blob: a6816bde0ea7506f8c1f9d64d7a6165765380394 [file] [log] [blame]
Zachary Turner63055452017-06-15 22:24:24 +00001//===- MinimalSymbolDumper.cpp -------------------------------- *- 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 "MinimalSymbolDumper.h"
11
12#include "FormatUtil.h"
13#include "LinePrinter.h"
14
15#include "llvm/DebugInfo/CodeView/CVRecord.h"
16#include "llvm/DebugInfo/CodeView/CodeView.h"
17#include "llvm/DebugInfo/CodeView/Formatters.h"
18#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
19#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
20#include "llvm/DebugInfo/CodeView/TypeRecord.h"
21#include "llvm/Support/FormatVariadic.h"
22
23using namespace llvm;
24using namespace llvm::codeview;
25using namespace llvm::pdb;
26
27static StringRef getSymbolKindName(SymbolKind K) {
28 switch (K) {
29#define SYMBOL_RECORD(EnumName, value, name) \
30 case EnumName: \
31 return #EnumName;
Zachary Turnerf401e112017-08-17 20:04:31 +000032#define CV_SYMBOL(EnumName, value) SYMBOL_RECORD(EnumName, value, EnumName)
Zachary Turner63055452017-06-15 22:24:24 +000033#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
34 default:
35 llvm_unreachable("Unknown symbol kind!");
36 }
37 return "";
38}
39
40static std::string formatLocalSymFlags(uint32_t IndentLevel,
41 LocalSymFlags Flags) {
42 std::vector<std::string> Opts;
43 if (Flags == LocalSymFlags::None)
44 return "none";
45
46 PUSH_FLAG(LocalSymFlags, IsParameter, Flags, "param");
47 PUSH_FLAG(LocalSymFlags, IsAddressTaken, Flags, "address is taken");
48 PUSH_FLAG(LocalSymFlags, IsCompilerGenerated, Flags, "compiler generated");
49 PUSH_FLAG(LocalSymFlags, IsAggregate, Flags, "aggregate");
50 PUSH_FLAG(LocalSymFlags, IsAggregated, Flags, "aggregated");
51 PUSH_FLAG(LocalSymFlags, IsAliased, Flags, "aliased");
52 PUSH_FLAG(LocalSymFlags, IsAlias, Flags, "alias");
53 PUSH_FLAG(LocalSymFlags, IsReturnValue, Flags, "return val");
54 PUSH_FLAG(LocalSymFlags, IsOptimizedOut, Flags, "optimized away");
55 PUSH_FLAG(LocalSymFlags, IsEnregisteredGlobal, Flags, "enreg global");
56 PUSH_FLAG(LocalSymFlags, IsEnregisteredStatic, Flags, "enreg static");
57 return typesetItemList(Opts, 4, IndentLevel, " | ");
58}
59
60static std::string formatExportFlags(uint32_t IndentLevel, ExportFlags Flags) {
61 std::vector<std::string> Opts;
62 if (Flags == ExportFlags::None)
63 return "none";
64
65 PUSH_FLAG(ExportFlags, IsConstant, Flags, "constant");
66 PUSH_FLAG(ExportFlags, IsData, Flags, "data");
67 PUSH_FLAG(ExportFlags, IsPrivate, Flags, "private");
68 PUSH_FLAG(ExportFlags, HasNoName, Flags, "no name");
69 PUSH_FLAG(ExportFlags, HasExplicitOrdinal, Flags, "explicit ord");
70 PUSH_FLAG(ExportFlags, IsForwarder, Flags, "forwarder");
71
72 return typesetItemList(Opts, 4, IndentLevel, " | ");
73}
74
75static std::string formatCompileSym2Flags(uint32_t IndentLevel,
76 CompileSym2Flags Flags) {
77 std::vector<std::string> Opts;
78 Flags &= ~CompileSym2Flags::SourceLanguageMask;
79 if (Flags == CompileSym2Flags::None)
80 return "none";
81
82 PUSH_FLAG(CompileSym2Flags, EC, Flags, "edit and continue");
83 PUSH_FLAG(CompileSym2Flags, NoDbgInfo, Flags, "no dbg info");
84 PUSH_FLAG(CompileSym2Flags, LTCG, Flags, "ltcg");
85 PUSH_FLAG(CompileSym2Flags, NoDataAlign, Flags, "no data align");
86 PUSH_FLAG(CompileSym2Flags, ManagedPresent, Flags, "has managed code");
87 PUSH_FLAG(CompileSym2Flags, SecurityChecks, Flags, "security checks");
88 PUSH_FLAG(CompileSym2Flags, HotPatch, Flags, "hot patchable");
89 PUSH_FLAG(CompileSym2Flags, CVTCIL, Flags, "cvtcil");
90 PUSH_FLAG(CompileSym2Flags, MSILModule, Flags, "msil module");
91 return typesetItemList(Opts, 4, IndentLevel, " | ");
92}
93
94static std::string formatCompileSym3Flags(uint32_t IndentLevel,
95 CompileSym3Flags Flags) {
96 std::vector<std::string> Opts;
97 Flags &= ~CompileSym3Flags::SourceLanguageMask;
98
99 if (Flags == CompileSym3Flags::None)
100 return "none";
101
102 PUSH_FLAG(CompileSym3Flags, EC, Flags, "edit and continue");
103 PUSH_FLAG(CompileSym3Flags, NoDbgInfo, Flags, "no dbg info");
104 PUSH_FLAG(CompileSym3Flags, LTCG, Flags, "ltcg");
105 PUSH_FLAG(CompileSym3Flags, NoDataAlign, Flags, "no data align");
106 PUSH_FLAG(CompileSym3Flags, ManagedPresent, Flags, "has managed code");
107 PUSH_FLAG(CompileSym3Flags, SecurityChecks, Flags, "security checks");
108 PUSH_FLAG(CompileSym3Flags, HotPatch, Flags, "hot patchable");
109 PUSH_FLAG(CompileSym3Flags, CVTCIL, Flags, "cvtcil");
110 PUSH_FLAG(CompileSym3Flags, MSILModule, Flags, "msil module");
111 PUSH_FLAG(CompileSym3Flags, Sdl, Flags, "sdl");
112 PUSH_FLAG(CompileSym3Flags, PGO, Flags, "pgo");
113 PUSH_FLAG(CompileSym3Flags, Exp, Flags, "exp");
114 return typesetItemList(Opts, 4, IndentLevel, " | ");
115}
116
117static std::string formatFrameProcedureOptions(uint32_t IndentLevel,
118 FrameProcedureOptions FPO) {
119 std::vector<std::string> Opts;
120 if (FPO == FrameProcedureOptions::None)
121 return "none";
122
123 PUSH_FLAG(FrameProcedureOptions, HasAlloca, FPO, "has alloca");
124 PUSH_FLAG(FrameProcedureOptions, HasSetJmp, FPO, "has setjmp");
125 PUSH_FLAG(FrameProcedureOptions, HasLongJmp, FPO, "has longjmp");
126 PUSH_FLAG(FrameProcedureOptions, HasInlineAssembly, FPO, "has inline asm");
127 PUSH_FLAG(FrameProcedureOptions, HasExceptionHandling, FPO, "has eh");
128 PUSH_FLAG(FrameProcedureOptions, MarkedInline, FPO, "marked inline");
129 PUSH_FLAG(FrameProcedureOptions, HasStructuredExceptionHandling, FPO,
130 "has seh");
131 PUSH_FLAG(FrameProcedureOptions, Naked, FPO, "naked");
132 PUSH_FLAG(FrameProcedureOptions, SecurityChecks, FPO, "secure checks");
133 PUSH_FLAG(FrameProcedureOptions, AsynchronousExceptionHandling, FPO,
134 "has async eh");
135 PUSH_FLAG(FrameProcedureOptions, NoStackOrderingForSecurityChecks, FPO,
136 "no stack order");
137 PUSH_FLAG(FrameProcedureOptions, Inlined, FPO, "inlined");
138 PUSH_FLAG(FrameProcedureOptions, StrictSecurityChecks, FPO,
139 "strict secure checks");
140 PUSH_FLAG(FrameProcedureOptions, SafeBuffers, FPO, "safe buffers");
141 PUSH_FLAG(FrameProcedureOptions, ProfileGuidedOptimization, FPO, "pgo");
142 PUSH_FLAG(FrameProcedureOptions, ValidProfileCounts, FPO,
143 "has profile counts");
144 PUSH_FLAG(FrameProcedureOptions, OptimizedForSpeed, FPO, "opt speed");
145 PUSH_FLAG(FrameProcedureOptions, GuardCfg, FPO, "guard cfg");
146 PUSH_FLAG(FrameProcedureOptions, GuardCfw, FPO, "guard cfw");
147 return typesetItemList(Opts, 4, IndentLevel, " | ");
148}
149
Reid Kleckner18d90e12017-06-19 16:54:51 +0000150static std::string formatPublicSymFlags(uint32_t IndentLevel,
151 PublicSymFlags Flags) {
152 std::vector<std::string> Opts;
153 if (Flags == PublicSymFlags::None)
154 return "none";
155
156 PUSH_FLAG(PublicSymFlags, Code, Flags, "code");
157 PUSH_FLAG(PublicSymFlags, Function, Flags, "function");
158 PUSH_FLAG(PublicSymFlags, Managed, Flags, "managed");
159 PUSH_FLAG(PublicSymFlags, MSIL, Flags, "msil");
160 return typesetItemList(Opts, 4, IndentLevel, " | ");
161}
162
Zachary Turner63055452017-06-15 22:24:24 +0000163static std::string formatProcSymFlags(uint32_t IndentLevel,
164 ProcSymFlags Flags) {
165 std::vector<std::string> Opts;
166 if (Flags == ProcSymFlags::None)
167 return "none";
168
169 PUSH_FLAG(ProcSymFlags, HasFP, Flags, "has fp");
170 PUSH_FLAG(ProcSymFlags, HasIRET, Flags, "has iret");
171 PUSH_FLAG(ProcSymFlags, HasFRET, Flags, "has fret");
172 PUSH_FLAG(ProcSymFlags, IsNoReturn, Flags, "noreturn");
173 PUSH_FLAG(ProcSymFlags, IsUnreachable, Flags, "unreachable");
174 PUSH_FLAG(ProcSymFlags, HasCustomCallingConv, Flags, "custom calling conv");
175 PUSH_FLAG(ProcSymFlags, IsNoInline, Flags, "noinline");
176 PUSH_FLAG(ProcSymFlags, HasOptimizedDebugInfo, Flags, "opt debuginfo");
177 return typesetItemList(Opts, 4, IndentLevel, " | ");
178}
179
180static std::string formatThunkOrdinal(ThunkOrdinal Ordinal) {
181 switch (Ordinal) {
182 RETURN_CASE(ThunkOrdinal, Standard, "thunk");
183 RETURN_CASE(ThunkOrdinal, ThisAdjustor, "this adjustor");
184 RETURN_CASE(ThunkOrdinal, Vcall, "vcall");
185 RETURN_CASE(ThunkOrdinal, Pcode, "pcode");
186 RETURN_CASE(ThunkOrdinal, UnknownLoad, "unknown load");
187 RETURN_CASE(ThunkOrdinal, TrampIncremental, "tramp incremental");
188 RETURN_CASE(ThunkOrdinal, BranchIsland, "branch island");
189 }
190 return formatUnknownEnum(Ordinal);
191}
192
193static std::string formatTrampolineType(TrampolineType Tramp) {
194 switch (Tramp) {
195 RETURN_CASE(TrampolineType, TrampIncremental, "tramp incremental");
196 RETURN_CASE(TrampolineType, BranchIsland, "branch island");
197 }
198 return formatUnknownEnum(Tramp);
199}
200
201static std::string formatSourceLanguage(SourceLanguage Lang) {
202 switch (Lang) {
203 RETURN_CASE(SourceLanguage, C, "c");
204 RETURN_CASE(SourceLanguage, Cpp, "c++");
205 RETURN_CASE(SourceLanguage, Fortran, "fortran");
206 RETURN_CASE(SourceLanguage, Masm, "masm");
207 RETURN_CASE(SourceLanguage, Pascal, "pascal");
208 RETURN_CASE(SourceLanguage, Basic, "basic");
209 RETURN_CASE(SourceLanguage, Cobol, "cobol");
210 RETURN_CASE(SourceLanguage, Link, "link");
211 RETURN_CASE(SourceLanguage, VB, "vb");
212 RETURN_CASE(SourceLanguage, Cvtres, "cvtres");
213 RETURN_CASE(SourceLanguage, Cvtpgd, "cvtpgd");
214 RETURN_CASE(SourceLanguage, CSharp, "c#");
215 RETURN_CASE(SourceLanguage, ILAsm, "il asm");
216 RETURN_CASE(SourceLanguage, Java, "java");
217 RETURN_CASE(SourceLanguage, JScript, "javascript");
218 RETURN_CASE(SourceLanguage, MSIL, "msil");
219 RETURN_CASE(SourceLanguage, HLSL, "hlsl");
Reid Kleckner898ddf62017-07-24 16:16:42 +0000220 RETURN_CASE(SourceLanguage, D, "d");
Zachary Turner63055452017-06-15 22:24:24 +0000221 }
222 return formatUnknownEnum(Lang);
223}
224
225static std::string formatMachineType(CPUType Cpu) {
226 switch (Cpu) {
227 RETURN_CASE(CPUType, Intel8080, "intel 8080");
228 RETURN_CASE(CPUType, Intel8086, "intel 8086");
229 RETURN_CASE(CPUType, Intel80286, "intel 80286");
230 RETURN_CASE(CPUType, Intel80386, "intel 80386");
231 RETURN_CASE(CPUType, Intel80486, "intel 80486");
232 RETURN_CASE(CPUType, Pentium, "intel pentium");
233 RETURN_CASE(CPUType, PentiumPro, "intel pentium pro");
234 RETURN_CASE(CPUType, Pentium3, "intel pentium 3");
235 RETURN_CASE(CPUType, MIPS, "mips");
236 RETURN_CASE(CPUType, MIPS16, "mips-16");
237 RETURN_CASE(CPUType, MIPS32, "mips-32");
238 RETURN_CASE(CPUType, MIPS64, "mips-64");
239 RETURN_CASE(CPUType, MIPSI, "mips i");
240 RETURN_CASE(CPUType, MIPSII, "mips ii");
241 RETURN_CASE(CPUType, MIPSIII, "mips iii");
242 RETURN_CASE(CPUType, MIPSIV, "mips iv");
243 RETURN_CASE(CPUType, MIPSV, "mips v");
244 RETURN_CASE(CPUType, M68000, "motorola 68000");
245 RETURN_CASE(CPUType, M68010, "motorola 68010");
246 RETURN_CASE(CPUType, M68020, "motorola 68020");
247 RETURN_CASE(CPUType, M68030, "motorola 68030");
248 RETURN_CASE(CPUType, M68040, "motorola 68040");
249 RETURN_CASE(CPUType, Alpha, "alpha");
250 RETURN_CASE(CPUType, Alpha21164, "alpha 21164");
251 RETURN_CASE(CPUType, Alpha21164A, "alpha 21164a");
252 RETURN_CASE(CPUType, Alpha21264, "alpha 21264");
253 RETURN_CASE(CPUType, Alpha21364, "alpha 21364");
254 RETURN_CASE(CPUType, PPC601, "powerpc 601");
255 RETURN_CASE(CPUType, PPC603, "powerpc 603");
256 RETURN_CASE(CPUType, PPC604, "powerpc 604");
257 RETURN_CASE(CPUType, PPC620, "powerpc 620");
258 RETURN_CASE(CPUType, PPCFP, "powerpc fp");
259 RETURN_CASE(CPUType, PPCBE, "powerpc be");
260 RETURN_CASE(CPUType, SH3, "sh3");
261 RETURN_CASE(CPUType, SH3E, "sh3e");
262 RETURN_CASE(CPUType, SH3DSP, "sh3 dsp");
263 RETURN_CASE(CPUType, SH4, "sh4");
264 RETURN_CASE(CPUType, SHMedia, "shmedia");
265 RETURN_CASE(CPUType, ARM3, "arm 3");
266 RETURN_CASE(CPUType, ARM4, "arm 4");
267 RETURN_CASE(CPUType, ARM4T, "arm 4t");
268 RETURN_CASE(CPUType, ARM5, "arm 5");
269 RETURN_CASE(CPUType, ARM5T, "arm 5t");
270 RETURN_CASE(CPUType, ARM6, "arm 6");
271 RETURN_CASE(CPUType, ARM_XMAC, "arm xmac");
272 RETURN_CASE(CPUType, ARM_WMMX, "arm wmmx");
273 RETURN_CASE(CPUType, ARM7, "arm 7");
Mandeep Singh Grangd41ac892017-07-20 20:20:00 +0000274 RETURN_CASE(CPUType, ARM64, "arm64");
Zachary Turner63055452017-06-15 22:24:24 +0000275 RETURN_CASE(CPUType, Omni, "omni");
276 RETURN_CASE(CPUType, Ia64, "intel itanium ia64");
277 RETURN_CASE(CPUType, Ia64_2, "intel itanium ia64 2");
278 RETURN_CASE(CPUType, CEE, "cee");
279 RETURN_CASE(CPUType, AM33, "am33");
280 RETURN_CASE(CPUType, M32R, "m32r");
281 RETURN_CASE(CPUType, TriCore, "tri-core");
282 RETURN_CASE(CPUType, X64, "intel x86-x64");
283 RETURN_CASE(CPUType, EBC, "ebc");
284 RETURN_CASE(CPUType, Thumb, "thumb");
285 RETURN_CASE(CPUType, ARMNT, "arm nt");
286 RETURN_CASE(CPUType, D3D11_Shader, "d3d11 shader");
287 }
288 return formatUnknownEnum(Cpu);
289}
290
291static std::string formatCookieKind(FrameCookieKind Kind) {
292 switch (Kind) {
293 RETURN_CASE(FrameCookieKind, Copy, "copy");
294 RETURN_CASE(FrameCookieKind, XorStackPointer, "xor stack ptr");
295 RETURN_CASE(FrameCookieKind, XorFramePointer, "xor frame ptr");
296 RETURN_CASE(FrameCookieKind, XorR13, "xor rot13");
297 }
298 return formatUnknownEnum(Kind);
299}
300
301static std::string formatRegisterId(RegisterId Id) {
302 switch (Id) {
303 RETURN_CASE(RegisterId, VFrame, "vframe");
304 RETURN_CASE(RegisterId, AL, "al");
305 RETURN_CASE(RegisterId, CL, "cl");
306 RETURN_CASE(RegisterId, DL, "dl");
307 RETURN_CASE(RegisterId, BL, "bl");
308 RETURN_CASE(RegisterId, AH, "ah");
309 RETURN_CASE(RegisterId, CH, "ch");
310 RETURN_CASE(RegisterId, DH, "dh");
311 RETURN_CASE(RegisterId, BH, "bh");
312 RETURN_CASE(RegisterId, AX, "ax");
313 RETURN_CASE(RegisterId, CX, "cx");
314 RETURN_CASE(RegisterId, DX, "dx");
315 RETURN_CASE(RegisterId, BX, "bx");
316 RETURN_CASE(RegisterId, SP, "sp");
317 RETURN_CASE(RegisterId, BP, "bp");
318 RETURN_CASE(RegisterId, SI, "si");
319 RETURN_CASE(RegisterId, DI, "di");
320 RETURN_CASE(RegisterId, EAX, "eax");
321 RETURN_CASE(RegisterId, ECX, "ecx");
322 RETURN_CASE(RegisterId, EDX, "edx");
323 RETURN_CASE(RegisterId, EBX, "ebx");
324 RETURN_CASE(RegisterId, ESP, "esp");
325 RETURN_CASE(RegisterId, EBP, "ebp");
326 RETURN_CASE(RegisterId, ESI, "esi");
327 RETURN_CASE(RegisterId, EDI, "edi");
328 RETURN_CASE(RegisterId, ES, "es");
329 RETURN_CASE(RegisterId, CS, "cs");
330 RETURN_CASE(RegisterId, SS, "ss");
331 RETURN_CASE(RegisterId, DS, "ds");
332 RETURN_CASE(RegisterId, FS, "fs");
333 RETURN_CASE(RegisterId, GS, "gs");
334 RETURN_CASE(RegisterId, IP, "ip");
335 RETURN_CASE(RegisterId, RAX, "rax");
336 RETURN_CASE(RegisterId, RBX, "rbx");
337 RETURN_CASE(RegisterId, RCX, "rcx");
338 RETURN_CASE(RegisterId, RDX, "rdx");
339 RETURN_CASE(RegisterId, RSI, "rsi");
340 RETURN_CASE(RegisterId, RDI, "rdi");
341 RETURN_CASE(RegisterId, RBP, "rbp");
342 RETURN_CASE(RegisterId, RSP, "rsp");
343 RETURN_CASE(RegisterId, R8, "r8");
344 RETURN_CASE(RegisterId, R9, "r9");
345 RETURN_CASE(RegisterId, R10, "r10");
346 RETURN_CASE(RegisterId, R11, "r11");
347 RETURN_CASE(RegisterId, R12, "r12");
348 RETURN_CASE(RegisterId, R13, "r13");
349 RETURN_CASE(RegisterId, R14, "r14");
350 RETURN_CASE(RegisterId, R15, "r15");
351 default:
352 return formatUnknownEnum(Id);
353 }
354}
355
356static std::string formatRange(LocalVariableAddrRange Range) {
357 return formatv("[{0},+{1})",
358 formatSegmentOffset(Range.ISectStart, Range.OffsetStart),
359 Range.Range)
360 .str();
361}
362
363static std::string formatGaps(uint32_t IndentLevel,
364 ArrayRef<LocalVariableAddrGap> Gaps) {
365 std::vector<std::string> GapStrs;
366 for (const auto &G : Gaps) {
367 GapStrs.push_back(formatv("({0},{1})", G.GapStartOffset, G.Range).str());
368 }
369 return typesetItemList(GapStrs, 7, IndentLevel, ", ");
370}
371
372Error MinimalSymbolDumper::visitSymbolBegin(codeview::CVSymbol &Record) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000373 return visitSymbolBegin(Record, 0);
374}
375
376Error MinimalSymbolDumper::visitSymbolBegin(codeview::CVSymbol &Record,
377 uint32_t Offset) {
Zachary Turner63055452017-06-15 22:24:24 +0000378 // formatLine puts the newline at the beginning, so we use formatLine here
379 // to start a new line, and then individual visit methods use format to
380 // append to the existing line.
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000381 P.formatLine("{0} | {1} [size = {2}]",
382 fmt_align(Offset, AlignStyle::Right, 6),
383 getSymbolKindName(Record.Type), Record.length());
Zachary Turner63055452017-06-15 22:24:24 +0000384 P.Indent();
385 return Error::success();
386}
387
388Error MinimalSymbolDumper::visitSymbolEnd(CVSymbol &Record) {
Zachary Turnerf401e112017-08-17 20:04:31 +0000389 if (RecordBytes) {
390 AutoIndent Indent(P, 7);
391 P.formatBinary("bytes", Record.content(), 0);
392 }
Zachary Turner63055452017-06-15 22:24:24 +0000393 P.Unindent();
394 return Error::success();
395}
396
Zachary Turner59e3ae82017-08-08 18:34:44 +0000397std::string MinimalSymbolDumper::typeOrIdIndex(codeview::TypeIndex TI,
398 bool IsType) const {
Zachary Turner63055452017-06-15 22:24:24 +0000399 if (TI.isSimple())
400 return formatv("{0}", TI).str();
Zachary Turner59e3ae82017-08-08 18:34:44 +0000401 auto &Container = IsType ? Types : Ids;
402 StringRef Name = Container.getTypeName(TI);
Zachary Turner63055452017-06-15 22:24:24 +0000403 if (Name.size() > 32) {
404 Name = Name.take_front(32);
405 return formatv("{0} ({1}...)", TI, Name);
406 } else
407 return formatv("{0} ({1})", TI, Name);
408}
409
Zachary Turner59e3ae82017-08-08 18:34:44 +0000410std::string MinimalSymbolDumper::idIndex(codeview::TypeIndex TI) const {
411 return typeOrIdIndex(TI, false);
412}
413
414std::string MinimalSymbolDumper::typeIndex(TypeIndex TI) const {
415 return typeOrIdIndex(TI, true);
416}
417
Zachary Turner63055452017-06-15 22:24:24 +0000418Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
419 P.format(" `{0}`", Block.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000420 AutoIndent Indent(P, 7);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000421 P.formatLine("parent = {0}, end = {1}", Block.Parent, Block.End);
422 P.formatLine("code size = {0}, addr = {1}", Block.CodeSize,
Zachary Turner63055452017-06-15 22:24:24 +0000423 formatSegmentOffset(Block.Segment, Block.CodeOffset));
Zachary Turner63055452017-06-15 22:24:24 +0000424 return Error::success();
425}
426
427Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
428 P.format(" `{0}`", Thunk.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000429 AutoIndent Indent(P, 7);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000430 P.formatLine("parent = {0}, end = {1}, next = {2}", Thunk.Parent, Thunk.End,
Zachary Turner63055452017-06-15 22:24:24 +0000431 Thunk.Next);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000432 P.formatLine("kind = {0}, size = {1}, addr = {2}",
433 formatThunkOrdinal(Thunk.Thunk), Thunk.Length,
434 formatSegmentOffset(Thunk.Segment, Thunk.Offset));
Zachary Turner63055452017-06-15 22:24:24 +0000435
436 return Error::success();
437}
438
439Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
440 TrampolineSym &Tramp) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000441 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000442 P.formatLine("type = {0}, size = {1}, source = {2}, target = {3}",
443 formatTrampolineType(Tramp.Type), Tramp.Size,
444 formatSegmentOffset(Tramp.ThunkSection, Tramp.ThunkOffset),
445 formatSegmentOffset(Tramp.TargetSection, Tramp.ThunkOffset));
446
447 return Error::success();
448}
449
450Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
451 SectionSym &Section) {
452 P.format(" `{0}`", Section.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000453 AutoIndent Indent(P, 7);
Zachary Turner28e31ee2017-08-11 20:46:28 +0000454 P.formatLine("length = {0}, alignment = {1}, rva = {2}, section # = {3}",
Zachary Turner63055452017-06-15 22:24:24 +0000455 Section.Length, Section.Alignment, Section.Rva,
Zachary Turner28e31ee2017-08-11 20:46:28 +0000456 Section.SectionNumber);
457 P.printLine("characteristics =");
458 AutoIndent Indent2(P, 2);
459 P.printLine(formatSectionCharacteristics(P.getIndentLevel(),
460 Section.Characteristics, 1, "",
461 CharacteristicStyle::Descriptive));
Zachary Turner63055452017-06-15 22:24:24 +0000462 return Error::success();
463}
464
465Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CoffGroupSym &CG) {
466 P.format(" `{0}`", CG.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000467 AutoIndent Indent(P, 7);
Zachary Turner28e31ee2017-08-11 20:46:28 +0000468 P.formatLine("length = {0}, addr = {1}", CG.Size,
469 formatSegmentOffset(CG.Segment, CG.Offset));
470 P.printLine("characteristics =");
471 AutoIndent Indent2(P, 2);
472 P.printLine(formatSectionCharacteristics(P.getIndentLevel(),
473 CG.Characteristics, 1, "",
474 CharacteristicStyle::Descriptive));
Zachary Turner63055452017-06-15 22:24:24 +0000475 return Error::success();
476}
477
478Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
479 BPRelativeSym &BPRel) {
480 P.format(" `{0}`", BPRel.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000481 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000482 P.formatLine("type = {0}, offset = {1}", typeIndex(BPRel.Type), BPRel.Offset);
483 return Error::success();
484}
485
486Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
487 BuildInfoSym &BuildInfo) {
488 P.format(" BuildId = `{0}`", BuildInfo.BuildId);
489 return Error::success();
490}
491
492Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
493 CallSiteInfoSym &CSI) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000494 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000495 P.formatLine("type = {0}, addr = {1}", typeIndex(CSI.Type),
496 formatSegmentOffset(CSI.Segment, CSI.CodeOffset));
497 return Error::success();
498}
499
500Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
501 EnvBlockSym &EnvBlock) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000502 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000503 for (const auto &Entry : EnvBlock.Fields) {
504 P.formatLine("- {0}", Entry);
505 }
506 return Error::success();
507}
508
509Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FileStaticSym &FS) {
510 P.format(" `{0}`", FS.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000511 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000512 P.formatLine("type = {0}, file name offset = {1}, flags = {2}",
513 typeIndex(FS.Index), FS.ModFilenameOffset,
514 formatLocalSymFlags(P.getIndentLevel() + 9, FS.Flags));
515 return Error::success();
516}
517
518Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
519 P.format(" `{0}`", Export.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000520 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000521 P.formatLine("ordinal = {0}, flags = {1}", Export.Ordinal,
522 formatExportFlags(P.getIndentLevel() + 9, Export.Flags));
523 return Error::success();
524}
525
526Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
527 Compile2Sym &Compile2) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000528 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000529 SourceLanguage Lang = static_cast<SourceLanguage>(
530 Compile2.Flags & CompileSym2Flags::SourceLanguageMask);
531 P.formatLine("machine = {0}, ver = {1}, language = {2}",
532 formatMachineType(Compile2.Machine), Compile2.Version,
533 formatSourceLanguage(Lang));
534 P.formatLine("frontend = {0}.{1}.{2}, backend = {3}.{4}.{5}",
535 Compile2.VersionFrontendMajor, Compile2.VersionFrontendMinor,
536 Compile2.VersionFrontendBuild, Compile2.VersionBackendMajor,
537 Compile2.VersionBackendMinor, Compile2.VersionBackendBuild);
538 P.formatLine("flags = {0}",
539 formatCompileSym2Flags(P.getIndentLevel() + 9, Compile2.Flags));
540 P.formatLine(
541 "extra strings = {0}",
542 typesetStringList(P.getIndentLevel() + 9 + 2, Compile2.ExtraStrings));
543 return Error::success();
544}
545
546Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
547 Compile3Sym &Compile3) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000548 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000549 SourceLanguage Lang = static_cast<SourceLanguage>(
550 Compile3.Flags & CompileSym3Flags::SourceLanguageMask);
551 P.formatLine("machine = {0}, Ver = {1}, language = {2}",
552 formatMachineType(Compile3.Machine), Compile3.Version,
553 formatSourceLanguage(Lang));
554 P.formatLine("frontend = {0}.{1}.{2}.{3}, backend = {4}.{5}.{6}.{7}",
555 Compile3.VersionFrontendMajor, Compile3.VersionFrontendMinor,
556 Compile3.VersionFrontendBuild, Compile3.VersionFrontendQFE,
557 Compile3.VersionBackendMajor, Compile3.VersionBackendMinor,
558 Compile3.VersionBackendBuild, Compile3.VersionBackendQFE);
559 P.formatLine("flags = {0}",
560 formatCompileSym3Flags(P.getIndentLevel() + 9, Compile3.Flags));
561 return Error::success();
562}
563
564Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
565 ConstantSym &Constant) {
566 P.format(" `{0}`", Constant.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000567 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000568 P.formatLine("type = {0}, value = {1}", typeIndex(Constant.Type),
569 Constant.Value.toString(10));
570 return Error::success();
571}
572
573Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
574 P.format(" `{0}`", Data.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000575 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000576 P.formatLine("type = {0}, addr = {1}", typeIndex(Data.Type),
577 formatSegmentOffset(Data.Segment, Data.DataOffset));
578 return Error::success();
579}
580
581Error MinimalSymbolDumper::visitKnownRecord(
582 CVSymbol &CVR, DefRangeFramePointerRelFullScopeSym &Def) {
583 P.format(" offset = {0}", Def.Offset);
584 return Error::success();
585}
586
587Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
588 DefRangeFramePointerRelSym &Def) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000589 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000590 P.formatLine("offset = {0}, range = {1}", Def.Offset, formatRange(Def.Range));
591 P.formatLine("gaps = {2}", Def.Offset,
592 formatGaps(P.getIndentLevel() + 9, Def.Gaps));
593 return Error::success();
594}
595
596Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
597 DefRangeRegisterRelSym &Def) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000598 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000599 P.formatLine("register = {0}, base ptr = {1}, offset in parent = {2}, has "
600 "spilled udt = {3}",
601 uint16_t(Def.Hdr.Register), int32_t(Def.Hdr.BasePointerOffset),
602 Def.offsetInParent(), Def.hasSpilledUDTMember());
603 P.formatLine("range = {0}, gaps = {1}", formatRange(Def.Range),
604 formatGaps(P.getIndentLevel() + 9, Def.Gaps));
605 return Error::success();
606}
607
608Error MinimalSymbolDumper::visitKnownRecord(
609 CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000610 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000611 P.formatLine("register = {0}, may have no name = {1}, range start = "
612 "{2}, length = {3}",
613 uint16_t(DefRangeRegister.Hdr.Register),
614 uint16_t(DefRangeRegister.Hdr.MayHaveNoName),
615 formatSegmentOffset(DefRangeRegister.Range.ISectStart,
616 DefRangeRegister.Range.OffsetStart),
617 DefRangeRegister.Range.Range);
618 P.formatLine("gaps = [{0}]",
619 formatGaps(P.getIndentLevel() + 9, DefRangeRegister.Gaps));
620 return Error::success();
621}
622
623Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
624 DefRangeSubfieldRegisterSym &Def) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000625 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000626 bool NoName = !!(Def.Hdr.MayHaveNoName == 0);
627 P.formatLine("register = {0}, may have no name = {1}, offset in parent = {2}",
628 uint16_t(Def.Hdr.Register), NoName,
629 uint32_t(Def.Hdr.OffsetInParent));
630 P.formatLine("range = {0}, gaps = {1}", formatRange(Def.Range),
631 formatGaps(P.getIndentLevel() + 9, Def.Gaps));
632 return Error::success();
633}
634
635Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
636 DefRangeSubfieldSym &Def) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000637 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000638 P.formatLine("program = {0}, offset in parent = {1}, range = {2}",
639 Def.Program, Def.OffsetInParent, formatRange(Def.Range));
640 P.formatLine("gaps = {0}", formatGaps(P.getIndentLevel() + 9, Def.Gaps));
641 return Error::success();
642}
643
644Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DefRangeSym &Def) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000645 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000646 P.formatLine("program = {0}, range = {1}", Def.Program,
647 formatRange(Def.Range));
648 P.formatLine("gaps = {0}", formatGaps(P.getIndentLevel() + 9, Def.Gaps));
649 return Error::success();
650}
651
652Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameCookieSym &FC) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000653 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000654 P.formatLine("code offset = {0}, Register = {1}, kind = {2}, flags = {3}",
655 FC.CodeOffset, FC.Register, formatCookieKind(FC.CookieKind),
656 FC.Flags);
657 return Error::success();
658}
659
660Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameProcSym &FP) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000661 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000662 P.formatLine("size = {0}, padding size = {1}, offset to padding = {2}",
663 FP.TotalFrameBytes, FP.PaddingFrameBytes, FP.OffsetToPadding);
664 P.formatLine("bytes of callee saved registers = {0}, exception handler addr "
665 "= {1}",
666 FP.BytesOfCalleeSavedRegisters,
667 formatSegmentOffset(FP.SectionIdOfExceptionHandler,
668 FP.OffsetOfExceptionHandler));
669 P.formatLine("flags = {0}",
670 formatFrameProcedureOptions(P.getIndentLevel() + 9, FP.Flags));
671 return Error::success();
672}
673
674Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
675 HeapAllocationSiteSym &HAS) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000676 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000677 P.formatLine("type = {0}, addr = {1} call size = {2}", typeIndex(HAS.Type),
678 formatSegmentOffset(HAS.Segment, HAS.CodeOffset),
679 HAS.CallInstructionSize);
680 return Error::success();
681}
682
683Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, InlineSiteSym &IS) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000684 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000685 auto Bytes = makeArrayRef(IS.AnnotationData);
686 StringRef Annotations(reinterpret_cast<const char *>(Bytes.begin()),
687 Bytes.size());
688
689 P.formatLine("inlinee = {0}, parent = {1}, end = {2}", typeIndex(IS.Inlinee),
690 IS.Parent, IS.End);
691 P.formatLine("annotations = {0}", toHex(Annotations));
692 return Error::success();
693}
694
695Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
696 RegisterSym &Register) {
697 P.format(" `{0}`", Register.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000698 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000699 P.formatLine("register = {0}, type = {1}",
700 formatRegisterId(Register.Register), typeIndex(Register.Index));
701 return Error::success();
702}
703
704Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
705 PublicSym32 &Public) {
706 P.format(" `{0}`", Public.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000707 AutoIndent Indent(P, 7);
Reid Kleckner18d90e12017-06-19 16:54:51 +0000708 P.formatLine("flags = {0}, addr = {1}",
709 formatPublicSymFlags(P.getIndentLevel() + 9, Public.Flags),
Zachary Turner63055452017-06-15 22:24:24 +0000710 formatSegmentOffset(Public.Segment, Public.Offset));
711 return Error::success();
712}
713
714Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ProcRefSym &PR) {
715 P.format(" `{0}`", PR.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000716 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000717 P.formatLine("module = {0}, sum name = {1}, offset = {2}", PR.Module,
718 PR.SumName, PR.SymOffset);
719 return Error::success();
720}
721
722Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
723 P.format(" `{0}` (addr = {1})", Label.Name,
724 formatSegmentOffset(Label.Segment, Label.CodeOffset));
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000725 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000726 P.formatLine("flags = {0}",
727 formatProcSymFlags(P.getIndentLevel() + 9, Label.Flags));
728 return Error::success();
729}
730
731Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
732 P.format(" `{0}`", Local.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000733 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000734
735 std::string FlagStr =
736 formatLocalSymFlags(P.getIndentLevel() + 9, Local.Flags);
737 P.formatLine("type={0}, flags = {1}", typeIndex(Local.Type), FlagStr);
738 return Error::success();
739}
740
741Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
742 ObjNameSym &ObjName) {
743 P.format(" sig={0}, `{1}`", ObjName.Signature, ObjName.Name);
744 return Error::success();
745}
746
747Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
748 P.format(" `{0}`", Proc.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000749 AutoIndent Indent(P, 7);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000750 P.formatLine("parent = {0}, end = {1}, addr = {2}, code size = {3}",
751 Proc.Parent, Proc.End,
752 formatSegmentOffset(Proc.Segment, Proc.CodeOffset),
753 Proc.CodeSize);
Zachary Turner59e3ae82017-08-08 18:34:44 +0000754 bool IsType = true;
755 switch (Proc.getKind()) {
756 case SymbolRecordKind::GlobalProcIdSym:
757 case SymbolRecordKind::ProcIdSym:
758 case SymbolRecordKind::DPCProcIdSym:
759 IsType = false;
760 break;
761 default:
762 break;
763 }
Reid Kleckneraf88a912017-07-15 18:10:39 +0000764 P.formatLine("type = `{0}`, debug start = {1}, debug end = {2}, flags = {3}",
Zachary Turner59e3ae82017-08-08 18:34:44 +0000765 typeOrIdIndex(Proc.FunctionType, IsType), Proc.DbgStart,
766 Proc.DbgEnd,
Zachary Turner63055452017-06-15 22:24:24 +0000767 formatProcSymFlags(P.getIndentLevel() + 9, Proc.Flags));
768 return Error::success();
769}
770
771Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
772 ScopeEndSym &ScopeEnd) {
773 return Error::success();
774}
775
776Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000777 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000778 for (const auto &I : Caller.Indices) {
779 P.formatLine("callee: {0}", typeIndex(I));
780 }
781 return Error::success();
782}
783
784Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
785 RegRelativeSym &RegRel) {
786 P.format(" `{0}`", RegRel.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000787 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000788 P.formatLine("type = {0}, register = {1}, offset = {2}",
789 typeIndex(RegRel.Type), formatRegisterId(RegRel.Register),
790 RegRel.Offset);
791 return Error::success();
792}
793
794Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
795 ThreadLocalDataSym &Data) {
796 P.format(" `{0}`", Data.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000797 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000798 P.formatLine("type = {0}, addr = {1}", typeIndex(Data.Type),
799 formatSegmentOffset(Data.Segment, Data.DataOffset));
800 return Error::success();
801}
802
803Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
804 P.format(" `{0}`", UDT.Name);
Zachary Turneraf8c75a2017-06-30 21:35:00 +0000805 AutoIndent Indent(P, 7);
Zachary Turner63055452017-06-15 22:24:24 +0000806 P.formatLine("original type = {0}", UDT.Type);
807 return Error::success();
808}