LLVM  13.0.0git
TypeIndex.h
Go to the documentation of this file.
1 //===- TypeIndex.h ----------------------------------------------*- 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 
9 #ifndef LLVM_DEBUGINFO_CODEVIEW_TYPEINDEX_H
10 #define LLVM_DEBUGINFO_CODEVIEW_TYPEINDEX_H
11 
12 #include "llvm/ADT/DenseMapInfo.h"
13 #include "llvm/Support/Endian.h"
14 #include <cassert>
15 #include <cinttypes>
16 #include <functional>
17 
18 namespace llvm {
19 
20 class ScopedPrinter;
21 
22 namespace codeview {
23 
24 class TypeCollection;
25 
26 enum class SimpleTypeKind : uint32_t {
27  None = 0x0000, // uncharacterized type (no type)
28  Void = 0x0003, // void
29  NotTranslated = 0x0007, // type not translated by cvpack
30  HResult = 0x0008, // OLE/COM HRESULT
31 
32  SignedCharacter = 0x0010, // 8 bit signed
33  UnsignedCharacter = 0x0020, // 8 bit unsigned
34  NarrowCharacter = 0x0070, // really a char
35  WideCharacter = 0x0071, // wide char
36  Character16 = 0x007a, // char16_t
37  Character32 = 0x007b, // char32_t
38 
39  SByte = 0x0068, // 8 bit signed int
40  Byte = 0x0069, // 8 bit unsigned int
41  Int16Short = 0x0011, // 16 bit signed
42  UInt16Short = 0x0021, // 16 bit unsigned
43  Int16 = 0x0072, // 16 bit signed int
44  UInt16 = 0x0073, // 16 bit unsigned int
45  Int32Long = 0x0012, // 32 bit signed
46  UInt32Long = 0x0022, // 32 bit unsigned
47  Int32 = 0x0074, // 32 bit signed int
48  UInt32 = 0x0075, // 32 bit unsigned int
49  Int64Quad = 0x0013, // 64 bit signed
50  UInt64Quad = 0x0023, // 64 bit unsigned
51  Int64 = 0x0076, // 64 bit signed int
52  UInt64 = 0x0077, // 64 bit unsigned int
53  Int128Oct = 0x0014, // 128 bit signed int
54  UInt128Oct = 0x0024, // 128 bit unsigned int
55  Int128 = 0x0078, // 128 bit signed int
56  UInt128 = 0x0079, // 128 bit unsigned int
57 
58  Float16 = 0x0046, // 16 bit real
59  Float32 = 0x0040, // 32 bit real
60  Float32PartialPrecision = 0x0045, // 32 bit PP real
61  Float48 = 0x0044, // 48 bit real
62  Float64 = 0x0041, // 64 bit real
63  Float80 = 0x0042, // 80 bit real
64  Float128 = 0x0043, // 128 bit real
65 
66  Complex16 = 0x0056, // 16 bit complex
67  Complex32 = 0x0050, // 32 bit complex
68  Complex32PartialPrecision = 0x0055, // 32 bit PP complex
69  Complex48 = 0x0054, // 48 bit complex
70  Complex64 = 0x0051, // 64 bit complex
71  Complex80 = 0x0052, // 80 bit complex
72  Complex128 = 0x0053, // 128 bit complex
73 
74  Boolean8 = 0x0030, // 8 bit boolean
75  Boolean16 = 0x0031, // 16 bit boolean
76  Boolean32 = 0x0032, // 32 bit boolean
77  Boolean64 = 0x0033, // 64 bit boolean
78  Boolean128 = 0x0034, // 128 bit boolean
79 };
80 
81 enum class SimpleTypeMode : uint32_t {
82  Direct = 0x00000000, // Not a pointer
83  NearPointer = 0x00000100, // Near pointer
84  FarPointer = 0x00000200, // Far pointer
85  HugePointer = 0x00000300, // Huge pointer
86  NearPointer32 = 0x00000400, // 32 bit near pointer
87  FarPointer32 = 0x00000500, // 32 bit far pointer
88  NearPointer64 = 0x00000600, // 64 bit near pointer
89  NearPointer128 = 0x00000700 // 128 bit near pointer
90 };
91 
92 /// A 32-bit type reference. Types are indexed by their order of appearance in
93 /// .debug$T plus 0x1000. Type indices less than 0x1000 are "simple" types,
94 /// composed of a SimpleTypeMode byte followed by a SimpleTypeKind byte.
95 class TypeIndex {
96 public:
97  static const uint32_t FirstNonSimpleIndex = 0x1000;
98  static const uint32_t SimpleKindMask = 0x000000ff;
99  static const uint32_t SimpleModeMask = 0x00000700;
100  static const uint32_t DecoratedItemIdMask = 0x80000000;
101 
102 public:
103  TypeIndex() : Index(static_cast<uint32_t>(SimpleTypeKind::None)) {}
104  explicit TypeIndex(uint32_t Index) : Index(Index) {}
106  : Index(static_cast<uint32_t>(Kind)) {}
108  : Index(static_cast<uint32_t>(Kind) | static_cast<uint32_t>(Mode)) {}
109 
110  uint32_t getIndex() const { return Index; }
111  void setIndex(uint32_t I) { Index = I; }
112  bool isSimple() const { return Index < FirstNonSimpleIndex; }
113  bool isDecoratedItemId() const { return !!(Index & DecoratedItemIdMask); }
114 
115  bool isNoneType() const { return *this == None(); }
116 
118  assert(!isSimple());
120  }
121 
123  return TypeIndex(Index + FirstNonSimpleIndex);
124  }
125 
126  static TypeIndex fromDecoratedArrayIndex(bool IsItem, uint32_t Index) {
127  return TypeIndex((Index + FirstNonSimpleIndex) |
128  (IsItem ? DecoratedItemIdMask : 0));
129  }
130 
132  return TypeIndex(Index & ~DecoratedItemIdMask);
133  }
134 
136  assert(isSimple());
137  return static_cast<SimpleTypeKind>(Index & SimpleKindMask);
138  }
139 
141  assert(isSimple());
142  return static_cast<SimpleTypeMode>(Index & SimpleModeMask);
143  }
144 
146 
151  }
154  }
155 
156  static TypeIndex NullptrT() {
157  // std::nullptr_t uses the pointer mode that doesn't indicate bit-width,
158  // presumably because std::nullptr_t is intended to be compatible with any
159  // pointer type.
161  }
162 
165  }
168  }
171  }
174  }
177  }
180  }
186  }
192  }
193 
196 
197  TypeIndex &operator+=(unsigned N) {
198  Index += N;
199  return *this;
200  }
201 
203  Index += 1;
204  return *this;
205  }
206 
208  TypeIndex Copy = *this;
209  operator++();
210  return Copy;
211  }
212 
213  TypeIndex &operator-=(unsigned N) {
214  assert(Index >= N);
215  Index -= N;
216  return *this;
217  }
218 
220  Index -= 1;
221  return *this;
222  }
223 
225  TypeIndex Copy = *this;
226  operator--();
227  return Copy;
228  }
229 
230  friend inline bool operator==(const TypeIndex &A, const TypeIndex &B) {
231  return A.getIndex() == B.getIndex();
232  }
233 
234  friend inline bool operator!=(const TypeIndex &A, const TypeIndex &B) {
235  return A.getIndex() != B.getIndex();
236  }
237 
238  friend inline bool operator<(const TypeIndex &A, const TypeIndex &B) {
239  return A.getIndex() < B.getIndex();
240  }
241 
242  friend inline bool operator<=(const TypeIndex &A, const TypeIndex &B) {
243  return A.getIndex() <= B.getIndex();
244  }
245 
246  friend inline bool operator>(const TypeIndex &A, const TypeIndex &B) {
247  return A.getIndex() > B.getIndex();
248  }
249 
250  friend inline bool operator>=(const TypeIndex &A, const TypeIndex &B) {
251  return A.getIndex() >= B.getIndex();
252  }
253 
254  friend inline TypeIndex operator+(const TypeIndex &A, uint32_t N) {
255  TypeIndex Result(A);
256  Result += N;
257  return Result;
258  }
259 
260  friend inline TypeIndex operator-(const TypeIndex &A, uint32_t N) {
261  assert(A.getIndex() >= N);
262  TypeIndex Result(A);
263  Result -= N;
264  return Result;
265  }
266 
267  friend inline uint32_t operator-(const TypeIndex &A, const TypeIndex &B) {
268  assert(A >= B);
269  return A.toArrayIndex() - B.toArrayIndex();
270  }
271 
273 
274 private:
275  support::ulittle32_t Index;
276 };
277 
278 // Used for pseudo-indexing an array of type records. An array of such records
279 // sorted by TypeIndex can allow log(N) lookups even though such a type record
280 // stream does not provide random access.
284 };
285 
287  TypeCollection &Types);
288 }
289 
290 template <> struct DenseMapInfo<codeview::TypeIndex> {
293  }
296  }
297  static unsigned getHashValue(const codeview::TypeIndex &TI) {
299  }
300  static bool isEqual(const codeview::TypeIndex &LHS,
301  const codeview::TypeIndex &RHS) {
302  return LHS == RHS;
303  }
304 };
305 
306 } // namespace llvm
307 
308 #endif
llvm::codeview::SimpleTypeKind::Byte
@ Byte
llvm::codeview::TypeIndex::isNoneType
bool isNoneType() const
Definition: TypeIndex.h:115
llvm::codeview::SimpleTypeMode::NearPointer32
@ NearPointer32
llvm::codeview::SimpleTypeKind::Complex128
@ Complex128
llvm
Definition: AllocatorList.h:23
llvm::codeview::TypeIndex::SimpleModeMask
static const uint32_t SimpleModeMask
Definition: TypeIndex.h:99
llvm::codeview::SimpleTypeKind::Int32
@ Int32
llvm::codeview::TypeIndex::SignedCharacter
static TypeIndex SignedCharacter()
Definition: TypeIndex.h:163
llvm::codeview::SimpleTypeKind::Complex48
@ Complex48
llvm::support::detail::packed_endian_specific_integral
Definition: Endian.h:206
llvm::codeview::TypeIndex::setIndex
void setIndex(uint32_t I)
Definition: TypeIndex.h:111
llvm::codeview::TypeIndex::FirstNonSimpleIndex
static const uint32_t FirstNonSimpleIndex
Definition: TypeIndex.h:97
llvm::codeview::TypeIndex::operator-=
TypeIndex & operator-=(unsigned N)
Definition: TypeIndex.h:213
llvm::codeview::TypeIndex::operator+=
TypeIndex & operator+=(unsigned N)
Definition: TypeIndex.h:197
llvm::codeview::SimpleTypeKind::Int64Quad
@ Int64Quad
llvm::codeview::TypeIndex::fromArrayIndex
static TypeIndex fromArrayIndex(uint32_t Index)
Definition: TypeIndex.h:122
llvm::codeview::SimpleTypeKind::UInt64Quad
@ UInt64Quad
llvm::codeview::TypeIndex::TypeIndex
TypeIndex(SimpleTypeKind Kind, SimpleTypeMode Mode)
Definition: TypeIndex.h:107
llvm::codeview::SimpleTypeKind
SimpleTypeKind
Definition: TypeIndex.h:26
llvm::codeview::SimpleTypeKind::Complex64
@ Complex64
llvm::codeview::SimpleTypeKind::Float32PartialPrecision
@ Float32PartialPrecision
llvm::codeview::SimpleTypeKind::Complex80
@ Complex80
llvm::codeview::TypeIndex::DecoratedItemIdMask
static const uint32_t DecoratedItemIdMask
Definition: TypeIndex.h:100
llvm::codeview::SimpleTypeKind::Float80
@ Float80
llvm::codeview::SimpleTypeKind::NarrowCharacter
@ NarrowCharacter
llvm::codeview::TypeIndex::Int16Short
static TypeIndex Int16Short()
Definition: TypeIndex.h:175
llvm::codeview::SimpleTypeKind::Boolean8
@ Boolean8
llvm::codeview::TypeIndex::None
static TypeIndex None()
Definition: TypeIndex.h:147
llvm::codeview::SimpleTypeKind::None
@ None
llvm::codeview::TypeIndex::Int32Long
static TypeIndex Int32Long()
Definition: TypeIndex.h:183
llvm::codeview::SimpleTypeMode::NearPointer
@ NearPointer
llvm::DenseMapInfo< codeview::TypeIndex >::isEqual
static bool isEqual(const codeview::TypeIndex &LHS, const codeview::TypeIndex &RHS)
Definition: TypeIndex.h:300
llvm::codeview::SimpleTypeKind::Boolean128
@ Boolean128
llvm::codeview::TypeIndex::UnsignedCharacter
static TypeIndex UnsignedCharacter()
Definition: TypeIndex.h:166
llvm::codeview::SimpleTypeMode::Direct
@ Direct
llvm::DenseMapInfo< codeview::TypeIndex >::getHashValue
static unsigned getHashValue(const codeview::TypeIndex &TI)
Definition: TypeIndex.h:297
llvm::DenseMapInfo< codeview::TypeIndex >::getEmptyKey
static codeview::TypeIndex getEmptyKey()
Definition: TypeIndex.h:291
Printer
print alias Alias Set Printer
Definition: AliasSetTracker.cpp:762
llvm::codeview::printTypeIndex
void printTypeIndex(ScopedPrinter &Printer, StringRef FieldName, TypeIndex TI, TypeCollection &Types)
Definition: TypeIndex.cpp:92
llvm::codeview::TypeIndex::operator-
friend uint32_t operator-(const TypeIndex &A, const TypeIndex &B)
Definition: TypeIndex.h:267
llvm::codeview::TypeIndex::UInt32
static TypeIndex UInt32()
Definition: TypeIndex.h:182
llvm::DenseMapInfo
Definition: APInt.h:34
llvm::codeview::SimpleTypeKind::Boolean32
@ Boolean32
llvm::codeview::TypeIndex::UInt16Short
static TypeIndex UInt16Short()
Definition: TypeIndex.h:178
llvm::codeview::TypeIndex::NullptrT
static TypeIndex NullptrT()
Definition: TypeIndex.h:156
llvm::codeview::SimpleTypeKind::Boolean16
@ Boolean16
llvm::codeview::SimpleTypeKind::Int16Short
@ Int16Short
llvm::codeview::TypeIndex::makeDirect
TypeIndex makeDirect() const
Definition: TypeIndex.h:145
llvm::codeview::TypeIndex::operator>=
friend bool operator>=(const TypeIndex &A, const TypeIndex &B)
Definition: TypeIndex.h:250
llvm::codeview::SimpleTypeKind::Int128
@ Int128
llvm::codeview::TypeCollection
Definition: TypeCollection.h:18
llvm::codeview::TypeIndex::Void
static TypeIndex Void()
Definition: TypeIndex.h:148
B
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
llvm::codeview::SimpleTypeKind::Complex32
@ Complex32
llvm::codeview::SimpleTypeKind::UInt32Long
@ UInt32Long
llvm::codeview::TypeIndex::Int64
static TypeIndex Int64()
Definition: TypeIndex.h:187
llvm::lltok::Kind
Kind
Definition: LLToken.h:18
llvm::codeview::TypeIndex::removeDecoration
TypeIndex removeDecoration()
Definition: TypeIndex.h:131
llvm::DenseMapInfo< codeview::TypeIndex >::getTombstoneKey
static codeview::TypeIndex getTombstoneKey()
Definition: TypeIndex.h:294
llvm::codeview::TypeIndexOffset::Offset
support::ulittle32_t Offset
Definition: TypeIndex.h:283
llvm::codeview::TypeIndex::UInt64Quad
static TypeIndex UInt64Quad()
Definition: TypeIndex.h:190
llvm::codeview::TypeIndex::getSimpleKind
SimpleTypeKind getSimpleKind() const
Definition: TypeIndex.h:135
llvm::codeview::SimpleTypeKind::UInt16Short
@ UInt16Short
llvm::codeview::TypeIndex::operator!=
friend bool operator!=(const TypeIndex &A, const TypeIndex &B)
Definition: TypeIndex.h:234
llvm::codeview::TypeIndex::operator==
friend bool operator==(const TypeIndex &A, const TypeIndex &B)
Definition: TypeIndex.h:230
llvm::codeview::TypeIndex::NarrowCharacter
static TypeIndex NarrowCharacter()
Definition: TypeIndex.h:169
llvm::codeview::SimpleTypeKind::Float128
@ Float128
llvm::codeview::TypeIndex::Float32
static TypeIndex Float32()
Definition: TypeIndex.h:194
llvm::codeview::TypeIndex::operator++
TypeIndex operator++(int)
Definition: TypeIndex.h:207
llvm::codeview::FrameCookieKind::Copy
@ Copy
llvm::codeview::TypeIndex::UInt32Long
static TypeIndex UInt32Long()
Definition: TypeIndex.h:184
llvm::codeview::SimpleTypeKind::Float64
@ Float64
I
#define I(x, y, z)
Definition: MD5.cpp:59
llvm::codeview::SimpleTypeMode
SimpleTypeMode
Definition: TypeIndex.h:81
llvm::codeview::SimpleTypeKind::Void
@ Void
llvm::codeview::SimpleTypeMode::HugePointer
@ HugePointer
llvm::codeview::TypeIndex::operator--
TypeIndex & operator--()
Definition: TypeIndex.h:219
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::codeview::SimpleTypeKind::Int128Oct
@ Int128Oct
llvm::codeview::TypeIndex::TypeIndex
TypeIndex(SimpleTypeKind Kind)
Definition: TypeIndex.h:105
llvm::codeview::TypeIndex::SimpleKindMask
static const uint32_t SimpleKindMask
Definition: TypeIndex.h:98
Mode
SI Whole Quad Mode
Definition: SIWholeQuadMode.cpp:262
llvm::codeview::TypeIndex::isDecoratedItemId
bool isDecoratedItemId() const
Definition: TypeIndex.h:113
llvm::codeview::SimpleTypeKind::Boolean64
@ Boolean64
llvm::codeview::TypeIndex::operator<
friend bool operator<(const TypeIndex &A, const TypeIndex &B)
Definition: TypeIndex.h:238
llvm::codeview::TypeIndexOffset::Type
TypeIndex Type
Definition: TypeIndex.h:282
llvm::codeview::SimpleTypeKind::Int16
@ Int16
llvm::codeview::TypeIndex::Int32
static TypeIndex Int32()
Definition: TypeIndex.h:181
llvm::codeview::TypeIndex::simpleTypeName
static StringRef simpleTypeName(TypeIndex TI)
Definition: TypeIndex.cpp:70
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:58
llvm::codeview::TypeIndex::toArrayIndex
uint32_t toArrayIndex() const
Definition: TypeIndex.h:117
uint32_t
llvm::codeview::TypeIndex::getSimpleMode
SimpleTypeMode getSimpleMode() const
Definition: TypeIndex.h:140
llvm::codeview::SimpleTypeKind::Int32Long
@ Int32Long
llvm::codeview::SimpleTypeKind::Complex32PartialPrecision
@ Complex32PartialPrecision
llvm::codeview::SimpleTypeMode::FarPointer
@ FarPointer
llvm::codeview::SimpleTypeKind::Float16
@ Float16
llvm::codeview::TypeIndex::operator--
TypeIndex operator--(int)
Definition: TypeIndex.h:224
llvm::codeview::SimpleTypeKind::Float32
@ Float32
llvm::codeview::TypeIndex::operator+
friend TypeIndex operator+(const TypeIndex &A, uint32_t N)
Definition: TypeIndex.h:254
llvm::codeview::SimpleTypeMode::NearPointer64
@ NearPointer64
llvm::codeview::TypeIndex::operator++
TypeIndex & operator++()
Definition: TypeIndex.h:202
llvm::codeview::TypeIndex::VoidPointer32
static TypeIndex VoidPointer32()
Definition: TypeIndex.h:149
llvm::codeview::TypeIndex::operator>
friend bool operator>(const TypeIndex &A, const TypeIndex &B)
Definition: TypeIndex.h:246
llvm::codeview::TypeIndex::TypeIndex
TypeIndex(uint32_t Index)
Definition: TypeIndex.h:104
llvm::codeview::SimpleTypeKind::UInt128Oct
@ UInt128Oct
llvm::ScopedPrinter
Definition: ScopedPrinter.h:69
llvm::codeview::SimpleTypeKind::Character32
@ Character32
llvm::codeview::TypeIndex::Int64Quad
static TypeIndex Int64Quad()
Definition: TypeIndex.h:189
llvm::codeview::SimpleTypeKind::SByte
@ SByte
llvm::codeview::TypeIndex::getIndex
uint32_t getIndex() const
Definition: TypeIndex.h:110
llvm::codeview::SimpleTypeKind::WideCharacter
@ WideCharacter
llvm::codeview::SimpleTypeKind::UInt16
@ UInt16
llvm::codeview::SimpleTypeKind::UnsignedCharacter
@ UnsignedCharacter
llvm::codeview::TypeIndex::isSimple
bool isSimple() const
Definition: TypeIndex.h:112
llvm::codeview::SimpleTypeKind::Complex16
@ Complex16
llvm::codeview::TypeIndex::TypeIndex
TypeIndex()
Definition: TypeIndex.h:103
llvm::codeview::SimpleTypeKind::Float48
@ Float48
N
#define N
llvm::codeview::SimpleTypeKind::Int64
@ Int64
llvm::codeview::TypeIndex::VoidPointer64
static TypeIndex VoidPointer64()
Definition: TypeIndex.h:152
llvm::codeview::SimpleTypeKind::UInt32
@ UInt32
llvm::codeview::SimpleTypeKind::HResult
@ HResult
llvm::codeview::TypeIndex::Float64
static TypeIndex Float64()
Definition: TypeIndex.h:195
llvm::codeview::SimpleTypeMode::FarPointer32
@ FarPointer32
DenseMapInfo.h
llvm::codeview::TypeIndex
A 32-bit type reference.
Definition: TypeIndex.h:95
llvm::codeview::SimpleTypeKind::UInt128
@ UInt128
llvm::codeview::SimpleTypeKind::NotTranslated
@ NotTranslated
llvm::codeview::TypeIndex::operator<=
friend bool operator<=(const TypeIndex &A, const TypeIndex &B)
Definition: TypeIndex.h:242
llvm::codeview::TypeIndexOffset
Definition: TypeIndex.h:281
llvm::codeview::TypeIndex::UInt64
static TypeIndex UInt64()
Definition: TypeIndex.h:188
llvm::codeview::SimpleTypeKind::Character16
@ Character16
Endian.h
llvm::codeview::TypeIndex::fromDecoratedArrayIndex
static TypeIndex fromDecoratedArrayIndex(bool IsItem, uint32_t Index)
Definition: TypeIndex.h:126
llvm::codeview::SimpleTypeKind::SignedCharacter
@ SignedCharacter
llvm::codeview::SimpleTypeMode::NearPointer128
@ NearPointer128
llvm::codeview::SimpleTypeKind::UInt64
@ UInt64
llvm::codeview::TypeIndex::operator-
friend TypeIndex operator-(const TypeIndex &A, uint32_t N)
Definition: TypeIndex.h:260
llvm::codeview::TypeIndex::WideCharacter
static TypeIndex WideCharacter()
Definition: TypeIndex.h:172