1aaad5744SZachary Turner //===-- SymbolDumper.cpp - CodeView symbol info dumper ----------*- C++ -*-===//
2aaad5744SZachary Turner //
3aaad5744SZachary Turner //                     The LLVM Compiler Infrastructure
4aaad5744SZachary Turner //
5aaad5744SZachary Turner // This file is distributed under the University of Illinois Open Source
6aaad5744SZachary Turner // License. See LICENSE.TXT for details.
7aaad5744SZachary Turner //
8aaad5744SZachary Turner //===----------------------------------------------------------------------===//
9aaad5744SZachary Turner 
10aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolDumper.h"
11aaad5744SZachary Turner #include "llvm/ADT/DenseMap.h"
12aaad5744SZachary Turner #include "llvm/ADT/SmallString.h"
13aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
14aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
15aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
16aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/TypeDumper.h"
17aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/TypeIndex.h"
18aaad5744SZachary Turner #include "llvm/Support/ScopedPrinter.h"
19aaad5744SZachary Turner 
20aaad5744SZachary Turner #include <system_error>
21aaad5744SZachary Turner 
22aaad5744SZachary Turner using namespace llvm;
23aaad5744SZachary Turner using namespace llvm::codeview;
24aaad5744SZachary Turner 
25aaad5744SZachary Turner static const EnumEntry<SymbolKind> SymbolTypeNames[] = {
26aaad5744SZachary Turner #define CV_SYMBOL(enum, val) {#enum, enum},
27aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
28aaad5744SZachary Turner };
29aaad5744SZachary Turner 
30aaad5744SZachary Turner namespace {
31aaad5744SZachary Turner #define CV_ENUM_CLASS_ENT(enum_class, enum)                                    \
32aaad5744SZachary Turner   { #enum, std::underlying_type < enum_class > ::type(enum_class::enum) }
33aaad5744SZachary Turner 
34aaad5744SZachary Turner #define CV_ENUM_ENT(ns, enum)                                                  \
35aaad5744SZachary Turner   { #enum, ns::enum }
36aaad5744SZachary Turner 
37aaad5744SZachary Turner static const EnumEntry<uint8_t> ProcSymFlagNames[] = {
38aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasFP),
39aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasIRET),
40aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasFRET),
41aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoReturn),
42aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, IsUnreachable),
43aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasCustomCallingConv),
44aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoInline),
45aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasOptimizedDebugInfo),
46aaad5744SZachary Turner };
47aaad5744SZachary Turner 
48aaad5744SZachary Turner static const EnumEntry<uint16_t> LocalFlags[] = {
49aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsParameter),
50aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAddressTaken),
51aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsCompilerGenerated),
52aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregate),
53aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregated),
54aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAliased),
55aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAlias),
56aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsReturnValue),
57aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsOptimizedOut),
58aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredGlobal),
59aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredStatic),
60aaad5744SZachary Turner };
61aaad5744SZachary Turner 
62aaad5744SZachary Turner static const EnumEntry<uint32_t> FrameCookieKinds[] = {
63aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameCookieKind, Copy),
64aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameCookieKind, XorStackPointer),
65aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameCookieKind, XorFramePointer),
66aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameCookieKind, XorR13),
67aaad5744SZachary Turner };
68aaad5744SZachary Turner 
69aaad5744SZachary Turner static const EnumEntry<codeview::SourceLanguage> SourceLanguages[] = {
70aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, C),       CV_ENUM_ENT(SourceLanguage, Cpp),
71aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, Fortran), CV_ENUM_ENT(SourceLanguage, Masm),
72aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, Pascal),  CV_ENUM_ENT(SourceLanguage, Basic),
73aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, Cobol),   CV_ENUM_ENT(SourceLanguage, Link),
74aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, Cvtres),  CV_ENUM_ENT(SourceLanguage, Cvtpgd),
75aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, CSharp),  CV_ENUM_ENT(SourceLanguage, VB),
76aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, ILAsm),   CV_ENUM_ENT(SourceLanguage, Java),
77aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, JScript), CV_ENUM_ENT(SourceLanguage, MSIL),
78aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, HLSL),
79aaad5744SZachary Turner };
80aaad5744SZachary Turner 
81aaad5744SZachary Turner static const EnumEntry<uint32_t> CompileSym3FlagNames[] = {
82aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, EC),
83aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDbgInfo),
84aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, LTCG),
85aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDataAlign),
86aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, ManagedPresent),
87aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, SecurityChecks),
88aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, HotPatch),
89aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, CVTCIL),
90aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, MSILModule),
91aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, Sdl),
92aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, PGO),
93aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, Exp),
94aaad5744SZachary Turner };
95aaad5744SZachary Turner 
96aaad5744SZachary Turner static const EnumEntry<unsigned> CPUTypeNames[] = {
97aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel8080),
98aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel8086),
99aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel80286),
100aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel80386),
101aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel80486),
102aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Pentium),
103aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PentiumPro),
104aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Pentium3),
105aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPS),
106aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPS16),
107aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPS32),
108aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPS64),
109aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSI),
110aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSII),
111aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSIII),
112aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSIV),
113aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSV),
114aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68000),
115aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68010),
116aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68020),
117aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68030),
118aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68040),
119aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha),
120aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha21164),
121aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha21164A),
122aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha21264),
123aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha21364),
124aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPC601),
125aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPC603),
126aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPC604),
127aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPC620),
128aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPCFP),
129aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPCBE),
130aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SH3),
131aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SH3E),
132aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SH3DSP),
133aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SH4),
134aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SHMedia),
135aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM3),
136aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM4),
137aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM4T),
138aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM5),
139aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM5T),
140aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM6),
141aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM_XMAC),
142aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM_WMMX),
143aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM7),
144aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Omni),
145aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Ia64),
146aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Ia64_2),
147aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, CEE),
148aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, AM33),
149aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M32R),
150aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, TriCore),
151aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, X64),
152aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, EBC),
153aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Thumb),
154aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARMNT),
155aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, D3D11_Shader),
156aaad5744SZachary Turner };
157aaad5744SZachary Turner 
158aaad5744SZachary Turner static const EnumEntry<uint32_t> FrameProcSymFlags[] = {
159aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasAlloca),
160aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasSetJmp),
161aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasLongJmp),
162aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasInlineAssembly),
163aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasExceptionHandling),
164aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, MarkedInline),
165aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasStructuredExceptionHandling),
166aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, Naked),
167aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, SecurityChecks),
168aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, AsynchronousExceptionHandling),
169aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, NoStackOrderingForSecurityChecks),
170aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, Inlined),
171aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, StrictSecurityChecks),
172aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, SafeBuffers),
173aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, ProfileGuidedOptimization),
174aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, ValidProfileCounts),
175aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, OptimizedForSpeed),
176aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfg),
177aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfw),
178aaad5744SZachary Turner };
179aaad5744SZachary Turner 
180aaad5744SZachary Turner /// Use this private dumper implementation to keep implementation details about
181aaad5744SZachary Turner /// the visitor out of SymbolDumper.h.
182aaad5744SZachary Turner class CVSymbolDumperImpl : public CVSymbolVisitor<CVSymbolDumperImpl> {
183aaad5744SZachary Turner public:
184*3e78e2d4SZachary Turner   CVSymbolDumperImpl(CVTypeDumper &CVTD, SymbolDumpDelegate *ObjDelegate,
185*3e78e2d4SZachary Turner                      ScopedPrinter &W, bool PrintRecordBytes)
186*3e78e2d4SZachary Turner       : CVSymbolVisitor(ObjDelegate), CVTD(CVTD), ObjDelegate(ObjDelegate),
187*3e78e2d4SZachary Turner         W(W), PrintRecordBytes(PrintRecordBytes), InFunctionScope(false) {}
188aaad5744SZachary Turner 
189aaad5744SZachary Turner /// CVSymbolVisitor overrides.
190aaad5744SZachary Turner #define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
191aaad5744SZachary Turner   void visit##Name(SymbolKind Kind, Name &Record);
192aaad5744SZachary Turner #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
193aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
194aaad5744SZachary Turner 
195aaad5744SZachary Turner   void visitSymbolBegin(SymbolKind Kind, ArrayRef<uint8_t> Data);
196aaad5744SZachary Turner   void visitSymbolEnd(SymbolKind Kind, ArrayRef<uint8_t> OriginalSymData);
197aaad5744SZachary Turner   void visitUnknownSymbol(SymbolKind Kind, ArrayRef<uint8_t> Data);
198aaad5744SZachary Turner 
199aaad5744SZachary Turner private:
200aaad5744SZachary Turner   void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
201aaad5744SZachary Turner                                    uint32_t RelocationOffset);
202aaad5744SZachary Turner   void printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps);
203aaad5744SZachary Turner 
204aaad5744SZachary Turner   CVTypeDumper &CVTD;
205aaad5744SZachary Turner   SymbolDumpDelegate *ObjDelegate;
206aaad5744SZachary Turner   ScopedPrinter &W;
207aaad5744SZachary Turner 
208aaad5744SZachary Turner   bool PrintRecordBytes;
209aaad5744SZachary Turner   bool InFunctionScope;
210aaad5744SZachary Turner };
211aaad5744SZachary Turner }
212aaad5744SZachary Turner 
213aaad5744SZachary Turner void CVSymbolDumperImpl::printLocalVariableAddrRange(
214aaad5744SZachary Turner     const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
215aaad5744SZachary Turner   DictScope S(W, "LocalVariableAddrRange");
216aaad5744SZachary Turner   if (ObjDelegate)
217aaad5744SZachary Turner     ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
218aaad5744SZachary Turner                                      Range.OffsetStart);
219aaad5744SZachary Turner   W.printHex("ISectStart", Range.ISectStart);
220aaad5744SZachary Turner   W.printHex("Range", Range.Range);
221aaad5744SZachary Turner }
222aaad5744SZachary Turner 
223aaad5744SZachary Turner void CVSymbolDumperImpl::printLocalVariableAddrGap(
224aaad5744SZachary Turner     ArrayRef<LocalVariableAddrGap> Gaps) {
225aaad5744SZachary Turner   for (auto &Gap : Gaps) {
226aaad5744SZachary Turner     ListScope S(W, "LocalVariableAddrGap");
227aaad5744SZachary Turner     W.printHex("GapStartOffset", Gap.GapStartOffset);
228aaad5744SZachary Turner     W.printHex("Range", Gap.Range);
229aaad5744SZachary Turner   }
230aaad5744SZachary Turner }
231aaad5744SZachary Turner 
232aaad5744SZachary Turner void CVSymbolDumperImpl::visitSymbolBegin(SymbolKind Kind,
233aaad5744SZachary Turner                                           ArrayRef<uint8_t> Data) {}
234aaad5744SZachary Turner 
235aaad5744SZachary Turner void CVSymbolDumperImpl::visitSymbolEnd(SymbolKind Kind,
236aaad5744SZachary Turner                                         ArrayRef<uint8_t> OriginalSymData) {
237aaad5744SZachary Turner   if (PrintRecordBytes && ObjDelegate)
238aaad5744SZachary Turner     ObjDelegate->printBinaryBlockWithRelocs("SymData", OriginalSymData);
239aaad5744SZachary Turner }
240aaad5744SZachary Turner 
241aaad5744SZachary Turner void CVSymbolDumperImpl::visitBlockSym(SymbolKind Kind, BlockSym &Block) {
242aaad5744SZachary Turner   DictScope S(W, "BlockStart");
243aaad5744SZachary Turner 
244aaad5744SZachary Turner   StringRef LinkageName;
245aaad5744SZachary Turner   W.printHex("PtrParent", Block.Header.PtrParent);
246aaad5744SZachary Turner   W.printHex("PtrEnd", Block.Header.PtrEnd);
247aaad5744SZachary Turner   W.printHex("CodeSize", Block.Header.CodeSize);
248aaad5744SZachary Turner   if (ObjDelegate) {
249aaad5744SZachary Turner     ObjDelegate->printRelocatedField("CodeOffset", Block.getRelocationOffset(),
250aaad5744SZachary Turner                                      Block.Header.CodeOffset, &LinkageName);
251aaad5744SZachary Turner   }
252aaad5744SZachary Turner   W.printHex("Segment", Block.Header.Segment);
253aaad5744SZachary Turner   W.printString("BlockName", Block.Name);
254aaad5744SZachary Turner   W.printString("LinkageName", LinkageName);
255aaad5744SZachary Turner }
256aaad5744SZachary Turner 
257aaad5744SZachary Turner void CVSymbolDumperImpl::visitBPRelativeSym(SymbolKind Kind,
258aaad5744SZachary Turner                                             BPRelativeSym &BPRel) {
259aaad5744SZachary Turner   DictScope S(W, "BPRelativeSym");
260aaad5744SZachary Turner 
261aaad5744SZachary Turner   W.printNumber("Offset", BPRel.Header.Offset);
262aaad5744SZachary Turner   CVTD.printTypeIndex("Type", BPRel.Header.Type);
263aaad5744SZachary Turner   W.printString("VarName", BPRel.Name);
264aaad5744SZachary Turner }
265aaad5744SZachary Turner 
266aaad5744SZachary Turner void CVSymbolDumperImpl::visitBuildInfoSym(SymbolKind Kind,
267aaad5744SZachary Turner                                            BuildInfoSym &BuildInfo) {
268aaad5744SZachary Turner   DictScope S(W, "BuildInfo");
269aaad5744SZachary Turner 
270aaad5744SZachary Turner   W.printNumber("BuildId", BuildInfo.Header.BuildId);
271aaad5744SZachary Turner }
272aaad5744SZachary Turner 
273aaad5744SZachary Turner void CVSymbolDumperImpl::visitCallSiteInfoSym(SymbolKind Kind,
274aaad5744SZachary Turner                                               CallSiteInfoSym &CallSiteInfo) {
275aaad5744SZachary Turner   DictScope S(W, "CallSiteInfo");
276aaad5744SZachary Turner 
277aaad5744SZachary Turner   StringRef LinkageName;
278aaad5744SZachary Turner   if (ObjDelegate) {
279aaad5744SZachary Turner     ObjDelegate->printRelocatedField(
280aaad5744SZachary Turner         "CodeOffset", CallSiteInfo.getRelocationOffset(),
281aaad5744SZachary Turner         CallSiteInfo.Header.CodeOffset, &LinkageName);
282aaad5744SZachary Turner   }
283aaad5744SZachary Turner   W.printHex("Segment", CallSiteInfo.Header.Segment);
284aaad5744SZachary Turner   W.printHex("Reserved", CallSiteInfo.Header.Reserved);
285aaad5744SZachary Turner   CVTD.printTypeIndex("Type", CallSiteInfo.Header.Type);
286aaad5744SZachary Turner   if (!LinkageName.empty())
287aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
288aaad5744SZachary Turner }
289aaad5744SZachary Turner 
290aaad5744SZachary Turner void CVSymbolDumperImpl::visitCompile3Sym(SymbolKind Kind,
291aaad5744SZachary Turner                                           Compile3Sym &Compile3) {
292aaad5744SZachary Turner   DictScope S(W, "CompilerFlags");
293aaad5744SZachary Turner 
294aaad5744SZachary Turner   W.printEnum("Language", Compile3.Header.getLanguage(),
295aaad5744SZachary Turner               makeArrayRef(SourceLanguages));
296aaad5744SZachary Turner   W.printFlags("Flags", Compile3.Header.flags & ~0xff,
297aaad5744SZachary Turner                makeArrayRef(CompileSym3FlagNames));
298aaad5744SZachary Turner   W.printEnum("Machine", unsigned(Compile3.Header.Machine),
299aaad5744SZachary Turner               makeArrayRef(CPUTypeNames));
300aaad5744SZachary Turner   std::string FrontendVersion;
301aaad5744SZachary Turner   {
302aaad5744SZachary Turner     raw_string_ostream Out(FrontendVersion);
303aaad5744SZachary Turner     Out << Compile3.Header.VersionFrontendMajor << '.'
304aaad5744SZachary Turner         << Compile3.Header.VersionFrontendMinor << '.'
305aaad5744SZachary Turner         << Compile3.Header.VersionFrontendBuild << '.'
306aaad5744SZachary Turner         << Compile3.Header.VersionFrontendQFE;
307aaad5744SZachary Turner   }
308aaad5744SZachary Turner   std::string BackendVersion;
309aaad5744SZachary Turner   {
310aaad5744SZachary Turner     raw_string_ostream Out(BackendVersion);
311aaad5744SZachary Turner     Out << Compile3.Header.VersionBackendMajor << '.'
312aaad5744SZachary Turner         << Compile3.Header.VersionBackendMinor << '.'
313aaad5744SZachary Turner         << Compile3.Header.VersionBackendBuild << '.'
314aaad5744SZachary Turner         << Compile3.Header.VersionBackendQFE;
315aaad5744SZachary Turner   }
316aaad5744SZachary Turner   W.printString("FrontendVersion", FrontendVersion);
317aaad5744SZachary Turner   W.printString("BackendVersion", BackendVersion);
318aaad5744SZachary Turner   W.printString("VersionName", Compile3.Version);
319aaad5744SZachary Turner }
320aaad5744SZachary Turner 
321aaad5744SZachary Turner void CVSymbolDumperImpl::visitConstantSym(SymbolKind Kind,
322aaad5744SZachary Turner                                           ConstantSym &Constant) {
323aaad5744SZachary Turner   DictScope S(W, "Constant");
324aaad5744SZachary Turner 
325aaad5744SZachary Turner   CVTD.printTypeIndex("Type", Constant.Header.Type);
326aaad5744SZachary Turner   W.printNumber("Value", Constant.Value);
327aaad5744SZachary Turner   W.printString("Name", Constant.Name);
328aaad5744SZachary Turner }
329aaad5744SZachary Turner 
330aaad5744SZachary Turner void CVSymbolDumperImpl::visitDataSym(SymbolKind Kind, DataSym &Data) {
331aaad5744SZachary Turner   DictScope S(W, "DataSym");
332aaad5744SZachary Turner 
333aaad5744SZachary Turner   StringRef LinkageName;
334aaad5744SZachary Turner   if (ObjDelegate) {
335aaad5744SZachary Turner     ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
336aaad5744SZachary Turner                                      Data.Header.DataOffset, &LinkageName);
337aaad5744SZachary Turner   }
338aaad5744SZachary Turner   CVTD.printTypeIndex("Type", Data.Header.Type);
339aaad5744SZachary Turner   W.printString("DisplayName", Data.Name);
340aaad5744SZachary Turner   if (!LinkageName.empty())
341aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
342aaad5744SZachary Turner }
343aaad5744SZachary Turner 
344aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeFramePointerRelFullScopeSym(
345aaad5744SZachary Turner     SymbolKind Kind,
346aaad5744SZachary Turner     DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
347aaad5744SZachary Turner   DictScope S(W, "DefRangeFramePointerRelFullScope");
348aaad5744SZachary Turner   W.printNumber("Offset", DefRangeFramePointerRelFullScope.Header.Offset);
349aaad5744SZachary Turner }
350aaad5744SZachary Turner 
351aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeFramePointerRelSym(
352aaad5744SZachary Turner     SymbolKind Kind, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
353aaad5744SZachary Turner   DictScope S(W, "DefRangeFramePointerRel");
354aaad5744SZachary Turner 
355aaad5744SZachary Turner   W.printNumber("Offset", DefRangeFramePointerRel.Header.Offset);
356aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeFramePointerRel.Header.Range,
357aaad5744SZachary Turner                               DefRangeFramePointerRel.getRelocationOffset());
358aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
359aaad5744SZachary Turner }
360aaad5744SZachary Turner 
361aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeRegisterRelSym(
362aaad5744SZachary Turner     SymbolKind Kind, DefRangeRegisterRelSym &DefRangeRegisterRel) {
363aaad5744SZachary Turner   DictScope S(W, "DefRangeRegisterRel");
364aaad5744SZachary Turner 
365aaad5744SZachary Turner   W.printNumber("BaseRegister", DefRangeRegisterRel.Header.BaseRegister);
366aaad5744SZachary Turner   W.printBoolean("HasSpilledUDTMember",
367aaad5744SZachary Turner                  DefRangeRegisterRel.hasSpilledUDTMember());
368aaad5744SZachary Turner   W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
369aaad5744SZachary Turner   W.printNumber("BasePointerOffset",
370aaad5744SZachary Turner                 DefRangeRegisterRel.Header.BasePointerOffset);
371aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeRegisterRel.Header.Range,
372aaad5744SZachary Turner                               DefRangeRegisterRel.getRelocationOffset());
373aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
374aaad5744SZachary Turner }
375aaad5744SZachary Turner 
376aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeRegisterSym(
377aaad5744SZachary Turner     SymbolKind Kind, DefRangeRegisterSym &DefRangeRegister) {
378aaad5744SZachary Turner   DictScope S(W, "DefRangeRegister");
379aaad5744SZachary Turner 
380aaad5744SZachary Turner   W.printNumber("Register", DefRangeRegister.Header.Register);
381aaad5744SZachary Turner   W.printNumber("MayHaveNoName", DefRangeRegister.Header.MayHaveNoName);
382aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeRegister.Header.Range,
383aaad5744SZachary Turner                               DefRangeRegister.getRelocationOffset());
384aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeRegister.Gaps);
385aaad5744SZachary Turner }
386aaad5744SZachary Turner 
387aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeSubfieldRegisterSym(
388aaad5744SZachary Turner     SymbolKind Kind, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
389aaad5744SZachary Turner   DictScope S(W, "DefRangeSubfieldRegister");
390aaad5744SZachary Turner 
391aaad5744SZachary Turner   W.printNumber("Register", DefRangeSubfieldRegister.Header.Register);
392aaad5744SZachary Turner   W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Header.MayHaveNoName);
393aaad5744SZachary Turner   W.printNumber("OffsetInParent",
394aaad5744SZachary Turner                 DefRangeSubfieldRegister.Header.OffsetInParent);
395aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeSubfieldRegister.Header.Range,
396aaad5744SZachary Turner                               DefRangeSubfieldRegister.getRelocationOffset());
397aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
398aaad5744SZachary Turner }
399aaad5744SZachary Turner 
400aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeSubfieldSym(
401aaad5744SZachary Turner     SymbolKind Kind, DefRangeSubfieldSym &DefRangeSubfield) {
402aaad5744SZachary Turner   DictScope S(W, "DefRangeSubfield");
403aaad5744SZachary Turner 
404aaad5744SZachary Turner   if (ObjDelegate) {
405aaad5744SZachary Turner     StringRef StringTable = ObjDelegate->getStringTable();
406aaad5744SZachary Turner     if (!StringTable.empty()) {
407aaad5744SZachary Turner       W.printString("Program",
408aaad5744SZachary Turner                     StringTable.drop_front(DefRangeSubfield.Header.Program)
409aaad5744SZachary Turner                         .split('\0')
410aaad5744SZachary Turner                         .first);
411aaad5744SZachary Turner     }
412aaad5744SZachary Turner   }
413aaad5744SZachary Turner   W.printNumber("OffsetInParent", DefRangeSubfield.Header.OffsetInParent);
414aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeSubfield.Header.Range,
415aaad5744SZachary Turner                               DefRangeSubfield.getRelocationOffset());
416aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeSubfield.Gaps);
417aaad5744SZachary Turner }
418aaad5744SZachary Turner 
419aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeSym(SymbolKind Kind,
420aaad5744SZachary Turner                                           DefRangeSym &DefRange) {
421aaad5744SZachary Turner   DictScope S(W, "DefRange");
422aaad5744SZachary Turner 
423aaad5744SZachary Turner   if (ObjDelegate) {
424aaad5744SZachary Turner     StringRef StringTable = ObjDelegate->getStringTable();
425aaad5744SZachary Turner     if (!StringTable.empty()) {
426aaad5744SZachary Turner       W.printString(
427aaad5744SZachary Turner           "Program",
428aaad5744SZachary Turner           StringTable.drop_front(DefRange.Header.Program).split('\0').first);
429aaad5744SZachary Turner     }
430aaad5744SZachary Turner   }
431aaad5744SZachary Turner   printLocalVariableAddrRange(DefRange.Header.Range,
432aaad5744SZachary Turner                               DefRange.getRelocationOffset());
433aaad5744SZachary Turner   printLocalVariableAddrGap(DefRange.Gaps);
434aaad5744SZachary Turner }
435aaad5744SZachary Turner 
436aaad5744SZachary Turner void CVSymbolDumperImpl::visitFrameCookieSym(SymbolKind Kind,
437aaad5744SZachary Turner                                              FrameCookieSym &FrameCookie) {
438aaad5744SZachary Turner   DictScope S(W, "FrameCookie");
439aaad5744SZachary Turner 
440aaad5744SZachary Turner   StringRef LinkageName;
441aaad5744SZachary Turner   if (ObjDelegate) {
442aaad5744SZachary Turner     ObjDelegate->printRelocatedField(
443aaad5744SZachary Turner         "CodeOffset", FrameCookie.getRelocationOffset(),
444aaad5744SZachary Turner         FrameCookie.Header.CodeOffset, &LinkageName);
445aaad5744SZachary Turner   }
446aaad5744SZachary Turner   W.printHex("Register", FrameCookie.Header.Register);
447aaad5744SZachary Turner   W.printEnum("CookieKind", uint16_t(FrameCookie.Header.CookieKind),
448aaad5744SZachary Turner               makeArrayRef(FrameCookieKinds));
449aaad5744SZachary Turner }
450aaad5744SZachary Turner 
451aaad5744SZachary Turner void CVSymbolDumperImpl::visitFrameProcSym(SymbolKind Kind,
452aaad5744SZachary Turner                                            FrameProcSym &FrameProc) {
453aaad5744SZachary Turner   DictScope S(W, "FrameProc");
454aaad5744SZachary Turner 
455aaad5744SZachary Turner   W.printHex("TotalFrameBytes", FrameProc.Header.TotalFrameBytes);
456aaad5744SZachary Turner   W.printHex("PaddingFrameBytes", FrameProc.Header.PaddingFrameBytes);
457aaad5744SZachary Turner   W.printHex("OffsetToPadding", FrameProc.Header.OffsetToPadding);
458aaad5744SZachary Turner   W.printHex("BytesOfCalleeSavedRegisters",
459aaad5744SZachary Turner              FrameProc.Header.BytesOfCalleeSavedRegisters);
460aaad5744SZachary Turner   W.printHex("OffsetOfExceptionHandler",
461aaad5744SZachary Turner              FrameProc.Header.OffsetOfExceptionHandler);
462aaad5744SZachary Turner   W.printHex("SectionIdOfExceptionHandler",
463aaad5744SZachary Turner              FrameProc.Header.SectionIdOfExceptionHandler);
464aaad5744SZachary Turner   W.printFlags("Flags", FrameProc.Header.Flags,
465aaad5744SZachary Turner                makeArrayRef(FrameProcSymFlags));
466aaad5744SZachary Turner }
467aaad5744SZachary Turner 
468aaad5744SZachary Turner void CVSymbolDumperImpl::visitHeapAllocationSiteSym(
469aaad5744SZachary Turner     SymbolKind Kind, HeapAllocationSiteSym &HeapAllocSite) {
470aaad5744SZachary Turner   DictScope S(W, "HeapAllocationSite");
471aaad5744SZachary Turner 
472aaad5744SZachary Turner   StringRef LinkageName;
473aaad5744SZachary Turner   if (ObjDelegate) {
474aaad5744SZachary Turner     ObjDelegate->printRelocatedField(
475aaad5744SZachary Turner         "CodeOffset", HeapAllocSite.getRelocationOffset(),
476aaad5744SZachary Turner         HeapAllocSite.Header.CodeOffset, &LinkageName);
477aaad5744SZachary Turner   }
478aaad5744SZachary Turner   W.printHex("Segment", HeapAllocSite.Header.Segment);
479aaad5744SZachary Turner   W.printHex("CallInstructionSize", HeapAllocSite.Header.CallInstructionSize);
480aaad5744SZachary Turner   CVTD.printTypeIndex("Type", HeapAllocSite.Header.Type);
481aaad5744SZachary Turner   if (!LinkageName.empty())
482aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
483aaad5744SZachary Turner }
484aaad5744SZachary Turner 
485aaad5744SZachary Turner void CVSymbolDumperImpl::visitInlineSiteSym(SymbolKind Kind,
486aaad5744SZachary Turner                                             InlineSiteSym &InlineSite) {
487aaad5744SZachary Turner   DictScope S(W, "InlineSite");
488aaad5744SZachary Turner 
489aaad5744SZachary Turner   W.printHex("PtrParent", InlineSite.Header.PtrParent);
490aaad5744SZachary Turner   W.printHex("PtrEnd", InlineSite.Header.PtrEnd);
491aaad5744SZachary Turner   CVTD.printTypeIndex("Inlinee", InlineSite.Header.Inlinee);
492aaad5744SZachary Turner 
493aaad5744SZachary Turner   ListScope BinaryAnnotations(W, "BinaryAnnotations");
494aaad5744SZachary Turner   for (auto &Annotation : InlineSite.annotations()) {
495aaad5744SZachary Turner     switch (Annotation.OpCode) {
496aaad5744SZachary Turner     case BinaryAnnotationsOpCode::Invalid:
497aaad5744SZachary Turner       return parseError();
498aaad5744SZachary Turner     case BinaryAnnotationsOpCode::CodeOffset:
499aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeOffset:
500aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeLength:
501aaad5744SZachary Turner       W.printHex(Annotation.Name, Annotation.U1);
502aaad5744SZachary Turner       break;
503aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
504aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeLineEndDelta:
505aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeRangeKind:
506aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeColumnStart:
507aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeColumnEnd:
508aaad5744SZachary Turner       W.printNumber(Annotation.Name, Annotation.U1);
509aaad5744SZachary Turner       break;
510aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeLineOffset:
511aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
512aaad5744SZachary Turner       W.printNumber(Annotation.Name, Annotation.S1);
513aaad5744SZachary Turner       break;
514aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeFile:
515aaad5744SZachary Turner       if (ObjDelegate) {
516aaad5744SZachary Turner         W.printHex("ChangeFile",
517aaad5744SZachary Turner                    ObjDelegate->getFileNameForFileOffset(Annotation.U1),
518aaad5744SZachary Turner                    Annotation.U1);
519aaad5744SZachary Turner       } else {
520aaad5744SZachary Turner         W.printHex("ChangeFile", Annotation.U1);
521aaad5744SZachary Turner       }
522aaad5744SZachary Turner 
523aaad5744SZachary Turner       break;
524aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
525aaad5744SZachary Turner       W.startLine() << "ChangeCodeOffsetAndLineOffset: {CodeOffset: "
526aaad5744SZachary Turner                     << W.hex(Annotation.U1) << ", LineOffset: " << Annotation.S1
527aaad5744SZachary Turner                     << "}\n";
528aaad5744SZachary Turner       break;
529aaad5744SZachary Turner     }
530aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
531aaad5744SZachary Turner       W.startLine() << "ChangeCodeLengthAndCodeOffset: {CodeOffset: "
532aaad5744SZachary Turner                     << W.hex(Annotation.U2)
533aaad5744SZachary Turner                     << ", Length: " << W.hex(Annotation.U1) << "}\n";
534aaad5744SZachary Turner       break;
535aaad5744SZachary Turner     }
536aaad5744SZachary Turner     }
537aaad5744SZachary Turner   }
538aaad5744SZachary Turner }
539aaad5744SZachary Turner 
540aaad5744SZachary Turner void CVSymbolDumperImpl::visitLabelSym(SymbolKind Kind, LabelSym &Label) {
541aaad5744SZachary Turner   DictScope S(W, "Label");
542aaad5744SZachary Turner 
543aaad5744SZachary Turner   StringRef LinkageName;
544aaad5744SZachary Turner   if (ObjDelegate) {
545aaad5744SZachary Turner     ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(),
546aaad5744SZachary Turner                                      Label.Header.CodeOffset, &LinkageName);
547aaad5744SZachary Turner   }
548aaad5744SZachary Turner   W.printHex("Segment", Label.Header.Segment);
549aaad5744SZachary Turner   W.printHex("Flags", Label.Header.Flags);
550aaad5744SZachary Turner   W.printFlags("Flags", Label.Header.Flags, makeArrayRef(ProcSymFlagNames));
551aaad5744SZachary Turner   W.printString("DisplayName", Label.Name);
552aaad5744SZachary Turner   if (!LinkageName.empty())
553aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
554aaad5744SZachary Turner }
555aaad5744SZachary Turner 
556aaad5744SZachary Turner void CVSymbolDumperImpl::visitLocalSym(SymbolKind Kind, LocalSym &Local) {
557aaad5744SZachary Turner   DictScope S(W, "Local");
558aaad5744SZachary Turner 
559aaad5744SZachary Turner   CVTD.printTypeIndex("Type", Local.Header.Type);
560aaad5744SZachary Turner   W.printFlags("Flags", uint16_t(Local.Header.Flags), makeArrayRef(LocalFlags));
561aaad5744SZachary Turner   W.printString("VarName", Local.Name);
562aaad5744SZachary Turner }
563aaad5744SZachary Turner 
564aaad5744SZachary Turner void CVSymbolDumperImpl::visitObjNameSym(SymbolKind Kind, ObjNameSym &ObjName) {
565aaad5744SZachary Turner   DictScope S(W, "ObjectName");
566aaad5744SZachary Turner 
567aaad5744SZachary Turner   W.printHex("Signature", ObjName.Header.Signature);
568aaad5744SZachary Turner   W.printString("ObjectName", ObjName.Name);
569aaad5744SZachary Turner }
570aaad5744SZachary Turner 
571aaad5744SZachary Turner void CVSymbolDumperImpl::visitProcSym(SymbolKind Kind, ProcSym &Proc) {
572aaad5744SZachary Turner   DictScope S(W, "ProcStart");
573aaad5744SZachary Turner 
574aaad5744SZachary Turner   if (InFunctionScope)
575aaad5744SZachary Turner     return parseError();
576aaad5744SZachary Turner 
577aaad5744SZachary Turner   InFunctionScope = true;
578aaad5744SZachary Turner 
579aaad5744SZachary Turner   StringRef LinkageName;
580aaad5744SZachary Turner   W.printHex("PtrParent", Proc.Header.PtrParent);
581aaad5744SZachary Turner   W.printHex("PtrEnd", Proc.Header.PtrEnd);
582aaad5744SZachary Turner   W.printHex("PtrNext", Proc.Header.PtrNext);
583aaad5744SZachary Turner   W.printHex("CodeSize", Proc.Header.CodeSize);
584aaad5744SZachary Turner   W.printHex("DbgStart", Proc.Header.DbgStart);
585aaad5744SZachary Turner   W.printHex("DbgEnd", Proc.Header.DbgEnd);
586aaad5744SZachary Turner   CVTD.printTypeIndex("FunctionType", Proc.Header.FunctionType);
587aaad5744SZachary Turner   if (ObjDelegate) {
588aaad5744SZachary Turner     ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(),
589aaad5744SZachary Turner                                      Proc.Header.CodeOffset, &LinkageName);
590aaad5744SZachary Turner   }
591aaad5744SZachary Turner   W.printHex("Segment", Proc.Header.Segment);
592aaad5744SZachary Turner   W.printFlags("Flags", static_cast<uint8_t>(Proc.Header.Flags),
593aaad5744SZachary Turner                makeArrayRef(ProcSymFlagNames));
594aaad5744SZachary Turner   W.printString("DisplayName", Proc.Name);
595aaad5744SZachary Turner   if (!LinkageName.empty())
596aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
597aaad5744SZachary Turner }
598aaad5744SZachary Turner 
599aaad5744SZachary Turner void CVSymbolDumperImpl::visitScopeEndSym(SymbolKind Kind,
600aaad5744SZachary Turner                                           ScopeEndSym &ScopeEnd) {
601aaad5744SZachary Turner   if (Kind == SymbolKind::S_END)
602aaad5744SZachary Turner     W.startLine() << "BlockEnd\n";
603aaad5744SZachary Turner   else if (Kind == SymbolKind::S_PROC_ID_END)
604aaad5744SZachary Turner     W.startLine() << "ProcEnd\n";
605aaad5744SZachary Turner   else if (Kind == SymbolKind::S_INLINESITE_END)
606aaad5744SZachary Turner     DictScope S(W, "InlineSiteEnd");
607aaad5744SZachary Turner 
608aaad5744SZachary Turner   InFunctionScope = false;
609aaad5744SZachary Turner }
610aaad5744SZachary Turner 
611aaad5744SZachary Turner void CVSymbolDumperImpl::visitCallerSym(SymbolKind Kind, CallerSym &Caller) {
612aaad5744SZachary Turner   ListScope S(W, Kind == S_CALLEES ? "Callees" : "Callers");
613aaad5744SZachary Turner   for (auto FuncID : Caller.Indices)
614aaad5744SZachary Turner     CVTD.printTypeIndex("FuncID", FuncID);
615aaad5744SZachary Turner }
616aaad5744SZachary Turner 
617aaad5744SZachary Turner void CVSymbolDumperImpl::visitRegRelativeSym(SymbolKind Kind,
618aaad5744SZachary Turner                                              RegRelativeSym &RegRel) {
619aaad5744SZachary Turner   DictScope S(W, "RegRelativeSym");
620aaad5744SZachary Turner 
621aaad5744SZachary Turner   W.printHex("Offset", RegRel.Header.Offset);
622aaad5744SZachary Turner   CVTD.printTypeIndex("Type", RegRel.Header.Type);
623aaad5744SZachary Turner   W.printHex("Register", RegRel.Header.Register);
624aaad5744SZachary Turner   W.printString("VarName", RegRel.Name);
625aaad5744SZachary Turner }
626aaad5744SZachary Turner 
627aaad5744SZachary Turner void CVSymbolDumperImpl::visitThreadLocalDataSym(SymbolKind Kind,
628aaad5744SZachary Turner                                                  ThreadLocalDataSym &Data) {
629aaad5744SZachary Turner   DictScope S(W, "ThreadLocalDataSym");
630aaad5744SZachary Turner 
631aaad5744SZachary Turner   StringRef LinkageName;
632aaad5744SZachary Turner   if (ObjDelegate) {
633aaad5744SZachary Turner     ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
634aaad5744SZachary Turner                                      Data.Header.DataOffset, &LinkageName);
635aaad5744SZachary Turner   }
636aaad5744SZachary Turner   CVTD.printTypeIndex("Type", Data.Header.Type);
637aaad5744SZachary Turner   W.printString("DisplayName", Data.Name);
638aaad5744SZachary Turner   if (!LinkageName.empty())
639aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
640aaad5744SZachary Turner }
641aaad5744SZachary Turner 
642aaad5744SZachary Turner void CVSymbolDumperImpl::visitUDTSym(SymbolKind Kind, UDTSym &UDT) {
643aaad5744SZachary Turner   DictScope S(W, "UDT");
644aaad5744SZachary Turner   CVTD.printTypeIndex("Type", UDT.Header.Type);
645aaad5744SZachary Turner   W.printString("UDTName", UDT.Name);
646aaad5744SZachary Turner }
647aaad5744SZachary Turner 
648aaad5744SZachary Turner void CVSymbolDumperImpl::visitUnknownSymbol(SymbolKind Kind,
649aaad5744SZachary Turner                                             ArrayRef<uint8_t> Data) {
650aaad5744SZachary Turner   DictScope S(W, "UnknownSym");
651aaad5744SZachary Turner   W.printHex("Kind", unsigned(Kind));
652aaad5744SZachary Turner   W.printHex("Size", Data.size());
653aaad5744SZachary Turner }
654aaad5744SZachary Turner 
655aaad5744SZachary Turner bool CVSymbolDumper::dump(const SymbolIterator::Record &Record) {
656*3e78e2d4SZachary Turner   CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
657aaad5744SZachary Turner   Dumper.visitSymbolRecord(Record);
658aaad5744SZachary Turner   return !Dumper.hadError();
659aaad5744SZachary Turner }
660aaad5744SZachary Turner 
661aaad5744SZachary Turner bool CVSymbolDumper::dump(ArrayRef<uint8_t> Data) {
662*3e78e2d4SZachary Turner   CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
663aaad5744SZachary Turner   Dumper.visitSymbolStream(Data);
664aaad5744SZachary Turner   return !Dumper.hadError();
665aaad5744SZachary Turner }
666