LLVM  8.0.1
NativeTypeUDT.cpp
Go to the documentation of this file.
1 //===- NativeTypeUDT.cpp - info about class/struct type ---------*- 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 
13 
14 #include <cassert>
15 
16 using namespace llvm;
17 using namespace llvm::codeview;
18 using namespace llvm::pdb;
19 
20 NativeTypeUDT::NativeTypeUDT(NativeSession &Session, SymIndexId Id,
22  : NativeRawSymbol(Session, PDB_SymType::UDT, Id), Index(TI),
23  Class(std::move(CR)), Tag(Class.getPointer()) {}
24 
27  : NativeRawSymbol(Session, PDB_SymType::UDT, Id), Index(TI),
28  Union(std::move(UR)), Tag(Union.getPointer()) {}
29 
32  codeview::ModifierRecord Modifier)
33  : NativeRawSymbol(Session, PDB_SymType::UDT, Id),
34  UnmodifiedType(&UnmodifiedType), Modifiers(std::move(Modifier)) {}
35 
37 
39  PdbSymbolIdField ShowIdFields,
40  PdbSymbolIdField RecurseIdFields) const {
41 
42  NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields);
43 
44  dumpSymbolField(OS, "name", getName(), Indent);
45  dumpSymbolIdField(OS, "lexicalParentId", 0, Indent, Session,
46  PdbSymbolIdField::LexicalParent, ShowIdFields,
47  RecurseIdFields);
48  if (Modifiers.hasValue())
49  dumpSymbolIdField(OS, "unmodifiedTypeId", getUnmodifiedTypeId(), Indent,
51  RecurseIdFields);
53  dumpSymbolField(OS, "virtualTableShapeId", getVirtualTableShapeId(),
54  Indent);
55  dumpSymbolField(OS, "length", getLength(), Indent);
56  dumpSymbolField(OS, "udtKind", getUdtKind(), Indent);
57  dumpSymbolField(OS, "constructor", hasConstructor(), Indent);
58  dumpSymbolField(OS, "constType", isConstType(), Indent);
59  dumpSymbolField(OS, "hasAssignmentOperator", hasAssignmentOperator(), Indent);
60  dumpSymbolField(OS, "hasCastOperator", hasCastOperator(), Indent);
61  dumpSymbolField(OS, "hasNestedTypes", hasNestedTypes(), Indent);
62  dumpSymbolField(OS, "overloadedOperator", hasOverloadedOperator(), Indent);
63  dumpSymbolField(OS, "isInterfaceUdt", isInterfaceUdt(), Indent);
64  dumpSymbolField(OS, "intrinsic", isIntrinsic(), Indent);
65  dumpSymbolField(OS, "nested", isNested(), Indent);
66  dumpSymbolField(OS, "packed", isPacked(), Indent);
67  dumpSymbolField(OS, "isRefUdt", isRefUdt(), Indent);
68  dumpSymbolField(OS, "scoped", isScoped(), Indent);
69  dumpSymbolField(OS, "unalignedType", isUnalignedType(), Indent);
70  dumpSymbolField(OS, "isValueUdt", isValueUdt(), Indent);
71  dumpSymbolField(OS, "volatileType", isVolatileType(), Indent);
72 }
73 
74 std::string NativeTypeUDT::getName() const {
75  if (UnmodifiedType)
76  return UnmodifiedType->getName();
77 
78  return Tag->getName();
79 }
80 
82 
84  if (UnmodifiedType)
85  return UnmodifiedType->getSymIndexId();
86 
87  return 0;
88 }
89 
91  if (UnmodifiedType)
93 
94  if (Class)
95  return Session.getSymbolCache().findSymbolByTypeIndex(Class->VTableShape);
96 
97  return 0;
98 }
99 
100 uint64_t NativeTypeUDT::getLength() const {
101  if (UnmodifiedType)
102  return UnmodifiedType->getLength();
103 
104  if (Class)
105  return Class->getSize();
106 
107  return Union->getSize();
108 }
109 
111  if (UnmodifiedType)
112  return UnmodifiedType->getUdtKind();
113 
114  switch (Tag->Kind) {
116  return PDB_UdtType::Class;
118  return PDB_UdtType::Union;
120  return PDB_UdtType::Struct;
122  return PDB_UdtType::Interface;
123  default:
124  llvm_unreachable("Unexected udt kind");
125  }
126 }
127 
129  if (UnmodifiedType)
130  return UnmodifiedType->hasConstructor();
131 
132  return (Tag->Options & ClassOptions::HasConstructorOrDestructor) !=
134 }
135 
137  if (!Modifiers)
138  return false;
139  return (Modifiers->Modifiers & ModifierOptions::Const) !=
141 }
142 
144  if (UnmodifiedType)
146 
147  return (Tag->Options & ClassOptions::HasOverloadedAssignmentOperator) !=
149 }
150 
152  if (UnmodifiedType)
154 
155  return (Tag->Options & ClassOptions::HasConversionOperator) !=
157 }
158 
160  if (UnmodifiedType)
161  return UnmodifiedType->hasNestedTypes();
162 
163  return (Tag->Options & ClassOptions::ContainsNestedClass) !=
165 }
166 
168  if (UnmodifiedType)
170 
171  return (Tag->Options & ClassOptions::HasOverloadedOperator) !=
173 }
174 
175 bool NativeTypeUDT::isInterfaceUdt() const { return false; }
176 
178  if (UnmodifiedType)
179  return UnmodifiedType->isIntrinsic();
180 
181  return (Tag->Options & ClassOptions::Intrinsic) != ClassOptions::None;
182 }
183 
185  if (UnmodifiedType)
186  return UnmodifiedType->isNested();
187 
188  return (Tag->Options & ClassOptions::Nested) != ClassOptions::None;
189 }
190 
192  if (UnmodifiedType)
193  return UnmodifiedType->isPacked();
194 
195  return (Tag->Options & ClassOptions::Packed) != ClassOptions::None;
196 }
197 
198 bool NativeTypeUDT::isRefUdt() const { return false; }
199 
201  if (UnmodifiedType)
202  return UnmodifiedType->isScoped();
203 
204  return (Tag->Options & ClassOptions::Scoped) != ClassOptions::None;
205 }
206 
207 bool NativeTypeUDT::isValueUdt() const { return false; }
208 
210  if (!Modifiers)
211  return false;
212  return (Modifiers->Modifiers & ModifierOptions::Unaligned) !=
214 }
215 
217  if (!Modifiers)
218  return false;
219  return (Modifiers->Modifiers & ModifierOptions::Volatile) !=
221 }
This class represents lattice values for constants.
Definition: AllocatorList.h:24
bool isVolatileType() const override
bool isInterfaceUdt() const override
PDB_UdtType
These values correspond to the UdtKind enumeration, and are documented here: https://msdn.microsoft.com/en-us/library/wcstk66t.aspx.
Definition: PDBTypes.h:250
SymIndexId getVirtualTableShapeId() const override
void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, PdbSymbolIdField RecurseIdFields) const override
void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, PdbSymbolIdField RecurseIdFields) const override
codeview::TypeIndex Index
Definition: NativeTypeUDT.h:62
StringRef getName() const
Definition: TypeRecord.h:460
Definition: BitVector.h:938
SymIndexId getLexicalParentId() const override
Optional< codeview::ClassRecord > Class
Definition: NativeTypeUDT.h:64
bool hasNestedTypes() const override
bool isConstType() const override
codeview::TagRecord * Tag
Definition: NativeTypeUDT.h:67
A 32-bit type reference.
Definition: TypeIndex.h:96
SymIndexId getUnmodifiedTypeId() const override
bool isUnalignedType() const override
bool isScoped() const override
PDB_SymType
These values correspond to the SymTagEnum enumeration, and are documented here: https://msdn.microsoft.com/en-us/library/bkedss5f.aspx.
Definition: PDBTypes.h:183
bool isRefUdt() const override
SymIndexId getSymIndexId() const override
bool isIntrinsic() const override
bool hasOverloadedOperator() const override
std::string getName() const override
void dumpSymbolField(raw_ostream &OS, StringRef Name, T Value, int Indent)
Definition: PDBExtras.h:49
bool hasConstructor() const override
bool isPacked() const override
void dumpSymbolIdField(raw_ostream &OS, StringRef Name, SymIndexId Value, int Indent, const IPDBSession &Session, PdbSymbolIdField FieldId, PdbSymbolIdField ShowFlags, PdbSymbolIdField RecurseFlags)
Definition: PDBSymbol.cpp:186
Optional< codeview::UnionRecord > Union
Definition: NativeTypeUDT.h:65
bool isValueUdt() const override
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool hasCastOperator() const override
PDB_UdtType getUdtKind() const override
NativeTypeUDT(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI, codeview::ClassRecord Class)
bool isNested() const override
SymIndexId findSymbolByTypeIndex(codeview::TypeIndex TI)
uint64_t getLength() const override
NativeTypeUDT * UnmodifiedType
Definition: NativeTypeUDT.h:66
SymbolCache & getSymbolCache()
Definition: JSON.cpp:598
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:46
Optional< codeview::ModifierRecord > Modifiers
Definition: NativeTypeUDT.h:68
bool hasAssignmentOperator() const override