mirror of
https://github.com/intel/llvm.git
synced 2026-02-01 17:07:36 +08:00
[PowerPC ABI] Bug 21398 - Consider C++ base classes in HA classification
As discussed in bug 21398, PowerPC ABI code needs to consider C++ base classes when classifying a class as homogeneous aggregate (or not) for ABI purposes. llvm-svn: 220852
This commit is contained in:
@@ -3208,6 +3208,22 @@ PPC64_SVR4_ABIInfo::isHomogeneousAggregate(QualType Ty, const Type *&Base,
|
||||
return false;
|
||||
|
||||
Members = 0;
|
||||
|
||||
// If this is a C++ record, check the bases first.
|
||||
if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
|
||||
for (const auto &I : CXXRD->bases()) {
|
||||
// Ignore empty records.
|
||||
if (isEmptyRecord(getContext(), I.getType(), true))
|
||||
continue;
|
||||
|
||||
uint64_t FldMembers;
|
||||
if (!isHomogeneousAggregate(I.getType(), Base, FldMembers))
|
||||
return false;
|
||||
|
||||
Members += FldMembers;
|
||||
}
|
||||
}
|
||||
|
||||
for (const auto *FD : RD->fields()) {
|
||||
// Ignore (non-zero arrays of) empty records.
|
||||
QualType FT = FD->getType();
|
||||
|
||||
39
clang/test/CodeGen/ppc64le-aggregates-cpp.cpp
Normal file
39
clang/test/CodeGen/ppc64le-aggregates-cpp.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
// REQUIRES: powerpc-registered-target
|
||||
// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s
|
||||
|
||||
// Test that C++ classes are correctly classified as homogeneous aggregates.
|
||||
|
||||
struct Base1 {
|
||||
int x;
|
||||
};
|
||||
struct Base2 {
|
||||
double x;
|
||||
};
|
||||
struct Base3 {
|
||||
double x;
|
||||
};
|
||||
struct D1 : Base1 { // non-homogeneous aggregate
|
||||
double y, z;
|
||||
};
|
||||
struct D2 : Base2 { // homogeneous aggregate
|
||||
double y, z;
|
||||
};
|
||||
struct D3 : Base1, Base2 { // non-homogeneous aggregate
|
||||
double y, z;
|
||||
};
|
||||
struct D4 : Base2, Base3 { // homogeneous aggregate
|
||||
double y, z;
|
||||
};
|
||||
|
||||
// CHECK: define void @_Z7func_D12D1(%struct.D1* noalias sret %agg.result, [3 x i64] %x.coerce)
|
||||
D1 func_D1(D1 x) { return x; }
|
||||
|
||||
// CHECK: define [3 x double] @_Z7func_D22D2([3 x double] %x.coerce)
|
||||
D2 func_D2(D2 x) { return x; }
|
||||
|
||||
// CHECK: define void @_Z7func_D32D3(%struct.D3* noalias sret %agg.result, [4 x i64] %x.coerce)
|
||||
D3 func_D3(D3 x) { return x; }
|
||||
|
||||
// CHECK: define [4 x double] @_Z7func_D42D4([4 x double] %x.coerce)
|
||||
D4 func_D4(D4 x) { return x; }
|
||||
|
||||
Reference in New Issue
Block a user