LLVM  4.0.0
SymbolRecord.h
Go to the documentation of this file.
1 //===- SymbolRecord.h -------------------------------------------*- 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 #ifndef LLVM_DEBUGINFO_CODEVIEW_SYMBOLRECORD_H
11 #define LLVM_DEBUGINFO_CODEVIEW_SYMBOLRECORD_H
12 
13 #include "llvm/ADT/APSInt.h"
14 #include "llvm/ADT/ArrayRef.h"
15 #include "llvm/ADT/Optional.h"
17 #include "llvm/ADT/StringRef.h"
23 #include "llvm/Support/Endian.h"
24 #include "llvm/Support/Error.h"
25 #include <cstddef>
26 #include <cstdint>
27 #include <vector>
28 
29 namespace llvm {
30 namespace codeview {
31 
32 class SymbolRecord {
33 protected:
34  explicit SymbolRecord(SymbolRecordKind Kind) : Kind(Kind) {}
35 
36 public:
37  SymbolRecordKind getKind() const { return Kind; }
38 
39 private:
40  SymbolRecordKind Kind;
41 };
42 
43 // S_GPROC32, S_LPROC32, S_GPROC32_ID, S_LPROC32_ID, S_LPROC32_DPC or
44 // S_LPROC32_DPC_ID
45 class ProcSym : public SymbolRecord {
46  static constexpr uint32_t RelocationOffset = 32;
47 
48 public:
49  explicit ProcSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
51  : SymbolRecord(Kind), RecordOffset(RecordOffset) {}
52 
54  return RecordOffset + RelocationOffset;
55  }
56 
65  uint16_t Segment = 0;
68 
70 };
71 
72 // S_THUNK32
73 class Thunk32Sym : public SymbolRecord {
74 public:
75  explicit Thunk32Sym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
77  : SymbolRecord(Kind), RecordOffset(RecordOffset) {}
78 
83  uint16_t Segment;
84  uint16_t Length;
88 
90 };
91 
92 // S_TRAMPOLINE
93 class TrampolineSym : public SymbolRecord {
94 public:
95  explicit TrampolineSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
97  : SymbolRecord(Kind), RecordOffset(RecordOffset) {}
98 
100  uint16_t Size;
103  uint16_t ThunkSection;
104  uint16_t TargetSection;
105 
107 };
108 
109 // S_SECTION
110 class SectionSym : public SymbolRecord {
111 public:
112  explicit SectionSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
114  : SymbolRecord(Kind), RecordOffset(RecordOffset) {}
115 
116  uint16_t SectionNumber;
117  uint8_t Alignment;
122 
124 };
125 
126 // S_COFFGROUP
127 class CoffGroupSym : public SymbolRecord {
128 public:
129  explicit CoffGroupSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
131  : SymbolRecord(Kind), RecordOffset(RecordOffset) {}
132 
136  uint16_t Segment;
138 
140 };
141 
142 class ScopeEndSym : public SymbolRecord {
143 public:
144  explicit ScopeEndSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
146  : SymbolRecord(Kind), RecordOffset(RecordOffset) {}
147 
149 };
150 
151 class CallerSym : public SymbolRecord {
152 public:
153  explicit CallerSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
155  : SymbolRecord(Kind), RecordOffset(RecordOffset) {}
156 
157  std::vector<TypeIndex> Indices;
159 };
160 
162  struct AnnotationData {
167  int32_t S1;
168  };
169 
170  BinaryAnnotationIterator(ArrayRef<uint8_t> Annotations) : Data(Annotations) {}
171  BinaryAnnotationIterator() = default;
173  : Data(Other.Data) {}
174 
176  return Data == Other.Data;
177  }
178 
180  return !(*this == Other);
181  }
182 
184  Data = Other.Data;
185  return *this;
186  }
187 
189  if (!ParseCurrentAnnotation()) {
190  *this = BinaryAnnotationIterator();
191  return *this;
192  }
193  Data = Next;
194  Next = ArrayRef<uint8_t>();
195  Current.reset();
196  return *this;
197  }
198 
200  BinaryAnnotationIterator Orig(*this);
201  ++(*this);
202  return Orig;
203  }
204 
206  ParseCurrentAnnotation();
207  return Current.getValue();
208  }
209 
210 private:
211  static uint32_t GetCompressedAnnotation(ArrayRef<uint8_t> &Annotations) {
212  if (Annotations.empty())
213  return -1;
214 
215  uint8_t FirstByte = Annotations.front();
216  Annotations = Annotations.drop_front();
217 
218  if ((FirstByte & 0x80) == 0x00)
219  return FirstByte;
220 
221  if (Annotations.empty())
222  return -1;
223 
224  uint8_t SecondByte = Annotations.front();
225  Annotations = Annotations.drop_front();
226 
227  if ((FirstByte & 0xC0) == 0x80)
228  return ((FirstByte & 0x3F) << 8) | SecondByte;
229 
230  if (Annotations.empty())
231  return -1;
232 
233  uint8_t ThirdByte = Annotations.front();
234  Annotations = Annotations.drop_front();
235 
236  if (Annotations.empty())
237  return -1;
238 
239  uint8_t FourthByte = Annotations.front();
240  Annotations = Annotations.drop_front();
241 
242  if ((FirstByte & 0xE0) == 0xC0)
243  return ((FirstByte & 0x1F) << 24) | (SecondByte << 16) |
244  (ThirdByte << 8) | FourthByte;
245 
246  return -1;
247  };
248 
249  static int32_t DecodeSignedOperand(uint32_t Operand) {
250  if (Operand & 1)
251  return -(Operand >> 1);
252  return Operand >> 1;
253  };
254 
255  static int32_t DecodeSignedOperand(ArrayRef<uint8_t> &Annotations) {
256  return DecodeSignedOperand(GetCompressedAnnotation(Annotations));
257  };
258 
259  bool ParseCurrentAnnotation() {
260  if (Current.hasValue())
261  return true;
262 
263  Next = Data;
264  uint32_t Op = GetCompressedAnnotation(Next);
265  AnnotationData Result;
266  Result.OpCode = static_cast<BinaryAnnotationsOpCode>(Op);
267  switch (Result.OpCode) {
269  Result.Name = "Invalid";
270  Next = ArrayRef<uint8_t>();
271  break;
273  Result.Name = "CodeOffset";
274  Result.U1 = GetCompressedAnnotation(Next);
275  break;
277  Result.Name = "ChangeCodeOffsetBase";
278  Result.U1 = GetCompressedAnnotation(Next);
279  break;
281  Result.Name = "ChangeCodeOffset";
282  Result.U1 = GetCompressedAnnotation(Next);
283  break;
285  Result.Name = "ChangeCodeLength";
286  Result.U1 = GetCompressedAnnotation(Next);
287  break;
289  Result.Name = "ChangeFile";
290  Result.U1 = GetCompressedAnnotation(Next);
291  break;
293  Result.Name = "ChangeLineEndDelta";
294  Result.U1 = GetCompressedAnnotation(Next);
295  break;
297  Result.Name = "ChangeRangeKind";
298  Result.U1 = GetCompressedAnnotation(Next);
299  break;
301  Result.Name = "ChangeColumnStart";
302  Result.U1 = GetCompressedAnnotation(Next);
303  break;
305  Result.Name = "ChangeColumnEnd";
306  Result.U1 = GetCompressedAnnotation(Next);
307  break;
309  Result.Name = "ChangeLineOffset";
310  Result.S1 = DecodeSignedOperand(Next);
311  break;
313  Result.Name = "ChangeColumnEndDelta";
314  Result.S1 = DecodeSignedOperand(Next);
315  break;
317  Result.Name = "ChangeCodeOffsetAndLineOffset";
318  uint32_t Annotation = GetCompressedAnnotation(Next);
319  Result.S1 = DecodeSignedOperand(Annotation >> 4);
320  Result.U1 = Annotation & 0xf;
321  break;
322  }
324  Result.Name = "ChangeCodeLengthAndCodeOffset";
325  Result.U1 = GetCompressedAnnotation(Next);
326  Result.U2 = GetCompressedAnnotation(Next);
327  break;
328  }
329  }
330  Current = Result;
331  return true;
332  }
333 
334  Optional<AnnotationData> Current;
335  ArrayRef<uint8_t> Data;
336  ArrayRef<uint8_t> Next;
337 };
338 
339 // S_INLINESITE
340 class InlineSiteSym : public SymbolRecord {
341 public:
342  explicit InlineSiteSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
345  RecordOffset(RecordOffset) {}
346 
350  }
351 
355  std::vector<uint8_t> AnnotationData;
356 
358 };
359 
360 // S_PUB32
361 class PublicSym32 : public SymbolRecord {
362 public:
363  explicit PublicSym32(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
366  RecordOffset(RecordOffset) {}
367 
370  uint16_t Segment;
372 
374 };
375 
376 // S_REGISTER
377 class RegisterSym : public SymbolRecord {
378 public:
379  explicit RegisterSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
382  RecordOffset(RecordOffset) {}
383 
387 
389 };
390 
391 // S_PROCREF, S_LPROCREF
392 class ProcRefSym : public SymbolRecord {
393 public:
394  explicit ProcRefSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
396  : SymbolRecord(SymbolRecordKind::ProcRefSym), RecordOffset(RecordOffset) {
397  }
398 
401  uint16_t Module;
403 
405 };
406 
407 // S_LOCAL
408 class LocalSym : public SymbolRecord {
409 public:
410  explicit LocalSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
412  : SymbolRecord(SymbolRecordKind::LocalSym), RecordOffset(RecordOffset) {}
413 
417 
419 };
420 
423  uint16_t ISectStart;
424  uint16_t Range;
425 };
426 
428  uint16_t GapStartOffset;
429  uint16_t Range;
430 };
431 
432 enum : uint16_t { MaxDefRange = 0xf000 };
433 
434 // S_DEFRANGE
435 class DefRangeSym : public SymbolRecord {
436  static constexpr uint32_t RelocationOffset = 8;
437 
438 public:
439  explicit DefRangeSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
442  RecordOffset(RecordOffset) {}
443 
445  return RecordOffset + RelocationOffset;
446  }
447 
450  std::vector<LocalVariableAddrGap> Gaps;
451 
453 };
454 
455 // S_DEFRANGE_SUBFIELD
457  static constexpr uint32_t RelocationOffset = 12;
458 
459 public:
463  RecordOffset(RecordOffset) {}
464 
466  return RecordOffset + RelocationOffset;
467  }
468 
470  uint16_t OffsetInParent;
472  std::vector<LocalVariableAddrGap> Gaps;
473 
475 };
476 
477 // S_DEFRANGE_REGISTER
479 public:
480  struct Header {
483  };
487  RecordOffset(RecordOffset) {}
488 
489  uint32_t getRelocationOffset() const { return RecordOffset + sizeof(Header); }
490 
493  std::vector<LocalVariableAddrGap> Gaps;
494 
496 };
497 
498 // S_DEFRANGE_SUBFIELD_REGISTER
500 public:
501  struct Header {
505  };
507  : SymbolRecord(Kind) {}
510  RecordOffset(RecordOffset) {}
511 
512  uint32_t getRelocationOffset() const { return RecordOffset + sizeof(Header); }
513 
516  std::vector<LocalVariableAddrGap> Gaps;
517 
519 };
520 
521 // S_DEFRANGE_FRAMEPOINTER_REL
523  static constexpr uint32_t RelocationOffset = 8;
524 
525 public:
527  : SymbolRecord(Kind) {}
530  RecordOffset(RecordOffset) {}
531 
533  return RecordOffset + RelocationOffset;
534  }
535 
536  int32_t Offset;
538  std::vector<LocalVariableAddrGap> Gaps;
539 
541 };
542 
543 // S_DEFRANGE_REGISTER_REL
545 public:
546  struct Header {
550  };
554  RecordOffset(RecordOffset) {}
555 
556  // The flags implement this notional bitfield:
557  // uint16_t IsSubfield : 1;
558  // uint16_t Padding : 3;
559  // uint16_t OffsetInParent : 12;
560  enum : uint16_t {
563  };
564 
565  bool hasSpilledUDTMember() const { return Hdr.Flags & IsSubfieldFlag; }
566  uint16_t offsetInParent() const { return Hdr.Flags >> OffsetInParentShift; }
567 
568  uint32_t getRelocationOffset() const { return RecordOffset + sizeof(Header); }
569 
572  std::vector<LocalVariableAddrGap> Gaps;
573 
575 };
576 
577 // S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE
579 public:
581  : SymbolRecord(Kind) {}
584  RecordOffset(RecordOffset) {}
585 
586  int32_t Offset;
587 
589 };
590 
591 // S_BLOCK32
592 class BlockSym : public SymbolRecord {
593  static constexpr uint32_t RelocationOffset = 16;
594 
595 public:
596  explicit BlockSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
598  : SymbolRecord(SymbolRecordKind::BlockSym), RecordOffset(RecordOffset) {}
599 
601  return RecordOffset + RelocationOffset;
602  }
603 
608  uint16_t Segment;
610 
612 };
613 
614 // S_LABEL32
615 class LabelSym : public SymbolRecord {
616  static constexpr uint32_t RelocationOffset = 4;
617 
618 public:
619  explicit LabelSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
621  : SymbolRecord(SymbolRecordKind::LabelSym), RecordOffset(RecordOffset) {}
622 
624  return RecordOffset + RelocationOffset;
625  }
626 
628  uint16_t Segment;
631 
633 };
634 
635 // S_OBJNAME
636 class ObjNameSym : public SymbolRecord {
637 public:
638  explicit ObjNameSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
640  : SymbolRecord(SymbolRecordKind::ObjNameSym), RecordOffset(RecordOffset) {
641  }
642 
645 
647 };
648 
649 // S_ENVBLOCK
650 class EnvBlockSym : public SymbolRecord {
651 public:
652  explicit EnvBlockSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
655  RecordOffset(RecordOffset) {}
656 
657  std::vector<StringRef> Fields;
658 
660 };
661 
662 // S_EXPORT
663 class ExportSym : public SymbolRecord {
664 public:
665  explicit ExportSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
667  : SymbolRecord(SymbolRecordKind::ExportSym), RecordOffset(RecordOffset) {}
668 
669  uint16_t Ordinal;
672 
674 };
675 
676 // S_FILESTATIC
677 class FileStaticSym : public SymbolRecord {
678 public:
679  explicit FileStaticSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
682  RecordOffset(RecordOffset) {}
683 
688 
690 };
691 
692 // S_COMPILE2
693 class Compile2Sym : public SymbolRecord {
694 public:
695  explicit Compile2Sym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
698  RecordOffset(RecordOffset) {}
699 
709  std::vector<StringRef> ExtraStrings;
710 
711  uint8_t getLanguage() const { return static_cast<uint32_t>(Flags) & 0xFF; }
712  uint32_t getFlags() const { return static_cast<uint32_t>(Flags) & ~0xFF; }
713 
715 };
716 
717 // S_COMPILE3
718 class Compile3Sym : public SymbolRecord {
719 public:
720  explicit Compile3Sym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
723  RecordOffset(RecordOffset) {}
724 
736 
737  uint8_t getLanguage() const { return static_cast<uint32_t>(Flags) & 0xFF; }
738  uint32_t getFlags() const { return static_cast<uint32_t>(Flags) & ~0xFF; }
739 
741 };
742 
743 // S_FRAMEPROC
744 class FrameProcSym : public SymbolRecord {
745 public:
746  explicit FrameProcSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
749  RecordOffset(RecordOffset) {}
750 
758 
760 };
761 
762 // S_CALLSITEINFO
764  static constexpr uint32_t RelocationOffset = 4;
765 
766 public:
770 
772  return RecordOffset + RelocationOffset;
773  }
774 
776  uint16_t Segment;
778 
780 };
781 
782 // S_HEAPALLOCSITE
784  static constexpr uint32_t RelocationOffset = 4;
785 
786 public:
790  RecordOffset(RecordOffset) {}
791 
793  return RecordOffset + RelocationOffset;
794  }
795 
797  uint16_t Segment;
800 
802 };
803 
804 // S_FRAMECOOKIE
805 class FrameCookieSym : public SymbolRecord {
806  static constexpr uint32_t RelocationOffset = 4;
807 
808 public:
809  explicit FrameCookieSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
812 
814  return RecordOffset + RelocationOffset;
815  }
816 
818  uint16_t Register;
819  uint8_t CookieKind;
820  uint8_t Flags;
821 
823 };
824 
825 // S_UDT, S_COBOLUDT
826 class UDTSym : public SymbolRecord {
827 public:
828  explicit UDTSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
831 
834 
836 };
837 
838 // S_BUILDINFO
839 class BuildInfoSym : public SymbolRecord {
840 public:
841  explicit BuildInfoSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
844  RecordOffset(RecordOffset) {}
845 
847 
849 };
850 
851 // S_BPREL32
852 class BPRelativeSym : public SymbolRecord {
853 public:
854  explicit BPRelativeSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
857  RecordOffset(RecordOffset) {}
858 
859  int32_t Offset;
862 
864 };
865 
866 // S_REGREL32
867 class RegRelativeSym : public SymbolRecord {
868 public:
869  explicit RegRelativeSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
872  RecordOffset(RecordOffset) {}
873 
876  uint16_t Register;
878 
880 };
881 
882 // S_CONSTANT, S_MANCONSTANT
883 class ConstantSym : public SymbolRecord {
884 public:
885  explicit ConstantSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
888  RecordOffset(RecordOffset) {}
889 
893 
895 };
896 
897 // S_LDATA32, S_GDATA32, S_LMANDATA, S_GMANDATA
898 class DataSym : public SymbolRecord {
899  static constexpr uint32_t RelocationOffset = 8;
900 
901 public:
902  explicit DataSym(SymbolRecordKind Kind) : SymbolRecord(Kind) {}
904  : SymbolRecord(SymbolRecordKind::DataSym), RecordOffset(RecordOffset) {}
905 
907  return RecordOffset + RelocationOffset;
908  }
909 
912  uint16_t Segment;
914 
916 };
917 
918 // S_LTHREAD32, S_GTHREAD32
920  static constexpr uint32_t RelocationOffset = 8;
921 
922 public:
926  RecordOffset(RecordOffset) {}
927 
929  return RecordOffset + RelocationOffset;
930  }
931 
934  uint16_t Segment;
936 
938 };
939 
942 
943 } // end namespace codeview
944 } // end namespace llvm
945 
946 #endif // LLVM_DEBUGINFO_CODEVIEW_SYMBOLRECORD_H
DefRangeFramePointerRelSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:526
SymbolRecordKind
Distinguishes individual records in the Symbols subsection of a .debug$S section. ...
Definition: CodeView.h:35
ObjNameSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:639
Thunk32Sym(SymbolRecordKind Kind, uint32_t RecordOffset)
Definition: SymbolRecord.h:76
CompileSym3Flags
Corresponds to COMPILESYM3::Flags bitfield.
Definition: CodeView.h:422
uint32_t getRelocationOffset() const
Definition: SymbolRecord.h:53
DefRangeSubfieldRegisterSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:506
bool operator!=(BinaryAnnotationIterator Other) const
Definition: SymbolRecord.h:179
UDTSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:828
BPRelativeSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:854
const T & front() const
front - Get the first element.
Definition: ArrayRef.h:144
LocalSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:410
msf::VarStreamArray< CVSymbol > CVSymbolArray
Definition: SymbolRecord.h:941
PublicSym32(SymbolRecordKind Kind)
Definition: SymbolRecord.h:363
FrameProcedureOptions Flags
Definition: SymbolRecord.h:757
uint32_t getRelocationOffset() const
Definition: SymbolRecord.h:813
This provides a very simple, boring adaptor for a begin and end iterator into a range type...
SymbolRecordKind getKind() const
Definition: SymbolRecord.h:37
uint32_t getRelocationOffset() const
Definition: SymbolRecord.h:928
ProcRefSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:395
ScopeEndSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:144
BlockSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:597
llvm::iterator_range< BinaryAnnotationIterator > annotations() const
Definition: SymbolRecord.h:347
ConstantSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:886
RegRelativeSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:869
ConstantSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:885
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:516
EnvBlockSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:652
ArrayRef< uint8_t > VariantData
Definition: SymbolRecord.h:87
UDTSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:829
CallerSym(SymbolRecordKind Kind, uint32_t RecordOffset)
Definition: SymbolRecord.h:154
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:572
std::vector< uint8_t > AnnotationData
Definition: SymbolRecord.h:355
DefRangeRegisterSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:485
ProcRefSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:394
ThreadLocalDataSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:924
DefRangeRegisterRelSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:552
LabelSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:619
bool operator==(BinaryAnnotationIterator Other) const
Definition: SymbolRecord.h:175
EnvBlockSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:653
std::vector< StringRef > ExtraStrings
Definition: SymbolRecord.h:709
BinaryAnnotationIterator(const BinaryAnnotationIterator &Other)
Definition: SymbolRecord.h:172
A 32-bit type reference.
Definition: TypeIndex.h:89
uint32_t getRelocationOffset() const
Definition: SymbolRecord.h:600
CallSiteInfoSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:767
uint32_t getRelocationOffset() const
Definition: SymbolRecord.h:623
RegisterSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:379
InlineSiteSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:343
uint32_t getRelocationOffset() const
Definition: SymbolRecord.h:906
BinaryAnnotationIterator(ArrayRef< uint8_t > Annotations)
Definition: SymbolRecord.h:170
BlockSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:596
FrameCookieSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:809
DataSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:903
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:493
ExportSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:666
FrameProcSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:746
RegRelativeSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:870
HeapAllocationSiteSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:788
std::vector< StringRef > Fields
Definition: SymbolRecord.h:657
LocalVariableAddrRange Range
Definition: SymbolRecord.h:449
uint32_t getRelocationOffset() const
Definition: SymbolRecord.h:771
BPRelativeSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:855
DefRangeSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:440
DefRangeRegisterSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:484
BinaryAnnotationIterator operator++(int)
Definition: SymbolRecord.h:199
DataSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:902
CVRecord< SymbolKind > CVSymbol
Definition: SymbolRecord.h:940
SectionSym(SymbolRecordKind Kind, uint32_t RecordOffset)
Definition: SymbolRecord.h:113
std::vector< TypeIndex > Indices
Definition: SymbolRecord.h:157
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:136
const AnnotationData & operator*()
Definition: SymbolRecord.h:205
LocalVariableAddrRange Range
Definition: SymbolRecord.h:492
ProcSym(SymbolRecordKind Kind, uint32_t RecordOffset)
Definition: SymbolRecord.h:50
DefRangeSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:439
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:450
BinaryAnnotationIterator & operator=(const BinaryAnnotationIterator Other)
Definition: SymbolRecord.h:183
PublicSym32(uint32_t RecordOffset)
Definition: SymbolRecord.h:364
BinaryAnnotationIterator & operator++()
Definition: SymbolRecord.h:188
LocalVariableAddrRange Range
Definition: SymbolRecord.h:471
ThreadLocalDataSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:923
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
uint32_t getFlags() const
Definition: SymbolRecord.h:738
detail::packed_endian_specific_integral< int32_t, little, unaligned > little32_t
Definition: Endian.h:242
CPUType
These values correspond to the CV_CPU_TYPE_e enumeration, and are documented here: https://msdn...
Definition: CodeView.h:73
uint8_t getLanguage() const
Definition: SymbolRecord.h:711
TrampolineSym(SymbolRecordKind Kind, uint32_t RecordOffset)
Definition: SymbolRecord.h:96
Compile3Sym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:720
uint8_t getLanguage() const
Definition: SymbolRecord.h:737
FrameProcSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:747
A range adaptor for a pair of iterators.
detail::packed_endian_specific_integral< uint16_t, little, unaligned > ulittle16_t
Definition: Endian.h:233
Thunk32Sym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:75
FrameCookieSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:810
ScopeEndSym(SymbolRecordKind Kind, uint32_t RecordOffset)
Definition: SymbolRecord.h:145
CoffGroupSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:129
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:538
DefRangeFramePointerRelSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:528
LabelSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:620
HeapAllocationSiteSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:787
InlineSiteSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:342
SectionSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:112
CallerSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:153
LocalSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:411
FileStaticSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:679
ThunkOrdinal
These values correspond to the THUNK_ORDINAL enumeration.
Definition: CodeView.h:528
RegisterSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:380
uint32_t getFlags() const
Definition: SymbolRecord.h:712
CoffGroupSym(SymbolRecordKind Kind, uint32_t RecordOffset)
Definition: SymbolRecord.h:130
TrampolineSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:95
detail::packed_endian_specific_integral< uint32_t, little, unaligned > ulittle32_t
Definition: Endian.h:235
std::vector< LocalVariableAddrGap > Gaps
Definition: SymbolRecord.h:472
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition: ArrayRef.h:180
Compile3Sym(uint32_t RecordOffset)
Definition: SymbolRecord.h:721
BuildInfoSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:841
DefRangeRegisterRelSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:551
BuildInfoSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:842
CallSiteInfoSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:768
ObjNameSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:638
uint32_t getRelocationOffset() const
Definition: SymbolRecord.h:444
ProcSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:49
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:47
ProcSymFlags
Corresponds to the CV_PROCFLAGS bitfield.
Definition: CodeView.h:394
LocalSymFlags
Corresponds to CV_LVARFLAGS bitfield.
Definition: CodeView.h:377
Compile2Sym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:695
DefRangeSubfieldRegisterSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:508
FileStaticSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:680
DefRangeSubfieldSym(uint32_t RecordOffset)
Definition: SymbolRecord.h:461
CompileSym2Flags
Corresponds to COMPILESYM2::Flags bitfield.
Definition: CodeView.h:408
ExportSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:665
DefRangeSubfieldSym(SymbolRecordKind Kind)
Definition: SymbolRecord.h:460
SymbolRecord(SymbolRecordKind Kind)
Definition: SymbolRecord.h:34
Compile2Sym(uint32_t RecordOffset)
Definition: SymbolRecord.h:696