Line data Source code
1 : //===- SymbolRecordMapping.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 "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"
11 :
12 : using namespace llvm;
13 : using namespace llvm::codeview;
14 :
15 : #define error(X) \
16 : if (auto EC = X) \
17 : return EC;
18 :
19 : namespace {
20 : struct MapGap {
21 0 : Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
22 0 : error(IO.mapInteger(Gap.GapStartOffset));
23 0 : error(IO.mapInteger(Gap.Range));
24 : return Error::success();
25 : }
26 : };
27 : }
28 :
29 237 : static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,
30 : LocalVariableAddrRange &Range) {
31 474 : error(IO.mapInteger(Range.OffsetStart));
32 474 : error(IO.mapInteger(Range.ISectStart));
33 474 : error(IO.mapInteger(Range.Range));
34 : return Error::success();
35 : }
36 :
37 3925 : Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
38 7850 : error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
39 : return Error::success();
40 : }
41 :
42 3925 : Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {
43 10636 : error(IO.padToAlignment(alignOf(Container)));
44 7850 : error(IO.endRecord());
45 : return Error::success();
46 : }
47 :
48 18 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
49 :
50 36 : error(IO.mapInteger(Block.Parent));
51 36 : error(IO.mapInteger(Block.End));
52 36 : error(IO.mapInteger(Block.CodeSize));
53 36 : error(IO.mapInteger(Block.CodeOffset));
54 36 : error(IO.mapInteger(Block.Segment));
55 36 : error(IO.mapStringZ(Block.Name));
56 :
57 : return Error::success();
58 : }
59 :
60 4 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
61 :
62 8 : error(IO.mapInteger(Thunk.Parent));
63 8 : error(IO.mapInteger(Thunk.End));
64 8 : error(IO.mapInteger(Thunk.Next));
65 8 : error(IO.mapInteger(Thunk.Offset));
66 8 : error(IO.mapInteger(Thunk.Segment));
67 8 : error(IO.mapInteger(Thunk.Length));
68 8 : error(IO.mapEnum(Thunk.Thunk));
69 8 : error(IO.mapStringZ(Thunk.Name));
70 8 : error(IO.mapByteVectorTail(Thunk.VariantData));
71 :
72 : return Error::success();
73 : }
74 :
75 6 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
76 : TrampolineSym &Tramp) {
77 :
78 12 : error(IO.mapEnum(Tramp.Type));
79 12 : error(IO.mapInteger(Tramp.Size));
80 12 : error(IO.mapInteger(Tramp.ThunkOffset));
81 12 : error(IO.mapInteger(Tramp.TargetOffset));
82 12 : error(IO.mapInteger(Tramp.ThunkSection));
83 12 : error(IO.mapInteger(Tramp.TargetSection));
84 :
85 : return Error::success();
86 : }
87 :
88 291 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
89 : SectionSym &Section) {
90 291 : uint8_t Padding = 0;
91 :
92 582 : error(IO.mapInteger(Section.SectionNumber));
93 582 : error(IO.mapInteger(Section.Alignment));
94 582 : error(IO.mapInteger(Padding));
95 582 : error(IO.mapInteger(Section.Rva));
96 582 : error(IO.mapInteger(Section.Length));
97 582 : error(IO.mapInteger(Section.Characteristics));
98 582 : error(IO.mapStringZ(Section.Name));
99 :
100 : return Error::success();
101 : }
102 :
103 30 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
104 : CoffGroupSym &CoffGroup) {
105 :
106 60 : error(IO.mapInteger(CoffGroup.Size));
107 60 : error(IO.mapInteger(CoffGroup.Characteristics));
108 60 : error(IO.mapInteger(CoffGroup.Offset));
109 60 : error(IO.mapInteger(CoffGroup.Segment));
110 60 : error(IO.mapStringZ(CoffGroup.Name));
111 :
112 : return Error::success();
113 : }
114 :
115 9 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
116 : BPRelativeSym &BPRel) {
117 :
118 18 : error(IO.mapInteger(BPRel.Offset));
119 18 : error(IO.mapInteger(BPRel.Type));
120 18 : error(IO.mapStringZ(BPRel.Name));
121 :
122 : return Error::success();
123 : }
124 :
125 153 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
126 : BuildInfoSym &BuildInfo) {
127 :
128 306 : error(IO.mapInteger(BuildInfo.BuildId));
129 :
130 : return Error::success();
131 : }
132 :
133 0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
134 : CallSiteInfoSym &CallSiteInfo) {
135 0 : uint16_t Padding = 0;
136 :
137 0 : error(IO.mapInteger(CallSiteInfo.CodeOffset));
138 0 : error(IO.mapInteger(CallSiteInfo.Segment));
139 0 : error(IO.mapInteger(Padding));
140 0 : error(IO.mapInteger(CallSiteInfo.Type));
141 :
142 : return Error::success();
143 : }
144 :
145 111 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
146 : EnvBlockSym &EnvBlock) {
147 :
148 111 : uint8_t Reserved = 0;
149 222 : error(IO.mapInteger(Reserved));
150 222 : error(IO.mapStringZVectorZ(EnvBlock.Fields));
151 :
152 : return Error::success();
153 : }
154 :
155 6 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
156 : FileStaticSym &FileStatic) {
157 :
158 12 : error(IO.mapInteger(FileStatic.Index));
159 12 : error(IO.mapInteger(FileStatic.ModFilenameOffset));
160 12 : error(IO.mapEnum(FileStatic.Flags));
161 12 : error(IO.mapStringZ(FileStatic.Name));
162 :
163 : return Error::success();
164 : }
165 :
166 0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
167 :
168 0 : error(IO.mapInteger(Export.Ordinal));
169 0 : error(IO.mapEnum(Export.Flags));
170 0 : error(IO.mapStringZ(Export.Name));
171 :
172 : return Error::success();
173 : }
174 :
175 0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
176 : Compile2Sym &Compile2) {
177 :
178 0 : error(IO.mapEnum(Compile2.Flags));
179 0 : error(IO.mapEnum(Compile2.Machine));
180 0 : error(IO.mapInteger(Compile2.VersionFrontendMajor));
181 0 : error(IO.mapInteger(Compile2.VersionFrontendMinor));
182 0 : error(IO.mapInteger(Compile2.VersionFrontendBuild));
183 0 : error(IO.mapInteger(Compile2.VersionBackendMajor));
184 0 : error(IO.mapInteger(Compile2.VersionBackendMinor));
185 0 : error(IO.mapInteger(Compile2.VersionBackendBuild));
186 0 : error(IO.mapStringZ(Compile2.Version));
187 0 : error(IO.mapStringZVectorZ(Compile2.ExtraStrings));
188 :
189 : return Error::success();
190 : }
191 :
192 275 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
193 : Compile3Sym &Compile3) {
194 :
195 550 : error(IO.mapEnum(Compile3.Flags));
196 550 : error(IO.mapEnum(Compile3.Machine));
197 550 : error(IO.mapInteger(Compile3.VersionFrontendMajor));
198 550 : error(IO.mapInteger(Compile3.VersionFrontendMinor));
199 550 : error(IO.mapInteger(Compile3.VersionFrontendBuild));
200 550 : error(IO.mapInteger(Compile3.VersionFrontendQFE));
201 550 : error(IO.mapInteger(Compile3.VersionBackendMajor));
202 550 : error(IO.mapInteger(Compile3.VersionBackendMinor));
203 550 : error(IO.mapInteger(Compile3.VersionBackendBuild));
204 550 : error(IO.mapInteger(Compile3.VersionBackendQFE));
205 550 : error(IO.mapStringZ(Compile3.Version));
206 :
207 : return Error::success();
208 : }
209 :
210 0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
211 : ConstantSym &Constant) {
212 :
213 0 : error(IO.mapInteger(Constant.Type));
214 0 : error(IO.mapEncodedInteger(Constant.Value));
215 0 : error(IO.mapStringZ(Constant.Name));
216 :
217 : return Error::success();
218 : }
219 :
220 92 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
221 :
222 184 : error(IO.mapInteger(Data.Type));
223 184 : error(IO.mapInteger(Data.DataOffset));
224 184 : error(IO.mapInteger(Data.Segment));
225 184 : error(IO.mapStringZ(Data.Name));
226 :
227 : return Error::success();
228 : }
229 :
230 160 : Error SymbolRecordMapping::visitKnownRecord(
231 : CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
232 :
233 320 : error(IO.mapInteger(DefRangeFramePointerRel.Offset));
234 320 : error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
235 320 : error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
236 :
237 : return Error::success();
238 : }
239 :
240 8 : Error SymbolRecordMapping::visitKnownRecord(
241 : CVSymbol &CVR,
242 : DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
243 :
244 16 : error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));
245 :
246 : return Error::success();
247 : }
248 :
249 16 : Error SymbolRecordMapping::visitKnownRecord(
250 : CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
251 :
252 32 : error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
253 32 : error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
254 32 : error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
255 32 : error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
256 32 : error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));
257 :
258 : return Error::success();
259 : }
260 :
261 54 : Error SymbolRecordMapping::visitKnownRecord(
262 : CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
263 :
264 108 : error(IO.mapObject(DefRangeRegister.Hdr.Register));
265 108 : error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
266 108 : error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
267 108 : error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));
268 :
269 : return Error::success();
270 : }
271 :
272 7 : Error SymbolRecordMapping::visitKnownRecord(
273 : CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
274 :
275 14 : error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
276 14 : error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
277 14 : error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
278 14 : error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
279 14 : error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));
280 :
281 : return Error::success();
282 : }
283 :
284 0 : Error SymbolRecordMapping::visitKnownRecord(
285 : CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
286 :
287 0 : error(IO.mapInteger(DefRangeSubfield.Program));
288 0 : error(IO.mapInteger(DefRangeSubfield.OffsetInParent));
289 0 : error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));
290 0 : error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));
291 :
292 : return Error::success();
293 : }
294 :
295 0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
296 : DefRangeSym &DefRange) {
297 :
298 0 : error(IO.mapInteger(DefRange.Program));
299 0 : error(mapLocalVariableAddrRange(IO, DefRange.Range));
300 0 : error(IO.mapVectorTail(DefRange.Gaps, MapGap()));
301 :
302 : return Error::success();
303 : }
304 :
305 0 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
306 : FrameCookieSym &FrameCookie) {
307 :
308 0 : error(IO.mapInteger(FrameCookie.CodeOffset));
309 0 : error(IO.mapInteger(FrameCookie.Register));
310 0 : error(IO.mapEnum(FrameCookie.CookieKind));
311 0 : error(IO.mapInteger(FrameCookie.Flags));
312 :
313 : return Error::success();
314 : }
315 :
316 270 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
317 : FrameProcSym &FrameProc) {
318 540 : error(IO.mapInteger(FrameProc.TotalFrameBytes));
319 540 : error(IO.mapInteger(FrameProc.PaddingFrameBytes));
320 540 : error(IO.mapInteger(FrameProc.OffsetToPadding));
321 540 : error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
322 540 : error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
323 540 : error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
324 540 : error(IO.mapEnum(FrameProc.Flags));
325 :
326 : return Error::success();
327 : }
328 :
329 2 : Error SymbolRecordMapping::visitKnownRecord(
330 : CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
331 :
332 4 : error(IO.mapInteger(HeapAllocSite.CodeOffset));
333 4 : error(IO.mapInteger(HeapAllocSite.Segment));
334 4 : error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
335 4 : error(IO.mapInteger(HeapAllocSite.Type));
336 :
337 : return Error::success();
338 : }
339 :
340 32 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
341 : InlineSiteSym &InlineSite) {
342 :
343 64 : error(IO.mapInteger(InlineSite.Parent));
344 64 : error(IO.mapInteger(InlineSite.End));
345 64 : error(IO.mapInteger(InlineSite.Inlinee));
346 64 : error(IO.mapByteVectorTail(InlineSite.AnnotationData));
347 :
348 : return Error::success();
349 : }
350 :
351 1 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
352 : RegisterSym &Register) {
353 :
354 2 : error(IO.mapInteger(Register.Index));
355 2 : error(IO.mapEnum(Register.Register));
356 2 : error(IO.mapStringZ(Register.Name));
357 :
358 : return Error::success();
359 : }
360 :
361 451 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
362 : PublicSym32 &Public) {
363 :
364 902 : error(IO.mapEnum(Public.Flags));
365 902 : error(IO.mapInteger(Public.Offset));
366 902 : error(IO.mapInteger(Public.Segment));
367 902 : error(IO.mapStringZ(Public.Name));
368 :
369 : return Error::success();
370 : }
371 :
372 91 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
373 : ProcRefSym &ProcRef) {
374 :
375 182 : error(IO.mapInteger(ProcRef.SumName));
376 182 : error(IO.mapInteger(ProcRef.SymOffset));
377 182 : error(IO.mapInteger(ProcRef.Module));
378 182 : error(IO.mapStringZ(ProcRef.Name));
379 :
380 : return Error::success();
381 : }
382 :
383 1 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
384 :
385 2 : error(IO.mapInteger(Label.CodeOffset));
386 2 : error(IO.mapInteger(Label.Segment));
387 2 : error(IO.mapEnum(Label.Flags));
388 2 : error(IO.mapStringZ(Label.Name));
389 :
390 : return Error::success();
391 : }
392 :
393 217 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
394 434 : error(IO.mapInteger(Local.Type));
395 434 : error(IO.mapEnum(Local.Flags));
396 434 : error(IO.mapStringZ(Local.Name));
397 :
398 : return Error::success();
399 : }
400 :
401 193 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
402 : ObjNameSym &ObjName) {
403 :
404 386 : error(IO.mapInteger(ObjName.Signature));
405 386 : error(IO.mapStringZ(ObjName.Name));
406 :
407 : return Error::success();
408 : }
409 :
410 293 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
411 586 : error(IO.mapInteger(Proc.Parent));
412 586 : error(IO.mapInteger(Proc.End));
413 586 : error(IO.mapInteger(Proc.Next));
414 586 : error(IO.mapInteger(Proc.CodeSize));
415 586 : error(IO.mapInteger(Proc.DbgStart));
416 586 : error(IO.mapInteger(Proc.DbgEnd));
417 586 : error(IO.mapInteger(Proc.FunctionType));
418 586 : error(IO.mapInteger(Proc.CodeOffset));
419 586 : error(IO.mapInteger(Proc.Segment));
420 586 : error(IO.mapEnum(Proc.Flags));
421 586 : error(IO.mapStringZ(Proc.Name));
422 : return Error::success();
423 : }
424 :
425 345 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
426 : ScopeEndSym &ScopeEnd) {
427 345 : return Error::success();
428 : }
429 :
430 15 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
431 30 : error(IO.mapVectorN<uint32_t>(
432 : Caller.Indices,
433 : [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
434 : return Error::success();
435 : }
436 :
437 47 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
438 : RegRelativeSym &RegRel) {
439 :
440 94 : error(IO.mapInteger(RegRel.Offset));
441 94 : error(IO.mapInteger(RegRel.Type));
442 94 : error(IO.mapEnum(RegRel.Register));
443 94 : error(IO.mapStringZ(RegRel.Name));
444 :
445 : return Error::success();
446 : }
447 :
448 2 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
449 : ThreadLocalDataSym &Data) {
450 :
451 4 : error(IO.mapInteger(Data.Type));
452 4 : error(IO.mapInteger(Data.DataOffset));
453 4 : error(IO.mapInteger(Data.Segment));
454 4 : error(IO.mapStringZ(Data.Name));
455 :
456 : return Error::success();
457 : }
458 :
459 716 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
460 :
461 1432 : error(IO.mapInteger(UDT.Type));
462 1432 : error(IO.mapStringZ(UDT.Name));
463 :
464 : return Error::success();
465 : }
466 :
467 9 : Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
468 : UsingNamespaceSym &UN) {
469 :
470 18 : error(IO.mapStringZ(UN.Name));
471 :
472 : return Error::success();
473 : }
474 :
475 422 : RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
476 : CPUType CPU) {
477 : assert(unsigned(EncodedReg) < 4);
478 422 : switch (CPU) {
479 : // FIXME: Add ARM and AArch64 variants here.
480 : default:
481 : break;
482 168 : case CPUType::Intel8080:
483 : case CPUType::Intel8086:
484 : case CPUType::Intel80286:
485 : case CPUType::Intel80386:
486 : case CPUType::Intel80486:
487 : case CPUType::Pentium:
488 : case CPUType::PentiumPro:
489 : case CPUType::Pentium3:
490 : switch (EncodedReg) {
491 : case EncodedFramePtrReg::None: return RegisterId::NONE;
492 : case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
493 : case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;
494 : case EncodedFramePtrReg::BasePtr: return RegisterId::EBX;
495 : }
496 0 : llvm_unreachable("bad encoding");
497 252 : case CPUType::X64:
498 : switch (EncodedReg) {
499 : case EncodedFramePtrReg::None: return RegisterId::NONE;
500 : case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
501 : case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
502 : case EncodedFramePtrReg::BasePtr: return RegisterId::R13;
503 : }
504 0 : llvm_unreachable("bad encoding");
505 : }
506 : return RegisterId::NONE;
507 : }
508 :
509 242 : EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {
510 242 : switch (CPU) {
511 : // FIXME: Add ARM and AArch64 variants here.
512 : default:
513 : break;
514 131 : case CPUType::Intel8080:
515 : case CPUType::Intel8086:
516 : case CPUType::Intel80286:
517 : case CPUType::Intel80386:
518 : case CPUType::Intel80486:
519 : case CPUType::Pentium:
520 : case CPUType::PentiumPro:
521 : case CPUType::Pentium3:
522 : switch (Reg) {
523 : case RegisterId::VFRAME:
524 : return EncodedFramePtrReg::StackPtr;
525 65 : case RegisterId::EBP:
526 65 : return EncodedFramePtrReg::FramePtr;
527 0 : case RegisterId::EBX:
528 0 : return EncodedFramePtrReg::BasePtr;
529 : default:
530 : break;
531 : }
532 : case CPUType::X64:
533 : switch (Reg) {
534 : case RegisterId::RSP:
535 : return EncodedFramePtrReg::StackPtr;
536 0 : case RegisterId::RBP:
537 0 : return EncodedFramePtrReg::FramePtr;
538 0 : case RegisterId::R13:
539 0 : return EncodedFramePtrReg::BasePtr;
540 : default:
541 : break;
542 : }
543 : }
544 5 : return EncodedFramePtrReg::None;
545 : }
|