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