r220852 - [PowerPC ABI] Bug 21398 - Consider C++ base classes in HA classification

Ulrich Weigand ulrich.weigand at de.ibm.com
Wed Oct 29 06:23:21 PDT 2014


Author: uweigand
Date: Wed Oct 29 08:23:20 2014
New Revision: 220852

URL: http://llvm.org/viewvc/llvm-project?rev=220852&view=rev
Log:
[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.


Added:
    cfe/trunk/test/CodeGen/ppc64le-aggregates-cpp.cpp
Modified:
    cfe/trunk/lib/CodeGen/TargetInfo.cpp

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=220852&r1=220851&r2=220852&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed Oct 29 08:23:20 2014
@@ -3208,6 +3208,22 @@ PPC64_SVR4_ABIInfo::isHomogeneousAggrega
       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();

Added: cfe/trunk/test/CodeGen/ppc64le-aggregates-cpp.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ppc64le-aggregates-cpp.cpp?rev=220852&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/ppc64le-aggregates-cpp.cpp (added)
+++ cfe/trunk/test/CodeGen/ppc64le-aggregates-cpp.cpp Wed Oct 29 08:23:20 2014
@@ -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; }
+





More information about the cfe-commits mailing list