27 #include "llvm/ADT/iterator.h" 29 using namespace clang;
45 assert(RT &&
"type of VarDecl is expected to be RecordType.");
46 assert(RT->
getDecl()->
isUnion() &&
"RecordType is expected to be a union.");
48 return FD->getIdentifier();
55 struct DecompositionDeclName {
59 BindingArray Bindings;
63 : llvm::iterator_adaptor_base<Iterator, BindingArray::const_iterator,
64 std::random_access_iterator_tag,
65 const IdentifierInfo *> {
66 Iterator(BindingArray::const_iterator It) : iterator_adaptor_base(It) {}
68 return (*this->I)->getIdentifier();
71 Iterator begin()
const {
return Iterator(Bindings.begin()); }
72 Iterator end()
const {
return Iterator(Bindings.end()); }
82 return {ArrayInfo::getEmptyKey()};
85 return {ArrayInfo::getTombstoneKey()};
88 assert(!isEqual(Key, getEmptyKey()) && !isEqual(Key, getTombstoneKey()));
89 return llvm::hash_combine_range(Key.begin(), Key.end());
91 static bool isEqual(DecompositionDeclName LHS, DecompositionDeclName RHS) {
92 if (ArrayInfo::isEqual(LHS.Bindings, ArrayInfo::getEmptyKey()))
93 return ArrayInfo::isEqual(RHS.Bindings, ArrayInfo::getEmptyKey());
94 if (ArrayInfo::isEqual(LHS.Bindings, ArrayInfo::getTombstoneKey()))
95 return ArrayInfo::isEqual(RHS.Bindings, ArrayInfo::getTombstoneKey());
96 return LHS.Bindings.size() == RHS.Bindings.size() &&
97 std::equal(LHS.begin(), LHS.end(), RHS.begin());
107 llvm::DenseMap<const Type *, unsigned> ManglingNumbers;
108 llvm::DenseMap<const IdentifierInfo *, unsigned> VarManglingNumbers;
109 llvm::DenseMap<const IdentifierInfo *, unsigned> TagManglingNumbers;
110 llvm::DenseMap<DecompositionDeclName, unsigned>
111 DecompsitionDeclManglingNumbers;
114 unsigned getManglingNumber(
const CXXMethodDecl *CallOperator)
override {
122 Context.getFunctionType(Context.VoidTy, Proto->
getParamTypes(), EPI);
127 unsigned getManglingNumber(
const BlockDecl *BD)
override {
128 const Type *Ty =
nullptr;
129 return ++ManglingNumbers[Ty];
132 unsigned getStaticLocalNumber(
const VarDecl *VD)
override {
137 unsigned getManglingNumber(
const VarDecl *VD,
unsigned)
override {
138 if (
auto *DD = dyn_cast<DecompositionDecl>(VD)) {
139 DecompositionDeclName Name{DD->bindings()};
140 return ++DecompsitionDeclManglingNumbers[Name];
147 Identifier = findAnonymousUnionVarDeclName(*VD);
149 return ++VarManglingNumbers[Identifier];
152 unsigned getManglingNumber(
const TagDecl *TD,
unsigned)
override {
157 class ItaniumCXXABI :
public CXXABI {
161 ItaniumCXXABI(
ASTContext &Ctx) : Context(Ctx) { }
167 MemberPointerInfo MPI;
170 MPI.HasPadding =
false;
176 CallingConv getDefaultMethodCallConv(
bool isVariadic)
const override {
178 if (!isVariadic && T.isWindowsGNUEnvironment() &&
179 T.getArch() == llvm::Triple::x86)
199 getCopyConstructorForExceptionObject(
CXXRecordDecl *RD)
override {
206 void addTypedefNameForUnnamedTagDecl(
TagDecl *TD,
213 void addDeclaratorForUnnamedTagDecl(
TagDecl *TD,
220 std::unique_ptr<MangleNumberingContext>
221 createMangleNumberingContext()
const override {
222 return llvm::make_unique<ItaniumNumberingContext>();
228 return new ItaniumCXXABI(Ctx);
Defines the clang::ASTContext interface.
unsigned getTypeWidth(IntType T) const
Return the width (in bits) of the specified integer type enum.
A (possibly-)qualified type.
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
C Language Family Type Representation.
The base class of the type hierarchy.
const TargetInfo & getTargetInfo() const
Represents a C++ constructor within a class.
Represents a variable declaration or definition.
const T * getAs() const
Member-template getAs<specific type>'.
Extra information about a function prototype.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
uint64_t getPointerWidth(unsigned AddrSpace) const
Return the width of pointers on this target, for the specified address space.
One of these records is kept for each identifier that is lexed.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
ArrayRef< QualType > getParamTypes() const
Represents a member of a struct/union/class.
static DecompositionDeclName getTombstoneKey()
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
static bool isEqual(DecompositionDeclName LHS, DecompositionDeclName RHS)
CharUnits - This is an opaque type for sizes expressed in character units.
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)
Creates an instance of a C++ ABI class.
static unsigned getHashValue(DecompositionDeclName Key)
Represents a prototype with parameter type info, e.g.
bool isDynamicClass() const
Represents a ValueDecl that came out of a declarator.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
Exposes information about the current target.
Pepresents a block literal declaration, which is like an unnamed FunctionDecl.
const FieldDecl * findFirstNamedDataMember() const
Finds the first data member which has a name.
const T * castAs() const
Member-template castAs<specific type>.
static DecompositionDeclName getEmptyKey()
Implements C++ ABI-specific semantic analysis functions.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
unsigned getTypeAlign(IntType T) const
Return the alignment (in bits) of the specified integer type enum.
RecordDecl * getDecl() const
IntType getPtrDiffType(unsigned AddrSpace) const
QualType getCanonicalType() const
Represents the declaration of a struct/union/class/enum.
ASTContext & getASTContext() const LLVM_READONLY
Represents a static or instance method of a struct/union/class.
Base class for declarations which introduce a typedef-name.
IntType
===-— Target Data Type Query Methods ----------------------------—===//
Dataflow Directional Tag Classes.
A pointer to member type per C++ 8.3.3 - Pointers to members.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate.h) and friends (in DeclFriend.h).
Represents a C++ struct/union/class.
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
CharUnits getNonVirtualSize() const
getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...
Defines the clang::TargetInfo interface.