1 //===-- BreakpadRecords.h ------------------------------------- -*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_PLUGINS_OBJECTFILE_BREAKPAD_BREAKPADRECORDS_H
10 #define LLDB_PLUGINS_OBJECTFILE_BREAKPAD_BREAKPADRECORDS_H
12 #include "lldb/Utility/UUID.h"
13 #include "lldb/lldb-types.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/ADT/Triple.h"
16 #include "llvm/Support/FormatProviders.h"
18 namespace lldb_private {
23 enum Kind { Module, Info, File, Func, Line, Public, StackCFI, StackWin };
25 /// Attempt to guess the kind of the record present in the argument without
26 /// doing a full parse. The returned kind will always be correct for valid
27 /// records, but the full parse can still fail in case of corrupted input.
28 static llvm::Optional<Kind> classify(llvm::StringRef Line);
31 Record(Kind K) : TheKind(K) {}
36 Kind getKind() { return TheKind; }
42 llvm::StringRef toString(Record::Kind K);
43 inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, Record::Kind K) {
48 class ModuleRecord : public Record {
50 static llvm::Optional<ModuleRecord> parse(llvm::StringRef Line);
51 ModuleRecord(llvm::Triple::OSType OS, llvm::Triple::ArchType Arch, UUID ID)
52 : Record(Module), OS(OS), Arch(Arch), ID(std::move(ID)) {}
54 llvm::Triple::OSType OS;
55 llvm::Triple::ArchType Arch;
59 inline bool operator==(const ModuleRecord &L, const ModuleRecord &R) {
60 return L.OS == R.OS && L.Arch == R.Arch && L.ID == R.ID;
62 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const ModuleRecord &R);
64 class InfoRecord : public Record {
66 static llvm::Optional<InfoRecord> parse(llvm::StringRef Line);
67 InfoRecord(UUID ID) : Record(Info), ID(std::move(ID)) {}
72 inline bool operator==(const InfoRecord &L, const InfoRecord &R) {
75 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const InfoRecord &R);
77 class FileRecord : public Record {
79 static llvm::Optional<FileRecord> parse(llvm::StringRef Line);
80 FileRecord(size_t Number, llvm::StringRef Name)
81 : Record(File), Number(Number), Name(Name) {}
87 inline bool operator==(const FileRecord &L, const FileRecord &R) {
88 return L.Number == R.Number && L.Name == R.Name;
90 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const FileRecord &R);
92 class FuncRecord : public Record {
94 static llvm::Optional<FuncRecord> parse(llvm::StringRef Line);
95 FuncRecord(bool Multiple, lldb::addr_t Address, lldb::addr_t Size,
96 lldb::addr_t ParamSize, llvm::StringRef Name)
97 : Record(Module), Multiple(Multiple), Address(Address), Size(Size),
98 ParamSize(ParamSize), Name(Name) {}
101 lldb::addr_t Address;
103 lldb::addr_t ParamSize;
104 llvm::StringRef Name;
107 bool operator==(const FuncRecord &L, const FuncRecord &R);
108 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const FuncRecord &R);
110 class LineRecord : public Record {
112 static llvm::Optional<LineRecord> parse(llvm::StringRef Line);
113 LineRecord(lldb::addr_t Address, lldb::addr_t Size, uint32_t LineNum,
115 : Record(Line), Address(Address), Size(Size), LineNum(LineNum),
118 lldb::addr_t Address;
124 bool operator==(const LineRecord &L, const LineRecord &R);
125 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const LineRecord &R);
127 class PublicRecord : public Record {
129 static llvm::Optional<PublicRecord> parse(llvm::StringRef Line);
130 PublicRecord(bool Multiple, lldb::addr_t Address, lldb::addr_t ParamSize,
131 llvm::StringRef Name)
132 : Record(Module), Multiple(Multiple), Address(Address),
133 ParamSize(ParamSize), Name(Name) {}
136 lldb::addr_t Address;
137 lldb::addr_t ParamSize;
138 llvm::StringRef Name;
141 bool operator==(const PublicRecord &L, const PublicRecord &R);
142 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const PublicRecord &R);
144 class StackCFIRecord : public Record {
146 static llvm::Optional<StackCFIRecord> parse(llvm::StringRef Line);
147 StackCFIRecord(lldb::addr_t Address, llvm::Optional<lldb::addr_t> Size,
148 llvm::StringRef UnwindRules)
149 : Record(StackCFI), Address(Address), Size(Size),
150 UnwindRules(UnwindRules) {}
152 lldb::addr_t Address;
153 llvm::Optional<lldb::addr_t> Size;
154 llvm::StringRef UnwindRules;
157 bool operator==(const StackCFIRecord &L, const StackCFIRecord &R);
158 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const StackCFIRecord &R);
160 class StackWinRecord : public Record {
162 static llvm::Optional<StackWinRecord> parse(llvm::StringRef Line);
164 StackWinRecord(lldb::addr_t RVA, lldb::addr_t CodeSize,
165 lldb::addr_t ParameterSize, lldb::addr_t SavedRegisterSize,
166 lldb::addr_t LocalSize, llvm::StringRef ProgramString)
167 : Record(StackWin), RVA(RVA), CodeSize(CodeSize),
168 ParameterSize(ParameterSize), SavedRegisterSize(SavedRegisterSize),
169 LocalSize(LocalSize), ProgramString(ProgramString) {}
171 enum class FrameType : uint8_t { FPO = 0, FrameData = 4 };
173 lldb::addr_t CodeSize;
174 lldb::addr_t ParameterSize;
175 lldb::addr_t SavedRegisterSize;
176 lldb::addr_t LocalSize;
177 llvm::StringRef ProgramString;
180 bool operator==(const StackWinRecord &L, const StackWinRecord &R);
181 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const StackWinRecord &R);
183 } // namespace breakpad
184 } // namespace lldb_private
186 #endif // LLDB_PLUGINS_OBJECTFILE_BREAKPAD_BREAKPADRECORDS_H