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 
374caa1bf0SZachary Turner static const EnumEntry<uint16_t> RegisterNames[] = {
384caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, Unknown),
394caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, VFrame),
404caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, AL),
414caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, CL),
424caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, DL),
434caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, BL),
444caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, AH),
454caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, CH),
464caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, DH),
474caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, BH),
484caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, AX),
494caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, CX),
504caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, DX),
514caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, BX),
524caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, SP),
534caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, BP),
544caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, SI),
554caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, DI),
564caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, EAX),
574caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, ECX),
584caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, EDX),
594caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, EBX),
604caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, ESP),
614caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, EBP),
624caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, ESI),
634caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, EDI),
644caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, ES),
654caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, CS),
664caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, SS),
674caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, DS),
684caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, FS),
694caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, GS),
704caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, IP),
714caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, RAX),
724caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, RBX),
734caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, RCX),
744caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, RDX),
754caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, RSI),
764caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, RDI),
774caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, RBP),
784caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, RSP),
794caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, R8),
804caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, R9),
814caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, R10),
824caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, R11),
834caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, R12),
844caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, R13),
854caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, R14),
864caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(RegisterId, R15),
874caa1bf0SZachary Turner };
884caa1bf0SZachary Turner 
89aaad5744SZachary Turner static const EnumEntry<uint8_t> ProcSymFlagNames[] = {
90aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasFP),
91aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasIRET),
92aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasFRET),
93aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoReturn),
94aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, IsUnreachable),
95aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasCustomCallingConv),
96aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoInline),
97aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(ProcSymFlags, HasOptimizedDebugInfo),
98aaad5744SZachary Turner };
99aaad5744SZachary Turner 
100aaad5744SZachary Turner static const EnumEntry<uint16_t> LocalFlags[] = {
101aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsParameter),
102aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAddressTaken),
103aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsCompilerGenerated),
104aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregate),
105aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregated),
106aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAliased),
107aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsAlias),
108aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsReturnValue),
109aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsOptimizedOut),
110aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredGlobal),
111aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredStatic),
112aaad5744SZachary Turner };
113aaad5744SZachary Turner 
114aaad5744SZachary Turner static const EnumEntry<uint32_t> FrameCookieKinds[] = {
115aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameCookieKind, Copy),
116aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameCookieKind, XorStackPointer),
117aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameCookieKind, XorFramePointer),
118aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameCookieKind, XorR13),
119aaad5744SZachary Turner };
120aaad5744SZachary Turner 
121aaad5744SZachary Turner static const EnumEntry<codeview::SourceLanguage> SourceLanguages[] = {
122aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, C),       CV_ENUM_ENT(SourceLanguage, Cpp),
123aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, Fortran), CV_ENUM_ENT(SourceLanguage, Masm),
124aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, Pascal),  CV_ENUM_ENT(SourceLanguage, Basic),
125aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, Cobol),   CV_ENUM_ENT(SourceLanguage, Link),
126aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, Cvtres),  CV_ENUM_ENT(SourceLanguage, Cvtpgd),
127aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, CSharp),  CV_ENUM_ENT(SourceLanguage, VB),
128aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, ILAsm),   CV_ENUM_ENT(SourceLanguage, Java),
129aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, JScript), CV_ENUM_ENT(SourceLanguage, MSIL),
130aaad5744SZachary Turner     CV_ENUM_ENT(SourceLanguage, HLSL),
131aaad5744SZachary Turner };
132aaad5744SZachary Turner 
1334caa1bf0SZachary Turner static const EnumEntry<uint32_t> CompileSym2FlagNames[] = {
1344caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, EC),
1354caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, NoDbgInfo),
1364caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, LTCG),
1374caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, NoDataAlign),
1384caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, ManagedPresent),
1394caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, SecurityChecks),
1404caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, HotPatch),
1414caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, CVTCIL),
1424caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym2Flags, MSILModule),
1434caa1bf0SZachary Turner };
1444caa1bf0SZachary Turner 
145aaad5744SZachary Turner static const EnumEntry<uint32_t> CompileSym3FlagNames[] = {
146aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, EC),
147aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDbgInfo),
148aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, LTCG),
149aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDataAlign),
150aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, ManagedPresent),
151aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, SecurityChecks),
152aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, HotPatch),
153aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, CVTCIL),
154aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, MSILModule),
155aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, Sdl),
156aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, PGO),
157aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CompileSym3Flags, Exp),
158aaad5744SZachary Turner };
159aaad5744SZachary Turner 
160aaad5744SZachary Turner static const EnumEntry<unsigned> CPUTypeNames[] = {
161aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel8080),
162aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel8086),
163aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel80286),
164aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel80386),
165aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Intel80486),
166aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Pentium),
167aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PentiumPro),
168aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Pentium3),
169aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPS),
170aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPS16),
171aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPS32),
172aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPS64),
173aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSI),
174aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSII),
175aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSIII),
176aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSIV),
177aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, MIPSV),
178aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68000),
179aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68010),
180aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68020),
181aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68030),
182aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M68040),
183aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha),
184aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha21164),
185aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha21164A),
186aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha21264),
187aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Alpha21364),
188aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPC601),
189aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPC603),
190aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPC604),
191aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPC620),
192aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPCFP),
193aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, PPCBE),
194aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SH3),
195aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SH3E),
196aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SH3DSP),
197aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SH4),
198aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, SHMedia),
199aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM3),
200aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM4),
201aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM4T),
202aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM5),
203aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM5T),
204aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM6),
205aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM_XMAC),
206aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM_WMMX),
207aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARM7),
208aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Omni),
209aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Ia64),
210aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Ia64_2),
211aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, CEE),
212aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, AM33),
213aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, M32R),
214aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, TriCore),
215aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, X64),
216aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, EBC),
217aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, Thumb),
218aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, ARMNT),
219aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(CPUType, D3D11_Shader),
220aaad5744SZachary Turner };
221aaad5744SZachary Turner 
222aaad5744SZachary Turner static const EnumEntry<uint32_t> FrameProcSymFlags[] = {
223aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasAlloca),
224aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasSetJmp),
225aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasLongJmp),
226aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasInlineAssembly),
227aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasExceptionHandling),
228aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, MarkedInline),
229aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasStructuredExceptionHandling),
230aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, Naked),
231aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, SecurityChecks),
232aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, AsynchronousExceptionHandling),
233aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, NoStackOrderingForSecurityChecks),
234aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, Inlined),
235aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, StrictSecurityChecks),
236aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, SafeBuffers),
237aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, ProfileGuidedOptimization),
238aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, ValidProfileCounts),
239aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, OptimizedForSpeed),
240aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfg),
241aaad5744SZachary Turner     CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfw),
242aaad5744SZachary Turner };
243aaad5744SZachary Turner 
2449f054d42SZachary Turner static const EnumEntry<uint16_t> ExportSymFlags[] = {
2459f054d42SZachary Turner     CV_ENUM_CLASS_ENT(ExportFlags, IsConstant),
2469f054d42SZachary Turner     CV_ENUM_CLASS_ENT(ExportFlags, IsData),
2479f054d42SZachary Turner     CV_ENUM_CLASS_ENT(ExportFlags, IsPrivate),
2489f054d42SZachary Turner     CV_ENUM_CLASS_ENT(ExportFlags, HasNoName),
2499f054d42SZachary Turner     CV_ENUM_CLASS_ENT(ExportFlags, HasExplicitOrdinal),
2509f054d42SZachary Turner     CV_ENUM_CLASS_ENT(ExportFlags, IsForwarder),
2519f054d42SZachary Turner };
2529f054d42SZachary Turner 
2534caa1bf0SZachary Turner static const EnumEntry<uint8_t> ThunkOrdinalNames[] = {
2544caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(ThunkOrdinal, Standard),
2554caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(ThunkOrdinal, ThisAdjustor),
2564caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(ThunkOrdinal, Vcall),
2574caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(ThunkOrdinal, Pcode),
2584caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(ThunkOrdinal, UnknownLoad),
2594caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(ThunkOrdinal, TrampIncremental),
2604caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(ThunkOrdinal, BranchIsland),
2614caa1bf0SZachary Turner };
2624caa1bf0SZachary Turner 
2634caa1bf0SZachary Turner static const EnumEntry<uint16_t> TrampolineNames[] = {
2644caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(TrampolineType, TrampIncremental),
2654caa1bf0SZachary Turner     CV_ENUM_CLASS_ENT(TrampolineType, BranchIsland),
2664caa1bf0SZachary Turner };
2674caa1bf0SZachary Turner 
268aaad5744SZachary Turner /// Use this private dumper implementation to keep implementation details about
269aaad5744SZachary Turner /// the visitor out of SymbolDumper.h.
270aaad5744SZachary Turner class CVSymbolDumperImpl : public CVSymbolVisitor<CVSymbolDumperImpl> {
271aaad5744SZachary Turner public:
2723e78e2d4SZachary Turner   CVSymbolDumperImpl(CVTypeDumper &CVTD, SymbolDumpDelegate *ObjDelegate,
2733e78e2d4SZachary Turner                      ScopedPrinter &W, bool PrintRecordBytes)
2743e78e2d4SZachary Turner       : CVSymbolVisitor(ObjDelegate), CVTD(CVTD), ObjDelegate(ObjDelegate),
2753e78e2d4SZachary Turner         W(W), PrintRecordBytes(PrintRecordBytes), InFunctionScope(false) {}
276aaad5744SZachary Turner 
277aaad5744SZachary Turner /// CVSymbolVisitor overrides.
278aaad5744SZachary Turner #define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
279aaad5744SZachary Turner   void visit##Name(SymbolKind Kind, Name &Record);
280aaad5744SZachary Turner #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
281aaad5744SZachary Turner #include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
282aaad5744SZachary Turner 
283aaad5744SZachary Turner   void visitSymbolBegin(SymbolKind Kind, ArrayRef<uint8_t> Data);
284aaad5744SZachary Turner   void visitSymbolEnd(SymbolKind Kind, ArrayRef<uint8_t> OriginalSymData);
285aaad5744SZachary Turner   void visitUnknownSymbol(SymbolKind Kind, ArrayRef<uint8_t> Data);
286aaad5744SZachary Turner 
287aaad5744SZachary Turner private:
288aaad5744SZachary Turner   void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
289aaad5744SZachary Turner                                    uint32_t RelocationOffset);
290aaad5744SZachary Turner   void printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps);
291aaad5744SZachary Turner 
292aaad5744SZachary Turner   CVTypeDumper &CVTD;
293aaad5744SZachary Turner   SymbolDumpDelegate *ObjDelegate;
294aaad5744SZachary Turner   ScopedPrinter &W;
295aaad5744SZachary Turner 
296aaad5744SZachary Turner   bool PrintRecordBytes;
297aaad5744SZachary Turner   bool InFunctionScope;
298aaad5744SZachary Turner };
299aaad5744SZachary Turner }
300aaad5744SZachary Turner 
301aaad5744SZachary Turner void CVSymbolDumperImpl::printLocalVariableAddrRange(
302aaad5744SZachary Turner     const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
303aaad5744SZachary Turner   DictScope S(W, "LocalVariableAddrRange");
304aaad5744SZachary Turner   if (ObjDelegate)
305aaad5744SZachary Turner     ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
306aaad5744SZachary Turner                                      Range.OffsetStart);
307aaad5744SZachary Turner   W.printHex("ISectStart", Range.ISectStart);
308aaad5744SZachary Turner   W.printHex("Range", Range.Range);
309aaad5744SZachary Turner }
310aaad5744SZachary Turner 
311aaad5744SZachary Turner void CVSymbolDumperImpl::printLocalVariableAddrGap(
312aaad5744SZachary Turner     ArrayRef<LocalVariableAddrGap> Gaps) {
313aaad5744SZachary Turner   for (auto &Gap : Gaps) {
314aaad5744SZachary Turner     ListScope S(W, "LocalVariableAddrGap");
315aaad5744SZachary Turner     W.printHex("GapStartOffset", Gap.GapStartOffset);
316aaad5744SZachary Turner     W.printHex("Range", Gap.Range);
317aaad5744SZachary Turner   }
318aaad5744SZachary Turner }
319aaad5744SZachary Turner 
320aaad5744SZachary Turner void CVSymbolDumperImpl::visitSymbolBegin(SymbolKind Kind,
321aaad5744SZachary Turner                                           ArrayRef<uint8_t> Data) {}
322aaad5744SZachary Turner 
323aaad5744SZachary Turner void CVSymbolDumperImpl::visitSymbolEnd(SymbolKind Kind,
324aaad5744SZachary Turner                                         ArrayRef<uint8_t> OriginalSymData) {
325aaad5744SZachary Turner   if (PrintRecordBytes && ObjDelegate)
326aaad5744SZachary Turner     ObjDelegate->printBinaryBlockWithRelocs("SymData", OriginalSymData);
327aaad5744SZachary Turner }
328aaad5744SZachary Turner 
329aaad5744SZachary Turner void CVSymbolDumperImpl::visitBlockSym(SymbolKind Kind, BlockSym &Block) {
330aaad5744SZachary Turner   DictScope S(W, "BlockStart");
331aaad5744SZachary Turner 
332aaad5744SZachary Turner   StringRef LinkageName;
333aaad5744SZachary Turner   W.printHex("PtrParent", Block.Header.PtrParent);
334aaad5744SZachary Turner   W.printHex("PtrEnd", Block.Header.PtrEnd);
335aaad5744SZachary Turner   W.printHex("CodeSize", Block.Header.CodeSize);
336aaad5744SZachary Turner   if (ObjDelegate) {
337aaad5744SZachary Turner     ObjDelegate->printRelocatedField("CodeOffset", Block.getRelocationOffset(),
338aaad5744SZachary Turner                                      Block.Header.CodeOffset, &LinkageName);
339aaad5744SZachary Turner   }
340aaad5744SZachary Turner   W.printHex("Segment", Block.Header.Segment);
341aaad5744SZachary Turner   W.printString("BlockName", Block.Name);
342aaad5744SZachary Turner   W.printString("LinkageName", LinkageName);
343aaad5744SZachary Turner }
344aaad5744SZachary Turner 
3454caa1bf0SZachary Turner void CVSymbolDumperImpl::visitThunk32Sym(SymbolKind Kind, Thunk32Sym &Thunk) {
3464caa1bf0SZachary Turner   DictScope S(W, "Thunk32");
3474caa1bf0SZachary Turner   W.printNumber("Parent", Thunk.Header.Parent);
3484caa1bf0SZachary Turner   W.printNumber("End", Thunk.Header.End);
3494caa1bf0SZachary Turner   W.printNumber("Next", Thunk.Header.Next);
3504caa1bf0SZachary Turner   W.printNumber("Off", Thunk.Header.Off);
3514caa1bf0SZachary Turner   W.printNumber("Seg", Thunk.Header.Seg);
3524caa1bf0SZachary Turner   W.printNumber("Len", Thunk.Header.Len);
3534caa1bf0SZachary Turner   W.printEnum("Ordinal", Thunk.Header.Ord, makeArrayRef(ThunkOrdinalNames));
3544caa1bf0SZachary Turner }
3554caa1bf0SZachary Turner 
3564caa1bf0SZachary Turner void CVSymbolDumperImpl::visitTrampolineSym(SymbolKind Kind,
3574caa1bf0SZachary Turner                                             TrampolineSym &Tramp) {
3584caa1bf0SZachary Turner   DictScope S(W, "Trampoline");
3594caa1bf0SZachary Turner   W.printEnum("Type", Tramp.Header.Type, makeArrayRef(TrampolineNames));
3604caa1bf0SZachary Turner   W.printNumber("Size", Tramp.Header.Size);
3614caa1bf0SZachary Turner   W.printNumber("ThunkOff", Tramp.Header.ThunkOff);
3624caa1bf0SZachary Turner   W.printNumber("TargetOff", Tramp.Header.TargetOff);
3634caa1bf0SZachary Turner   W.printNumber("ThunkSection", Tramp.Header.ThunkSection);
3644caa1bf0SZachary Turner   W.printNumber("TargetSection", Tramp.Header.TargetSection);
3654caa1bf0SZachary Turner }
3664caa1bf0SZachary Turner 
3674caa1bf0SZachary Turner void CVSymbolDumperImpl::visitSectionSym(SymbolKind Kind, SectionSym &Section) {
3684caa1bf0SZachary Turner   DictScope S(W, "Section");
3694caa1bf0SZachary Turner   W.printNumber("SectionNumber", Section.Header.SectionNumber);
3704caa1bf0SZachary Turner   W.printNumber("Alignment", Section.Header.Alignment);
3714caa1bf0SZachary Turner   W.printNumber("Reserved", Section.Header.Reserved);
3724caa1bf0SZachary Turner   W.printNumber("Rva", Section.Header.Rva);
3734caa1bf0SZachary Turner   W.printNumber("Length", Section.Header.Length);
3744caa1bf0SZachary Turner   W.printHex("Characteristics", Section.Header.Characteristics);
3754caa1bf0SZachary Turner   W.printString("Name", Section.Name);
3764caa1bf0SZachary Turner }
3774caa1bf0SZachary Turner 
3784caa1bf0SZachary Turner void CVSymbolDumperImpl::visitCoffGroupSym(SymbolKind Kind,
3794caa1bf0SZachary Turner                                            CoffGroupSym &CoffGroup) {
3804caa1bf0SZachary Turner   DictScope S(W, "COFF Group");
3814caa1bf0SZachary Turner   W.printNumber("Size", CoffGroup.Header.Size);
3824caa1bf0SZachary Turner   W.printHex("Characteristics", CoffGroup.Header.Characteristics);
3834caa1bf0SZachary Turner   W.printNumber("Offset", CoffGroup.Header.Offset);
3844caa1bf0SZachary Turner   W.printNumber("Segment", CoffGroup.Header.Segment);
3854caa1bf0SZachary Turner   W.printString("Name", CoffGroup.Name);
3864caa1bf0SZachary Turner }
3874caa1bf0SZachary Turner 
388aaad5744SZachary Turner void CVSymbolDumperImpl::visitBPRelativeSym(SymbolKind Kind,
389aaad5744SZachary Turner                                             BPRelativeSym &BPRel) {
390aaad5744SZachary Turner   DictScope S(W, "BPRelativeSym");
391aaad5744SZachary Turner 
392aaad5744SZachary Turner   W.printNumber("Offset", BPRel.Header.Offset);
393aaad5744SZachary Turner   CVTD.printTypeIndex("Type", BPRel.Header.Type);
394aaad5744SZachary Turner   W.printString("VarName", BPRel.Name);
395aaad5744SZachary Turner }
396aaad5744SZachary Turner 
397aaad5744SZachary Turner void CVSymbolDumperImpl::visitBuildInfoSym(SymbolKind Kind,
398aaad5744SZachary Turner                                            BuildInfoSym &BuildInfo) {
399aaad5744SZachary Turner   DictScope S(W, "BuildInfo");
400aaad5744SZachary Turner 
401aaad5744SZachary Turner   W.printNumber("BuildId", BuildInfo.Header.BuildId);
402aaad5744SZachary Turner }
403aaad5744SZachary Turner 
404aaad5744SZachary Turner void CVSymbolDumperImpl::visitCallSiteInfoSym(SymbolKind Kind,
405aaad5744SZachary Turner                                               CallSiteInfoSym &CallSiteInfo) {
406aaad5744SZachary Turner   DictScope S(W, "CallSiteInfo");
407aaad5744SZachary Turner 
408aaad5744SZachary Turner   StringRef LinkageName;
409aaad5744SZachary Turner   if (ObjDelegate) {
410aaad5744SZachary Turner     ObjDelegate->printRelocatedField(
411aaad5744SZachary Turner         "CodeOffset", CallSiteInfo.getRelocationOffset(),
412aaad5744SZachary Turner         CallSiteInfo.Header.CodeOffset, &LinkageName);
413aaad5744SZachary Turner   }
414aaad5744SZachary Turner   W.printHex("Segment", CallSiteInfo.Header.Segment);
415aaad5744SZachary Turner   W.printHex("Reserved", CallSiteInfo.Header.Reserved);
416aaad5744SZachary Turner   CVTD.printTypeIndex("Type", CallSiteInfo.Header.Type);
417aaad5744SZachary Turner   if (!LinkageName.empty())
418aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
419aaad5744SZachary Turner }
420aaad5744SZachary Turner 
4214caa1bf0SZachary Turner void CVSymbolDumperImpl::visitEnvBlockSym(SymbolKind Kind,
4224caa1bf0SZachary Turner                                           EnvBlockSym &EnvBlock) {
4234caa1bf0SZachary Turner   DictScope S(W, "EnvBlock");
4244caa1bf0SZachary Turner 
4254caa1bf0SZachary Turner   W.printNumber("Reserved", EnvBlock.Header.Reserved);
4264caa1bf0SZachary Turner   ListScope L(W, "Entries");
4274caa1bf0SZachary Turner   for (auto Entry : EnvBlock.Fields) {
4284caa1bf0SZachary Turner     W.printString(Entry);
4294caa1bf0SZachary Turner   }
4304caa1bf0SZachary Turner }
4314caa1bf0SZachary Turner 
4324caa1bf0SZachary Turner void CVSymbolDumperImpl::visitFileStaticSym(SymbolKind Kind,
4334caa1bf0SZachary Turner                                             FileStaticSym &FileStatic) {
4344caa1bf0SZachary Turner   DictScope S(W, "FileStatic");
4354caa1bf0SZachary Turner   W.printNumber("Index", FileStatic.Header.Index);
4364caa1bf0SZachary Turner   W.printNumber("ModFilenameOffset", FileStatic.Header.ModFilenameOffset);
4374caa1bf0SZachary Turner   W.printFlags("Flags", uint16_t(FileStatic.Header.Flags),
4384caa1bf0SZachary Turner                makeArrayRef(LocalFlags));
4394caa1bf0SZachary Turner   W.printString("Name", FileStatic.Name);
4404caa1bf0SZachary Turner }
4414caa1bf0SZachary Turner 
4429f054d42SZachary Turner void CVSymbolDumperImpl::visitExportSym(SymbolKind Kind, ExportSym &Export) {
4439f054d42SZachary Turner   DictScope S(W, "Export");
4449f054d42SZachary Turner   W.printNumber("Ordinal", Export.Header.Ordinal);
4459f054d42SZachary Turner   W.printFlags("Flags", Export.Header.Flags, makeArrayRef(ExportSymFlags));
4469f054d42SZachary Turner   W.printString("Name", Export.Name);
4479f054d42SZachary Turner }
4489f054d42SZachary Turner 
4494caa1bf0SZachary Turner void CVSymbolDumperImpl::visitCompile2Sym(SymbolKind Kind,
4504caa1bf0SZachary Turner                                           Compile2Sym &Compile2) {
4514caa1bf0SZachary Turner   DictScope S(W, "CompilerFlags2");
4524caa1bf0SZachary Turner 
4534caa1bf0SZachary Turner   W.printEnum("Language", Compile2.Header.getLanguage(),
4544caa1bf0SZachary Turner               makeArrayRef(SourceLanguages));
4554caa1bf0SZachary Turner   W.printFlags("Flags", Compile2.Header.flags & ~0xff,
4564caa1bf0SZachary Turner                makeArrayRef(CompileSym2FlagNames));
4574caa1bf0SZachary Turner   W.printEnum("Machine", unsigned(Compile2.Header.Machine),
4584caa1bf0SZachary Turner               makeArrayRef(CPUTypeNames));
4594caa1bf0SZachary Turner   std::string FrontendVersion;
4604caa1bf0SZachary Turner   {
4614caa1bf0SZachary Turner     raw_string_ostream Out(FrontendVersion);
4624caa1bf0SZachary Turner     Out << Compile2.Header.VersionFrontendMajor << '.'
4634caa1bf0SZachary Turner         << Compile2.Header.VersionFrontendMinor << '.'
4644caa1bf0SZachary Turner         << Compile2.Header.VersionFrontendBuild;
4654caa1bf0SZachary Turner   }
4664caa1bf0SZachary Turner   std::string BackendVersion;
4674caa1bf0SZachary Turner   {
4684caa1bf0SZachary Turner     raw_string_ostream Out(BackendVersion);
4694caa1bf0SZachary Turner     Out << Compile2.Header.VersionBackendMajor << '.'
4704caa1bf0SZachary Turner         << Compile2.Header.VersionBackendMinor << '.'
4714caa1bf0SZachary Turner         << Compile2.Header.VersionBackendBuild;
4724caa1bf0SZachary Turner   }
4734caa1bf0SZachary Turner   W.printString("FrontendVersion", FrontendVersion);
4744caa1bf0SZachary Turner   W.printString("BackendVersion", BackendVersion);
4754caa1bf0SZachary Turner   W.printString("VersionName", Compile2.Version);
4764caa1bf0SZachary Turner }
4774caa1bf0SZachary Turner 
478aaad5744SZachary Turner void CVSymbolDumperImpl::visitCompile3Sym(SymbolKind Kind,
479aaad5744SZachary Turner                                           Compile3Sym &Compile3) {
4804caa1bf0SZachary Turner   DictScope S(W, "CompilerFlags3");
481aaad5744SZachary Turner 
482aaad5744SZachary Turner   W.printEnum("Language", Compile3.Header.getLanguage(),
483aaad5744SZachary Turner               makeArrayRef(SourceLanguages));
484aaad5744SZachary Turner   W.printFlags("Flags", Compile3.Header.flags & ~0xff,
485aaad5744SZachary Turner                makeArrayRef(CompileSym3FlagNames));
486aaad5744SZachary Turner   W.printEnum("Machine", unsigned(Compile3.Header.Machine),
487aaad5744SZachary Turner               makeArrayRef(CPUTypeNames));
488aaad5744SZachary Turner   std::string FrontendVersion;
489aaad5744SZachary Turner   {
490aaad5744SZachary Turner     raw_string_ostream Out(FrontendVersion);
491aaad5744SZachary Turner     Out << Compile3.Header.VersionFrontendMajor << '.'
492aaad5744SZachary Turner         << Compile3.Header.VersionFrontendMinor << '.'
493aaad5744SZachary Turner         << Compile3.Header.VersionFrontendBuild << '.'
494aaad5744SZachary Turner         << Compile3.Header.VersionFrontendQFE;
495aaad5744SZachary Turner   }
496aaad5744SZachary Turner   std::string BackendVersion;
497aaad5744SZachary Turner   {
498aaad5744SZachary Turner     raw_string_ostream Out(BackendVersion);
499aaad5744SZachary Turner     Out << Compile3.Header.VersionBackendMajor << '.'
500aaad5744SZachary Turner         << Compile3.Header.VersionBackendMinor << '.'
501aaad5744SZachary Turner         << Compile3.Header.VersionBackendBuild << '.'
502aaad5744SZachary Turner         << Compile3.Header.VersionBackendQFE;
503aaad5744SZachary Turner   }
504aaad5744SZachary Turner   W.printString("FrontendVersion", FrontendVersion);
505aaad5744SZachary Turner   W.printString("BackendVersion", BackendVersion);
506aaad5744SZachary Turner   W.printString("VersionName", Compile3.Version);
507aaad5744SZachary Turner }
508aaad5744SZachary Turner 
509aaad5744SZachary Turner void CVSymbolDumperImpl::visitConstantSym(SymbolKind Kind,
510aaad5744SZachary Turner                                           ConstantSym &Constant) {
511aaad5744SZachary Turner   DictScope S(W, "Constant");
512aaad5744SZachary Turner 
513aaad5744SZachary Turner   CVTD.printTypeIndex("Type", Constant.Header.Type);
514aaad5744SZachary Turner   W.printNumber("Value", Constant.Value);
515aaad5744SZachary Turner   W.printString("Name", Constant.Name);
516aaad5744SZachary Turner }
517aaad5744SZachary Turner 
518aaad5744SZachary Turner void CVSymbolDumperImpl::visitDataSym(SymbolKind Kind, DataSym &Data) {
519aaad5744SZachary Turner   DictScope S(W, "DataSym");
520aaad5744SZachary Turner 
521aaad5744SZachary Turner   StringRef LinkageName;
522aaad5744SZachary Turner   if (ObjDelegate) {
523aaad5744SZachary Turner     ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
524aaad5744SZachary Turner                                      Data.Header.DataOffset, &LinkageName);
525aaad5744SZachary Turner   }
526aaad5744SZachary Turner   CVTD.printTypeIndex("Type", Data.Header.Type);
527aaad5744SZachary Turner   W.printString("DisplayName", Data.Name);
528aaad5744SZachary Turner   if (!LinkageName.empty())
529aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
530aaad5744SZachary Turner }
531aaad5744SZachary Turner 
532aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeFramePointerRelFullScopeSym(
533aaad5744SZachary Turner     SymbolKind Kind,
534aaad5744SZachary Turner     DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
535aaad5744SZachary Turner   DictScope S(W, "DefRangeFramePointerRelFullScope");
536aaad5744SZachary Turner   W.printNumber("Offset", DefRangeFramePointerRelFullScope.Header.Offset);
537aaad5744SZachary Turner }
538aaad5744SZachary Turner 
539aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeFramePointerRelSym(
540aaad5744SZachary Turner     SymbolKind Kind, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
541aaad5744SZachary Turner   DictScope S(W, "DefRangeFramePointerRel");
542aaad5744SZachary Turner 
543aaad5744SZachary Turner   W.printNumber("Offset", DefRangeFramePointerRel.Header.Offset);
544aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeFramePointerRel.Header.Range,
545aaad5744SZachary Turner                               DefRangeFramePointerRel.getRelocationOffset());
546aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
547aaad5744SZachary Turner }
548aaad5744SZachary Turner 
549aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeRegisterRelSym(
550aaad5744SZachary Turner     SymbolKind Kind, DefRangeRegisterRelSym &DefRangeRegisterRel) {
551aaad5744SZachary Turner   DictScope S(W, "DefRangeRegisterRel");
552aaad5744SZachary Turner 
553aaad5744SZachary Turner   W.printNumber("BaseRegister", DefRangeRegisterRel.Header.BaseRegister);
554aaad5744SZachary Turner   W.printBoolean("HasSpilledUDTMember",
555aaad5744SZachary Turner                  DefRangeRegisterRel.hasSpilledUDTMember());
556aaad5744SZachary Turner   W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
557aaad5744SZachary Turner   W.printNumber("BasePointerOffset",
558aaad5744SZachary Turner                 DefRangeRegisterRel.Header.BasePointerOffset);
559aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeRegisterRel.Header.Range,
560aaad5744SZachary Turner                               DefRangeRegisterRel.getRelocationOffset());
561aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
562aaad5744SZachary Turner }
563aaad5744SZachary Turner 
564aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeRegisterSym(
565aaad5744SZachary Turner     SymbolKind Kind, DefRangeRegisterSym &DefRangeRegister) {
566aaad5744SZachary Turner   DictScope S(W, "DefRangeRegister");
567aaad5744SZachary Turner 
568aaad5744SZachary Turner   W.printNumber("Register", DefRangeRegister.Header.Register);
569aaad5744SZachary Turner   W.printNumber("MayHaveNoName", DefRangeRegister.Header.MayHaveNoName);
570aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeRegister.Header.Range,
571aaad5744SZachary Turner                               DefRangeRegister.getRelocationOffset());
572aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeRegister.Gaps);
573aaad5744SZachary Turner }
574aaad5744SZachary Turner 
575aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeSubfieldRegisterSym(
576aaad5744SZachary Turner     SymbolKind Kind, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
577aaad5744SZachary Turner   DictScope S(W, "DefRangeSubfieldRegister");
578aaad5744SZachary Turner 
579aaad5744SZachary Turner   W.printNumber("Register", DefRangeSubfieldRegister.Header.Register);
580aaad5744SZachary Turner   W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Header.MayHaveNoName);
581aaad5744SZachary Turner   W.printNumber("OffsetInParent",
582aaad5744SZachary Turner                 DefRangeSubfieldRegister.Header.OffsetInParent);
583aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeSubfieldRegister.Header.Range,
584aaad5744SZachary Turner                               DefRangeSubfieldRegister.getRelocationOffset());
585aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
586aaad5744SZachary Turner }
587aaad5744SZachary Turner 
588aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeSubfieldSym(
589aaad5744SZachary Turner     SymbolKind Kind, DefRangeSubfieldSym &DefRangeSubfield) {
590aaad5744SZachary Turner   DictScope S(W, "DefRangeSubfield");
591aaad5744SZachary Turner 
592aaad5744SZachary Turner   if (ObjDelegate) {
593aaad5744SZachary Turner     StringRef StringTable = ObjDelegate->getStringTable();
594*c6cb2ec3SDavid Majnemer     auto ProgramStringTableOffset = DefRangeSubfield.Header.Program;
595*c6cb2ec3SDavid Majnemer     if (ProgramStringTableOffset >= StringTable.size())
596*c6cb2ec3SDavid Majnemer       return parseError();
597*c6cb2ec3SDavid Majnemer     StringRef Program =
598*c6cb2ec3SDavid Majnemer         StringTable.drop_front(ProgramStringTableOffset).split('\0').first;
599*c6cb2ec3SDavid Majnemer     W.printString("Program", Program);
600aaad5744SZachary Turner   }
601aaad5744SZachary Turner   W.printNumber("OffsetInParent", DefRangeSubfield.Header.OffsetInParent);
602aaad5744SZachary Turner   printLocalVariableAddrRange(DefRangeSubfield.Header.Range,
603aaad5744SZachary Turner                               DefRangeSubfield.getRelocationOffset());
604aaad5744SZachary Turner   printLocalVariableAddrGap(DefRangeSubfield.Gaps);
605aaad5744SZachary Turner }
606aaad5744SZachary Turner 
607aaad5744SZachary Turner void CVSymbolDumperImpl::visitDefRangeSym(SymbolKind Kind,
608aaad5744SZachary Turner                                           DefRangeSym &DefRange) {
609aaad5744SZachary Turner   DictScope S(W, "DefRange");
610aaad5744SZachary Turner 
611aaad5744SZachary Turner   if (ObjDelegate) {
612aaad5744SZachary Turner     StringRef StringTable = ObjDelegate->getStringTable();
613b343310bSDavid Majnemer     auto ProgramStringTableOffset = DefRange.Header.Program;
614b343310bSDavid Majnemer     if (ProgramStringTableOffset >= StringTable.size())
615b343310bSDavid Majnemer       return parseError();
616b343310bSDavid Majnemer     StringRef Program =
617b343310bSDavid Majnemer         StringTable.drop_front(ProgramStringTableOffset).split('\0').first;
618b343310bSDavid Majnemer     W.printString("Program", Program);
619aaad5744SZachary Turner   }
620aaad5744SZachary Turner   printLocalVariableAddrRange(DefRange.Header.Range,
621aaad5744SZachary Turner                               DefRange.getRelocationOffset());
622aaad5744SZachary Turner   printLocalVariableAddrGap(DefRange.Gaps);
623aaad5744SZachary Turner }
624aaad5744SZachary Turner 
625aaad5744SZachary Turner void CVSymbolDumperImpl::visitFrameCookieSym(SymbolKind Kind,
626aaad5744SZachary Turner                                              FrameCookieSym &FrameCookie) {
627aaad5744SZachary Turner   DictScope S(W, "FrameCookie");
628aaad5744SZachary Turner 
629aaad5744SZachary Turner   StringRef LinkageName;
630aaad5744SZachary Turner   if (ObjDelegate) {
631aaad5744SZachary Turner     ObjDelegate->printRelocatedField(
632aaad5744SZachary Turner         "CodeOffset", FrameCookie.getRelocationOffset(),
633aaad5744SZachary Turner         FrameCookie.Header.CodeOffset, &LinkageName);
634aaad5744SZachary Turner   }
635aaad5744SZachary Turner   W.printHex("Register", FrameCookie.Header.Register);
636aaad5744SZachary Turner   W.printEnum("CookieKind", uint16_t(FrameCookie.Header.CookieKind),
637aaad5744SZachary Turner               makeArrayRef(FrameCookieKinds));
638aaad5744SZachary Turner }
639aaad5744SZachary Turner 
640aaad5744SZachary Turner void CVSymbolDumperImpl::visitFrameProcSym(SymbolKind Kind,
641aaad5744SZachary Turner                                            FrameProcSym &FrameProc) {
642aaad5744SZachary Turner   DictScope S(W, "FrameProc");
643aaad5744SZachary Turner 
644aaad5744SZachary Turner   W.printHex("TotalFrameBytes", FrameProc.Header.TotalFrameBytes);
645aaad5744SZachary Turner   W.printHex("PaddingFrameBytes", FrameProc.Header.PaddingFrameBytes);
646aaad5744SZachary Turner   W.printHex("OffsetToPadding", FrameProc.Header.OffsetToPadding);
647aaad5744SZachary Turner   W.printHex("BytesOfCalleeSavedRegisters",
648aaad5744SZachary Turner              FrameProc.Header.BytesOfCalleeSavedRegisters);
649aaad5744SZachary Turner   W.printHex("OffsetOfExceptionHandler",
650aaad5744SZachary Turner              FrameProc.Header.OffsetOfExceptionHandler);
651aaad5744SZachary Turner   W.printHex("SectionIdOfExceptionHandler",
652aaad5744SZachary Turner              FrameProc.Header.SectionIdOfExceptionHandler);
653aaad5744SZachary Turner   W.printFlags("Flags", FrameProc.Header.Flags,
654aaad5744SZachary Turner                makeArrayRef(FrameProcSymFlags));
655aaad5744SZachary Turner }
656aaad5744SZachary Turner 
657aaad5744SZachary Turner void CVSymbolDumperImpl::visitHeapAllocationSiteSym(
658aaad5744SZachary Turner     SymbolKind Kind, HeapAllocationSiteSym &HeapAllocSite) {
659aaad5744SZachary Turner   DictScope S(W, "HeapAllocationSite");
660aaad5744SZachary Turner 
661aaad5744SZachary Turner   StringRef LinkageName;
662aaad5744SZachary Turner   if (ObjDelegate) {
663aaad5744SZachary Turner     ObjDelegate->printRelocatedField(
664aaad5744SZachary Turner         "CodeOffset", HeapAllocSite.getRelocationOffset(),
665aaad5744SZachary Turner         HeapAllocSite.Header.CodeOffset, &LinkageName);
666aaad5744SZachary Turner   }
667aaad5744SZachary Turner   W.printHex("Segment", HeapAllocSite.Header.Segment);
668aaad5744SZachary Turner   W.printHex("CallInstructionSize", HeapAllocSite.Header.CallInstructionSize);
669aaad5744SZachary Turner   CVTD.printTypeIndex("Type", HeapAllocSite.Header.Type);
670aaad5744SZachary Turner   if (!LinkageName.empty())
671aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
672aaad5744SZachary Turner }
673aaad5744SZachary Turner 
674aaad5744SZachary Turner void CVSymbolDumperImpl::visitInlineSiteSym(SymbolKind Kind,
675aaad5744SZachary Turner                                             InlineSiteSym &InlineSite) {
676aaad5744SZachary Turner   DictScope S(W, "InlineSite");
677aaad5744SZachary Turner 
678aaad5744SZachary Turner   W.printHex("PtrParent", InlineSite.Header.PtrParent);
679aaad5744SZachary Turner   W.printHex("PtrEnd", InlineSite.Header.PtrEnd);
680aaad5744SZachary Turner   CVTD.printTypeIndex("Inlinee", InlineSite.Header.Inlinee);
681aaad5744SZachary Turner 
682aaad5744SZachary Turner   ListScope BinaryAnnotations(W, "BinaryAnnotations");
683aaad5744SZachary Turner   for (auto &Annotation : InlineSite.annotations()) {
684aaad5744SZachary Turner     switch (Annotation.OpCode) {
685aaad5744SZachary Turner     case BinaryAnnotationsOpCode::Invalid:
686aaad5744SZachary Turner       return parseError();
687aaad5744SZachary Turner     case BinaryAnnotationsOpCode::CodeOffset:
688aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeOffset:
689aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeLength:
690aaad5744SZachary Turner       W.printHex(Annotation.Name, Annotation.U1);
691aaad5744SZachary Turner       break;
692aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
693aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeLineEndDelta:
694aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeRangeKind:
695aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeColumnStart:
696aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeColumnEnd:
697aaad5744SZachary Turner       W.printNumber(Annotation.Name, Annotation.U1);
698aaad5744SZachary Turner       break;
699aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeLineOffset:
700aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
701aaad5744SZachary Turner       W.printNumber(Annotation.Name, Annotation.S1);
702aaad5744SZachary Turner       break;
703aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeFile:
704aaad5744SZachary Turner       if (ObjDelegate) {
705aaad5744SZachary Turner         W.printHex("ChangeFile",
706aaad5744SZachary Turner                    ObjDelegate->getFileNameForFileOffset(Annotation.U1),
707aaad5744SZachary Turner                    Annotation.U1);
708aaad5744SZachary Turner       } else {
709aaad5744SZachary Turner         W.printHex("ChangeFile", Annotation.U1);
710aaad5744SZachary Turner       }
711aaad5744SZachary Turner 
712aaad5744SZachary Turner       break;
713aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
714aaad5744SZachary Turner       W.startLine() << "ChangeCodeOffsetAndLineOffset: {CodeOffset: "
715aaad5744SZachary Turner                     << W.hex(Annotation.U1) << ", LineOffset: " << Annotation.S1
716aaad5744SZachary Turner                     << "}\n";
717aaad5744SZachary Turner       break;
718aaad5744SZachary Turner     }
719aaad5744SZachary Turner     case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
720aaad5744SZachary Turner       W.startLine() << "ChangeCodeLengthAndCodeOffset: {CodeOffset: "
721aaad5744SZachary Turner                     << W.hex(Annotation.U2)
722aaad5744SZachary Turner                     << ", Length: " << W.hex(Annotation.U1) << "}\n";
723aaad5744SZachary Turner       break;
724aaad5744SZachary Turner     }
725aaad5744SZachary Turner     }
726aaad5744SZachary Turner   }
727aaad5744SZachary Turner }
728aaad5744SZachary Turner 
7294caa1bf0SZachary Turner void CVSymbolDumperImpl::visitRegisterSym(SymbolKind Kind,
7304caa1bf0SZachary Turner                                           RegisterSym &Register) {
7314caa1bf0SZachary Turner   DictScope S(W, "RegisterSym");
7324caa1bf0SZachary Turner   W.printNumber("Type", Register.Header.Index);
7334caa1bf0SZachary Turner   W.printEnum("Seg", uint16_t(Register.Header.Register),
7344caa1bf0SZachary Turner               makeArrayRef(RegisterNames));
7354caa1bf0SZachary Turner   W.printString("Name", Register.Name);
7364caa1bf0SZachary Turner }
7374caa1bf0SZachary Turner 
7389e33e6f8SZachary Turner void CVSymbolDumperImpl::visitPublicSym32(SymbolKind Kind,
7399e33e6f8SZachary Turner                                           PublicSym32 &Public) {
7409e33e6f8SZachary Turner   DictScope S(W, "PublicSym");
7419e33e6f8SZachary Turner   W.printNumber("Type", Public.Header.Index);
7429e33e6f8SZachary Turner   W.printNumber("Seg", Public.Header.Seg);
7439e33e6f8SZachary Turner   W.printNumber("Off", Public.Header.Off);
7449e33e6f8SZachary Turner   W.printString("Name", Public.Name);
7459e33e6f8SZachary Turner }
7469e33e6f8SZachary Turner 
7479e33e6f8SZachary Turner void CVSymbolDumperImpl::visitProcRefSym(SymbolKind Kind, ProcRefSym &ProcRef) {
7489e33e6f8SZachary Turner   DictScope S(W, "ProcRef");
7499e33e6f8SZachary Turner   W.printNumber("SumName", ProcRef.Header.SumName);
7509e33e6f8SZachary Turner   W.printNumber("SymOffset", ProcRef.Header.SymOffset);
7519e33e6f8SZachary Turner   W.printNumber("Mod", ProcRef.Header.Mod);
7529e33e6f8SZachary Turner   W.printString("Name", ProcRef.Name);
7539e33e6f8SZachary Turner }
7549e33e6f8SZachary Turner 
755aaad5744SZachary Turner void CVSymbolDumperImpl::visitLabelSym(SymbolKind Kind, LabelSym &Label) {
756aaad5744SZachary Turner   DictScope S(W, "Label");
757aaad5744SZachary Turner 
758aaad5744SZachary Turner   StringRef LinkageName;
759aaad5744SZachary Turner   if (ObjDelegate) {
760aaad5744SZachary Turner     ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(),
761aaad5744SZachary Turner                                      Label.Header.CodeOffset, &LinkageName);
762aaad5744SZachary Turner   }
763aaad5744SZachary Turner   W.printHex("Segment", Label.Header.Segment);
764aaad5744SZachary Turner   W.printHex("Flags", Label.Header.Flags);
765aaad5744SZachary Turner   W.printFlags("Flags", Label.Header.Flags, makeArrayRef(ProcSymFlagNames));
766aaad5744SZachary Turner   W.printString("DisplayName", Label.Name);
767aaad5744SZachary Turner   if (!LinkageName.empty())
768aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
769aaad5744SZachary Turner }
770aaad5744SZachary Turner 
771aaad5744SZachary Turner void CVSymbolDumperImpl::visitLocalSym(SymbolKind Kind, LocalSym &Local) {
772aaad5744SZachary Turner   DictScope S(W, "Local");
773aaad5744SZachary Turner 
774aaad5744SZachary Turner   CVTD.printTypeIndex("Type", Local.Header.Type);
775aaad5744SZachary Turner   W.printFlags("Flags", uint16_t(Local.Header.Flags), makeArrayRef(LocalFlags));
776aaad5744SZachary Turner   W.printString("VarName", Local.Name);
777aaad5744SZachary Turner }
778aaad5744SZachary Turner 
779aaad5744SZachary Turner void CVSymbolDumperImpl::visitObjNameSym(SymbolKind Kind, ObjNameSym &ObjName) {
780aaad5744SZachary Turner   DictScope S(W, "ObjectName");
781aaad5744SZachary Turner 
782aaad5744SZachary Turner   W.printHex("Signature", ObjName.Header.Signature);
783aaad5744SZachary Turner   W.printString("ObjectName", ObjName.Name);
784aaad5744SZachary Turner }
785aaad5744SZachary Turner 
786aaad5744SZachary Turner void CVSymbolDumperImpl::visitProcSym(SymbolKind Kind, ProcSym &Proc) {
787aaad5744SZachary Turner   DictScope S(W, "ProcStart");
788aaad5744SZachary Turner 
789aaad5744SZachary Turner   if (InFunctionScope)
790aaad5744SZachary Turner     return parseError();
791aaad5744SZachary Turner 
792aaad5744SZachary Turner   InFunctionScope = true;
793aaad5744SZachary Turner 
794aaad5744SZachary Turner   StringRef LinkageName;
795aaad5744SZachary Turner   W.printHex("PtrParent", Proc.Header.PtrParent);
796aaad5744SZachary Turner   W.printHex("PtrEnd", Proc.Header.PtrEnd);
797aaad5744SZachary Turner   W.printHex("PtrNext", Proc.Header.PtrNext);
798aaad5744SZachary Turner   W.printHex("CodeSize", Proc.Header.CodeSize);
799aaad5744SZachary Turner   W.printHex("DbgStart", Proc.Header.DbgStart);
800aaad5744SZachary Turner   W.printHex("DbgEnd", Proc.Header.DbgEnd);
801aaad5744SZachary Turner   CVTD.printTypeIndex("FunctionType", Proc.Header.FunctionType);
802aaad5744SZachary Turner   if (ObjDelegate) {
803aaad5744SZachary Turner     ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(),
804aaad5744SZachary Turner                                      Proc.Header.CodeOffset, &LinkageName);
805aaad5744SZachary Turner   }
806aaad5744SZachary Turner   W.printHex("Segment", Proc.Header.Segment);
807aaad5744SZachary Turner   W.printFlags("Flags", static_cast<uint8_t>(Proc.Header.Flags),
808aaad5744SZachary Turner                makeArrayRef(ProcSymFlagNames));
809aaad5744SZachary Turner   W.printString("DisplayName", Proc.Name);
810aaad5744SZachary Turner   if (!LinkageName.empty())
811aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
812aaad5744SZachary Turner }
813aaad5744SZachary Turner 
814aaad5744SZachary Turner void CVSymbolDumperImpl::visitScopeEndSym(SymbolKind Kind,
815aaad5744SZachary Turner                                           ScopeEndSym &ScopeEnd) {
816aaad5744SZachary Turner   if (Kind == SymbolKind::S_END)
817cac29ae0SZachary Turner     DictScope S(W, "BlockEnd");
818aaad5744SZachary Turner   else if (Kind == SymbolKind::S_PROC_ID_END)
819cac29ae0SZachary Turner     DictScope S(W, "ProcEnd");
820aaad5744SZachary Turner   else if (Kind == SymbolKind::S_INLINESITE_END)
821aaad5744SZachary Turner     DictScope S(W, "InlineSiteEnd");
822aaad5744SZachary Turner 
823aaad5744SZachary Turner   InFunctionScope = false;
824aaad5744SZachary Turner }
825aaad5744SZachary Turner 
826aaad5744SZachary Turner void CVSymbolDumperImpl::visitCallerSym(SymbolKind Kind, CallerSym &Caller) {
827aaad5744SZachary Turner   ListScope S(W, Kind == S_CALLEES ? "Callees" : "Callers");
828aaad5744SZachary Turner   for (auto FuncID : Caller.Indices)
829aaad5744SZachary Turner     CVTD.printTypeIndex("FuncID", FuncID);
830aaad5744SZachary Turner }
831aaad5744SZachary Turner 
832aaad5744SZachary Turner void CVSymbolDumperImpl::visitRegRelativeSym(SymbolKind Kind,
833aaad5744SZachary Turner                                              RegRelativeSym &RegRel) {
834aaad5744SZachary Turner   DictScope S(W, "RegRelativeSym");
835aaad5744SZachary Turner 
836aaad5744SZachary Turner   W.printHex("Offset", RegRel.Header.Offset);
837aaad5744SZachary Turner   CVTD.printTypeIndex("Type", RegRel.Header.Type);
838aaad5744SZachary Turner   W.printHex("Register", RegRel.Header.Register);
839aaad5744SZachary Turner   W.printString("VarName", RegRel.Name);
840aaad5744SZachary Turner }
841aaad5744SZachary Turner 
842aaad5744SZachary Turner void CVSymbolDumperImpl::visitThreadLocalDataSym(SymbolKind Kind,
843aaad5744SZachary Turner                                                  ThreadLocalDataSym &Data) {
844aaad5744SZachary Turner   DictScope S(W, "ThreadLocalDataSym");
845aaad5744SZachary Turner 
846aaad5744SZachary Turner   StringRef LinkageName;
847aaad5744SZachary Turner   if (ObjDelegate) {
848aaad5744SZachary Turner     ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
849aaad5744SZachary Turner                                      Data.Header.DataOffset, &LinkageName);
850aaad5744SZachary Turner   }
851aaad5744SZachary Turner   CVTD.printTypeIndex("Type", Data.Header.Type);
852aaad5744SZachary Turner   W.printString("DisplayName", Data.Name);
853aaad5744SZachary Turner   if (!LinkageName.empty())
854aaad5744SZachary Turner     W.printString("LinkageName", LinkageName);
855aaad5744SZachary Turner }
856aaad5744SZachary Turner 
857aaad5744SZachary Turner void CVSymbolDumperImpl::visitUDTSym(SymbolKind Kind, UDTSym &UDT) {
858aaad5744SZachary Turner   DictScope S(W, "UDT");
859aaad5744SZachary Turner   CVTD.printTypeIndex("Type", UDT.Header.Type);
860aaad5744SZachary Turner   W.printString("UDTName", UDT.Name);
861aaad5744SZachary Turner }
862aaad5744SZachary Turner 
863aaad5744SZachary Turner void CVSymbolDumperImpl::visitUnknownSymbol(SymbolKind Kind,
864aaad5744SZachary Turner                                             ArrayRef<uint8_t> Data) {
865aaad5744SZachary Turner   DictScope S(W, "UnknownSym");
86600d847b1SZachary Turner   W.printEnum("Kind", uint16_t(Kind), makeArrayRef(SymbolTypeNames));
86700d847b1SZachary Turner   W.printNumber("Length", uint32_t(Data.size()));
868aaad5744SZachary Turner }
869aaad5744SZachary Turner 
8701de49c9fSZachary Turner bool CVSymbolDumper::dump(const CVRecord<SymbolKind> &Record) {
8713e78e2d4SZachary Turner   CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
872aaad5744SZachary Turner   Dumper.visitSymbolRecord(Record);
873aaad5744SZachary Turner   return !Dumper.hadError();
874aaad5744SZachary Turner }
875aaad5744SZachary Turner 
8760d43c1c3SZachary Turner bool CVSymbolDumper::dump(const CVSymbolArray &Symbols) {
8773e78e2d4SZachary Turner   CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
8780d43c1c3SZachary Turner   Dumper.visitSymbolStream(Symbols);
879aaad5744SZachary Turner   return !Dumper.hadError();
880aaad5744SZachary Turner }
881