LLVM 20.0.0git
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
14
15using namespace llvm;
16using namespace llvm::codeview;
17using namespace llvm::pdb;
18
21 : NativeRawSymbol(Session, PDB_SymType::UDT, Id), Index(TI),
22 Class(std::move(CR)), Tag(&*Class) {}
23
26 : NativeRawSymbol(Session, PDB_SymType::UDT, Id), Index(TI),
27 Union(std::move(UR)), Tag(&*Union) {}
28
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,
46 RecurseIdFields);
47 if (Modifiers)
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
73std::string NativeTypeUDT::getName() const {
75 return UnmodifiedType->getName();
76
77 return std::string(Tag->getName());
78}
79
81
85
86 return 0;
87}
88
92
93 if (Class)
95
96 return 0;
97}
98
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) {
114 case TypeRecordKind::Class:
115 return PDB_UdtType::Class;
116 case TypeRecordKind::Union:
117 return PDB_UdtType::Union;
118 case TypeRecordKind::Struct:
119 return PDB_UdtType::Struct;
120 case TypeRecordKind::Interface:
122 default:
123 llvm_unreachable("Unexpected udt kind");
124 }
125}
126
128 if (UnmodifiedType)
130
131 return (Tag->Options & ClassOptions::HasConstructorOrDestructor) !=
132 ClassOptions::None;
133}
134
136 if (!Modifiers)
137 return false;
138 return (Modifiers->Modifiers & ModifierOptions::Const) !=
139 ModifierOptions::None;
140}
141
143 if (UnmodifiedType)
145
146 return (Tag->Options & ClassOptions::HasOverloadedAssignmentOperator) !=
147 ClassOptions::None;
148}
149
151 if (UnmodifiedType)
153
154 return (Tag->Options & ClassOptions::HasConversionOperator) !=
155 ClassOptions::None;
156}
157
159 if (UnmodifiedType)
161
162 return (Tag->Options & ClassOptions::ContainsNestedClass) !=
163 ClassOptions::None;
164}
165
167 if (UnmodifiedType)
169
170 return (Tag->Options & ClassOptions::HasOverloadedOperator) !=
171 ClassOptions::None;
172}
173
174bool 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
197bool NativeTypeUDT::isRefUdt() const { return false; }
198
200 if (UnmodifiedType)
201 return UnmodifiedType->isScoped();
202
203 return (Tag->Options & ClassOptions::Scoped) != ClassOptions::None;
204}
205
206bool NativeTypeUDT::isValueUdt() const { return false; }
207
209 if (!Modifiers)
210 return false;
211 return (Modifiers->Modifiers & ModifierOptions::Unaligned) !=
212 ModifierOptions::None;
213}
214
216 if (!Modifiers)
217 return false;
218 return (Modifiers->Modifiers & ModifierOptions::Volatile) !=
219 ModifierOptions::None;
220}
raw_pwrite_stream & OS
StringRef getName() const
Definition: TypeRecord.h:454
A 32-bit type reference.
Definition: TypeIndex.h:96
SymIndexId getSymIndexId() const override
void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, PdbSymbolIdField RecurseIdFields) const override
SymbolCache & getSymbolCache()
PDB_UdtType getUdtKind() const override
SymIndexId getVirtualTableShapeId() const override
bool hasNestedTypes() const override
bool isPacked() const override
bool isRefUdt() const override
bool isUnalignedType() const override
uint64_t getLength() const override
bool isVolatileType() const override
bool isValueUdt() const override
void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, PdbSymbolIdField RecurseIdFields) const override
bool isScoped() const override
NativeTypeUDT * UnmodifiedType
Definition: NativeTypeUDT.h:68
SymIndexId getUnmodifiedTypeId() const override
NativeTypeUDT(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI, codeview::ClassRecord Class)
SymIndexId getLexicalParentId() const override
std::optional< codeview::UnionRecord > Union
Definition: NativeTypeUDT.h:67
std::optional< codeview::ClassRecord > Class
Definition: NativeTypeUDT.h:66
bool hasAssignmentOperator() const override
bool hasCastOperator() const override
std::optional< codeview::ModifierRecord > Modifiers
Definition: NativeTypeUDT.h:70
codeview::TagRecord * Tag
Definition: NativeTypeUDT.h:69
bool hasConstructor() const override
std::string getName() const override
bool isConstType() const override
bool hasOverloadedOperator() const override
bool isNested() const override
bool isIntrinsic() const override
bool isInterfaceUdt() const override
SymIndexId findSymbolByTypeIndex(codeview::TypeIndex TI) const
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
void dumpSymbolField(raw_ostream &OS, StringRef Name, T Value, int Indent)
Definition: PDBExtras.h:47
PDB_UdtType
These values correspond to the UdtKind enumeration, and are documented here: https://msdn....
Definition: PDBTypes.h:310
PDB_SymType
These values correspond to the SymTagEnum enumeration, and are documented here: https://msdn....
Definition: PDBTypes.h:243
void dumpSymbolIdField(raw_ostream &OS, StringRef Name, SymIndexId Value, int Indent, const IPDBSession &Session, PdbSymbolIdField FieldId, PdbSymbolIdField ShowFlags, PdbSymbolIdField RecurseFlags)
Definition: PDBSymbol.cpp:202
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1873
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858