Thanks to visit codestin.com
Credit goes to llvm.org

LLVM 22.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
23
28
34
36
37void NativeTypeUDT::dump(raw_ostream &OS, int Indent,
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
84 return UnmodifiedType->getSymIndexId();
85
86 return 0;
87}
88
91 return UnmodifiedType->getVirtualTableShapeId();
92
93 if (Class)
94 return Session.getSymbolCache().findSymbolByTypeIndex(Class->VTableShape);
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)
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)
144 return UnmodifiedType->hasAssignmentOperator();
145
148}
149
151 if (UnmodifiedType)
152 return UnmodifiedType->hasCastOperator();
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)
168 return UnmodifiedType->hasOverloadedOperator();
169
170 return (Tag->Options & ClassOptions::HasOverloadedOperator) !=
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) !=
213}
214
216 if (!Modifiers)
217 return false;
218 return (Modifiers->Modifiers & ModifierOptions::Volatile) !=
220}
A 32-bit type reference.
Definition TypeIndex.h:97
NativeRawSymbol(NativeSession &PDBSession, PDB_SymType Tag, SymIndexId SymbolId)
void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, PdbSymbolIdField RecurseIdFields) const override
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
SymIndexId getUnmodifiedTypeId() const override
NativeTypeUDT(NativeSession &Session, SymIndexId Id, codeview::TypeIndex TI, codeview::ClassRecord Class)
SymIndexId getLexicalParentId() const override
std::optional< codeview::UnionRecord > Union
std::optional< codeview::ClassRecord > Class
bool hasAssignmentOperator() const override
bool hasCastOperator() const override
std::optional< codeview::ModifierRecord > Modifiers
codeview::TagRecord * Tag
bool hasConstructor() const override
std::string getName() const override
codeview::TypeIndex Index
bool isConstType() const override
bool hasOverloadedOperator() const override
bool isNested() const override
bool isIntrinsic() const override
bool isInterfaceUdt() const override
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
uint32_t SymIndexId
Definition PDBTypes.h:26
void dumpSymbolField(raw_ostream &OS, StringRef Name, T Value, int Indent)
Definition PDBExtras.h:51
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
LLVM_ABI void dumpSymbolIdField(raw_ostream &OS, StringRef Name, SymIndexId Value, int Indent, const IPDBSession &Session, PdbSymbolIdField FieldId, PdbSymbolIdField ShowFlags, PdbSymbolIdField RecurseFlags)
This is an optimization pass for GlobalISel generic memory operations.
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:1847
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:851