LLVM  9.0.0svn
SymbolRecordMapping.cpp
Go to the documentation of this file.
1 //===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
10 
11 using namespace llvm;
12 using namespace llvm::codeview;
13 
14 #define error(X) \
15  if (auto EC = X) \
16  return EC;
17 
18 namespace {
19 struct MapGap {
20  Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
22  error(IO.mapInteger(Gap.Range));
23  return Error::success();
24  }
25 };
26 }
27 
29  LocalVariableAddrRange &Range) {
30  error(IO.mapInteger(Range.OffsetStart));
31  error(IO.mapInteger(Range.ISectStart));
32  error(IO.mapInteger(Range.Range));
33  return Error::success();
34 }
35 
37  error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
38  return Error::success();
39 }
40 
42  error(IO.padToAlignment(alignOf(Container)));
43  error(IO.endRecord());
44  return Error::success();
45 }
46 
48 
49  error(IO.mapInteger(Block.Parent));
50  error(IO.mapInteger(Block.End));
51  error(IO.mapInteger(Block.CodeSize));
52  error(IO.mapInteger(Block.CodeOffset));
53  error(IO.mapInteger(Block.Segment));
54  error(IO.mapStringZ(Block.Name));
55 
56  return Error::success();
57 }
58 
60 
61  error(IO.mapInteger(Thunk.Parent));
62  error(IO.mapInteger(Thunk.End));
63  error(IO.mapInteger(Thunk.Next));
64  error(IO.mapInteger(Thunk.Offset));
65  error(IO.mapInteger(Thunk.Segment));
66  error(IO.mapInteger(Thunk.Length));
67  error(IO.mapEnum(Thunk.Thunk));
68  error(IO.mapStringZ(Thunk.Name));
69  error(IO.mapByteVectorTail(Thunk.VariantData));
70 
71  return Error::success();
72 }
73 
75  TrampolineSym &Tramp) {
76 
77  error(IO.mapEnum(Tramp.Type));
78  error(IO.mapInteger(Tramp.Size));
79  error(IO.mapInteger(Tramp.ThunkOffset));
80  error(IO.mapInteger(Tramp.TargetOffset));
81  error(IO.mapInteger(Tramp.ThunkSection));
82  error(IO.mapInteger(Tramp.TargetSection));
83 
84  return Error::success();
85 }
86 
89  uint8_t Padding = 0;
90 
91  error(IO.mapInteger(Section.SectionNumber));
92  error(IO.mapInteger(Section.Alignment));
93  error(IO.mapInteger(Padding));
94  error(IO.mapInteger(Section.Rva));
95  error(IO.mapInteger(Section.Length));
96  error(IO.mapInteger(Section.Characteristics));
97  error(IO.mapStringZ(Section.Name));
98 
99  return Error::success();
100 }
101 
103  CoffGroupSym &CoffGroup) {
104 
105  error(IO.mapInteger(CoffGroup.Size));
106  error(IO.mapInteger(CoffGroup.Characteristics));
107  error(IO.mapInteger(CoffGroup.Offset));
108  error(IO.mapInteger(CoffGroup.Segment));
109  error(IO.mapStringZ(CoffGroup.Name));
110 
111  return Error::success();
112 }
113 
115  BPRelativeSym &BPRel) {
116 
117  error(IO.mapInteger(BPRel.Offset));
118  error(IO.mapInteger(BPRel.Type));
119  error(IO.mapStringZ(BPRel.Name));
120 
121  return Error::success();
122 }
123 
125  BuildInfoSym &BuildInfo) {
126 
127  error(IO.mapInteger(BuildInfo.BuildId));
128 
129  return Error::success();
130 }
131 
133  CallSiteInfoSym &CallSiteInfo) {
134  uint16_t Padding = 0;
135 
136  error(IO.mapInteger(CallSiteInfo.CodeOffset));
137  error(IO.mapInteger(CallSiteInfo.Segment));
138  error(IO.mapInteger(Padding));
139  error(IO.mapInteger(CallSiteInfo.Type));
140 
141  return Error::success();
142 }
143 
145  EnvBlockSym &EnvBlock) {
146 
147  uint8_t Reserved = 0;
148  error(IO.mapInteger(Reserved));
149  error(IO.mapStringZVectorZ(EnvBlock.Fields));
150 
151  return Error::success();
152 }
153 
155  FileStaticSym &FileStatic) {
156 
157  error(IO.mapInteger(FileStatic.Index));
158  error(IO.mapInteger(FileStatic.ModFilenameOffset));
159  error(IO.mapEnum(FileStatic.Flags));
160  error(IO.mapStringZ(FileStatic.Name));
161 
162  return Error::success();
163 }
164 
166 
167  error(IO.mapInteger(Export.Ordinal));
168  error(IO.mapEnum(Export.Flags));
169  error(IO.mapStringZ(Export.Name));
170 
171  return Error::success();
172 }
173 
175  Compile2Sym &Compile2) {
176 
177  error(IO.mapEnum(Compile2.Flags));
178  error(IO.mapEnum(Compile2.Machine));
179  error(IO.mapInteger(Compile2.VersionFrontendMajor));
180  error(IO.mapInteger(Compile2.VersionFrontendMinor));
181  error(IO.mapInteger(Compile2.VersionFrontendBuild));
182  error(IO.mapInteger(Compile2.VersionBackendMajor));
183  error(IO.mapInteger(Compile2.VersionBackendMinor));
184  error(IO.mapInteger(Compile2.VersionBackendBuild));
185  error(IO.mapStringZ(Compile2.Version));
186  error(IO.mapStringZVectorZ(Compile2.ExtraStrings));
187 
188  return Error::success();
189 }
190 
192  Compile3Sym &Compile3) {
193 
194  error(IO.mapEnum(Compile3.Flags));
195  error(IO.mapEnum(Compile3.Machine));
196  error(IO.mapInteger(Compile3.VersionFrontendMajor));
197  error(IO.mapInteger(Compile3.VersionFrontendMinor));
198  error(IO.mapInteger(Compile3.VersionFrontendBuild));
199  error(IO.mapInteger(Compile3.VersionFrontendQFE));
200  error(IO.mapInteger(Compile3.VersionBackendMajor));
201  error(IO.mapInteger(Compile3.VersionBackendMinor));
202  error(IO.mapInteger(Compile3.VersionBackendBuild));
203  error(IO.mapInteger(Compile3.VersionBackendQFE));
204  error(IO.mapStringZ(Compile3.Version));
205 
206  return Error::success();
207 }
208 
211 
212  error(IO.mapInteger(Constant.Type));
213  error(IO.mapEncodedInteger(Constant.Value));
214  error(IO.mapStringZ(Constant.Name));
215 
216  return Error::success();
217 }
218 
220 
221  error(IO.mapInteger(Data.Type));
222  error(IO.mapInteger(Data.DataOffset));
223  error(IO.mapInteger(Data.Segment));
224  error(IO.mapStringZ(Data.Name));
225 
226  return Error::success();
227 }
228 
230  CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
231 
232  error(IO.mapInteger(DefRangeFramePointerRel.Offset));
233  error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
234  error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
235 
236  return Error::success();
237 }
238 
240  CVSymbol &CVR,
241  DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
242 
243  error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));
244 
245  return Error::success();
246 }
247 
249  CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
250 
251  error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
252  error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
253  error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
254  error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
255  error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));
256 
257  return Error::success();
258 }
259 
261  CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
262 
263  error(IO.mapObject(DefRangeRegister.Hdr.Register));
264  error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
265  error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
266  error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));
267 
268  return Error::success();
269 }
270 
272  CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
273 
274  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
275  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
276  error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
277  error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
278  error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));
279 
280  return Error::success();
281 }
282 
284  CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
285 
286  error(IO.mapInteger(DefRangeSubfield.Program));
287  error(IO.mapInteger(DefRangeSubfield.OffsetInParent));
288  error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));
289  error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));
290 
291  return Error::success();
292 }
293 
295  DefRangeSym &DefRange) {
296 
297  error(IO.mapInteger(DefRange.Program));
298  error(mapLocalVariableAddrRange(IO, DefRange.Range));
299  error(IO.mapVectorTail(DefRange.Gaps, MapGap()));
300 
301  return Error::success();
302 }
303 
305  FrameCookieSym &FrameCookie) {
306 
307  error(IO.mapInteger(FrameCookie.CodeOffset));
308  error(IO.mapInteger(FrameCookie.Register));
309  error(IO.mapEnum(FrameCookie.CookieKind));
310  error(IO.mapInteger(FrameCookie.Flags));
311 
312  return Error::success();
313 }
314 
316  FrameProcSym &FrameProc) {
317  error(IO.mapInteger(FrameProc.TotalFrameBytes));
318  error(IO.mapInteger(FrameProc.PaddingFrameBytes));
319  error(IO.mapInteger(FrameProc.OffsetToPadding));
320  error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
321  error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
322  error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
323  error(IO.mapEnum(FrameProc.Flags));
324 
325  return Error::success();
326 }
327 
329  CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
330 
331  error(IO.mapInteger(HeapAllocSite.CodeOffset));
332  error(IO.mapInteger(HeapAllocSite.Segment));
333  error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
334  error(IO.mapInteger(HeapAllocSite.Type));
335 
336  return Error::success();
337 }
338 
340  InlineSiteSym &InlineSite) {
341 
342  error(IO.mapInteger(InlineSite.Parent));
343  error(IO.mapInteger(InlineSite.End));
344  error(IO.mapInteger(InlineSite.Inlinee));
345  error(IO.mapByteVectorTail(InlineSite.AnnotationData));
346 
347  return Error::success();
348 }
349 
352 
353  error(IO.mapInteger(Register.Index));
354  error(IO.mapEnum(Register.Register));
355  error(IO.mapStringZ(Register.Name));
356 
357  return Error::success();
358 }
359 
361  PublicSym32 &Public) {
362 
363  error(IO.mapEnum(Public.Flags));
364  error(IO.mapInteger(Public.Offset));
365  error(IO.mapInteger(Public.Segment));
366  error(IO.mapStringZ(Public.Name));
367 
368  return Error::success();
369 }
370 
372  ProcRefSym &ProcRef) {
373 
374  error(IO.mapInteger(ProcRef.SumName));
375  error(IO.mapInteger(ProcRef.SymOffset));
376  error(IO.mapInteger(ProcRef.Module));
377  error(IO.mapStringZ(ProcRef.Name));
378 
379  return Error::success();
380 }
381 
383 
384  error(IO.mapInteger(Label.CodeOffset));
385  error(IO.mapInteger(Label.Segment));
386  error(IO.mapEnum(Label.Flags));
387  error(IO.mapStringZ(Label.Name));
388 
389  return Error::success();
390 }
391 
393  error(IO.mapInteger(Local.Type));
394  error(IO.mapEnum(Local.Flags));
395  error(IO.mapStringZ(Local.Name));
396 
397  return Error::success();
398 }
399 
401  ObjNameSym &ObjName) {
402 
403  error(IO.mapInteger(ObjName.Signature));
404  error(IO.mapStringZ(ObjName.Name));
405 
406  return Error::success();
407 }
408 
410  error(IO.mapInteger(Proc.Parent));
411  error(IO.mapInteger(Proc.End));
412  error(IO.mapInteger(Proc.Next));
413  error(IO.mapInteger(Proc.CodeSize));
414  error(IO.mapInteger(Proc.DbgStart));
415  error(IO.mapInteger(Proc.DbgEnd));
416  error(IO.mapInteger(Proc.FunctionType));
417  error(IO.mapInteger(Proc.CodeOffset));
418  error(IO.mapInteger(Proc.Segment));
419  error(IO.mapEnum(Proc.Flags));
420  error(IO.mapStringZ(Proc.Name));
421  return Error::success();
422 }
423 
425  ScopeEndSym &ScopeEnd) {
426  return Error::success();
427 }
428 
430  error(IO.mapVectorN<uint32_t>(
431  Caller.Indices,
432  [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
433  return Error::success();
434 }
435 
437  RegRelativeSym &RegRel) {
438 
439  error(IO.mapInteger(RegRel.Offset));
440  error(IO.mapInteger(RegRel.Type));
441  error(IO.mapEnum(RegRel.Register));
442  error(IO.mapStringZ(RegRel.Name));
443 
444  return Error::success();
445 }
446 
448  ThreadLocalDataSym &Data) {
449 
450  error(IO.mapInteger(Data.Type));
451  error(IO.mapInteger(Data.DataOffset));
452  error(IO.mapInteger(Data.Segment));
453  error(IO.mapStringZ(Data.Name));
454 
455  return Error::success();
456 }
457 
459 
460  error(IO.mapInteger(UDT.Type));
461  error(IO.mapStringZ(UDT.Name));
462 
463  return Error::success();
464 }
465 
467  UsingNamespaceSym &UN) {
468 
469  error(IO.mapStringZ(UN.Name));
470 
471  return Error::success();
472 }
473 
475  CPUType CPU) {
476  assert(unsigned(EncodedReg) < 4);
477  switch (CPU) {
478  // FIXME: Add ARM and AArch64 variants here.
479  default:
480  break;
481  case CPUType::Intel8080:
482  case CPUType::Intel8086:
483  case CPUType::Intel80286:
484  case CPUType::Intel80386:
485  case CPUType::Intel80486:
486  case CPUType::Pentium:
487  case CPUType::PentiumPro:
488  case CPUType::Pentium3:
489  switch (EncodedReg) {
491  case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
494  }
495  llvm_unreachable("bad encoding");
496  case CPUType::X64:
497  switch (EncodedReg) {
499  case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
500  case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
501  case EncodedFramePtrReg::BasePtr: return RegisterId::R13;
502  }
503  llvm_unreachable("bad encoding");
504  }
505  return RegisterId::NONE;
506 }
507 
509  switch (CPU) {
510  // FIXME: Add ARM and AArch64 variants here.
511  default:
512  break;
513  case CPUType::Intel8080:
514  case CPUType::Intel8086:
515  case CPUType::Intel80286:
516  case CPUType::Intel80386:
517  case CPUType::Intel80486:
518  case CPUType::Pentium:
519  case CPUType::PentiumPro:
520  case CPUType::Pentium3:
521  switch (Reg) {
522  case RegisterId::VFRAME:
524  case RegisterId::EBP:
526  case RegisterId::EBX:
528  default:
529  break;
530  }
531  break;
532  case CPUType::X64:
533  switch (Reg) {
534  case RegisterId::RSP:
536  case RegisterId::RBP:
538  case RegisterId::R13:
540  default:
541  break;
542  }
543  break;
544  }
546 }
This class represents lattice values for constants.
Definition: AllocatorList.h:23
FrameProcedureOptions Flags
Definition: SymbolRecord.h:774
Error mapInteger(TypeIndex &TypeInd)
unsigned Reg
#define error(X)
uint32_t alignOf(CodeViewContainer Container)
Definition: CodeView.h:589
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:517
ArrayRef< uint8_t > VariantData
Definition: SymbolRecord.h:83
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:574
std::vector< uint8_t > AnnotationData
Definition: SymbolRecord.h:352
std::vector< StringRef > ExtraStrings
Definition: SymbolRecord.h:712
static Error visitKnownRecord(CVSymbol &Record, SymbolVisitorCallbacks &Callbacks)
A 32-bit type reference.
Definition: TypeIndex.h:95
EncodedFramePtrReg
Two-bit value indicating which register is the designated frame pointer register. ...
Definition: CodeView.h:519
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:493
This is an important base class in LLVM.
Definition: Constant.h:41
std::vector< StringRef > Fields
Definition: SymbolRecord.h:660
LocalVariableAddrRange Range
Definition: SymbolRecord.h:448
std::vector< TypeIndex > Indices
Definition: SymbolRecord.h:153
LocalVariableAddrRange Range
Definition: SymbolRecord.h:492
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:449
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LocalVariableAddrRange Range
Definition: SymbolRecord.h:470
Error visitSymbolEnd(CVSymbol &Record) override
static ErrorSuccess success()
Create a success value.
Definition: Error.h:326
CPUType
These values correspond to the CV_CPU_TYPE_e enumeration, and are documented here: https://msdn...
Definition: CodeView.h:78
Promote Memory to Register
Definition: Mem2Reg.cpp:109
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:539
EncodedFramePtrReg encodeFramePtrReg(RegisterId Reg, CPUType CPU)
#define N
static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO, LocalVariableAddrRange &Range)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:471
Lightweight error class with error context and mandatory checking.
Definition: Error.h:157
Error visitSymbolBegin(CVSymbol &Record) override
RegisterId decodeFramePtrReg(EncodedFramePtrReg EncodedReg, CPUType CPU)