LLVM  9.0.0svn
NativeTypeUDT.cpp
Go to the documentation of this file.
1 //===- NativeTypeUDT.cpp - info about class/struct type ---------*- 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 
12 
13 #include <cassert>
14 
15 using namespace llvm;
16 using namespace llvm::codeview;
17 using namespace llvm::pdb;
18 
19 NativeTypeUDT::NativeTypeUDT(NativeSession &Session, SymIndexId Id,
21  : NativeRawSymbol(Session, PDB_SymType::UDT, Id), Index(TI),
22  Class(std::move(CR)), Tag(Class.getPointer()) {}
23 
26  : NativeRawSymbol(Session, PDB_SymType::UDT, Id), Index(TI),
27  Union(std::move(UR)), Tag(Union.getPointer()) {}
28 
31  codeview::ModifierRecord Modifier)
32  : NativeRawSymbol(Session, PDB_SymType::UDT, Id),
33  UnmodifiedType(&UnmodifiedType), Modifiers(std::move(Modifier)) {}
34 
36 
38  PdbSymbolIdField ShowIdFields,
39  PdbSymbolIdField RecurseIdFields) const {
40 
41  NativeRawSymbol::dump(OS, Indent, ShowIdFields, RecurseIdFields);
42 
43  dumpSymbolField(OS, "name", getName(), Indent);
44  dumpSymbolIdField(OS, "lexicalParentId", 0, Indent, Session,
45  PdbSymbolIdField::LexicalParent, ShowIdFields,
46  RecurseIdFields);
47  if (Modifiers.hasValue())
48  dumpSymbolIdField(OS, "unmodifiedTypeId", getUnmodifiedTypeId(), Indent,
50  RecurseIdFields);
52  dumpSymbolField(OS, "virtualTableShapeId", getVirtualTableShapeId(),
53  Indent);
54  dumpSymbolField(OS, "length", getLength(), Indent);
55  dumpSymbolField(OS, "udtKind", getUdtKind(), Indent);
56  dumpSymbolField(OS, "constructor", hasConstructor(), Indent);
57  dumpSymbolField(OS, "constType", isConstType(), Indent);
58  dumpSymbolField(OS, "hasAssignmentOperator", hasAssignmentOperator(), Indent);
59  dumpSymbolField(OS, "hasCastOperator", hasCastOperator(), Indent);
60  dumpSymbolField(OS, "hasNestedTypes", hasNestedTypes(), Indent);
61  dumpSymbolField(OS, "overloadedOperator", hasOverloadedOperator(), Indent);
62  dumpSymbolField(OS, "isInterfaceUdt", isInterfaceUdt(), Indent);
63  dumpSymbolField(OS, "intrinsic", isIntrinsic(), Indent);
64  dumpSymbolField(OS, "nested", isNested(), Indent);
65  dumpSymbolField(OS, "packed", isPacked(), Indent);
66  dumpSymbolField(OS, "isRefUdt", isRefUdt(), Indent);
67  dumpSymbolField(OS, "scoped", isScoped(), Indent);
68  dumpSymbolField(OS, "unalignedType", isUnalignedType(), Indent);
69  dumpSymbolField(OS, "isValueUdt", isValueUdt(), Indent);
70  dumpSymbolField(OS, "volatileType", isVolatileType(), Indent);
71 }
72 
73 std::string NativeTypeUDT::getName() const {
74  if (UnmodifiedType)
75  return UnmodifiedType->getName();
76 
77  return Tag->getName();
78 }
79 
81 
83  if (UnmodifiedType)
84  return UnmodifiedType->getSymIndexId();
85 
86  return 0;
87 }
88 
90  if (UnmodifiedType)
92 
93  if (Class)
94  return Session.getSymbolCache().findSymbolByTypeIndex(Class->VTableShape);
95 
96  return 0;
97 }
98 
99 uint64_t NativeTypeUDT::getLength() const {
100  if (UnmodifiedType)
101  return UnmodifiedType->getLength();
102 
103  if (Class)
104  return Class->getSize();
105 
106  return Union->getSize();
107 }
108 
110  if (UnmodifiedType)
111  return UnmodifiedType->getUdtKind();
112 
113  switch (Tag->Kind) {
115  return PDB_UdtType::Class;
117  return PDB_UdtType::Union;
119  return PDB_UdtType::Struct;
121  return PDB_UdtType::Interface;
122  default:
123  llvm_unreachable("Unexected udt kind");
124  }
125 }
126 
128  if (UnmodifiedType)
129  return UnmodifiedType->hasConstructor();
130 
131  return (Tag->Options & ClassOptions::HasConstructorOrDestructor) !=
133 }
134 
136  if (!Modifiers)
137  return false;
138  return (Modifiers->Modifiers & ModifierOptions::Const) !=
140 }
141 
143  if (UnmodifiedType)
145 
146  return (Tag->Options & ClassOptions::HasOverloadedAssignmentOperator) !=
148 }
149 
151  if (UnmodifiedType)
153 
154  return (Tag->Options & ClassOptions::HasConversionOperator) !=
156 }
157 
159  if (UnmodifiedType)
160  return UnmodifiedType->hasNestedTypes();
161 
162  return (Tag->Options & ClassOptions::ContainsNestedClass) !=
164 }
165 
167  if (UnmodifiedType)
169 
170  return (Tag->Options & ClassOptions::HasOverloadedOperator) !=
172 }
173 
174 bool NativeTypeUDT::isInterfaceUdt() const { return false; }
175 
177  if (UnmodifiedType)
178  return UnmodifiedType->isIntrinsic();
179 
180  return (Tag->Options & ClassOptions::Intrinsic) != ClassOptions::None;
181 }
182 
184  if (UnmodifiedType)
185  return UnmodifiedType->isNested();
186 
187  return (Tag->Options & ClassOptions::Nested) != ClassOptions::None;
188 }
189 
191  if (UnmodifiedType)
192  return UnmodifiedType->isPacked();
193 
194  return (Tag->Options & ClassOptions::Packed) != ClassOptions::None;
195 }
196 
197 bool NativeTypeUDT::isRefUdt() const { return false; }
198 
200  if (UnmodifiedType)
201  return UnmodifiedType->isScoped();
202 
203  return (Tag->Options & ClassOptions::Scoped) != ClassOptions::None;
204 }
205 
206 bool NativeTypeUDT::isValueUdt() const { return false; }
207 
209  if (!Modifiers)
210  return false;
211  return (Modifiers->Modifiers & ModifierOptions::Unaligned) !=
213 }
214 
216  if (!Modifiers)
217  return false;
218  return (Modifiers->Modifiers & ModifierOptions::Volatile) !=
220 }
This class represents lattice values for constants.
Definition: AllocatorList.h:23
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:249
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:61
StringRef getName() const
Definition: TypeRecord.h:459
Definition: BitVector.h:937
SymIndexId getLexicalParentId() const override
Optional< codeview::ClassRecord > Class
Definition: NativeTypeUDT.h:63
bool hasNestedTypes() const override
bool isConstType() const override
codeview::TagRecord * Tag
Definition: NativeTypeUDT.h:66
A 32-bit type reference.
Definition: TypeIndex.h:95
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:182
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:48
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:185
Optional< codeview::UnionRecord > Union
Definition: NativeTypeUDT.h:64
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:65
SymbolCache & getSymbolCache()
Definition: JSON.cpp:597
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:45
Optional< codeview::ModifierRecord > Modifiers
Definition: NativeTypeUDT.h:67
bool hasAssignmentOperator() const override