1 //===- NativeTypeUDT.cpp - info about class/struct type ---------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #include "llvm/DebugInfo/PDB/Native/NativeTypeUDT.h"
11 #include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
16 using namespace llvm::codeview
;
17 using namespace llvm::pdb
;
19 NativeTypeUDT::NativeTypeUDT(NativeSession
&Session
, SymIndexId Id
,
20 codeview::TypeIndex TI
, codeview::ClassRecord CR
)
21 : NativeRawSymbol(Session
, PDB_SymType::UDT
, Id
), Index(TI
),
22 Class(std::move(CR
)), Tag(Class
.getPointer()) {}
24 NativeTypeUDT::NativeTypeUDT(NativeSession
&Session
, SymIndexId Id
,
25 codeview::TypeIndex TI
, codeview::UnionRecord UR
)
26 : NativeRawSymbol(Session
, PDB_SymType::UDT
, Id
), Index(TI
),
27 Union(std::move(UR
)), Tag(Union
.getPointer()) {}
29 NativeTypeUDT::NativeTypeUDT(NativeSession
&Session
, SymIndexId Id
,
30 NativeTypeUDT
&UnmodifiedType
,
31 codeview::ModifierRecord Modifier
)
32 : NativeRawSymbol(Session
, PDB_SymType::UDT
, Id
),
33 UnmodifiedType(&UnmodifiedType
), Modifiers(std::move(Modifier
)) {}
35 NativeTypeUDT::~NativeTypeUDT() {}
37 void NativeTypeUDT::dump(raw_ostream
&OS
, int Indent
,
38 PdbSymbolIdField ShowIdFields
,
39 PdbSymbolIdField RecurseIdFields
) const {
41 NativeRawSymbol::dump(OS
, Indent
, ShowIdFields
, RecurseIdFields
);
43 dumpSymbolField(OS
, "name", getName(), Indent
);
44 dumpSymbolIdField(OS
, "lexicalParentId", 0, Indent
, Session
,
45 PdbSymbolIdField::LexicalParent
, ShowIdFields
,
47 if (Modifiers
.hasValue())
48 dumpSymbolIdField(OS
, "unmodifiedTypeId", getUnmodifiedTypeId(), Indent
,
49 Session
, PdbSymbolIdField::UnmodifiedType
, ShowIdFields
,
51 if (getUdtKind() != PDB_UdtType::Union
)
52 dumpSymbolField(OS
, "virtualTableShapeId", getVirtualTableShapeId(),
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
);
73 std::string
NativeTypeUDT::getName() const {
75 return UnmodifiedType
->getName();
77 return Tag
->getName();
80 SymIndexId
NativeTypeUDT::getLexicalParentId() const { return 0; }
82 SymIndexId
NativeTypeUDT::getUnmodifiedTypeId() const {
84 return UnmodifiedType
->getSymIndexId();
89 SymIndexId
NativeTypeUDT::getVirtualTableShapeId() const {
91 return UnmodifiedType
->getVirtualTableShapeId();
94 return Session
.getSymbolCache().findSymbolByTypeIndex(Class
->VTableShape
);
99 uint64_t NativeTypeUDT::getLength() const {
101 return UnmodifiedType
->getLength();
104 return Class
->getSize();
106 return Union
->getSize();
109 PDB_UdtType
NativeTypeUDT::getUdtKind() const {
111 return UnmodifiedType
->getUdtKind();
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
:
121 return PDB_UdtType::Interface
;
123 llvm_unreachable("Unexected udt kind");
127 bool NativeTypeUDT::hasConstructor() const {
129 return UnmodifiedType
->hasConstructor();
131 return (Tag
->Options
& ClassOptions::HasConstructorOrDestructor
) !=
135 bool NativeTypeUDT::isConstType() const {
138 return (Modifiers
->Modifiers
& ModifierOptions::Const
) !=
139 ModifierOptions::None
;
142 bool NativeTypeUDT::hasAssignmentOperator() const {
144 return UnmodifiedType
->hasAssignmentOperator();
146 return (Tag
->Options
& ClassOptions::HasOverloadedAssignmentOperator
) !=
150 bool NativeTypeUDT::hasCastOperator() const {
152 return UnmodifiedType
->hasCastOperator();
154 return (Tag
->Options
& ClassOptions::HasConversionOperator
) !=
158 bool NativeTypeUDT::hasNestedTypes() const {
160 return UnmodifiedType
->hasNestedTypes();
162 return (Tag
->Options
& ClassOptions::ContainsNestedClass
) !=
166 bool NativeTypeUDT::hasOverloadedOperator() const {
168 return UnmodifiedType
->hasOverloadedOperator();
170 return (Tag
->Options
& ClassOptions::HasOverloadedOperator
) !=
174 bool NativeTypeUDT::isInterfaceUdt() const { return false; }
176 bool NativeTypeUDT::isIntrinsic() const {
178 return UnmodifiedType
->isIntrinsic();
180 return (Tag
->Options
& ClassOptions::Intrinsic
) != ClassOptions::None
;
183 bool NativeTypeUDT::isNested() const {
185 return UnmodifiedType
->isNested();
187 return (Tag
->Options
& ClassOptions::Nested
) != ClassOptions::None
;
190 bool NativeTypeUDT::isPacked() const {
192 return UnmodifiedType
->isPacked();
194 return (Tag
->Options
& ClassOptions::Packed
) != ClassOptions::None
;
197 bool NativeTypeUDT::isRefUdt() const { return false; }
199 bool NativeTypeUDT::isScoped() const {
201 return UnmodifiedType
->isScoped();
203 return (Tag
->Options
& ClassOptions::Scoped
) != ClassOptions::None
;
206 bool NativeTypeUDT::isValueUdt() const { return false; }
208 bool NativeTypeUDT::isUnalignedType() const {
211 return (Modifiers
->Modifiers
& ModifierOptions::Unaligned
) !=
212 ModifierOptions::None
;
215 bool NativeTypeUDT::isVolatileType() const {
218 return (Modifiers
->Modifiers
& ModifierOptions::Volatile
) !=
219 ModifierOptions::None
;