mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-09 17:43:57 +00:00
When building RTTI descriptors for pointer types, we need to get the unqualified array type and the qualifiers from it.
llvm-svn: 105326
This commit is contained in:
parent
7881a64a50
commit
a85c1469c7
@ -728,15 +728,19 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
|
||||
void RTTIBuilder::BuildPointerTypeInfo(const PointerType *Ty) {
|
||||
QualType PointeeTy = Ty->getPointeeType();
|
||||
|
||||
Qualifiers Quals;
|
||||
QualType UnqualifiedPointeeTy =
|
||||
CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
|
||||
|
||||
// Itanium C++ ABI 2.9.5p7:
|
||||
// __flags is a flag word describing the cv-qualification and other
|
||||
// attributes of the type pointed to
|
||||
unsigned Flags = ComputeQualifierFlags(PointeeTy.getQualifiers());
|
||||
unsigned Flags = ComputeQualifierFlags(Quals);
|
||||
|
||||
// Itanium C++ ABI 2.9.5p7:
|
||||
// When the abi::__pbase_type_info is for a direct or indirect pointer to an
|
||||
// incomplete class type, the incomplete target type flag is set.
|
||||
if (ContainsIncompleteClassType(PointeeTy))
|
||||
if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
|
||||
Flags |= PTI_Incomplete;
|
||||
|
||||
const llvm::Type *UnsignedIntLTy =
|
||||
@ -747,7 +751,7 @@ void RTTIBuilder::BuildPointerTypeInfo(const PointerType *Ty) {
|
||||
// __pointee is a pointer to the std::type_info derivation for the
|
||||
// unqualified type being pointed to.
|
||||
llvm::Constant *PointeeTypeInfo =
|
||||
RTTIBuilder(CGM).BuildTypeInfo(PointeeTy.getUnqualifiedType());
|
||||
RTTIBuilder(CGM).BuildTypeInfo(UnqualifiedPointeeTy);
|
||||
Fields.push_back(PointeeTypeInfo);
|
||||
}
|
||||
|
||||
@ -756,17 +760,21 @@ void RTTIBuilder::BuildPointerTypeInfo(const PointerType *Ty) {
|
||||
void RTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
|
||||
QualType PointeeTy = Ty->getPointeeType();
|
||||
|
||||
Qualifiers Quals;
|
||||
QualType UnqualifiedPointeeTy =
|
||||
CGM.getContext().getUnqualifiedArrayType(PointeeTy, Quals);
|
||||
|
||||
// Itanium C++ ABI 2.9.5p7:
|
||||
// __flags is a flag word describing the cv-qualification and other
|
||||
// attributes of the type pointed to.
|
||||
unsigned Flags = ComputeQualifierFlags(PointeeTy.getQualifiers());
|
||||
unsigned Flags = ComputeQualifierFlags(Quals);
|
||||
|
||||
const RecordType *ClassType = cast<RecordType>(Ty->getClass());
|
||||
|
||||
// Itanium C++ ABI 2.9.5p7:
|
||||
// When the abi::__pbase_type_info is for a direct or indirect pointer to an
|
||||
// incomplete class type, the incomplete target type flag is set.
|
||||
if (ContainsIncompleteClassType(PointeeTy))
|
||||
if (ContainsIncompleteClassType(UnqualifiedPointeeTy))
|
||||
Flags |= PTI_Incomplete;
|
||||
|
||||
if (IsIncompleteClassType(ClassType))
|
||||
@ -780,7 +788,7 @@ void RTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) {
|
||||
// __pointee is a pointer to the std::type_info derivation for the
|
||||
// unqualified type being pointed to.
|
||||
llvm::Constant *PointeeTypeInfo =
|
||||
RTTIBuilder(CGM).BuildTypeInfo(PointeeTy.getUnqualifiedType());
|
||||
RTTIBuilder(CGM).BuildTypeInfo(UnqualifiedPointeeTy);
|
||||
Fields.push_back(PointeeTypeInfo);
|
||||
|
||||
// Itanium C++ ABI 2.9.5p9:
|
||||
|
@ -93,6 +93,14 @@ struct VMI7 : VMIBase1, VMI5, private VMI6 { };
|
||||
#define CHECK_BASE_INFO_TYPE(type, index, base) CHECK(to<__vmi_class_type_info>(typeid(type)).__base_info[(index)].__base_type == &typeid(base))
|
||||
#define CHECK_BASE_INFO_OFFSET_FLAGS(type, index, offset, flags) CHECK(to<__vmi_class_type_info>(typeid(type)).__base_info[(index)].__offset_flags == (((offset) << 8) | (flags)))
|
||||
|
||||
struct B {
|
||||
static int const volatile (*a)[10];
|
||||
static int (*b)[10];
|
||||
|
||||
static int const volatile (B::*c)[10];
|
||||
static int (B::*d)[10];
|
||||
};
|
||||
|
||||
// CHECK: define i32 @_Z1fv()
|
||||
int f() {
|
||||
// Vectors should be treated as fundamental types.
|
||||
@ -168,6 +176,12 @@ int f() {
|
||||
CHECK(to<__pbase_type_info>(typeid(Incomplete Incomplete::*)).__flags == (__pbase_type_info::__incomplete_class_mask | __pbase_type_info::__incomplete_mask));
|
||||
CHECK(to<__pbase_type_info>(typeid(Incomplete A::*)).__flags == (__pbase_type_info::__incomplete_mask));
|
||||
|
||||
// Check that when stripping qualifiers off the pointee type, we correctly handle arrays.
|
||||
CHECK(to<__pbase_type_info>(typeid(B::a)).__flags == (__pbase_type_info::__const_mask | __pbase_type_info::__volatile_mask));
|
||||
CHECK(to<__pbase_type_info>(typeid(B::a)).__pointee == to<__pbase_type_info>(typeid(B::b)).__pointee);
|
||||
CHECK(to<__pbase_type_info>(typeid(B::c)).__flags == (__pbase_type_info::__const_mask | __pbase_type_info::__volatile_mask));
|
||||
CHECK(to<__pbase_type_info>(typeid(B::c)).__pointee == to<__pbase_type_info>(typeid(B::d)).__pointee);
|
||||
|
||||
// Success!
|
||||
// CHECK: ret i32 0
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user