1*9880d681SAndroid Build Coastguard Worker //===-- SymbolDumper.cpp - CodeView symbol info dumper ----------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/SymbolDumper.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DenseMap.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallString.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/EnumTables.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/TypeDumper.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/TypeIndex.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ScopedPrinter.h"
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker #include <system_error>
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker using namespace llvm;
24*9880d681SAndroid Build Coastguard Worker using namespace llvm::codeview;
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker namespace {
27*9880d681SAndroid Build Coastguard Worker /// Use this private dumper implementation to keep implementation details about
28*9880d681SAndroid Build Coastguard Worker /// the visitor out of SymbolDumper.h.
29*9880d681SAndroid Build Coastguard Worker class CVSymbolDumperImpl : public CVSymbolVisitor<CVSymbolDumperImpl> {
30*9880d681SAndroid Build Coastguard Worker public:
CVSymbolDumperImpl(CVTypeDumper & CVTD,SymbolDumpDelegate * ObjDelegate,ScopedPrinter & W,bool PrintRecordBytes)31*9880d681SAndroid Build Coastguard Worker CVSymbolDumperImpl(CVTypeDumper &CVTD, SymbolDumpDelegate *ObjDelegate,
32*9880d681SAndroid Build Coastguard Worker ScopedPrinter &W, bool PrintRecordBytes)
33*9880d681SAndroid Build Coastguard Worker : CVSymbolVisitor(ObjDelegate), CVTD(CVTD), ObjDelegate(ObjDelegate),
34*9880d681SAndroid Build Coastguard Worker W(W), PrintRecordBytes(PrintRecordBytes), InFunctionScope(false) {}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker /// CVSymbolVisitor overrides.
37*9880d681SAndroid Build Coastguard Worker #define SYMBOL_RECORD(EnumName, EnumVal, Name) \
38*9880d681SAndroid Build Coastguard Worker void visit##Name(SymbolKind Kind, Name &Record);
39*9880d681SAndroid Build Coastguard Worker #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
40*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker void visitSymbolBegin(SymbolKind Kind, ArrayRef<uint8_t> Data);
43*9880d681SAndroid Build Coastguard Worker void visitSymbolEnd(SymbolKind Kind, ArrayRef<uint8_t> OriginalSymData);
44*9880d681SAndroid Build Coastguard Worker void visitUnknownSymbol(SymbolKind Kind, ArrayRef<uint8_t> Data);
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker private:
47*9880d681SAndroid Build Coastguard Worker void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
48*9880d681SAndroid Build Coastguard Worker uint32_t RelocationOffset);
49*9880d681SAndroid Build Coastguard Worker void printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps);
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker CVTypeDumper &CVTD;
52*9880d681SAndroid Build Coastguard Worker SymbolDumpDelegate *ObjDelegate;
53*9880d681SAndroid Build Coastguard Worker ScopedPrinter &W;
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker bool PrintRecordBytes;
56*9880d681SAndroid Build Coastguard Worker bool InFunctionScope;
57*9880d681SAndroid Build Coastguard Worker };
58*9880d681SAndroid Build Coastguard Worker }
59*9880d681SAndroid Build Coastguard Worker
printLocalVariableAddrRange(const LocalVariableAddrRange & Range,uint32_t RelocationOffset)60*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::printLocalVariableAddrRange(
61*9880d681SAndroid Build Coastguard Worker const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
62*9880d681SAndroid Build Coastguard Worker DictScope S(W, "LocalVariableAddrRange");
63*9880d681SAndroid Build Coastguard Worker if (ObjDelegate)
64*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
65*9880d681SAndroid Build Coastguard Worker Range.OffsetStart);
66*9880d681SAndroid Build Coastguard Worker W.printHex("ISectStart", Range.ISectStart);
67*9880d681SAndroid Build Coastguard Worker W.printHex("Range", Range.Range);
68*9880d681SAndroid Build Coastguard Worker }
69*9880d681SAndroid Build Coastguard Worker
printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps)70*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::printLocalVariableAddrGap(
71*9880d681SAndroid Build Coastguard Worker ArrayRef<LocalVariableAddrGap> Gaps) {
72*9880d681SAndroid Build Coastguard Worker for (auto &Gap : Gaps) {
73*9880d681SAndroid Build Coastguard Worker ListScope S(W, "LocalVariableAddrGap");
74*9880d681SAndroid Build Coastguard Worker W.printHex("GapStartOffset", Gap.GapStartOffset);
75*9880d681SAndroid Build Coastguard Worker W.printHex("Range", Gap.Range);
76*9880d681SAndroid Build Coastguard Worker }
77*9880d681SAndroid Build Coastguard Worker }
78*9880d681SAndroid Build Coastguard Worker
visitSymbolBegin(SymbolKind Kind,ArrayRef<uint8_t> Data)79*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitSymbolBegin(SymbolKind Kind,
80*9880d681SAndroid Build Coastguard Worker ArrayRef<uint8_t> Data) {}
81*9880d681SAndroid Build Coastguard Worker
visitSymbolEnd(SymbolKind Kind,ArrayRef<uint8_t> OriginalSymData)82*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitSymbolEnd(SymbolKind Kind,
83*9880d681SAndroid Build Coastguard Worker ArrayRef<uint8_t> OriginalSymData) {
84*9880d681SAndroid Build Coastguard Worker if (PrintRecordBytes && ObjDelegate)
85*9880d681SAndroid Build Coastguard Worker ObjDelegate->printBinaryBlockWithRelocs("SymData", OriginalSymData);
86*9880d681SAndroid Build Coastguard Worker }
87*9880d681SAndroid Build Coastguard Worker
visitBlockSym(SymbolKind Kind,BlockSym & Block)88*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitBlockSym(SymbolKind Kind, BlockSym &Block) {
89*9880d681SAndroid Build Coastguard Worker DictScope S(W, "BlockStart");
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker StringRef LinkageName;
92*9880d681SAndroid Build Coastguard Worker W.printHex("PtrParent", Block.Header.PtrParent);
93*9880d681SAndroid Build Coastguard Worker W.printHex("PtrEnd", Block.Header.PtrEnd);
94*9880d681SAndroid Build Coastguard Worker W.printHex("CodeSize", Block.Header.CodeSize);
95*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
96*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField("CodeOffset", Block.getRelocationOffset(),
97*9880d681SAndroid Build Coastguard Worker Block.Header.CodeOffset, &LinkageName);
98*9880d681SAndroid Build Coastguard Worker }
99*9880d681SAndroid Build Coastguard Worker W.printHex("Segment", Block.Header.Segment);
100*9880d681SAndroid Build Coastguard Worker W.printString("BlockName", Block.Name);
101*9880d681SAndroid Build Coastguard Worker W.printString("LinkageName", LinkageName);
102*9880d681SAndroid Build Coastguard Worker }
103*9880d681SAndroid Build Coastguard Worker
visitThunk32Sym(SymbolKind Kind,Thunk32Sym & Thunk)104*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitThunk32Sym(SymbolKind Kind, Thunk32Sym &Thunk) {
105*9880d681SAndroid Build Coastguard Worker DictScope S(W, "Thunk32");
106*9880d681SAndroid Build Coastguard Worker W.printNumber("Parent", Thunk.Header.Parent);
107*9880d681SAndroid Build Coastguard Worker W.printNumber("End", Thunk.Header.End);
108*9880d681SAndroid Build Coastguard Worker W.printNumber("Next", Thunk.Header.Next);
109*9880d681SAndroid Build Coastguard Worker W.printNumber("Off", Thunk.Header.Off);
110*9880d681SAndroid Build Coastguard Worker W.printNumber("Seg", Thunk.Header.Seg);
111*9880d681SAndroid Build Coastguard Worker W.printNumber("Len", Thunk.Header.Len);
112*9880d681SAndroid Build Coastguard Worker W.printEnum("Ordinal", Thunk.Header.Ord, getThunkOrdinalNames());
113*9880d681SAndroid Build Coastguard Worker }
114*9880d681SAndroid Build Coastguard Worker
visitTrampolineSym(SymbolKind Kind,TrampolineSym & Tramp)115*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitTrampolineSym(SymbolKind Kind,
116*9880d681SAndroid Build Coastguard Worker TrampolineSym &Tramp) {
117*9880d681SAndroid Build Coastguard Worker DictScope S(W, "Trampoline");
118*9880d681SAndroid Build Coastguard Worker W.printEnum("Type", Tramp.Header.Type, getTrampolineNames());
119*9880d681SAndroid Build Coastguard Worker W.printNumber("Size", Tramp.Header.Size);
120*9880d681SAndroid Build Coastguard Worker W.printNumber("ThunkOff", Tramp.Header.ThunkOff);
121*9880d681SAndroid Build Coastguard Worker W.printNumber("TargetOff", Tramp.Header.TargetOff);
122*9880d681SAndroid Build Coastguard Worker W.printNumber("ThunkSection", Tramp.Header.ThunkSection);
123*9880d681SAndroid Build Coastguard Worker W.printNumber("TargetSection", Tramp.Header.TargetSection);
124*9880d681SAndroid Build Coastguard Worker }
125*9880d681SAndroid Build Coastguard Worker
visitSectionSym(SymbolKind Kind,SectionSym & Section)126*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitSectionSym(SymbolKind Kind, SectionSym &Section) {
127*9880d681SAndroid Build Coastguard Worker DictScope S(W, "Section");
128*9880d681SAndroid Build Coastguard Worker W.printNumber("SectionNumber", Section.Header.SectionNumber);
129*9880d681SAndroid Build Coastguard Worker W.printNumber("Alignment", Section.Header.Alignment);
130*9880d681SAndroid Build Coastguard Worker W.printNumber("Reserved", Section.Header.Reserved);
131*9880d681SAndroid Build Coastguard Worker W.printNumber("Rva", Section.Header.Rva);
132*9880d681SAndroid Build Coastguard Worker W.printNumber("Length", Section.Header.Length);
133*9880d681SAndroid Build Coastguard Worker W.printFlags("Characteristics", Section.Header.Characteristics,
134*9880d681SAndroid Build Coastguard Worker getImageSectionCharacteristicNames(),
135*9880d681SAndroid Build Coastguard Worker COFF::SectionCharacteristics(0x00F00000));
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker W.printString("Name", Section.Name);
138*9880d681SAndroid Build Coastguard Worker }
139*9880d681SAndroid Build Coastguard Worker
visitCoffGroupSym(SymbolKind Kind,CoffGroupSym & CoffGroup)140*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitCoffGroupSym(SymbolKind Kind,
141*9880d681SAndroid Build Coastguard Worker CoffGroupSym &CoffGroup) {
142*9880d681SAndroid Build Coastguard Worker DictScope S(W, "COFF Group");
143*9880d681SAndroid Build Coastguard Worker W.printNumber("Size", CoffGroup.Header.Size);
144*9880d681SAndroid Build Coastguard Worker W.printFlags("Characteristics", CoffGroup.Header.Characteristics,
145*9880d681SAndroid Build Coastguard Worker getImageSectionCharacteristicNames(),
146*9880d681SAndroid Build Coastguard Worker COFF::SectionCharacteristics(0x00F00000));
147*9880d681SAndroid Build Coastguard Worker W.printNumber("Offset", CoffGroup.Header.Offset);
148*9880d681SAndroid Build Coastguard Worker W.printNumber("Segment", CoffGroup.Header.Segment);
149*9880d681SAndroid Build Coastguard Worker W.printString("Name", CoffGroup.Name);
150*9880d681SAndroid Build Coastguard Worker }
151*9880d681SAndroid Build Coastguard Worker
visitBPRelativeSym(SymbolKind Kind,BPRelativeSym & BPRel)152*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitBPRelativeSym(SymbolKind Kind,
153*9880d681SAndroid Build Coastguard Worker BPRelativeSym &BPRel) {
154*9880d681SAndroid Build Coastguard Worker DictScope S(W, "BPRelativeSym");
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker W.printNumber("Offset", BPRel.Header.Offset);
157*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", BPRel.Header.Type);
158*9880d681SAndroid Build Coastguard Worker W.printString("VarName", BPRel.Name);
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker
visitBuildInfoSym(SymbolKind Kind,BuildInfoSym & BuildInfo)161*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitBuildInfoSym(SymbolKind Kind,
162*9880d681SAndroid Build Coastguard Worker BuildInfoSym &BuildInfo) {
163*9880d681SAndroid Build Coastguard Worker DictScope S(W, "BuildInfo");
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker W.printNumber("BuildId", BuildInfo.Header.BuildId);
166*9880d681SAndroid Build Coastguard Worker }
167*9880d681SAndroid Build Coastguard Worker
visitCallSiteInfoSym(SymbolKind Kind,CallSiteInfoSym & CallSiteInfo)168*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitCallSiteInfoSym(SymbolKind Kind,
169*9880d681SAndroid Build Coastguard Worker CallSiteInfoSym &CallSiteInfo) {
170*9880d681SAndroid Build Coastguard Worker DictScope S(W, "CallSiteInfo");
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker StringRef LinkageName;
173*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
174*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField(
175*9880d681SAndroid Build Coastguard Worker "CodeOffset", CallSiteInfo.getRelocationOffset(),
176*9880d681SAndroid Build Coastguard Worker CallSiteInfo.Header.CodeOffset, &LinkageName);
177*9880d681SAndroid Build Coastguard Worker }
178*9880d681SAndroid Build Coastguard Worker W.printHex("Segment", CallSiteInfo.Header.Segment);
179*9880d681SAndroid Build Coastguard Worker W.printHex("Reserved", CallSiteInfo.Header.Reserved);
180*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", CallSiteInfo.Header.Type);
181*9880d681SAndroid Build Coastguard Worker if (!LinkageName.empty())
182*9880d681SAndroid Build Coastguard Worker W.printString("LinkageName", LinkageName);
183*9880d681SAndroid Build Coastguard Worker }
184*9880d681SAndroid Build Coastguard Worker
visitEnvBlockSym(SymbolKind Kind,EnvBlockSym & EnvBlock)185*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitEnvBlockSym(SymbolKind Kind,
186*9880d681SAndroid Build Coastguard Worker EnvBlockSym &EnvBlock) {
187*9880d681SAndroid Build Coastguard Worker DictScope S(W, "EnvBlock");
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker W.printNumber("Reserved", EnvBlock.Header.Reserved);
190*9880d681SAndroid Build Coastguard Worker ListScope L(W, "Entries");
191*9880d681SAndroid Build Coastguard Worker for (auto Entry : EnvBlock.Fields) {
192*9880d681SAndroid Build Coastguard Worker W.printString(Entry);
193*9880d681SAndroid Build Coastguard Worker }
194*9880d681SAndroid Build Coastguard Worker }
195*9880d681SAndroid Build Coastguard Worker
visitFileStaticSym(SymbolKind Kind,FileStaticSym & FileStatic)196*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitFileStaticSym(SymbolKind Kind,
197*9880d681SAndroid Build Coastguard Worker FileStaticSym &FileStatic) {
198*9880d681SAndroid Build Coastguard Worker DictScope S(W, "FileStatic");
199*9880d681SAndroid Build Coastguard Worker W.printNumber("Index", FileStatic.Header.Index);
200*9880d681SAndroid Build Coastguard Worker W.printNumber("ModFilenameOffset", FileStatic.Header.ModFilenameOffset);
201*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", uint16_t(FileStatic.Header.Flags), getLocalFlagNames());
202*9880d681SAndroid Build Coastguard Worker W.printString("Name", FileStatic.Name);
203*9880d681SAndroid Build Coastguard Worker }
204*9880d681SAndroid Build Coastguard Worker
visitExportSym(SymbolKind Kind,ExportSym & Export)205*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitExportSym(SymbolKind Kind, ExportSym &Export) {
206*9880d681SAndroid Build Coastguard Worker DictScope S(W, "Export");
207*9880d681SAndroid Build Coastguard Worker W.printNumber("Ordinal", Export.Header.Ordinal);
208*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", Export.Header.Flags, getExportSymFlagNames());
209*9880d681SAndroid Build Coastguard Worker W.printString("Name", Export.Name);
210*9880d681SAndroid Build Coastguard Worker }
211*9880d681SAndroid Build Coastguard Worker
visitCompile2Sym(SymbolKind Kind,Compile2Sym & Compile2)212*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitCompile2Sym(SymbolKind Kind,
213*9880d681SAndroid Build Coastguard Worker Compile2Sym &Compile2) {
214*9880d681SAndroid Build Coastguard Worker DictScope S(W, "CompilerFlags2");
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker W.printEnum("Language", Compile2.Header.getLanguage(),
217*9880d681SAndroid Build Coastguard Worker getSourceLanguageNames());
218*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", Compile2.Header.flags & ~0xff,
219*9880d681SAndroid Build Coastguard Worker getCompileSym2FlagNames());
220*9880d681SAndroid Build Coastguard Worker W.printEnum("Machine", unsigned(Compile2.Header.Machine), getCPUTypeNames());
221*9880d681SAndroid Build Coastguard Worker std::string FrontendVersion;
222*9880d681SAndroid Build Coastguard Worker {
223*9880d681SAndroid Build Coastguard Worker raw_string_ostream Out(FrontendVersion);
224*9880d681SAndroid Build Coastguard Worker Out << Compile2.Header.VersionFrontendMajor << '.'
225*9880d681SAndroid Build Coastguard Worker << Compile2.Header.VersionFrontendMinor << '.'
226*9880d681SAndroid Build Coastguard Worker << Compile2.Header.VersionFrontendBuild;
227*9880d681SAndroid Build Coastguard Worker }
228*9880d681SAndroid Build Coastguard Worker std::string BackendVersion;
229*9880d681SAndroid Build Coastguard Worker {
230*9880d681SAndroid Build Coastguard Worker raw_string_ostream Out(BackendVersion);
231*9880d681SAndroid Build Coastguard Worker Out << Compile2.Header.VersionBackendMajor << '.'
232*9880d681SAndroid Build Coastguard Worker << Compile2.Header.VersionBackendMinor << '.'
233*9880d681SAndroid Build Coastguard Worker << Compile2.Header.VersionBackendBuild;
234*9880d681SAndroid Build Coastguard Worker }
235*9880d681SAndroid Build Coastguard Worker W.printString("FrontendVersion", FrontendVersion);
236*9880d681SAndroid Build Coastguard Worker W.printString("BackendVersion", BackendVersion);
237*9880d681SAndroid Build Coastguard Worker W.printString("VersionName", Compile2.Version);
238*9880d681SAndroid Build Coastguard Worker }
239*9880d681SAndroid Build Coastguard Worker
visitCompile3Sym(SymbolKind Kind,Compile3Sym & Compile3)240*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitCompile3Sym(SymbolKind Kind,
241*9880d681SAndroid Build Coastguard Worker Compile3Sym &Compile3) {
242*9880d681SAndroid Build Coastguard Worker DictScope S(W, "CompilerFlags3");
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker W.printEnum("Language", Compile3.Header.getLanguage(),
245*9880d681SAndroid Build Coastguard Worker getSourceLanguageNames());
246*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", Compile3.Header.flags & ~0xff,
247*9880d681SAndroid Build Coastguard Worker getCompileSym3FlagNames());
248*9880d681SAndroid Build Coastguard Worker W.printEnum("Machine", unsigned(Compile3.Header.Machine), getCPUTypeNames());
249*9880d681SAndroid Build Coastguard Worker std::string FrontendVersion;
250*9880d681SAndroid Build Coastguard Worker {
251*9880d681SAndroid Build Coastguard Worker raw_string_ostream Out(FrontendVersion);
252*9880d681SAndroid Build Coastguard Worker Out << Compile3.Header.VersionFrontendMajor << '.'
253*9880d681SAndroid Build Coastguard Worker << Compile3.Header.VersionFrontendMinor << '.'
254*9880d681SAndroid Build Coastguard Worker << Compile3.Header.VersionFrontendBuild << '.'
255*9880d681SAndroid Build Coastguard Worker << Compile3.Header.VersionFrontendQFE;
256*9880d681SAndroid Build Coastguard Worker }
257*9880d681SAndroid Build Coastguard Worker std::string BackendVersion;
258*9880d681SAndroid Build Coastguard Worker {
259*9880d681SAndroid Build Coastguard Worker raw_string_ostream Out(BackendVersion);
260*9880d681SAndroid Build Coastguard Worker Out << Compile3.Header.VersionBackendMajor << '.'
261*9880d681SAndroid Build Coastguard Worker << Compile3.Header.VersionBackendMinor << '.'
262*9880d681SAndroid Build Coastguard Worker << Compile3.Header.VersionBackendBuild << '.'
263*9880d681SAndroid Build Coastguard Worker << Compile3.Header.VersionBackendQFE;
264*9880d681SAndroid Build Coastguard Worker }
265*9880d681SAndroid Build Coastguard Worker W.printString("FrontendVersion", FrontendVersion);
266*9880d681SAndroid Build Coastguard Worker W.printString("BackendVersion", BackendVersion);
267*9880d681SAndroid Build Coastguard Worker W.printString("VersionName", Compile3.Version);
268*9880d681SAndroid Build Coastguard Worker }
269*9880d681SAndroid Build Coastguard Worker
visitConstantSym(SymbolKind Kind,ConstantSym & Constant)270*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitConstantSym(SymbolKind Kind,
271*9880d681SAndroid Build Coastguard Worker ConstantSym &Constant) {
272*9880d681SAndroid Build Coastguard Worker DictScope S(W, "Constant");
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", Constant.Header.Type);
275*9880d681SAndroid Build Coastguard Worker W.printNumber("Value", Constant.Value);
276*9880d681SAndroid Build Coastguard Worker W.printString("Name", Constant.Name);
277*9880d681SAndroid Build Coastguard Worker }
278*9880d681SAndroid Build Coastguard Worker
visitDataSym(SymbolKind Kind,DataSym & Data)279*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitDataSym(SymbolKind Kind, DataSym &Data) {
280*9880d681SAndroid Build Coastguard Worker DictScope S(W, "DataSym");
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker W.printEnum("Kind", uint16_t(Kind), getSymbolTypeNames());
283*9880d681SAndroid Build Coastguard Worker StringRef LinkageName;
284*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
285*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
286*9880d681SAndroid Build Coastguard Worker Data.Header.DataOffset, &LinkageName);
287*9880d681SAndroid Build Coastguard Worker }
288*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", Data.Header.Type);
289*9880d681SAndroid Build Coastguard Worker W.printString("DisplayName", Data.Name);
290*9880d681SAndroid Build Coastguard Worker if (!LinkageName.empty())
291*9880d681SAndroid Build Coastguard Worker W.printString("LinkageName", LinkageName);
292*9880d681SAndroid Build Coastguard Worker }
293*9880d681SAndroid Build Coastguard Worker
visitDefRangeFramePointerRelFullScopeSym(SymbolKind Kind,DefRangeFramePointerRelFullScopeSym & DefRangeFramePointerRelFullScope)294*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitDefRangeFramePointerRelFullScopeSym(
295*9880d681SAndroid Build Coastguard Worker SymbolKind Kind,
296*9880d681SAndroid Build Coastguard Worker DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
297*9880d681SAndroid Build Coastguard Worker DictScope S(W, "DefRangeFramePointerRelFullScope");
298*9880d681SAndroid Build Coastguard Worker W.printNumber("Offset", DefRangeFramePointerRelFullScope.Header.Offset);
299*9880d681SAndroid Build Coastguard Worker }
300*9880d681SAndroid Build Coastguard Worker
visitDefRangeFramePointerRelSym(SymbolKind Kind,DefRangeFramePointerRelSym & DefRangeFramePointerRel)301*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitDefRangeFramePointerRelSym(
302*9880d681SAndroid Build Coastguard Worker SymbolKind Kind, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
303*9880d681SAndroid Build Coastguard Worker DictScope S(W, "DefRangeFramePointerRel");
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker W.printNumber("Offset", DefRangeFramePointerRel.Header.Offset);
306*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrRange(DefRangeFramePointerRel.Header.Range,
307*9880d681SAndroid Build Coastguard Worker DefRangeFramePointerRel.getRelocationOffset());
308*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
309*9880d681SAndroid Build Coastguard Worker }
310*9880d681SAndroid Build Coastguard Worker
visitDefRangeRegisterRelSym(SymbolKind Kind,DefRangeRegisterRelSym & DefRangeRegisterRel)311*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitDefRangeRegisterRelSym(
312*9880d681SAndroid Build Coastguard Worker SymbolKind Kind, DefRangeRegisterRelSym &DefRangeRegisterRel) {
313*9880d681SAndroid Build Coastguard Worker DictScope S(W, "DefRangeRegisterRel");
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker W.printNumber("BaseRegister", DefRangeRegisterRel.Header.BaseRegister);
316*9880d681SAndroid Build Coastguard Worker W.printBoolean("HasSpilledUDTMember",
317*9880d681SAndroid Build Coastguard Worker DefRangeRegisterRel.hasSpilledUDTMember());
318*9880d681SAndroid Build Coastguard Worker W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
319*9880d681SAndroid Build Coastguard Worker W.printNumber("BasePointerOffset",
320*9880d681SAndroid Build Coastguard Worker DefRangeRegisterRel.Header.BasePointerOffset);
321*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrRange(DefRangeRegisterRel.Header.Range,
322*9880d681SAndroid Build Coastguard Worker DefRangeRegisterRel.getRelocationOffset());
323*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
324*9880d681SAndroid Build Coastguard Worker }
325*9880d681SAndroid Build Coastguard Worker
visitDefRangeRegisterSym(SymbolKind Kind,DefRangeRegisterSym & DefRangeRegister)326*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitDefRangeRegisterSym(
327*9880d681SAndroid Build Coastguard Worker SymbolKind Kind, DefRangeRegisterSym &DefRangeRegister) {
328*9880d681SAndroid Build Coastguard Worker DictScope S(W, "DefRangeRegister");
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker W.printNumber("Register", DefRangeRegister.Header.Register);
331*9880d681SAndroid Build Coastguard Worker W.printNumber("MayHaveNoName", DefRangeRegister.Header.MayHaveNoName);
332*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrRange(DefRangeRegister.Header.Range,
333*9880d681SAndroid Build Coastguard Worker DefRangeRegister.getRelocationOffset());
334*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrGap(DefRangeRegister.Gaps);
335*9880d681SAndroid Build Coastguard Worker }
336*9880d681SAndroid Build Coastguard Worker
visitDefRangeSubfieldRegisterSym(SymbolKind Kind,DefRangeSubfieldRegisterSym & DefRangeSubfieldRegister)337*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitDefRangeSubfieldRegisterSym(
338*9880d681SAndroid Build Coastguard Worker SymbolKind Kind, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
339*9880d681SAndroid Build Coastguard Worker DictScope S(W, "DefRangeSubfieldRegister");
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Worker W.printNumber("Register", DefRangeSubfieldRegister.Header.Register);
342*9880d681SAndroid Build Coastguard Worker W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Header.MayHaveNoName);
343*9880d681SAndroid Build Coastguard Worker W.printNumber("OffsetInParent",
344*9880d681SAndroid Build Coastguard Worker DefRangeSubfieldRegister.Header.OffsetInParent);
345*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrRange(DefRangeSubfieldRegister.Header.Range,
346*9880d681SAndroid Build Coastguard Worker DefRangeSubfieldRegister.getRelocationOffset());
347*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
348*9880d681SAndroid Build Coastguard Worker }
349*9880d681SAndroid Build Coastguard Worker
visitDefRangeSubfieldSym(SymbolKind Kind,DefRangeSubfieldSym & DefRangeSubfield)350*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitDefRangeSubfieldSym(
351*9880d681SAndroid Build Coastguard Worker SymbolKind Kind, DefRangeSubfieldSym &DefRangeSubfield) {
352*9880d681SAndroid Build Coastguard Worker DictScope S(W, "DefRangeSubfield");
353*9880d681SAndroid Build Coastguard Worker
354*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
355*9880d681SAndroid Build Coastguard Worker StringRef StringTable = ObjDelegate->getStringTable();
356*9880d681SAndroid Build Coastguard Worker auto ProgramStringTableOffset = DefRangeSubfield.Header.Program;
357*9880d681SAndroid Build Coastguard Worker if (ProgramStringTableOffset >= StringTable.size())
358*9880d681SAndroid Build Coastguard Worker return parseError();
359*9880d681SAndroid Build Coastguard Worker StringRef Program =
360*9880d681SAndroid Build Coastguard Worker StringTable.drop_front(ProgramStringTableOffset).split('\0').first;
361*9880d681SAndroid Build Coastguard Worker W.printString("Program", Program);
362*9880d681SAndroid Build Coastguard Worker }
363*9880d681SAndroid Build Coastguard Worker W.printNumber("OffsetInParent", DefRangeSubfield.Header.OffsetInParent);
364*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrRange(DefRangeSubfield.Header.Range,
365*9880d681SAndroid Build Coastguard Worker DefRangeSubfield.getRelocationOffset());
366*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrGap(DefRangeSubfield.Gaps);
367*9880d681SAndroid Build Coastguard Worker }
368*9880d681SAndroid Build Coastguard Worker
visitDefRangeSym(SymbolKind Kind,DefRangeSym & DefRange)369*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitDefRangeSym(SymbolKind Kind,
370*9880d681SAndroid Build Coastguard Worker DefRangeSym &DefRange) {
371*9880d681SAndroid Build Coastguard Worker DictScope S(W, "DefRange");
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
374*9880d681SAndroid Build Coastguard Worker StringRef StringTable = ObjDelegate->getStringTable();
375*9880d681SAndroid Build Coastguard Worker auto ProgramStringTableOffset = DefRange.Header.Program;
376*9880d681SAndroid Build Coastguard Worker if (ProgramStringTableOffset >= StringTable.size())
377*9880d681SAndroid Build Coastguard Worker return parseError();
378*9880d681SAndroid Build Coastguard Worker StringRef Program =
379*9880d681SAndroid Build Coastguard Worker StringTable.drop_front(ProgramStringTableOffset).split('\0').first;
380*9880d681SAndroid Build Coastguard Worker W.printString("Program", Program);
381*9880d681SAndroid Build Coastguard Worker }
382*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrRange(DefRange.Header.Range,
383*9880d681SAndroid Build Coastguard Worker DefRange.getRelocationOffset());
384*9880d681SAndroid Build Coastguard Worker printLocalVariableAddrGap(DefRange.Gaps);
385*9880d681SAndroid Build Coastguard Worker }
386*9880d681SAndroid Build Coastguard Worker
visitFrameCookieSym(SymbolKind Kind,FrameCookieSym & FrameCookie)387*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitFrameCookieSym(SymbolKind Kind,
388*9880d681SAndroid Build Coastguard Worker FrameCookieSym &FrameCookie) {
389*9880d681SAndroid Build Coastguard Worker DictScope S(W, "FrameCookie");
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Worker StringRef LinkageName;
392*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
393*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField(
394*9880d681SAndroid Build Coastguard Worker "CodeOffset", FrameCookie.getRelocationOffset(),
395*9880d681SAndroid Build Coastguard Worker FrameCookie.Header.CodeOffset, &LinkageName);
396*9880d681SAndroid Build Coastguard Worker }
397*9880d681SAndroid Build Coastguard Worker W.printHex("Register", FrameCookie.Header.Register);
398*9880d681SAndroid Build Coastguard Worker W.printEnum("CookieKind", uint16_t(FrameCookie.Header.CookieKind),
399*9880d681SAndroid Build Coastguard Worker getFrameCookieKindNames());
400*9880d681SAndroid Build Coastguard Worker W.printHex("Flags", FrameCookie.Header.Flags);
401*9880d681SAndroid Build Coastguard Worker }
402*9880d681SAndroid Build Coastguard Worker
visitFrameProcSym(SymbolKind Kind,FrameProcSym & FrameProc)403*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitFrameProcSym(SymbolKind Kind,
404*9880d681SAndroid Build Coastguard Worker FrameProcSym &FrameProc) {
405*9880d681SAndroid Build Coastguard Worker DictScope S(W, "FrameProc");
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Worker W.printHex("TotalFrameBytes", FrameProc.Header.TotalFrameBytes);
408*9880d681SAndroid Build Coastguard Worker W.printHex("PaddingFrameBytes", FrameProc.Header.PaddingFrameBytes);
409*9880d681SAndroid Build Coastguard Worker W.printHex("OffsetToPadding", FrameProc.Header.OffsetToPadding);
410*9880d681SAndroid Build Coastguard Worker W.printHex("BytesOfCalleeSavedRegisters",
411*9880d681SAndroid Build Coastguard Worker FrameProc.Header.BytesOfCalleeSavedRegisters);
412*9880d681SAndroid Build Coastguard Worker W.printHex("OffsetOfExceptionHandler",
413*9880d681SAndroid Build Coastguard Worker FrameProc.Header.OffsetOfExceptionHandler);
414*9880d681SAndroid Build Coastguard Worker W.printHex("SectionIdOfExceptionHandler",
415*9880d681SAndroid Build Coastguard Worker FrameProc.Header.SectionIdOfExceptionHandler);
416*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", FrameProc.Header.Flags, getFrameProcSymFlagNames());
417*9880d681SAndroid Build Coastguard Worker }
418*9880d681SAndroid Build Coastguard Worker
visitHeapAllocationSiteSym(SymbolKind Kind,HeapAllocationSiteSym & HeapAllocSite)419*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitHeapAllocationSiteSym(
420*9880d681SAndroid Build Coastguard Worker SymbolKind Kind, HeapAllocationSiteSym &HeapAllocSite) {
421*9880d681SAndroid Build Coastguard Worker DictScope S(W, "HeapAllocationSite");
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Worker StringRef LinkageName;
424*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
425*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField(
426*9880d681SAndroid Build Coastguard Worker "CodeOffset", HeapAllocSite.getRelocationOffset(),
427*9880d681SAndroid Build Coastguard Worker HeapAllocSite.Header.CodeOffset, &LinkageName);
428*9880d681SAndroid Build Coastguard Worker }
429*9880d681SAndroid Build Coastguard Worker W.printHex("Segment", HeapAllocSite.Header.Segment);
430*9880d681SAndroid Build Coastguard Worker W.printHex("CallInstructionSize", HeapAllocSite.Header.CallInstructionSize);
431*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", HeapAllocSite.Header.Type);
432*9880d681SAndroid Build Coastguard Worker if (!LinkageName.empty())
433*9880d681SAndroid Build Coastguard Worker W.printString("LinkageName", LinkageName);
434*9880d681SAndroid Build Coastguard Worker }
435*9880d681SAndroid Build Coastguard Worker
visitInlineSiteSym(SymbolKind Kind,InlineSiteSym & InlineSite)436*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitInlineSiteSym(SymbolKind Kind,
437*9880d681SAndroid Build Coastguard Worker InlineSiteSym &InlineSite) {
438*9880d681SAndroid Build Coastguard Worker DictScope S(W, "InlineSite");
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Worker W.printHex("PtrParent", InlineSite.Header.PtrParent);
441*9880d681SAndroid Build Coastguard Worker W.printHex("PtrEnd", InlineSite.Header.PtrEnd);
442*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Inlinee", InlineSite.Header.Inlinee);
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker ListScope BinaryAnnotations(W, "BinaryAnnotations");
445*9880d681SAndroid Build Coastguard Worker for (auto &Annotation : InlineSite.annotations()) {
446*9880d681SAndroid Build Coastguard Worker switch (Annotation.OpCode) {
447*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::Invalid:
448*9880d681SAndroid Build Coastguard Worker return parseError();
449*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::CodeOffset:
450*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeCodeOffset:
451*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeCodeLength:
452*9880d681SAndroid Build Coastguard Worker W.printHex(Annotation.Name, Annotation.U1);
453*9880d681SAndroid Build Coastguard Worker break;
454*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
455*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeLineEndDelta:
456*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeRangeKind:
457*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeColumnStart:
458*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeColumnEnd:
459*9880d681SAndroid Build Coastguard Worker W.printNumber(Annotation.Name, Annotation.U1);
460*9880d681SAndroid Build Coastguard Worker break;
461*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeLineOffset:
462*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
463*9880d681SAndroid Build Coastguard Worker W.printNumber(Annotation.Name, Annotation.S1);
464*9880d681SAndroid Build Coastguard Worker break;
465*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeFile:
466*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
467*9880d681SAndroid Build Coastguard Worker W.printHex("ChangeFile",
468*9880d681SAndroid Build Coastguard Worker ObjDelegate->getFileNameForFileOffset(Annotation.U1),
469*9880d681SAndroid Build Coastguard Worker Annotation.U1);
470*9880d681SAndroid Build Coastguard Worker } else {
471*9880d681SAndroid Build Coastguard Worker W.printHex("ChangeFile", Annotation.U1);
472*9880d681SAndroid Build Coastguard Worker }
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Worker break;
475*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
476*9880d681SAndroid Build Coastguard Worker W.startLine() << "ChangeCodeOffsetAndLineOffset: {CodeOffset: "
477*9880d681SAndroid Build Coastguard Worker << W.hex(Annotation.U1) << ", LineOffset: " << Annotation.S1
478*9880d681SAndroid Build Coastguard Worker << "}\n";
479*9880d681SAndroid Build Coastguard Worker break;
480*9880d681SAndroid Build Coastguard Worker }
481*9880d681SAndroid Build Coastguard Worker case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
482*9880d681SAndroid Build Coastguard Worker W.startLine() << "ChangeCodeLengthAndCodeOffset: {CodeOffset: "
483*9880d681SAndroid Build Coastguard Worker << W.hex(Annotation.U2)
484*9880d681SAndroid Build Coastguard Worker << ", Length: " << W.hex(Annotation.U1) << "}\n";
485*9880d681SAndroid Build Coastguard Worker break;
486*9880d681SAndroid Build Coastguard Worker }
487*9880d681SAndroid Build Coastguard Worker }
488*9880d681SAndroid Build Coastguard Worker }
489*9880d681SAndroid Build Coastguard Worker }
490*9880d681SAndroid Build Coastguard Worker
visitRegisterSym(SymbolKind Kind,RegisterSym & Register)491*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitRegisterSym(SymbolKind Kind,
492*9880d681SAndroid Build Coastguard Worker RegisterSym &Register) {
493*9880d681SAndroid Build Coastguard Worker DictScope S(W, "RegisterSym");
494*9880d681SAndroid Build Coastguard Worker W.printNumber("Type", Register.Header.Index);
495*9880d681SAndroid Build Coastguard Worker W.printEnum("Seg", uint16_t(Register.Header.Register), getRegisterNames());
496*9880d681SAndroid Build Coastguard Worker W.printString("Name", Register.Name);
497*9880d681SAndroid Build Coastguard Worker }
498*9880d681SAndroid Build Coastguard Worker
visitPublicSym32(SymbolKind Kind,PublicSym32 & Public)499*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitPublicSym32(SymbolKind Kind,
500*9880d681SAndroid Build Coastguard Worker PublicSym32 &Public) {
501*9880d681SAndroid Build Coastguard Worker DictScope S(W, "PublicSym");
502*9880d681SAndroid Build Coastguard Worker W.printNumber("Type", Public.Header.Index);
503*9880d681SAndroid Build Coastguard Worker W.printNumber("Seg", Public.Header.Seg);
504*9880d681SAndroid Build Coastguard Worker W.printNumber("Off", Public.Header.Off);
505*9880d681SAndroid Build Coastguard Worker W.printString("Name", Public.Name);
506*9880d681SAndroid Build Coastguard Worker }
507*9880d681SAndroid Build Coastguard Worker
visitProcRefSym(SymbolKind Kind,ProcRefSym & ProcRef)508*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitProcRefSym(SymbolKind Kind, ProcRefSym &ProcRef) {
509*9880d681SAndroid Build Coastguard Worker DictScope S(W, "ProcRef");
510*9880d681SAndroid Build Coastguard Worker W.printNumber("SumName", ProcRef.Header.SumName);
511*9880d681SAndroid Build Coastguard Worker W.printNumber("SymOffset", ProcRef.Header.SymOffset);
512*9880d681SAndroid Build Coastguard Worker W.printNumber("Mod", ProcRef.Header.Mod);
513*9880d681SAndroid Build Coastguard Worker W.printString("Name", ProcRef.Name);
514*9880d681SAndroid Build Coastguard Worker }
515*9880d681SAndroid Build Coastguard Worker
visitLabelSym(SymbolKind Kind,LabelSym & Label)516*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitLabelSym(SymbolKind Kind, LabelSym &Label) {
517*9880d681SAndroid Build Coastguard Worker DictScope S(W, "Label");
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Worker StringRef LinkageName;
520*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
521*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(),
522*9880d681SAndroid Build Coastguard Worker Label.Header.CodeOffset, &LinkageName);
523*9880d681SAndroid Build Coastguard Worker }
524*9880d681SAndroid Build Coastguard Worker W.printHex("Segment", Label.Header.Segment);
525*9880d681SAndroid Build Coastguard Worker W.printHex("Flags", Label.Header.Flags);
526*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", Label.Header.Flags, getProcSymFlagNames());
527*9880d681SAndroid Build Coastguard Worker W.printString("DisplayName", Label.Name);
528*9880d681SAndroid Build Coastguard Worker if (!LinkageName.empty())
529*9880d681SAndroid Build Coastguard Worker W.printString("LinkageName", LinkageName);
530*9880d681SAndroid Build Coastguard Worker }
531*9880d681SAndroid Build Coastguard Worker
visitLocalSym(SymbolKind Kind,LocalSym & Local)532*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitLocalSym(SymbolKind Kind, LocalSym &Local) {
533*9880d681SAndroid Build Coastguard Worker DictScope S(W, "Local");
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", Local.Header.Type);
536*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", uint16_t(Local.Header.Flags), getLocalFlagNames());
537*9880d681SAndroid Build Coastguard Worker W.printString("VarName", Local.Name);
538*9880d681SAndroid Build Coastguard Worker }
539*9880d681SAndroid Build Coastguard Worker
visitObjNameSym(SymbolKind Kind,ObjNameSym & ObjName)540*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitObjNameSym(SymbolKind Kind, ObjNameSym &ObjName) {
541*9880d681SAndroid Build Coastguard Worker DictScope S(W, "ObjectName");
542*9880d681SAndroid Build Coastguard Worker
543*9880d681SAndroid Build Coastguard Worker W.printHex("Signature", ObjName.Header.Signature);
544*9880d681SAndroid Build Coastguard Worker W.printString("ObjectName", ObjName.Name);
545*9880d681SAndroid Build Coastguard Worker }
546*9880d681SAndroid Build Coastguard Worker
visitProcSym(SymbolKind Kind,ProcSym & Proc)547*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitProcSym(SymbolKind Kind, ProcSym &Proc) {
548*9880d681SAndroid Build Coastguard Worker DictScope S(W, "ProcStart");
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Worker if (InFunctionScope)
551*9880d681SAndroid Build Coastguard Worker return parseError();
552*9880d681SAndroid Build Coastguard Worker
553*9880d681SAndroid Build Coastguard Worker InFunctionScope = true;
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Worker StringRef LinkageName;
556*9880d681SAndroid Build Coastguard Worker W.printEnum("Kind", uint16_t(Kind), getSymbolTypeNames());
557*9880d681SAndroid Build Coastguard Worker W.printHex("PtrParent", Proc.Header.PtrParent);
558*9880d681SAndroid Build Coastguard Worker W.printHex("PtrEnd", Proc.Header.PtrEnd);
559*9880d681SAndroid Build Coastguard Worker W.printHex("PtrNext", Proc.Header.PtrNext);
560*9880d681SAndroid Build Coastguard Worker W.printHex("CodeSize", Proc.Header.CodeSize);
561*9880d681SAndroid Build Coastguard Worker W.printHex("DbgStart", Proc.Header.DbgStart);
562*9880d681SAndroid Build Coastguard Worker W.printHex("DbgEnd", Proc.Header.DbgEnd);
563*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("FunctionType", Proc.Header.FunctionType);
564*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
565*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(),
566*9880d681SAndroid Build Coastguard Worker Proc.Header.CodeOffset, &LinkageName);
567*9880d681SAndroid Build Coastguard Worker }
568*9880d681SAndroid Build Coastguard Worker W.printHex("Segment", Proc.Header.Segment);
569*9880d681SAndroid Build Coastguard Worker W.printFlags("Flags", static_cast<uint8_t>(Proc.Header.Flags),
570*9880d681SAndroid Build Coastguard Worker getProcSymFlagNames());
571*9880d681SAndroid Build Coastguard Worker W.printString("DisplayName", Proc.Name);
572*9880d681SAndroid Build Coastguard Worker if (!LinkageName.empty())
573*9880d681SAndroid Build Coastguard Worker W.printString("LinkageName", LinkageName);
574*9880d681SAndroid Build Coastguard Worker }
575*9880d681SAndroid Build Coastguard Worker
visitScopeEndSym(SymbolKind Kind,ScopeEndSym & ScopeEnd)576*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitScopeEndSym(SymbolKind Kind,
577*9880d681SAndroid Build Coastguard Worker ScopeEndSym &ScopeEnd) {
578*9880d681SAndroid Build Coastguard Worker if (Kind == SymbolKind::S_END)
579*9880d681SAndroid Build Coastguard Worker DictScope S(W, "BlockEnd");
580*9880d681SAndroid Build Coastguard Worker else if (Kind == SymbolKind::S_PROC_ID_END)
581*9880d681SAndroid Build Coastguard Worker DictScope S(W, "ProcEnd");
582*9880d681SAndroid Build Coastguard Worker else if (Kind == SymbolKind::S_INLINESITE_END)
583*9880d681SAndroid Build Coastguard Worker DictScope S(W, "InlineSiteEnd");
584*9880d681SAndroid Build Coastguard Worker
585*9880d681SAndroid Build Coastguard Worker InFunctionScope = false;
586*9880d681SAndroid Build Coastguard Worker }
587*9880d681SAndroid Build Coastguard Worker
visitCallerSym(SymbolKind Kind,CallerSym & Caller)588*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitCallerSym(SymbolKind Kind, CallerSym &Caller) {
589*9880d681SAndroid Build Coastguard Worker ListScope S(W, Kind == S_CALLEES ? "Callees" : "Callers");
590*9880d681SAndroid Build Coastguard Worker for (auto FuncID : Caller.Indices)
591*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("FuncID", FuncID);
592*9880d681SAndroid Build Coastguard Worker }
593*9880d681SAndroid Build Coastguard Worker
visitRegRelativeSym(SymbolKind Kind,RegRelativeSym & RegRel)594*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitRegRelativeSym(SymbolKind Kind,
595*9880d681SAndroid Build Coastguard Worker RegRelativeSym &RegRel) {
596*9880d681SAndroid Build Coastguard Worker DictScope S(W, "RegRelativeSym");
597*9880d681SAndroid Build Coastguard Worker
598*9880d681SAndroid Build Coastguard Worker W.printHex("Offset", RegRel.Header.Offset);
599*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", RegRel.Header.Type);
600*9880d681SAndroid Build Coastguard Worker W.printHex("Register", RegRel.Header.Register);
601*9880d681SAndroid Build Coastguard Worker W.printString("VarName", RegRel.Name);
602*9880d681SAndroid Build Coastguard Worker }
603*9880d681SAndroid Build Coastguard Worker
visitThreadLocalDataSym(SymbolKind Kind,ThreadLocalDataSym & Data)604*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitThreadLocalDataSym(SymbolKind Kind,
605*9880d681SAndroid Build Coastguard Worker ThreadLocalDataSym &Data) {
606*9880d681SAndroid Build Coastguard Worker DictScope S(W, "ThreadLocalDataSym");
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Worker StringRef LinkageName;
609*9880d681SAndroid Build Coastguard Worker if (ObjDelegate) {
610*9880d681SAndroid Build Coastguard Worker ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
611*9880d681SAndroid Build Coastguard Worker Data.Header.DataOffset, &LinkageName);
612*9880d681SAndroid Build Coastguard Worker }
613*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", Data.Header.Type);
614*9880d681SAndroid Build Coastguard Worker W.printString("DisplayName", Data.Name);
615*9880d681SAndroid Build Coastguard Worker if (!LinkageName.empty())
616*9880d681SAndroid Build Coastguard Worker W.printString("LinkageName", LinkageName);
617*9880d681SAndroid Build Coastguard Worker }
618*9880d681SAndroid Build Coastguard Worker
visitUDTSym(SymbolKind Kind,UDTSym & UDT)619*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitUDTSym(SymbolKind Kind, UDTSym &UDT) {
620*9880d681SAndroid Build Coastguard Worker DictScope S(W, "UDT");
621*9880d681SAndroid Build Coastguard Worker CVTD.printTypeIndex("Type", UDT.Header.Type);
622*9880d681SAndroid Build Coastguard Worker W.printString("UDTName", UDT.Name);
623*9880d681SAndroid Build Coastguard Worker }
624*9880d681SAndroid Build Coastguard Worker
visitUnknownSymbol(SymbolKind Kind,ArrayRef<uint8_t> Data)625*9880d681SAndroid Build Coastguard Worker void CVSymbolDumperImpl::visitUnknownSymbol(SymbolKind Kind,
626*9880d681SAndroid Build Coastguard Worker ArrayRef<uint8_t> Data) {
627*9880d681SAndroid Build Coastguard Worker DictScope S(W, "UnknownSym");
628*9880d681SAndroid Build Coastguard Worker W.printEnum("Kind", uint16_t(Kind), getSymbolTypeNames());
629*9880d681SAndroid Build Coastguard Worker W.printNumber("Length", uint32_t(Data.size()));
630*9880d681SAndroid Build Coastguard Worker }
631*9880d681SAndroid Build Coastguard Worker
dump(const CVRecord<SymbolKind> & Record)632*9880d681SAndroid Build Coastguard Worker bool CVSymbolDumper::dump(const CVRecord<SymbolKind> &Record) {
633*9880d681SAndroid Build Coastguard Worker CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
634*9880d681SAndroid Build Coastguard Worker Dumper.visitSymbolRecord(Record);
635*9880d681SAndroid Build Coastguard Worker return !Dumper.hadError();
636*9880d681SAndroid Build Coastguard Worker }
637*9880d681SAndroid Build Coastguard Worker
dump(const CVSymbolArray & Symbols)638*9880d681SAndroid Build Coastguard Worker bool CVSymbolDumper::dump(const CVSymbolArray &Symbols) {
639*9880d681SAndroid Build Coastguard Worker CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
640*9880d681SAndroid Build Coastguard Worker Dumper.visitSymbolStream(Symbols);
641*9880d681SAndroid Build Coastguard Worker return !Dumper.hadError();
642*9880d681SAndroid Build Coastguard Worker }
643