blob: 19a2552ff7f3d90e5e4b6da7d0826281d6eb8293 [file] [log] [blame]
Zachary Turneraaad5742016-05-23 23:41:13 +00001//===-- SymbolDumper.cpp - CodeView symbol info dumper ----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
11#include "llvm/ADT/DenseMap.h"
12#include "llvm/ADT/SmallString.h"
13#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
Zachary Turner93839cb2016-06-02 05:07:49 +000014#include "llvm/DebugInfo/CodeView/EnumTables.h"
Zachary Turner0d840742016-10-07 21:34:46 +000015#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
Zachary Turneraaad5742016-05-23 23:41:13 +000016#include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
17#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
Zachary Turner0d840742016-10-07 21:34:46 +000018#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h"
19#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
Zachary Turneraaad5742016-05-23 23:41:13 +000020#include "llvm/DebugInfo/CodeView/TypeDumper.h"
21#include "llvm/DebugInfo/CodeView/TypeIndex.h"
Zachary Turner0d840742016-10-07 21:34:46 +000022#include "llvm/Support/Error.h"
Zachary Turneraaad5742016-05-23 23:41:13 +000023#include "llvm/Support/ScopedPrinter.h"
24
25#include <system_error>
26
27using namespace llvm;
28using namespace llvm::codeview;
29
Zachary Turneraaad5742016-05-23 23:41:13 +000030namespace {
Zachary Turneraaad5742016-05-23 23:41:13 +000031/// Use this private dumper implementation to keep implementation details about
32/// the visitor out of SymbolDumper.h.
Zachary Turner0d840742016-10-07 21:34:46 +000033class CVSymbolDumperImpl : public SymbolVisitorCallbacks {
Zachary Turneraaad5742016-05-23 23:41:13 +000034public:
Zachary Turner3e78e2d2016-05-24 00:06:04 +000035 CVSymbolDumperImpl(CVTypeDumper &CVTD, SymbolDumpDelegate *ObjDelegate,
36 ScopedPrinter &W, bool PrintRecordBytes)
Zachary Turner0d840742016-10-07 21:34:46 +000037 : CVTD(CVTD), ObjDelegate(ObjDelegate), W(W),
38 PrintRecordBytes(PrintRecordBytes), InFunctionScope(false) {}
Zachary Turneraaad5742016-05-23 23:41:13 +000039
40/// CVSymbolVisitor overrides.
41#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
Zachary Turner0d840742016-10-07 21:34:46 +000042 Error visitKnownRecord(CVSymbol &CVR, Name &Record) override;
Zachary Turneraaad5742016-05-23 23:41:13 +000043#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
44#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
45
Zachary Turner0d840742016-10-07 21:34:46 +000046 Error visitSymbolBegin(CVSymbol &Record) override;
47 Error visitSymbolEnd(CVSymbol &Record) override;
48 Error visitUnknownSymbol(CVSymbol &Record) override;
Zachary Turneraaad5742016-05-23 23:41:13 +000049
50private:
51 void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
52 uint32_t RelocationOffset);
53 void printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps);
54
Zachary Turneraaad5742016-05-23 23:41:13 +000055 CVTypeDumper &CVTD;
56 SymbolDumpDelegate *ObjDelegate;
57 ScopedPrinter &W;
58
59 bool PrintRecordBytes;
60 bool InFunctionScope;
61};
62}
63
64void CVSymbolDumperImpl::printLocalVariableAddrRange(
65 const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
66 DictScope S(W, "LocalVariableAddrRange");
67 if (ObjDelegate)
68 ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
69 Range.OffsetStart);
70 W.printHex("ISectStart", Range.ISectStart);
71 W.printHex("Range", Range.Range);
72}
73
74void CVSymbolDumperImpl::printLocalVariableAddrGap(
75 ArrayRef<LocalVariableAddrGap> Gaps) {
76 for (auto &Gap : Gaps) {
77 ListScope S(W, "LocalVariableAddrGap");
78 W.printHex("GapStartOffset", Gap.GapStartOffset);
79 W.printHex("Range", Gap.Range);
80 }
81}
82
Zachary Turner0d840742016-10-07 21:34:46 +000083Error CVSymbolDumperImpl::visitSymbolBegin(CVSymbol &CVR) {
84 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +000085}
86
Zachary Turner0d840742016-10-07 21:34:46 +000087Error CVSymbolDumperImpl::visitSymbolEnd(CVSymbol &CVR) {
88 if (PrintRecordBytes && ObjDelegate)
89 ObjDelegate->printBinaryBlockWithRelocs("SymData", CVR.content());
90 return Error::success();
91}
92
93Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
Zachary Turneraaad5742016-05-23 23:41:13 +000094 DictScope S(W, "BlockStart");
95
96 StringRef LinkageName;
97 W.printHex("PtrParent", Block.Header.PtrParent);
98 W.printHex("PtrEnd", Block.Header.PtrEnd);
99 W.printHex("CodeSize", Block.Header.CodeSize);
100 if (ObjDelegate) {
101 ObjDelegate->printRelocatedField("CodeOffset", Block.getRelocationOffset(),
102 Block.Header.CodeOffset, &LinkageName);
103 }
104 W.printHex("Segment", Block.Header.Segment);
105 W.printString("BlockName", Block.Name);
106 W.printString("LinkageName", LinkageName);
Zachary Turner0d840742016-10-07 21:34:46 +0000107 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000108}
109
Zachary Turner0d840742016-10-07 21:34:46 +0000110Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000111 DictScope S(W, "Thunk32");
112 W.printNumber("Parent", Thunk.Header.Parent);
113 W.printNumber("End", Thunk.Header.End);
114 W.printNumber("Next", Thunk.Header.Next);
115 W.printNumber("Off", Thunk.Header.Off);
116 W.printNumber("Seg", Thunk.Header.Seg);
117 W.printNumber("Len", Thunk.Header.Len);
Zachary Turner93839cb2016-06-02 05:07:49 +0000118 W.printEnum("Ordinal", Thunk.Header.Ord, getThunkOrdinalNames());
Zachary Turner0d840742016-10-07 21:34:46 +0000119 return Error::success();
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000120}
121
Zachary Turner0d840742016-10-07 21:34:46 +0000122Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
123 TrampolineSym &Tramp) {
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000124 DictScope S(W, "Trampoline");
Zachary Turner93839cb2016-06-02 05:07:49 +0000125 W.printEnum("Type", Tramp.Header.Type, getTrampolineNames());
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000126 W.printNumber("Size", Tramp.Header.Size);
127 W.printNumber("ThunkOff", Tramp.Header.ThunkOff);
128 W.printNumber("TargetOff", Tramp.Header.TargetOff);
129 W.printNumber("ThunkSection", Tramp.Header.ThunkSection);
130 W.printNumber("TargetSection", Tramp.Header.TargetSection);
Zachary Turner0d840742016-10-07 21:34:46 +0000131 return Error::success();
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000132}
133
Zachary Turner0d840742016-10-07 21:34:46 +0000134Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, SectionSym &Section) {
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000135 DictScope S(W, "Section");
136 W.printNumber("SectionNumber", Section.Header.SectionNumber);
137 W.printNumber("Alignment", Section.Header.Alignment);
138 W.printNumber("Reserved", Section.Header.Reserved);
139 W.printNumber("Rva", Section.Header.Rva);
140 W.printNumber("Length", Section.Header.Length);
Zachary Turner93839cb2016-06-02 05:07:49 +0000141 W.printFlags("Characteristics", Section.Header.Characteristics,
142 getImageSectionCharacteristicNames(),
143 COFF::SectionCharacteristics(0x00F00000));
144
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000145 W.printString("Name", Section.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000146 return Error::success();
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000147}
148
Zachary Turner0d840742016-10-07 21:34:46 +0000149Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000150 CoffGroupSym &CoffGroup) {
151 DictScope S(W, "COFF Group");
152 W.printNumber("Size", CoffGroup.Header.Size);
Zachary Turner93839cb2016-06-02 05:07:49 +0000153 W.printFlags("Characteristics", CoffGroup.Header.Characteristics,
154 getImageSectionCharacteristicNames(),
155 COFF::SectionCharacteristics(0x00F00000));
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000156 W.printNumber("Offset", CoffGroup.Header.Offset);
157 W.printNumber("Segment", CoffGroup.Header.Segment);
158 W.printString("Name", CoffGroup.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000159 return Error::success();
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000160}
161
Zachary Turner0d840742016-10-07 21:34:46 +0000162Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
163 BPRelativeSym &BPRel) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000164 DictScope S(W, "BPRelativeSym");
165
166 W.printNumber("Offset", BPRel.Header.Offset);
167 CVTD.printTypeIndex("Type", BPRel.Header.Type);
168 W.printString("VarName", BPRel.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000169 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000170}
171
Zachary Turner0d840742016-10-07 21:34:46 +0000172Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
Zachary Turneraaad5742016-05-23 23:41:13 +0000173 BuildInfoSym &BuildInfo) {
174 DictScope S(W, "BuildInfo");
175
176 W.printNumber("BuildId", BuildInfo.Header.BuildId);
Zachary Turner0d840742016-10-07 21:34:46 +0000177 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000178}
179
Zachary Turner0d840742016-10-07 21:34:46 +0000180Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
181 CallSiteInfoSym &CallSiteInfo) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000182 DictScope S(W, "CallSiteInfo");
183
184 StringRef LinkageName;
185 if (ObjDelegate) {
186 ObjDelegate->printRelocatedField(
187 "CodeOffset", CallSiteInfo.getRelocationOffset(),
188 CallSiteInfo.Header.CodeOffset, &LinkageName);
189 }
190 W.printHex("Segment", CallSiteInfo.Header.Segment);
191 W.printHex("Reserved", CallSiteInfo.Header.Reserved);
192 CVTD.printTypeIndex("Type", CallSiteInfo.Header.Type);
193 if (!LinkageName.empty())
194 W.printString("LinkageName", LinkageName);
Zachary Turner0d840742016-10-07 21:34:46 +0000195 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000196}
197
Zachary Turner0d840742016-10-07 21:34:46 +0000198Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
199 EnvBlockSym &EnvBlock) {
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000200 DictScope S(W, "EnvBlock");
201
202 W.printNumber("Reserved", EnvBlock.Header.Reserved);
203 ListScope L(W, "Entries");
204 for (auto Entry : EnvBlock.Fields) {
205 W.printString(Entry);
206 }
Zachary Turner0d840742016-10-07 21:34:46 +0000207 return Error::success();
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000208}
209
Zachary Turner0d840742016-10-07 21:34:46 +0000210Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
211 FileStaticSym &FileStatic) {
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000212 DictScope S(W, "FileStatic");
213 W.printNumber("Index", FileStatic.Header.Index);
214 W.printNumber("ModFilenameOffset", FileStatic.Header.ModFilenameOffset);
Zachary Turner93839cb2016-06-02 05:07:49 +0000215 W.printFlags("Flags", uint16_t(FileStatic.Header.Flags), getLocalFlagNames());
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000216 W.printString("Name", FileStatic.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000217 return Error::success();
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000218}
219
Zachary Turner0d840742016-10-07 21:34:46 +0000220Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
Zachary Turner9f054d42016-05-25 00:12:40 +0000221 DictScope S(W, "Export");
222 W.printNumber("Ordinal", Export.Header.Ordinal);
Zachary Turner93839cb2016-06-02 05:07:49 +0000223 W.printFlags("Flags", Export.Header.Flags, getExportSymFlagNames());
Zachary Turner9f054d42016-05-25 00:12:40 +0000224 W.printString("Name", Export.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000225 return Error::success();
Zachary Turner9f054d42016-05-25 00:12:40 +0000226}
227
Zachary Turner0d840742016-10-07 21:34:46 +0000228Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
229 Compile2Sym &Compile2) {
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000230 DictScope S(W, "CompilerFlags2");
231
232 W.printEnum("Language", Compile2.Header.getLanguage(),
Zachary Turner93839cb2016-06-02 05:07:49 +0000233 getSourceLanguageNames());
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000234 W.printFlags("Flags", Compile2.Header.flags & ~0xff,
Zachary Turner93839cb2016-06-02 05:07:49 +0000235 getCompileSym2FlagNames());
236 W.printEnum("Machine", unsigned(Compile2.Header.Machine), getCPUTypeNames());
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000237 std::string FrontendVersion;
238 {
239 raw_string_ostream Out(FrontendVersion);
240 Out << Compile2.Header.VersionFrontendMajor << '.'
241 << Compile2.Header.VersionFrontendMinor << '.'
242 << Compile2.Header.VersionFrontendBuild;
243 }
244 std::string BackendVersion;
245 {
246 raw_string_ostream Out(BackendVersion);
247 Out << Compile2.Header.VersionBackendMajor << '.'
248 << Compile2.Header.VersionBackendMinor << '.'
249 << Compile2.Header.VersionBackendBuild;
250 }
251 W.printString("FrontendVersion", FrontendVersion);
252 W.printString("BackendVersion", BackendVersion);
253 W.printString("VersionName", Compile2.Version);
Zachary Turner0d840742016-10-07 21:34:46 +0000254 return Error::success();
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000255}
256
Zachary Turner0d840742016-10-07 21:34:46 +0000257Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
258 Compile3Sym &Compile3) {
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000259 DictScope S(W, "CompilerFlags3");
Zachary Turneraaad5742016-05-23 23:41:13 +0000260
261 W.printEnum("Language", Compile3.Header.getLanguage(),
Zachary Turner93839cb2016-06-02 05:07:49 +0000262 getSourceLanguageNames());
Zachary Turneraaad5742016-05-23 23:41:13 +0000263 W.printFlags("Flags", Compile3.Header.flags & ~0xff,
Zachary Turner93839cb2016-06-02 05:07:49 +0000264 getCompileSym3FlagNames());
265 W.printEnum("Machine", unsigned(Compile3.Header.Machine), getCPUTypeNames());
Zachary Turneraaad5742016-05-23 23:41:13 +0000266 std::string FrontendVersion;
267 {
268 raw_string_ostream Out(FrontendVersion);
269 Out << Compile3.Header.VersionFrontendMajor << '.'
270 << Compile3.Header.VersionFrontendMinor << '.'
271 << Compile3.Header.VersionFrontendBuild << '.'
272 << Compile3.Header.VersionFrontendQFE;
273 }
274 std::string BackendVersion;
275 {
276 raw_string_ostream Out(BackendVersion);
277 Out << Compile3.Header.VersionBackendMajor << '.'
278 << Compile3.Header.VersionBackendMinor << '.'
279 << Compile3.Header.VersionBackendBuild << '.'
280 << Compile3.Header.VersionBackendQFE;
281 }
282 W.printString("FrontendVersion", FrontendVersion);
283 W.printString("BackendVersion", BackendVersion);
284 W.printString("VersionName", Compile3.Version);
Zachary Turner0d840742016-10-07 21:34:46 +0000285 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000286}
287
Zachary Turner0d840742016-10-07 21:34:46 +0000288Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
289 ConstantSym &Constant) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000290 DictScope S(W, "Constant");
291
292 CVTD.printTypeIndex("Type", Constant.Header.Type);
293 W.printNumber("Value", Constant.Value);
294 W.printString("Name", Constant.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000295 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000296}
297
Zachary Turner0d840742016-10-07 21:34:46 +0000298Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000299 DictScope S(W, "DataSym");
300
Zachary Turner0d840742016-10-07 21:34:46 +0000301 W.printEnum("Kind", uint16_t(CVR.kind()), getSymbolTypeNames());
Zachary Turneraaad5742016-05-23 23:41:13 +0000302 StringRef LinkageName;
303 if (ObjDelegate) {
304 ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
305 Data.Header.DataOffset, &LinkageName);
306 }
307 CVTD.printTypeIndex("Type", Data.Header.Type);
308 W.printString("DisplayName", Data.Name);
309 if (!LinkageName.empty())
310 W.printString("LinkageName", LinkageName);
Zachary Turner0d840742016-10-07 21:34:46 +0000311 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000312}
313
Zachary Turner0d840742016-10-07 21:34:46 +0000314Error CVSymbolDumperImpl::visitKnownRecord(
315 CVSymbol &CVR,
Zachary Turneraaad5742016-05-23 23:41:13 +0000316 DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
317 DictScope S(W, "DefRangeFramePointerRelFullScope");
318 W.printNumber("Offset", DefRangeFramePointerRelFullScope.Header.Offset);
Zachary Turner0d840742016-10-07 21:34:46 +0000319 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000320}
321
Zachary Turner0d840742016-10-07 21:34:46 +0000322Error CVSymbolDumperImpl::visitKnownRecord(
323 CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000324 DictScope S(W, "DefRangeFramePointerRel");
325
326 W.printNumber("Offset", DefRangeFramePointerRel.Header.Offset);
327 printLocalVariableAddrRange(DefRangeFramePointerRel.Header.Range,
328 DefRangeFramePointerRel.getRelocationOffset());
329 printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
Zachary Turner0d840742016-10-07 21:34:46 +0000330 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000331}
332
Zachary Turner0d840742016-10-07 21:34:46 +0000333Error CVSymbolDumperImpl::visitKnownRecord(
334 CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000335 DictScope S(W, "DefRangeRegisterRel");
336
337 W.printNumber("BaseRegister", DefRangeRegisterRel.Header.BaseRegister);
338 W.printBoolean("HasSpilledUDTMember",
339 DefRangeRegisterRel.hasSpilledUDTMember());
340 W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
341 W.printNumber("BasePointerOffset",
342 DefRangeRegisterRel.Header.BasePointerOffset);
343 printLocalVariableAddrRange(DefRangeRegisterRel.Header.Range,
344 DefRangeRegisterRel.getRelocationOffset());
345 printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
Zachary Turner0d840742016-10-07 21:34:46 +0000346 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000347}
348
Zachary Turner0d840742016-10-07 21:34:46 +0000349Error CVSymbolDumperImpl::visitKnownRecord(
350 CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000351 DictScope S(W, "DefRangeRegister");
352
353 W.printNumber("Register", DefRangeRegister.Header.Register);
354 W.printNumber("MayHaveNoName", DefRangeRegister.Header.MayHaveNoName);
355 printLocalVariableAddrRange(DefRangeRegister.Header.Range,
356 DefRangeRegister.getRelocationOffset());
357 printLocalVariableAddrGap(DefRangeRegister.Gaps);
Zachary Turner0d840742016-10-07 21:34:46 +0000358 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000359}
360
Zachary Turner0d840742016-10-07 21:34:46 +0000361Error CVSymbolDumperImpl::visitKnownRecord(
362 CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000363 DictScope S(W, "DefRangeSubfieldRegister");
364
365 W.printNumber("Register", DefRangeSubfieldRegister.Header.Register);
366 W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Header.MayHaveNoName);
367 W.printNumber("OffsetInParent",
368 DefRangeSubfieldRegister.Header.OffsetInParent);
369 printLocalVariableAddrRange(DefRangeSubfieldRegister.Header.Range,
370 DefRangeSubfieldRegister.getRelocationOffset());
371 printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
Zachary Turner0d840742016-10-07 21:34:46 +0000372 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000373}
374
Zachary Turner0d840742016-10-07 21:34:46 +0000375Error CVSymbolDumperImpl::visitKnownRecord(
376 CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000377 DictScope S(W, "DefRangeSubfield");
378
379 if (ObjDelegate) {
380 StringRef StringTable = ObjDelegate->getStringTable();
David Majnemerc6cb2ec2016-05-28 20:04:46 +0000381 auto ProgramStringTableOffset = DefRangeSubfield.Header.Program;
382 if (ProgramStringTableOffset >= StringTable.size())
Zachary Turner0d840742016-10-07 21:34:46 +0000383 return llvm::make_error<CodeViewError>(
384 "String table offset outside of bounds of String Table!");
David Majnemerc6cb2ec2016-05-28 20:04:46 +0000385 StringRef Program =
386 StringTable.drop_front(ProgramStringTableOffset).split('\0').first;
387 W.printString("Program", Program);
Zachary Turneraaad5742016-05-23 23:41:13 +0000388 }
389 W.printNumber("OffsetInParent", DefRangeSubfield.Header.OffsetInParent);
390 printLocalVariableAddrRange(DefRangeSubfield.Header.Range,
391 DefRangeSubfield.getRelocationOffset());
392 printLocalVariableAddrGap(DefRangeSubfield.Gaps);
Zachary Turner0d840742016-10-07 21:34:46 +0000393 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000394}
395
Zachary Turner0d840742016-10-07 21:34:46 +0000396Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
397 DefRangeSym &DefRange) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000398 DictScope S(W, "DefRange");
399
400 if (ObjDelegate) {
401 StringRef StringTable = ObjDelegate->getStringTable();
David Majnemerb3433102016-05-28 19:45:56 +0000402 auto ProgramStringTableOffset = DefRange.Header.Program;
403 if (ProgramStringTableOffset >= StringTable.size())
Zachary Turner0d840742016-10-07 21:34:46 +0000404 return llvm::make_error<CodeViewError>(
405 "String table offset outside of bounds of String Table!");
David Majnemerb3433102016-05-28 19:45:56 +0000406 StringRef Program =
407 StringTable.drop_front(ProgramStringTableOffset).split('\0').first;
408 W.printString("Program", Program);
Zachary Turneraaad5742016-05-23 23:41:13 +0000409 }
410 printLocalVariableAddrRange(DefRange.Header.Range,
411 DefRange.getRelocationOffset());
412 printLocalVariableAddrGap(DefRange.Gaps);
Zachary Turner0d840742016-10-07 21:34:46 +0000413 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000414}
415
Zachary Turner0d840742016-10-07 21:34:46 +0000416Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
417 FrameCookieSym &FrameCookie) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000418 DictScope S(W, "FrameCookie");
419
420 StringRef LinkageName;
421 if (ObjDelegate) {
422 ObjDelegate->printRelocatedField(
423 "CodeOffset", FrameCookie.getRelocationOffset(),
424 FrameCookie.Header.CodeOffset, &LinkageName);
425 }
426 W.printHex("Register", FrameCookie.Header.Register);
427 W.printEnum("CookieKind", uint16_t(FrameCookie.Header.CookieKind),
Zachary Turner93839cb2016-06-02 05:07:49 +0000428 getFrameCookieKindNames());
Reid Kleckner33848fa2016-06-24 17:23:49 +0000429 W.printHex("Flags", FrameCookie.Header.Flags);
Zachary Turner0d840742016-10-07 21:34:46 +0000430 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000431}
432
Zachary Turner0d840742016-10-07 21:34:46 +0000433Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
Zachary Turneraaad5742016-05-23 23:41:13 +0000434 FrameProcSym &FrameProc) {
435 DictScope S(W, "FrameProc");
436
437 W.printHex("TotalFrameBytes", FrameProc.Header.TotalFrameBytes);
438 W.printHex("PaddingFrameBytes", FrameProc.Header.PaddingFrameBytes);
439 W.printHex("OffsetToPadding", FrameProc.Header.OffsetToPadding);
440 W.printHex("BytesOfCalleeSavedRegisters",
441 FrameProc.Header.BytesOfCalleeSavedRegisters);
442 W.printHex("OffsetOfExceptionHandler",
443 FrameProc.Header.OffsetOfExceptionHandler);
444 W.printHex("SectionIdOfExceptionHandler",
445 FrameProc.Header.SectionIdOfExceptionHandler);
Zachary Turner93839cb2016-06-02 05:07:49 +0000446 W.printFlags("Flags", FrameProc.Header.Flags, getFrameProcSymFlagNames());
Zachary Turner0d840742016-10-07 21:34:46 +0000447 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000448}
449
Zachary Turner0d840742016-10-07 21:34:46 +0000450Error CVSymbolDumperImpl::visitKnownRecord(
451 CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000452 DictScope S(W, "HeapAllocationSite");
453
454 StringRef LinkageName;
455 if (ObjDelegate) {
456 ObjDelegate->printRelocatedField(
457 "CodeOffset", HeapAllocSite.getRelocationOffset(),
458 HeapAllocSite.Header.CodeOffset, &LinkageName);
459 }
460 W.printHex("Segment", HeapAllocSite.Header.Segment);
461 W.printHex("CallInstructionSize", HeapAllocSite.Header.CallInstructionSize);
462 CVTD.printTypeIndex("Type", HeapAllocSite.Header.Type);
463 if (!LinkageName.empty())
464 W.printString("LinkageName", LinkageName);
Zachary Turner0d840742016-10-07 21:34:46 +0000465 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000466}
467
Zachary Turner0d840742016-10-07 21:34:46 +0000468Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
469 InlineSiteSym &InlineSite) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000470 DictScope S(W, "InlineSite");
471
472 W.printHex("PtrParent", InlineSite.Header.PtrParent);
473 W.printHex("PtrEnd", InlineSite.Header.PtrEnd);
474 CVTD.printTypeIndex("Inlinee", InlineSite.Header.Inlinee);
475
476 ListScope BinaryAnnotations(W, "BinaryAnnotations");
477 for (auto &Annotation : InlineSite.annotations()) {
478 switch (Annotation.OpCode) {
479 case BinaryAnnotationsOpCode::Invalid:
Zachary Turner0d840742016-10-07 21:34:46 +0000480 return llvm::make_error<CodeViewError>(
481 "Invalid binary annotation opcode!");
Zachary Turneraaad5742016-05-23 23:41:13 +0000482 case BinaryAnnotationsOpCode::CodeOffset:
483 case BinaryAnnotationsOpCode::ChangeCodeOffset:
484 case BinaryAnnotationsOpCode::ChangeCodeLength:
485 W.printHex(Annotation.Name, Annotation.U1);
486 break;
487 case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
488 case BinaryAnnotationsOpCode::ChangeLineEndDelta:
489 case BinaryAnnotationsOpCode::ChangeRangeKind:
490 case BinaryAnnotationsOpCode::ChangeColumnStart:
491 case BinaryAnnotationsOpCode::ChangeColumnEnd:
492 W.printNumber(Annotation.Name, Annotation.U1);
493 break;
494 case BinaryAnnotationsOpCode::ChangeLineOffset:
495 case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
496 W.printNumber(Annotation.Name, Annotation.S1);
497 break;
498 case BinaryAnnotationsOpCode::ChangeFile:
499 if (ObjDelegate) {
500 W.printHex("ChangeFile",
501 ObjDelegate->getFileNameForFileOffset(Annotation.U1),
502 Annotation.U1);
503 } else {
504 W.printHex("ChangeFile", Annotation.U1);
505 }
506
507 break;
508 case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
509 W.startLine() << "ChangeCodeOffsetAndLineOffset: {CodeOffset: "
510 << W.hex(Annotation.U1) << ", LineOffset: " << Annotation.S1
511 << "}\n";
512 break;
513 }
514 case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
515 W.startLine() << "ChangeCodeLengthAndCodeOffset: {CodeOffset: "
516 << W.hex(Annotation.U2)
517 << ", Length: " << W.hex(Annotation.U1) << "}\n";
518 break;
519 }
520 }
521 }
Zachary Turner0d840742016-10-07 21:34:46 +0000522 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000523}
524
Zachary Turner0d840742016-10-07 21:34:46 +0000525Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
526 RegisterSym &Register) {
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000527 DictScope S(W, "RegisterSym");
528 W.printNumber("Type", Register.Header.Index);
Zachary Turner93839cb2016-06-02 05:07:49 +0000529 W.printEnum("Seg", uint16_t(Register.Header.Register), getRegisterNames());
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000530 W.printString("Name", Register.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000531 return Error::success();
Zachary Turner4caa1bf2016-05-24 22:58:46 +0000532}
533
Zachary Turner0d840742016-10-07 21:34:46 +0000534Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) {
Zachary Turner9e33e6f2016-05-24 18:55:14 +0000535 DictScope S(W, "PublicSym");
536 W.printNumber("Type", Public.Header.Index);
537 W.printNumber("Seg", Public.Header.Seg);
538 W.printNumber("Off", Public.Header.Off);
539 W.printString("Name", Public.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000540 return Error::success();
Zachary Turner9e33e6f2016-05-24 18:55:14 +0000541}
542
Zachary Turner0d840742016-10-07 21:34:46 +0000543Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcRefSym &ProcRef) {
Zachary Turner9e33e6f2016-05-24 18:55:14 +0000544 DictScope S(W, "ProcRef");
545 W.printNumber("SumName", ProcRef.Header.SumName);
546 W.printNumber("SymOffset", ProcRef.Header.SymOffset);
547 W.printNumber("Mod", ProcRef.Header.Mod);
548 W.printString("Name", ProcRef.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000549 return Error::success();
Zachary Turner9e33e6f2016-05-24 18:55:14 +0000550}
551
Zachary Turner0d840742016-10-07 21:34:46 +0000552Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000553 DictScope S(W, "Label");
554
555 StringRef LinkageName;
556 if (ObjDelegate) {
557 ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(),
558 Label.Header.CodeOffset, &LinkageName);
559 }
560 W.printHex("Segment", Label.Header.Segment);
561 W.printHex("Flags", Label.Header.Flags);
Zachary Turner93839cb2016-06-02 05:07:49 +0000562 W.printFlags("Flags", Label.Header.Flags, getProcSymFlagNames());
Zachary Turneraaad5742016-05-23 23:41:13 +0000563 W.printString("DisplayName", Label.Name);
564 if (!LinkageName.empty())
565 W.printString("LinkageName", LinkageName);
Zachary Turner0d840742016-10-07 21:34:46 +0000566 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000567}
568
Zachary Turner0d840742016-10-07 21:34:46 +0000569Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000570 DictScope S(W, "Local");
571
572 CVTD.printTypeIndex("Type", Local.Header.Type);
Zachary Turner93839cb2016-06-02 05:07:49 +0000573 W.printFlags("Flags", uint16_t(Local.Header.Flags), getLocalFlagNames());
Zachary Turneraaad5742016-05-23 23:41:13 +0000574 W.printString("VarName", Local.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000575 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000576}
577
Zachary Turner0d840742016-10-07 21:34:46 +0000578Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ObjNameSym &ObjName) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000579 DictScope S(W, "ObjectName");
580
581 W.printHex("Signature", ObjName.Header.Signature);
582 W.printString("ObjectName", ObjName.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000583 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000584}
585
Zachary Turner0d840742016-10-07 21:34:46 +0000586Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000587 DictScope S(W, "ProcStart");
588
589 if (InFunctionScope)
Zachary Turner0d840742016-10-07 21:34:46 +0000590 return llvm::make_error<CodeViewError>(
591 "Visiting a ProcSym while inside function scope!");
Zachary Turneraaad5742016-05-23 23:41:13 +0000592
593 InFunctionScope = true;
594
595 StringRef LinkageName;
Zachary Turner0d840742016-10-07 21:34:46 +0000596 W.printEnum("Kind", uint16_t(CVR.kind()), getSymbolTypeNames());
Zachary Turneraaad5742016-05-23 23:41:13 +0000597 W.printHex("PtrParent", Proc.Header.PtrParent);
598 W.printHex("PtrEnd", Proc.Header.PtrEnd);
599 W.printHex("PtrNext", Proc.Header.PtrNext);
600 W.printHex("CodeSize", Proc.Header.CodeSize);
601 W.printHex("DbgStart", Proc.Header.DbgStart);
602 W.printHex("DbgEnd", Proc.Header.DbgEnd);
603 CVTD.printTypeIndex("FunctionType", Proc.Header.FunctionType);
604 if (ObjDelegate) {
605 ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(),
606 Proc.Header.CodeOffset, &LinkageName);
607 }
608 W.printHex("Segment", Proc.Header.Segment);
609 W.printFlags("Flags", static_cast<uint8_t>(Proc.Header.Flags),
Zachary Turner93839cb2016-06-02 05:07:49 +0000610 getProcSymFlagNames());
Zachary Turneraaad5742016-05-23 23:41:13 +0000611 W.printString("DisplayName", Proc.Name);
612 if (!LinkageName.empty())
613 W.printString("LinkageName", LinkageName);
Zachary Turner0d840742016-10-07 21:34:46 +0000614 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000615}
616
Zachary Turner0d840742016-10-07 21:34:46 +0000617Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
618 ScopeEndSym &ScopeEnd) {
619 if (CVR.kind() == SymbolKind::S_END)
Zachary Turnercac29ae2016-05-24 17:30:25 +0000620 DictScope S(W, "BlockEnd");
Zachary Turner0d840742016-10-07 21:34:46 +0000621 else if (CVR.kind() == SymbolKind::S_PROC_ID_END)
Zachary Turnercac29ae2016-05-24 17:30:25 +0000622 DictScope S(W, "ProcEnd");
Zachary Turner0d840742016-10-07 21:34:46 +0000623 else if (CVR.kind() == SymbolKind::S_INLINESITE_END)
Zachary Turneraaad5742016-05-23 23:41:13 +0000624 DictScope S(W, "InlineSiteEnd");
625
626 InFunctionScope = false;
Zachary Turner0d840742016-10-07 21:34:46 +0000627 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000628}
629
Zachary Turner0d840742016-10-07 21:34:46 +0000630Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
631 ListScope S(W, CVR.kind() == S_CALLEES ? "Callees" : "Callers");
Zachary Turneraaad5742016-05-23 23:41:13 +0000632 for (auto FuncID : Caller.Indices)
633 CVTD.printTypeIndex("FuncID", FuncID);
Zachary Turner0d840742016-10-07 21:34:46 +0000634 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000635}
636
Zachary Turner0d840742016-10-07 21:34:46 +0000637Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
638 RegRelativeSym &RegRel) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000639 DictScope S(W, "RegRelativeSym");
640
641 W.printHex("Offset", RegRel.Header.Offset);
642 CVTD.printTypeIndex("Type", RegRel.Header.Type);
643 W.printHex("Register", RegRel.Header.Register);
644 W.printString("VarName", RegRel.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000645 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000646}
647
Zachary Turner0d840742016-10-07 21:34:46 +0000648Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
649 ThreadLocalDataSym &Data) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000650 DictScope S(W, "ThreadLocalDataSym");
651
652 StringRef LinkageName;
653 if (ObjDelegate) {
654 ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
655 Data.Header.DataOffset, &LinkageName);
656 }
657 CVTD.printTypeIndex("Type", Data.Header.Type);
658 W.printString("DisplayName", Data.Name);
659 if (!LinkageName.empty())
660 W.printString("LinkageName", LinkageName);
Zachary Turner0d840742016-10-07 21:34:46 +0000661 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000662}
663
Zachary Turner0d840742016-10-07 21:34:46 +0000664Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000665 DictScope S(W, "UDT");
666 CVTD.printTypeIndex("Type", UDT.Header.Type);
667 W.printString("UDTName", UDT.Name);
Zachary Turner0d840742016-10-07 21:34:46 +0000668 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000669}
670
Zachary Turner0d840742016-10-07 21:34:46 +0000671Error CVSymbolDumperImpl::visitUnknownSymbol(CVSymbol &CVR) {
Zachary Turneraaad5742016-05-23 23:41:13 +0000672 DictScope S(W, "UnknownSym");
Zachary Turner0d840742016-10-07 21:34:46 +0000673 W.printEnum("Kind", uint16_t(CVR.kind()), getSymbolTypeNames());
674 W.printNumber("Length", CVR.length());
675 return Error::success();
Zachary Turneraaad5742016-05-23 23:41:13 +0000676}
677
Zachary Turner0d840742016-10-07 21:34:46 +0000678Error CVSymbolDumper::dump(CVRecord<SymbolKind> &Record) {
679 SymbolVisitorCallbackPipeline Pipeline;
680 SymbolDeserializer Deserializer(ObjDelegate.get());
Zachary Turner3e78e2d2016-05-24 00:06:04 +0000681 CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
Zachary Turner0d840742016-10-07 21:34:46 +0000682
683 Pipeline.addCallbackToPipeline(Deserializer);
684 Pipeline.addCallbackToPipeline(Dumper);
685 CVSymbolVisitor Visitor(Pipeline);
686 return Visitor.visitSymbolRecord(Record);
Zachary Turneraaad5742016-05-23 23:41:13 +0000687}
688
Zachary Turner0d840742016-10-07 21:34:46 +0000689Error CVSymbolDumper::dump(const CVSymbolArray &Symbols) {
690 SymbolVisitorCallbackPipeline Pipeline;
691 SymbolDeserializer Deserializer(ObjDelegate.get());
Zachary Turner3e78e2d2016-05-24 00:06:04 +0000692 CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
Zachary Turner0d840742016-10-07 21:34:46 +0000693
694 Pipeline.addCallbackToPipeline(Deserializer);
695 Pipeline.addCallbackToPipeline(Dumper);
696 CVSymbolVisitor Visitor(Pipeline);
697 return Visitor.visitSymbolStream(Symbols);
Zachary Turneraaad5742016-05-23 23:41:13 +0000698}