LLVM  8.0.1
TypeIndex.cpp
Go to the documentation of this file.
1 //===-- TypeIndex.cpp - CodeView type index ---------------------*- 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 
11 
14 
15 using namespace llvm;
16 using namespace llvm::codeview;
17 
18 namespace {
19 struct SimpleTypeEntry {
22 };
23 
24 /// The names here all end in "*". If the simple type is a pointer type, we
25 /// return the whole name. Otherwise we lop off the last character in our
26 /// StringRef.
27 static const SimpleTypeEntry SimpleTypeNames[] = {
28  {"void*", SimpleTypeKind::Void},
29  {"<not translated>*", SimpleTypeKind::NotTranslated},
30  {"HRESULT*", SimpleTypeKind::HResult},
31  {"signed char*", SimpleTypeKind::SignedCharacter},
32  {"unsigned char*", SimpleTypeKind::UnsignedCharacter},
34  {"wchar_t*", SimpleTypeKind::WideCharacter},
35  {"char16_t*", SimpleTypeKind::Character16},
36  {"char32_t*", SimpleTypeKind::Character32},
37  {"__int8*", SimpleTypeKind::SByte},
38  {"unsigned __int8*", SimpleTypeKind::Byte},
39  {"short*", SimpleTypeKind::Int16Short},
40  {"unsigned short*", SimpleTypeKind::UInt16Short},
41  {"__int16*", SimpleTypeKind::Int16},
42  {"unsigned __int16*", SimpleTypeKind::UInt16},
43  {"long*", SimpleTypeKind::Int32Long},
44  {"unsigned long*", SimpleTypeKind::UInt32Long},
45  {"int*", SimpleTypeKind::Int32},
46  {"unsigned*", SimpleTypeKind::UInt32},
47  {"__int64*", SimpleTypeKind::Int64Quad},
48  {"unsigned __int64*", SimpleTypeKind::UInt64Quad},
49  {"__int64*", SimpleTypeKind::Int64},
50  {"unsigned __int64*", SimpleTypeKind::UInt64},
51  {"__int128*", SimpleTypeKind::Int128},
52  {"unsigned __int128*", SimpleTypeKind::UInt128},
53  {"__half*", SimpleTypeKind::Float16},
54  {"float*", SimpleTypeKind::Float32},
56  {"__float48*", SimpleTypeKind::Float48},
57  {"double*", SimpleTypeKind::Float64},
58  {"long double*", SimpleTypeKind::Float80},
59  {"__float128*", SimpleTypeKind::Float128},
60  {"_Complex float*", SimpleTypeKind::Complex32},
61  {"_Complex double*", SimpleTypeKind::Complex64},
62  {"_Complex long double*", SimpleTypeKind::Complex80},
63  {"_Complex __float128*", SimpleTypeKind::Complex128},
64  {"bool*", SimpleTypeKind::Boolean8},
65  {"__bool16*", SimpleTypeKind::Boolean16},
66  {"__bool32*", SimpleTypeKind::Boolean32},
67  {"__bool64*", SimpleTypeKind::Boolean64},
68 };
69 } // namespace
70 
72  assert(TI.isNoneType() || TI.isSimple());
73 
74  if (TI.isNoneType())
75  return "<no type>";
76 
77  if (TI == TypeIndex::NullptrT())
78  return "std::nullptr_t";
79 
80  // This is a simple type.
81  for (const auto &SimpleTypeName : SimpleTypeNames) {
82  if (SimpleTypeName.Kind == TI.getSimpleKind()) {
84  return SimpleTypeName.Name.drop_back(1);
85  // Otherwise, this is a pointer type. We gloss over the distinction
86  // between near, far, 64, 32, etc, and just give a pointer type.
87  return SimpleTypeName.Name;
88  }
89  }
90  return "<unknown simple type>";
91 }
92 
94  TypeIndex TI, TypeCollection &Types) {
96  if (!TI.isNoneType()) {
97  if (TI.isSimple())
98  TypeName = TypeIndex::simpleTypeName(TI);
99  else
100  TypeName = Types.getTypeName(TI);
101  }
102 
103  if (!TypeName.empty())
104  Printer.printHex(FieldName, TypeName, TI.getIndex());
105  else
106  Printer.printHex(FieldName, TI.getIndex());
107 }
This class represents lattice values for constants.
Definition: AllocatorList.h:24
SimpleTypeKind getSimpleKind() const
Definition: TypeIndex.h:127
print alias Alias Set Printer
SimpleTypeMode getSimpleMode() const
Definition: TypeIndex.h:132
amdgpu Simplify well known AMD library false Value Value const Twine & Name
bool isNoneType() const
Definition: TypeIndex.h:116
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:133
A 32-bit type reference.
Definition: TypeIndex.h:96
void printTypeIndex(ScopedPrinter &Printer, StringRef FieldName, TypeIndex TI, TypeCollection &Types)
Definition: TypeIndex.cpp:93
static StringRef simpleTypeName(TypeIndex TI)
Definition: TypeIndex.cpp:71
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
void printHex(StringRef Label, T Value)
uint32_t getIndex() const
Definition: TypeIndex.h:111
virtual StringRef getTypeName(TypeIndex Index)=0
const unsigned Kind
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
static TypeIndex NullptrT()
Definition: TypeIndex.h:148