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