xref: /src/contrib/llvm-project/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
101095a5dSDimitry Andric //===-- SymbolDumper.cpp - CodeView symbol info dumper ----------*- C++ -*-===//
201095a5dSDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
601095a5dSDimitry Andric //
701095a5dSDimitry Andric //===----------------------------------------------------------------------===//
801095a5dSDimitry Andric 
901095a5dSDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolDumper.h"
10145449b1SDimitry Andric #include "llvm/ADT/StringRef.h"
1101095a5dSDimitry Andric #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
12ee2f195dSDimitry Andric #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
1301095a5dSDimitry Andric #include "llvm/DebugInfo/CodeView/EnumTables.h"
14b915e9e0SDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
1501095a5dSDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
1601095a5dSDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
17b915e9e0SDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h"
18b915e9e0SDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
1901095a5dSDimitry Andric #include "llvm/DebugInfo/CodeView/TypeIndex.h"
20b915e9e0SDimitry Andric #include "llvm/Support/Error.h"
2101095a5dSDimitry Andric #include "llvm/Support/ScopedPrinter.h"
2201095a5dSDimitry Andric 
2301095a5dSDimitry Andric using namespace llvm;
2401095a5dSDimitry Andric using namespace llvm::codeview;
2501095a5dSDimitry Andric 
2601095a5dSDimitry Andric namespace {
2701095a5dSDimitry Andric /// Use this private dumper implementation to keep implementation details about
2801095a5dSDimitry Andric /// the visitor out of SymbolDumper.h.
29b915e9e0SDimitry Andric class CVSymbolDumperImpl : public SymbolVisitorCallbacks {
3001095a5dSDimitry Andric public:
CVSymbolDumperImpl(TypeCollection & Types,SymbolDumpDelegate * ObjDelegate,ScopedPrinter & W,CPUType CPU,bool PrintRecordBytes)31b5630dbaSDimitry Andric   CVSymbolDumperImpl(TypeCollection &Types, SymbolDumpDelegate *ObjDelegate,
32d8e91e46SDimitry Andric                      ScopedPrinter &W, CPUType CPU, bool PrintRecordBytes)
33d8e91e46SDimitry Andric       : Types(Types), ObjDelegate(ObjDelegate), W(W), CompilationCPUType(CPU),
34b915e9e0SDimitry Andric         PrintRecordBytes(PrintRecordBytes), InFunctionScope(false) {}
3501095a5dSDimitry Andric 
3601095a5dSDimitry Andric /// CVSymbolVisitor overrides.
3701095a5dSDimitry Andric #define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
38b915e9e0SDimitry Andric   Error visitKnownRecord(CVSymbol &CVR, Name &Record) override;
3901095a5dSDimitry Andric #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
40f382538dSDimitry Andric #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
4101095a5dSDimitry Andric 
42b915e9e0SDimitry Andric   Error visitSymbolBegin(CVSymbol &Record) override;
43b915e9e0SDimitry Andric   Error visitSymbolEnd(CVSymbol &Record) override;
44b915e9e0SDimitry Andric   Error visitUnknownSymbol(CVSymbol &Record) override;
4501095a5dSDimitry Andric 
getCompilationCPUType() const46d8e91e46SDimitry Andric   CPUType getCompilationCPUType() const { return CompilationCPUType; }
47d8e91e46SDimitry Andric 
4801095a5dSDimitry Andric private:
4901095a5dSDimitry Andric   void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
5001095a5dSDimitry Andric                                    uint32_t RelocationOffset);
5101095a5dSDimitry Andric   void printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps);
52581a6d85SDimitry Andric   void printTypeIndex(StringRef FieldName, TypeIndex TI);
5301095a5dSDimitry Andric 
54b5630dbaSDimitry Andric   TypeCollection &Types;
5501095a5dSDimitry Andric   SymbolDumpDelegate *ObjDelegate;
5601095a5dSDimitry Andric   ScopedPrinter &W;
5701095a5dSDimitry Andric 
58d8e91e46SDimitry Andric   /// Save the machine or CPU type when dumping a compile symbols.
59d8e91e46SDimitry Andric   CPUType CompilationCPUType = CPUType::X64;
60d8e91e46SDimitry Andric 
6101095a5dSDimitry Andric   bool PrintRecordBytes;
6201095a5dSDimitry Andric   bool InFunctionScope;
6301095a5dSDimitry Andric };
6401095a5dSDimitry Andric }
6501095a5dSDimitry Andric 
getSymbolKindName(SymbolKind Kind)66ca089b24SDimitry Andric static StringRef getSymbolKindName(SymbolKind Kind) {
67ca089b24SDimitry Andric   switch (Kind) {
68ca089b24SDimitry Andric #define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
69ca089b24SDimitry Andric   case EnumName:                                                               \
70ca089b24SDimitry Andric     return #Name;
71ca089b24SDimitry Andric #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
72ca089b24SDimitry Andric   default:
73ca089b24SDimitry Andric     break;
74ca089b24SDimitry Andric   }
75ca089b24SDimitry Andric   return "UnknownSym";
76ca089b24SDimitry Andric }
77ca089b24SDimitry Andric 
printLocalVariableAddrRange(const LocalVariableAddrRange & Range,uint32_t RelocationOffset)7801095a5dSDimitry Andric void CVSymbolDumperImpl::printLocalVariableAddrRange(
7901095a5dSDimitry Andric     const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
8001095a5dSDimitry Andric   DictScope S(W, "LocalVariableAddrRange");
8101095a5dSDimitry Andric   if (ObjDelegate)
8201095a5dSDimitry Andric     ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
8301095a5dSDimitry Andric                                      Range.OffsetStart);
8401095a5dSDimitry Andric   W.printHex("ISectStart", Range.ISectStart);
8501095a5dSDimitry Andric   W.printHex("Range", Range.Range);
8601095a5dSDimitry Andric }
8701095a5dSDimitry Andric 
printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps)8801095a5dSDimitry Andric void CVSymbolDumperImpl::printLocalVariableAddrGap(
8901095a5dSDimitry Andric     ArrayRef<LocalVariableAddrGap> Gaps) {
9001095a5dSDimitry Andric   for (auto &Gap : Gaps) {
9101095a5dSDimitry Andric     ListScope S(W, "LocalVariableAddrGap");
9201095a5dSDimitry Andric     W.printHex("GapStartOffset", Gap.GapStartOffset);
9301095a5dSDimitry Andric     W.printHex("Range", Gap.Range);
9401095a5dSDimitry Andric   }
9501095a5dSDimitry Andric }
9601095a5dSDimitry Andric 
printTypeIndex(StringRef FieldName,TypeIndex TI)97581a6d85SDimitry Andric void CVSymbolDumperImpl::printTypeIndex(StringRef FieldName, TypeIndex TI) {
98b5630dbaSDimitry Andric   codeview::printTypeIndex(W, FieldName, TI, Types);
99581a6d85SDimitry Andric }
100581a6d85SDimitry Andric 
visitSymbolBegin(CVSymbol & CVR)101b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitSymbolBegin(CVSymbol &CVR) {
102e6d15924SDimitry Andric   W.startLine() << getSymbolKindName(CVR.kind());
103ca089b24SDimitry Andric   W.getOStream() << " {\n";
104ca089b24SDimitry Andric   W.indent();
105e6d15924SDimitry Andric   W.printEnum("Kind", unsigned(CVR.kind()), getSymbolTypeNames());
106b915e9e0SDimitry Andric   return Error::success();
10701095a5dSDimitry Andric }
10801095a5dSDimitry Andric 
visitSymbolEnd(CVSymbol & CVR)109b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitSymbolEnd(CVSymbol &CVR) {
110b915e9e0SDimitry Andric   if (PrintRecordBytes && ObjDelegate)
111b915e9e0SDimitry Andric     ObjDelegate->printBinaryBlockWithRelocs("SymData", CVR.content());
112ca089b24SDimitry Andric 
113ca089b24SDimitry Andric   W.unindent();
114ca089b24SDimitry Andric   W.startLine() << "}\n";
115b915e9e0SDimitry Andric   return Error::success();
116b915e9e0SDimitry Andric }
117b915e9e0SDimitry Andric 
visitKnownRecord(CVSymbol & CVR,BlockSym & Block)118b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
11901095a5dSDimitry Andric   StringRef LinkageName;
120b915e9e0SDimitry Andric   W.printHex("PtrParent", Block.Parent);
121b915e9e0SDimitry Andric   W.printHex("PtrEnd", Block.End);
122b915e9e0SDimitry Andric   W.printHex("CodeSize", Block.CodeSize);
12301095a5dSDimitry Andric   if (ObjDelegate) {
12401095a5dSDimitry Andric     ObjDelegate->printRelocatedField("CodeOffset", Block.getRelocationOffset(),
125b915e9e0SDimitry Andric                                      Block.CodeOffset, &LinkageName);
12601095a5dSDimitry Andric   }
127b915e9e0SDimitry Andric   W.printHex("Segment", Block.Segment);
12801095a5dSDimitry Andric   W.printString("BlockName", Block.Name);
12901095a5dSDimitry Andric   W.printString("LinkageName", LinkageName);
130b915e9e0SDimitry Andric   return Error::success();
13101095a5dSDimitry Andric }
13201095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,Thunk32Sym & Thunk)133b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
134eb11fae6SDimitry Andric   W.printString("Name", Thunk.Name);
135b915e9e0SDimitry Andric   W.printNumber("Parent", Thunk.Parent);
136b915e9e0SDimitry Andric   W.printNumber("End", Thunk.End);
137b915e9e0SDimitry Andric   W.printNumber("Next", Thunk.Next);
138b915e9e0SDimitry Andric   W.printNumber("Off", Thunk.Offset);
139b915e9e0SDimitry Andric   W.printNumber("Seg", Thunk.Segment);
140b915e9e0SDimitry Andric   W.printNumber("Len", Thunk.Length);
141b915e9e0SDimitry Andric   W.printEnum("Ordinal", uint8_t(Thunk.Thunk), getThunkOrdinalNames());
142b915e9e0SDimitry Andric   return Error::success();
14301095a5dSDimitry Andric }
14401095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,TrampolineSym & Tramp)145b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
14601095a5dSDimitry Andric                                            TrampolineSym &Tramp) {
147b915e9e0SDimitry Andric   W.printEnum("Type", uint16_t(Tramp.Type), getTrampolineNames());
148b915e9e0SDimitry Andric   W.printNumber("Size", Tramp.Size);
149b915e9e0SDimitry Andric   W.printNumber("ThunkOff", Tramp.ThunkOffset);
150b915e9e0SDimitry Andric   W.printNumber("TargetOff", Tramp.TargetOffset);
151b915e9e0SDimitry Andric   W.printNumber("ThunkSection", Tramp.ThunkSection);
152b915e9e0SDimitry Andric   W.printNumber("TargetSection", Tramp.TargetSection);
153b915e9e0SDimitry Andric   return Error::success();
15401095a5dSDimitry Andric }
15501095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,SectionSym & Section)156b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, SectionSym &Section) {
157b915e9e0SDimitry Andric   W.printNumber("SectionNumber", Section.SectionNumber);
158b915e9e0SDimitry Andric   W.printNumber("Alignment", Section.Alignment);
159b915e9e0SDimitry Andric   W.printNumber("Rva", Section.Rva);
160b915e9e0SDimitry Andric   W.printNumber("Length", Section.Length);
161b915e9e0SDimitry Andric   W.printFlags("Characteristics", Section.Characteristics,
16201095a5dSDimitry Andric                getImageSectionCharacteristicNames(),
16301095a5dSDimitry Andric                COFF::SectionCharacteristics(0x00F00000));
16401095a5dSDimitry Andric 
16501095a5dSDimitry Andric   W.printString("Name", Section.Name);
166b915e9e0SDimitry Andric   return Error::success();
16701095a5dSDimitry Andric }
16801095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,CoffGroupSym & CoffGroup)169b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
17001095a5dSDimitry Andric                                            CoffGroupSym &CoffGroup) {
171b915e9e0SDimitry Andric   W.printNumber("Size", CoffGroup.Size);
172b915e9e0SDimitry Andric   W.printFlags("Characteristics", CoffGroup.Characteristics,
17301095a5dSDimitry Andric                getImageSectionCharacteristicNames(),
17401095a5dSDimitry Andric                COFF::SectionCharacteristics(0x00F00000));
175b915e9e0SDimitry Andric   W.printNumber("Offset", CoffGroup.Offset);
176b915e9e0SDimitry Andric   W.printNumber("Segment", CoffGroup.Segment);
17701095a5dSDimitry Andric   W.printString("Name", CoffGroup.Name);
178b915e9e0SDimitry Andric   return Error::success();
17901095a5dSDimitry Andric }
18001095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,BPRelativeSym & BPRel)181b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
18201095a5dSDimitry Andric                                            BPRelativeSym &BPRel) {
183b915e9e0SDimitry Andric   W.printNumber("Offset", BPRel.Offset);
184581a6d85SDimitry Andric   printTypeIndex("Type", BPRel.Type);
18501095a5dSDimitry Andric   W.printString("VarName", BPRel.Name);
186b915e9e0SDimitry Andric   return Error::success();
18701095a5dSDimitry Andric }
18801095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,BuildInfoSym & BuildInfo)189b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
19001095a5dSDimitry Andric                                            BuildInfoSym &BuildInfo) {
19193c91e39SDimitry Andric   printTypeIndex("BuildId", BuildInfo.BuildId);
192b915e9e0SDimitry Andric   return Error::success();
19301095a5dSDimitry Andric }
19401095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,CallSiteInfoSym & CallSiteInfo)195b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
19601095a5dSDimitry Andric                                            CallSiteInfoSym &CallSiteInfo) {
19701095a5dSDimitry Andric   StringRef LinkageName;
19801095a5dSDimitry Andric   if (ObjDelegate) {
199b915e9e0SDimitry Andric     ObjDelegate->printRelocatedField("CodeOffset",
200b915e9e0SDimitry Andric                                      CallSiteInfo.getRelocationOffset(),
201b915e9e0SDimitry Andric                                      CallSiteInfo.CodeOffset, &LinkageName);
20201095a5dSDimitry Andric   }
203b915e9e0SDimitry Andric   W.printHex("Segment", CallSiteInfo.Segment);
204581a6d85SDimitry Andric   printTypeIndex("Type", CallSiteInfo.Type);
20501095a5dSDimitry Andric   if (!LinkageName.empty())
20601095a5dSDimitry Andric     W.printString("LinkageName", LinkageName);
207b915e9e0SDimitry Andric   return Error::success();
20801095a5dSDimitry Andric }
20901095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,EnvBlockSym & EnvBlock)210b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
21101095a5dSDimitry Andric                                            EnvBlockSym &EnvBlock) {
21201095a5dSDimitry Andric   ListScope L(W, "Entries");
21301095a5dSDimitry Andric   for (auto Entry : EnvBlock.Fields) {
21401095a5dSDimitry Andric     W.printString(Entry);
21501095a5dSDimitry Andric   }
216b915e9e0SDimitry Andric   return Error::success();
21701095a5dSDimitry Andric }
21801095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,FileStaticSym & FileStatic)219b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
22001095a5dSDimitry Andric                                            FileStaticSym &FileStatic) {
2217c7aba6eSDimitry Andric   printTypeIndex("Index", FileStatic.Index);
222b915e9e0SDimitry Andric   W.printNumber("ModFilenameOffset", FileStatic.ModFilenameOffset);
223b915e9e0SDimitry Andric   W.printFlags("Flags", uint16_t(FileStatic.Flags), getLocalFlagNames());
22401095a5dSDimitry Andric   W.printString("Name", FileStatic.Name);
225b915e9e0SDimitry Andric   return Error::success();
22601095a5dSDimitry Andric }
22701095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ExportSym & Export)228b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
229b915e9e0SDimitry Andric   W.printNumber("Ordinal", Export.Ordinal);
230b915e9e0SDimitry Andric   W.printFlags("Flags", uint16_t(Export.Flags), getExportSymFlagNames());
23101095a5dSDimitry Andric   W.printString("Name", Export.Name);
232b915e9e0SDimitry Andric   return Error::success();
23301095a5dSDimitry Andric }
23401095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,Compile2Sym & Compile2)235b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
23601095a5dSDimitry Andric                                            Compile2Sym &Compile2) {
237b915e9e0SDimitry Andric   W.printEnum("Language", Compile2.getLanguage(), getSourceLanguageNames());
238b915e9e0SDimitry Andric   W.printFlags("Flags", Compile2.getFlags(), getCompileSym2FlagNames());
239b915e9e0SDimitry Andric   W.printEnum("Machine", unsigned(Compile2.Machine), getCPUTypeNames());
240d8e91e46SDimitry Andric   CompilationCPUType = Compile2.Machine;
24101095a5dSDimitry Andric   std::string FrontendVersion;
24201095a5dSDimitry Andric   {
24301095a5dSDimitry Andric     raw_string_ostream Out(FrontendVersion);
244b915e9e0SDimitry Andric     Out << Compile2.VersionFrontendMajor << '.' << Compile2.VersionFrontendMinor
245b915e9e0SDimitry Andric         << '.' << Compile2.VersionFrontendBuild;
24601095a5dSDimitry Andric   }
24701095a5dSDimitry Andric   std::string BackendVersion;
24801095a5dSDimitry Andric   {
24901095a5dSDimitry Andric     raw_string_ostream Out(BackendVersion);
250b915e9e0SDimitry Andric     Out << Compile2.VersionBackendMajor << '.' << Compile2.VersionBackendMinor
251b915e9e0SDimitry Andric         << '.' << Compile2.VersionBackendBuild;
25201095a5dSDimitry Andric   }
25301095a5dSDimitry Andric   W.printString("FrontendVersion", FrontendVersion);
25401095a5dSDimitry Andric   W.printString("BackendVersion", BackendVersion);
25501095a5dSDimitry Andric   W.printString("VersionName", Compile2.Version);
256b915e9e0SDimitry Andric   return Error::success();
25701095a5dSDimitry Andric }
25801095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,Compile3Sym & Compile3)259b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
26001095a5dSDimitry Andric                                            Compile3Sym &Compile3) {
261d8e91e46SDimitry Andric   W.printEnum("Language", uint8_t(Compile3.getLanguage()), getSourceLanguageNames());
262d8e91e46SDimitry Andric   W.printFlags("Flags", uint32_t(Compile3.getFlags()),
263d8e91e46SDimitry Andric                getCompileSym3FlagNames());
264b915e9e0SDimitry Andric   W.printEnum("Machine", unsigned(Compile3.Machine), getCPUTypeNames());
265d8e91e46SDimitry Andric   CompilationCPUType = Compile3.Machine;
26601095a5dSDimitry Andric   std::string FrontendVersion;
26701095a5dSDimitry Andric   {
26801095a5dSDimitry Andric     raw_string_ostream Out(FrontendVersion);
269b915e9e0SDimitry Andric     Out << Compile3.VersionFrontendMajor << '.' << Compile3.VersionFrontendMinor
270b915e9e0SDimitry Andric         << '.' << Compile3.VersionFrontendBuild << '.'
271b915e9e0SDimitry Andric         << Compile3.VersionFrontendQFE;
27201095a5dSDimitry Andric   }
27301095a5dSDimitry Andric   std::string BackendVersion;
27401095a5dSDimitry Andric   {
27501095a5dSDimitry Andric     raw_string_ostream Out(BackendVersion);
276b915e9e0SDimitry Andric     Out << Compile3.VersionBackendMajor << '.' << Compile3.VersionBackendMinor
277b915e9e0SDimitry Andric         << '.' << Compile3.VersionBackendBuild << '.'
278b915e9e0SDimitry Andric         << Compile3.VersionBackendQFE;
27901095a5dSDimitry Andric   }
28001095a5dSDimitry Andric   W.printString("FrontendVersion", FrontendVersion);
28101095a5dSDimitry Andric   W.printString("BackendVersion", BackendVersion);
28201095a5dSDimitry Andric   W.printString("VersionName", Compile3.Version);
283b915e9e0SDimitry Andric   return Error::success();
28401095a5dSDimitry Andric }
28501095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ConstantSym & Constant)286b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
28701095a5dSDimitry Andric                                            ConstantSym &Constant) {
288581a6d85SDimitry Andric   printTypeIndex("Type", Constant.Type);
28901095a5dSDimitry Andric   W.printNumber("Value", Constant.Value);
29001095a5dSDimitry Andric   W.printString("Name", Constant.Name);
291b915e9e0SDimitry Andric   return Error::success();
29201095a5dSDimitry Andric }
29301095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DataSym & Data)294b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
29501095a5dSDimitry Andric   StringRef LinkageName;
29601095a5dSDimitry Andric   if (ObjDelegate) {
29701095a5dSDimitry Andric     ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
298b915e9e0SDimitry Andric                                      Data.DataOffset, &LinkageName);
29901095a5dSDimitry Andric   }
300581a6d85SDimitry Andric   printTypeIndex("Type", Data.Type);
30101095a5dSDimitry Andric   W.printString("DisplayName", Data.Name);
30201095a5dSDimitry Andric   if (!LinkageName.empty())
30301095a5dSDimitry Andric     W.printString("LinkageName", LinkageName);
304b915e9e0SDimitry Andric   return Error::success();
30501095a5dSDimitry Andric }
30601095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeFramePointerRelFullScopeSym & DefRangeFramePointerRelFullScope)307b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(
308b915e9e0SDimitry Andric     CVSymbol &CVR,
30901095a5dSDimitry Andric     DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
310b915e9e0SDimitry Andric   W.printNumber("Offset", DefRangeFramePointerRelFullScope.Offset);
311b915e9e0SDimitry Andric   return Error::success();
31201095a5dSDimitry Andric }
31301095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeFramePointerRelSym & DefRangeFramePointerRel)314b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(
315b915e9e0SDimitry Andric     CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
3161d5ae102SDimitry Andric   W.printNumber("Offset", DefRangeFramePointerRel.Hdr.Offset);
317b915e9e0SDimitry Andric   printLocalVariableAddrRange(DefRangeFramePointerRel.Range,
31801095a5dSDimitry Andric                               DefRangeFramePointerRel.getRelocationOffset());
31901095a5dSDimitry Andric   printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
320b915e9e0SDimitry Andric   return Error::success();
32101095a5dSDimitry Andric }
32201095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeRegisterRelSym & DefRangeRegisterRel)323b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(
324b915e9e0SDimitry Andric     CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
325044eb2f6SDimitry Andric   W.printEnum("BaseRegister", uint16_t(DefRangeRegisterRel.Hdr.Register),
326e6d15924SDimitry Andric               getRegisterNames(CompilationCPUType));
32701095a5dSDimitry Andric   W.printBoolean("HasSpilledUDTMember",
32801095a5dSDimitry Andric                  DefRangeRegisterRel.hasSpilledUDTMember());
32901095a5dSDimitry Andric   W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
330b915e9e0SDimitry Andric   W.printNumber("BasePointerOffset", DefRangeRegisterRel.Hdr.BasePointerOffset);
331b915e9e0SDimitry Andric   printLocalVariableAddrRange(DefRangeRegisterRel.Range,
33201095a5dSDimitry Andric                               DefRangeRegisterRel.getRelocationOffset());
33301095a5dSDimitry Andric   printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
334b915e9e0SDimitry Andric   return Error::success();
33501095a5dSDimitry Andric }
33601095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeRegisterSym & DefRangeRegister)337b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(
338b915e9e0SDimitry Andric     CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
339044eb2f6SDimitry Andric   W.printEnum("Register", uint16_t(DefRangeRegister.Hdr.Register),
340e6d15924SDimitry Andric               getRegisterNames(CompilationCPUType));
341b915e9e0SDimitry Andric   W.printNumber("MayHaveNoName", DefRangeRegister.Hdr.MayHaveNoName);
342b915e9e0SDimitry Andric   printLocalVariableAddrRange(DefRangeRegister.Range,
34301095a5dSDimitry Andric                               DefRangeRegister.getRelocationOffset());
34401095a5dSDimitry Andric   printLocalVariableAddrGap(DefRangeRegister.Gaps);
345b915e9e0SDimitry Andric   return Error::success();
34601095a5dSDimitry Andric }
34701095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeSubfieldRegisterSym & DefRangeSubfieldRegister)348b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(
349b915e9e0SDimitry Andric     CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
350044eb2f6SDimitry Andric   W.printEnum("Register", uint16_t(DefRangeSubfieldRegister.Hdr.Register),
351e6d15924SDimitry Andric               getRegisterNames(CompilationCPUType));
352b915e9e0SDimitry Andric   W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Hdr.MayHaveNoName);
353b915e9e0SDimitry Andric   W.printNumber("OffsetInParent", DefRangeSubfieldRegister.Hdr.OffsetInParent);
354b915e9e0SDimitry Andric   printLocalVariableAddrRange(DefRangeSubfieldRegister.Range,
35501095a5dSDimitry Andric                               DefRangeSubfieldRegister.getRelocationOffset());
35601095a5dSDimitry Andric   printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
357b915e9e0SDimitry Andric   return Error::success();
35801095a5dSDimitry Andric }
35901095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeSubfieldSym & DefRangeSubfield)360b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(
361b915e9e0SDimitry Andric     CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
36201095a5dSDimitry Andric   if (ObjDelegate) {
363ee2f195dSDimitry Andric     DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();
364148779dfSDimitry Andric     auto ExpectedProgram = Strings.getString(DefRangeSubfield.Program);
365148779dfSDimitry Andric     if (!ExpectedProgram) {
366148779dfSDimitry Andric       consumeError(ExpectedProgram.takeError());
367b915e9e0SDimitry Andric       return llvm::make_error<CodeViewError>(
368b915e9e0SDimitry Andric           "String table offset outside of bounds of String Table!");
369148779dfSDimitry Andric     }
370148779dfSDimitry Andric     W.printString("Program", *ExpectedProgram);
37101095a5dSDimitry Andric   }
372b915e9e0SDimitry Andric   W.printNumber("OffsetInParent", DefRangeSubfield.OffsetInParent);
373b915e9e0SDimitry Andric   printLocalVariableAddrRange(DefRangeSubfield.Range,
37401095a5dSDimitry Andric                               DefRangeSubfield.getRelocationOffset());
37501095a5dSDimitry Andric   printLocalVariableAddrGap(DefRangeSubfield.Gaps);
376b915e9e0SDimitry Andric   return Error::success();
37701095a5dSDimitry Andric }
37801095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,DefRangeSym & DefRange)379b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
38001095a5dSDimitry Andric                                            DefRangeSym &DefRange) {
38101095a5dSDimitry Andric   if (ObjDelegate) {
382ee2f195dSDimitry Andric     DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();
383148779dfSDimitry Andric     auto ExpectedProgram = Strings.getString(DefRange.Program);
384148779dfSDimitry Andric     if (!ExpectedProgram) {
385148779dfSDimitry Andric       consumeError(ExpectedProgram.takeError());
386b915e9e0SDimitry Andric       return llvm::make_error<CodeViewError>(
387b915e9e0SDimitry Andric           "String table offset outside of bounds of String Table!");
388148779dfSDimitry Andric     }
389148779dfSDimitry Andric     W.printString("Program", *ExpectedProgram);
39001095a5dSDimitry Andric   }
391b915e9e0SDimitry Andric   printLocalVariableAddrRange(DefRange.Range, DefRange.getRelocationOffset());
39201095a5dSDimitry Andric   printLocalVariableAddrGap(DefRange.Gaps);
393b915e9e0SDimitry Andric   return Error::success();
39401095a5dSDimitry Andric }
39501095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,FrameCookieSym & FrameCookie)396b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
39701095a5dSDimitry Andric                                            FrameCookieSym &FrameCookie) {
39801095a5dSDimitry Andric   StringRef LinkageName;
39901095a5dSDimitry Andric   if (ObjDelegate) {
400b915e9e0SDimitry Andric     ObjDelegate->printRelocatedField("CodeOffset",
401b915e9e0SDimitry Andric                                      FrameCookie.getRelocationOffset(),
402b915e9e0SDimitry Andric                                      FrameCookie.CodeOffset, &LinkageName);
40301095a5dSDimitry Andric   }
404e6d15924SDimitry Andric   W.printEnum("Register", uint16_t(FrameCookie.Register),
405e6d15924SDimitry Andric               getRegisterNames(CompilationCPUType));
406b915e9e0SDimitry Andric   W.printEnum("CookieKind", uint16_t(FrameCookie.CookieKind),
40701095a5dSDimitry Andric               getFrameCookieKindNames());
408b915e9e0SDimitry Andric   W.printHex("Flags", FrameCookie.Flags);
409b915e9e0SDimitry Andric   return Error::success();
41001095a5dSDimitry Andric }
41101095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,FrameProcSym & FrameProc)412b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
41301095a5dSDimitry Andric                                            FrameProcSym &FrameProc) {
414b915e9e0SDimitry Andric   W.printHex("TotalFrameBytes", FrameProc.TotalFrameBytes);
415b915e9e0SDimitry Andric   W.printHex("PaddingFrameBytes", FrameProc.PaddingFrameBytes);
416b915e9e0SDimitry Andric   W.printHex("OffsetToPadding", FrameProc.OffsetToPadding);
41701095a5dSDimitry Andric   W.printHex("BytesOfCalleeSavedRegisters",
418b915e9e0SDimitry Andric              FrameProc.BytesOfCalleeSavedRegisters);
419b915e9e0SDimitry Andric   W.printHex("OffsetOfExceptionHandler", FrameProc.OffsetOfExceptionHandler);
42001095a5dSDimitry Andric   W.printHex("SectionIdOfExceptionHandler",
421b915e9e0SDimitry Andric              FrameProc.SectionIdOfExceptionHandler);
422b915e9e0SDimitry Andric   W.printFlags("Flags", static_cast<uint32_t>(FrameProc.Flags),
423b915e9e0SDimitry Andric                getFrameProcSymFlagNames());
424d8e91e46SDimitry Andric   W.printEnum("LocalFramePtrReg",
425d8e91e46SDimitry Andric               uint16_t(FrameProc.getLocalFramePtrReg(CompilationCPUType)),
426e6d15924SDimitry Andric               getRegisterNames(CompilationCPUType));
427d8e91e46SDimitry Andric   W.printEnum("ParamFramePtrReg",
428d8e91e46SDimitry Andric               uint16_t(FrameProc.getParamFramePtrReg(CompilationCPUType)),
429e6d15924SDimitry Andric               getRegisterNames(CompilationCPUType));
430b915e9e0SDimitry Andric   return Error::success();
43101095a5dSDimitry Andric }
43201095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,HeapAllocationSiteSym & HeapAllocSite)433b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(
434b915e9e0SDimitry Andric     CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
43501095a5dSDimitry Andric   StringRef LinkageName;
43601095a5dSDimitry Andric   if (ObjDelegate) {
437b915e9e0SDimitry Andric     ObjDelegate->printRelocatedField("CodeOffset",
438b915e9e0SDimitry Andric                                      HeapAllocSite.getRelocationOffset(),
439b915e9e0SDimitry Andric                                      HeapAllocSite.CodeOffset, &LinkageName);
44001095a5dSDimitry Andric   }
441b915e9e0SDimitry Andric   W.printHex("Segment", HeapAllocSite.Segment);
442b915e9e0SDimitry Andric   W.printHex("CallInstructionSize", HeapAllocSite.CallInstructionSize);
443581a6d85SDimitry Andric   printTypeIndex("Type", HeapAllocSite.Type);
44401095a5dSDimitry Andric   if (!LinkageName.empty())
44501095a5dSDimitry Andric     W.printString("LinkageName", LinkageName);
446b915e9e0SDimitry Andric   return Error::success();
44701095a5dSDimitry Andric }
44801095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,InlineSiteSym & InlineSite)449b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
45001095a5dSDimitry Andric                                            InlineSiteSym &InlineSite) {
451b915e9e0SDimitry Andric   W.printHex("PtrParent", InlineSite.Parent);
452b915e9e0SDimitry Andric   W.printHex("PtrEnd", InlineSite.End);
453581a6d85SDimitry Andric   printTypeIndex("Inlinee", InlineSite.Inlinee);
45401095a5dSDimitry Andric 
45501095a5dSDimitry Andric   ListScope BinaryAnnotations(W, "BinaryAnnotations");
45601095a5dSDimitry Andric   for (auto &Annotation : InlineSite.annotations()) {
45701095a5dSDimitry Andric     switch (Annotation.OpCode) {
45801095a5dSDimitry Andric     case BinaryAnnotationsOpCode::Invalid:
45971d5a254SDimitry Andric       W.printString("(Annotation Padding)");
46071d5a254SDimitry Andric       break;
46101095a5dSDimitry Andric     case BinaryAnnotationsOpCode::CodeOffset:
46201095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeCodeOffset:
46301095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeCodeLength:
46401095a5dSDimitry Andric       W.printHex(Annotation.Name, Annotation.U1);
46501095a5dSDimitry Andric       break;
46601095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
46701095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeLineEndDelta:
46801095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeRangeKind:
46901095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeColumnStart:
47001095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeColumnEnd:
47101095a5dSDimitry Andric       W.printNumber(Annotation.Name, Annotation.U1);
47201095a5dSDimitry Andric       break;
47301095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeLineOffset:
47401095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
47501095a5dSDimitry Andric       W.printNumber(Annotation.Name, Annotation.S1);
47601095a5dSDimitry Andric       break;
47701095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeFile:
47801095a5dSDimitry Andric       if (ObjDelegate) {
47901095a5dSDimitry Andric         W.printHex("ChangeFile",
48001095a5dSDimitry Andric                    ObjDelegate->getFileNameForFileOffset(Annotation.U1),
48101095a5dSDimitry Andric                    Annotation.U1);
48201095a5dSDimitry Andric       } else {
48301095a5dSDimitry Andric         W.printHex("ChangeFile", Annotation.U1);
48401095a5dSDimitry Andric       }
48501095a5dSDimitry Andric 
48601095a5dSDimitry Andric       break;
48701095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
48801095a5dSDimitry Andric       W.startLine() << "ChangeCodeOffsetAndLineOffset: {CodeOffset: "
48901095a5dSDimitry Andric                     << W.hex(Annotation.U1) << ", LineOffset: " << Annotation.S1
49001095a5dSDimitry Andric                     << "}\n";
49101095a5dSDimitry Andric       break;
49201095a5dSDimitry Andric     }
49301095a5dSDimitry Andric     case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
49401095a5dSDimitry Andric       W.startLine() << "ChangeCodeLengthAndCodeOffset: {CodeOffset: "
49501095a5dSDimitry Andric                     << W.hex(Annotation.U2)
49601095a5dSDimitry Andric                     << ", Length: " << W.hex(Annotation.U1) << "}\n";
49701095a5dSDimitry Andric       break;
49801095a5dSDimitry Andric     }
49901095a5dSDimitry Andric     }
50001095a5dSDimitry Andric   }
501b915e9e0SDimitry Andric   return Error::success();
50201095a5dSDimitry Andric }
50301095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,RegisterSym & Register)504b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
50501095a5dSDimitry Andric                                            RegisterSym &Register) {
5067c7aba6eSDimitry Andric   printTypeIndex("Type", Register.Index);
507e6d15924SDimitry Andric   W.printEnum("Seg", uint16_t(Register.Register),
508e6d15924SDimitry Andric               getRegisterNames(CompilationCPUType));
50901095a5dSDimitry Andric   W.printString("Name", Register.Name);
510b915e9e0SDimitry Andric   return Error::success();
51101095a5dSDimitry Andric }
51201095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,PublicSym32 & Public)513b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) {
51408bbd35aSDimitry Andric   W.printFlags("Flags", uint32_t(Public.Flags), getPublicSymFlagNames());
515b915e9e0SDimitry Andric   W.printNumber("Seg", Public.Segment);
516b915e9e0SDimitry Andric   W.printNumber("Off", Public.Offset);
51701095a5dSDimitry Andric   W.printString("Name", Public.Name);
518b915e9e0SDimitry Andric   return Error::success();
51901095a5dSDimitry Andric }
52001095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ProcRefSym & ProcRef)521b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcRefSym &ProcRef) {
522b915e9e0SDimitry Andric   W.printNumber("SumName", ProcRef.SumName);
523b915e9e0SDimitry Andric   W.printNumber("SymOffset", ProcRef.SymOffset);
524b915e9e0SDimitry Andric   W.printNumber("Mod", ProcRef.Module);
52501095a5dSDimitry Andric   W.printString("Name", ProcRef.Name);
526b915e9e0SDimitry Andric   return Error::success();
52701095a5dSDimitry Andric }
52801095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,LabelSym & Label)529b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
53001095a5dSDimitry Andric   StringRef LinkageName;
53101095a5dSDimitry Andric   if (ObjDelegate) {
53201095a5dSDimitry Andric     ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(),
533b915e9e0SDimitry Andric                                      Label.CodeOffset, &LinkageName);
53401095a5dSDimitry Andric   }
535b915e9e0SDimitry Andric   W.printHex("Segment", Label.Segment);
536b915e9e0SDimitry Andric   W.printHex("Flags", uint8_t(Label.Flags));
537b915e9e0SDimitry Andric   W.printFlags("Flags", uint8_t(Label.Flags), getProcSymFlagNames());
53801095a5dSDimitry Andric   W.printString("DisplayName", Label.Name);
53901095a5dSDimitry Andric   if (!LinkageName.empty())
54001095a5dSDimitry Andric     W.printString("LinkageName", LinkageName);
541b915e9e0SDimitry Andric   return Error::success();
54201095a5dSDimitry Andric }
54301095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,LocalSym & Local)544b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
545581a6d85SDimitry Andric   printTypeIndex("Type", Local.Type);
546b915e9e0SDimitry Andric   W.printFlags("Flags", uint16_t(Local.Flags), getLocalFlagNames());
54701095a5dSDimitry Andric   W.printString("VarName", Local.Name);
548b915e9e0SDimitry Andric   return Error::success();
54901095a5dSDimitry Andric }
55001095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ObjNameSym & ObjName)551b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ObjNameSym &ObjName) {
552b915e9e0SDimitry Andric   W.printHex("Signature", ObjName.Signature);
55301095a5dSDimitry Andric   W.printString("ObjectName", ObjName.Name);
554b915e9e0SDimitry Andric   return Error::success();
55501095a5dSDimitry Andric }
55601095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ProcSym & Proc)557b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
55801095a5dSDimitry Andric   if (InFunctionScope)
559b915e9e0SDimitry Andric     return llvm::make_error<CodeViewError>(
560b915e9e0SDimitry Andric         "Visiting a ProcSym while inside function scope!");
56101095a5dSDimitry Andric 
56201095a5dSDimitry Andric   InFunctionScope = true;
56301095a5dSDimitry Andric 
56401095a5dSDimitry Andric   StringRef LinkageName;
565b915e9e0SDimitry Andric   W.printHex("PtrParent", Proc.Parent);
566b915e9e0SDimitry Andric   W.printHex("PtrEnd", Proc.End);
567b915e9e0SDimitry Andric   W.printHex("PtrNext", Proc.Next);
568b915e9e0SDimitry Andric   W.printHex("CodeSize", Proc.CodeSize);
569b915e9e0SDimitry Andric   W.printHex("DbgStart", Proc.DbgStart);
570b915e9e0SDimitry Andric   W.printHex("DbgEnd", Proc.DbgEnd);
571581a6d85SDimitry Andric   printTypeIndex("FunctionType", Proc.FunctionType);
57201095a5dSDimitry Andric   if (ObjDelegate) {
57301095a5dSDimitry Andric     ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(),
574b915e9e0SDimitry Andric                                      Proc.CodeOffset, &LinkageName);
57501095a5dSDimitry Andric   }
576b915e9e0SDimitry Andric   W.printHex("Segment", Proc.Segment);
577b915e9e0SDimitry Andric   W.printFlags("Flags", static_cast<uint8_t>(Proc.Flags),
57801095a5dSDimitry Andric                getProcSymFlagNames());
57901095a5dSDimitry Andric   W.printString("DisplayName", Proc.Name);
58001095a5dSDimitry Andric   if (!LinkageName.empty())
58101095a5dSDimitry Andric     W.printString("LinkageName", LinkageName);
582b915e9e0SDimitry Andric   return Error::success();
58301095a5dSDimitry Andric }
58401095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ScopeEndSym & ScopeEnd)585b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
58601095a5dSDimitry Andric                                            ScopeEndSym &ScopeEnd) {
58701095a5dSDimitry Andric   InFunctionScope = false;
588b915e9e0SDimitry Andric   return Error::success();
58901095a5dSDimitry Andric }
59001095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,CallerSym & Caller)591b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
592b1c73532SDimitry Andric   llvm::StringRef ScopeName;
593b1c73532SDimitry Andric   switch (CVR.kind()) {
594b1c73532SDimitry Andric   case S_CALLEES:
595b1c73532SDimitry Andric     ScopeName = "Callees";
596b1c73532SDimitry Andric     break;
597b1c73532SDimitry Andric   case S_CALLERS:
598b1c73532SDimitry Andric     ScopeName = "Callers";
599b1c73532SDimitry Andric     break;
600b1c73532SDimitry Andric   case S_INLINEES:
601b1c73532SDimitry Andric     ScopeName = "Inlinees";
602b1c73532SDimitry Andric     break;
603b1c73532SDimitry Andric   default:
604b1c73532SDimitry Andric     return llvm::make_error<CodeViewError>(
605b1c73532SDimitry Andric         "Unknown CV Record type for a CallerSym object!");
606b1c73532SDimitry Andric   }
607b1c73532SDimitry Andric   ListScope S(W, ScopeName);
60801095a5dSDimitry Andric   for (auto FuncID : Caller.Indices)
609581a6d85SDimitry Andric     printTypeIndex("FuncID", FuncID);
610b915e9e0SDimitry Andric   return Error::success();
61101095a5dSDimitry Andric }
61201095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,RegRelativeSym & RegRel)613b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
61401095a5dSDimitry Andric                                            RegRelativeSym &RegRel) {
615b915e9e0SDimitry Andric   W.printHex("Offset", RegRel.Offset);
616581a6d85SDimitry Andric   printTypeIndex("Type", RegRel.Type);
617e6d15924SDimitry Andric   W.printEnum("Register", uint16_t(RegRel.Register),
618e6d15924SDimitry Andric               getRegisterNames(CompilationCPUType));
61901095a5dSDimitry Andric   W.printString("VarName", RegRel.Name);
620b915e9e0SDimitry Andric   return Error::success();
62101095a5dSDimitry Andric }
62201095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,ThreadLocalDataSym & Data)623b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
62401095a5dSDimitry Andric                                            ThreadLocalDataSym &Data) {
62501095a5dSDimitry Andric   StringRef LinkageName;
62601095a5dSDimitry Andric   if (ObjDelegate) {
62701095a5dSDimitry Andric     ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
628b915e9e0SDimitry Andric                                      Data.DataOffset, &LinkageName);
62901095a5dSDimitry Andric   }
630581a6d85SDimitry Andric   printTypeIndex("Type", Data.Type);
63101095a5dSDimitry Andric   W.printString("DisplayName", Data.Name);
63201095a5dSDimitry Andric   if (!LinkageName.empty())
63301095a5dSDimitry Andric     W.printString("LinkageName", LinkageName);
634b915e9e0SDimitry Andric   return Error::success();
63501095a5dSDimitry Andric }
63601095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,UDTSym & UDT)637b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
638581a6d85SDimitry Andric   printTypeIndex("Type", UDT.Type);
63901095a5dSDimitry Andric   W.printString("UDTName", UDT.Name);
640b915e9e0SDimitry Andric   return Error::success();
64101095a5dSDimitry Andric }
64201095a5dSDimitry Andric 
visitKnownRecord(CVSymbol & CVR,UsingNamespaceSym & UN)643b7eb8e35SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
644b7eb8e35SDimitry Andric                                            UsingNamespaceSym &UN) {
645b7eb8e35SDimitry Andric   W.printString("Namespace", UN.Name);
646b7eb8e35SDimitry Andric   return Error::success();
647b7eb8e35SDimitry Andric }
648b7eb8e35SDimitry Andric 
visitKnownRecord(CVSymbol & CVR,AnnotationSym & Annot)649e6d15924SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
650e6d15924SDimitry Andric                                            AnnotationSym &Annot) {
651e6d15924SDimitry Andric   W.printHex("Offset", Annot.CodeOffset);
652e6d15924SDimitry Andric   W.printHex("Segment", Annot.Segment);
653e6d15924SDimitry Andric 
654e6d15924SDimitry Andric   ListScope S(W, "Strings");
655e6d15924SDimitry Andric   for (StringRef Str : Annot.Strings)
656e6d15924SDimitry Andric     W.printString(Str);
657e6d15924SDimitry Andric 
658e6d15924SDimitry Andric   return Error::success();
659e6d15924SDimitry Andric }
660e6d15924SDimitry Andric 
visitKnownRecord(CVSymbol & CVR,JumpTableSym & JumpTable)661b1c73532SDimitry Andric Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
662b1c73532SDimitry Andric                                            JumpTableSym &JumpTable) {
663b1c73532SDimitry Andric   W.printHex("BaseOffset", JumpTable.BaseOffset);
664b1c73532SDimitry Andric   W.printNumber("BaseSegment", JumpTable.BaseSegment);
665b1c73532SDimitry Andric   W.printEnum("SwitchType", static_cast<uint16_t>(JumpTable.SwitchType),
666b1c73532SDimitry Andric               getJumpTableEntrySizeNames());
667b1c73532SDimitry Andric   W.printHex("BranchOffset", JumpTable.BranchOffset);
668b1c73532SDimitry Andric   W.printHex("TableOffset", JumpTable.TableOffset);
669b1c73532SDimitry Andric   W.printNumber("BranchSegment", JumpTable.BranchSegment);
670b1c73532SDimitry Andric   W.printNumber("TableSegment", JumpTable.TableSegment);
671b1c73532SDimitry Andric   W.printNumber("EntriesCount", JumpTable.EntriesCount);
672b1c73532SDimitry Andric   return Error::success();
673b1c73532SDimitry Andric }
674b1c73532SDimitry Andric 
visitUnknownSymbol(CVSymbol & CVR)675b915e9e0SDimitry Andric Error CVSymbolDumperImpl::visitUnknownSymbol(CVSymbol &CVR) {
676b915e9e0SDimitry Andric   W.printNumber("Length", CVR.length());
677b915e9e0SDimitry Andric   return Error::success();
67801095a5dSDimitry Andric }
67901095a5dSDimitry Andric 
dump(CVRecord<SymbolKind> & Record)680b915e9e0SDimitry Andric Error CVSymbolDumper::dump(CVRecord<SymbolKind> &Record) {
681b915e9e0SDimitry Andric   SymbolVisitorCallbackPipeline Pipeline;
682d288ef4cSDimitry Andric   SymbolDeserializer Deserializer(ObjDelegate.get(), Container);
683d8e91e46SDimitry Andric   CVSymbolDumperImpl Dumper(Types, ObjDelegate.get(), W, CompilationCPUType,
684d8e91e46SDimitry Andric                             PrintRecordBytes);
685b915e9e0SDimitry Andric 
686b915e9e0SDimitry Andric   Pipeline.addCallbackToPipeline(Deserializer);
687b915e9e0SDimitry Andric   Pipeline.addCallbackToPipeline(Dumper);
688b915e9e0SDimitry Andric   CVSymbolVisitor Visitor(Pipeline);
689d8e91e46SDimitry Andric   auto Err = Visitor.visitSymbolRecord(Record);
690d8e91e46SDimitry Andric   CompilationCPUType = Dumper.getCompilationCPUType();
691d8e91e46SDimitry Andric   return Err;
69201095a5dSDimitry Andric }
69301095a5dSDimitry Andric 
dump(const CVSymbolArray & Symbols)694b915e9e0SDimitry Andric Error CVSymbolDumper::dump(const CVSymbolArray &Symbols) {
695b915e9e0SDimitry Andric   SymbolVisitorCallbackPipeline Pipeline;
696d288ef4cSDimitry Andric   SymbolDeserializer Deserializer(ObjDelegate.get(), Container);
697d8e91e46SDimitry Andric   CVSymbolDumperImpl Dumper(Types, ObjDelegate.get(), W, CompilationCPUType,
698d8e91e46SDimitry Andric                             PrintRecordBytes);
699b915e9e0SDimitry Andric 
700b915e9e0SDimitry Andric   Pipeline.addCallbackToPipeline(Deserializer);
701b915e9e0SDimitry Andric   Pipeline.addCallbackToPipeline(Dumper);
702b915e9e0SDimitry Andric   CVSymbolVisitor Visitor(Pipeline);
703d8e91e46SDimitry Andric   auto Err = Visitor.visitSymbolStream(Symbols);
704d8e91e46SDimitry Andric   CompilationCPUType = Dumper.getCompilationCPUType();
705d8e91e46SDimitry Andric   return Err;
70601095a5dSDimitry Andric }
707