summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-07-08 05:14:29 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-07-08 05:14:29 +0000
commitcefbc7cfcb7538b89a921226ee87e3ab66ffeb94 (patch)
treedc087d41d6b66c3598e60f85f07bbf63667f62ef
parent699dd04a13beb0ebb4a4fca8d5646c9ede3da4ab (diff)
downloadbcm5719-llvm-cefbc7cfcb7538b89a921226ee87e3ab66ffeb94.tar.gz
bcm5719-llvm-cefbc7cfcb7538b89a921226ee87e3ab66ffeb94.zip
[CodeGen] Correctly handle base classes which are passed in memory
We didn't correctly process the case where a base class is classified as MEMORY. This would cause us to trip over an assertion. This fixes PR24020. Differential Revision: http://reviews.llvm.org/D10907 llvm-svn: 241667
-rw-r--r--clang/lib/CodeGen/TargetInfo.cpp6
-rw-r--r--clang/test/CodeGenCXX/x86_64-arguments.cpp16
2 files changed, 20 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index dbb9e8d9039..300d3c909f7 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -2073,8 +2073,10 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
classify(I.getType(), Offset, FieldLo, FieldHi, isNamedArg);
Lo = merge(Lo, FieldLo);
Hi = merge(Hi, FieldHi);
- if (Lo == Memory || Hi == Memory)
- break;
+ if (Lo == Memory || Hi == Memory) {
+ postMerge(Size, Lo, Hi);
+ return;
+ }
}
}
diff --git a/clang/test/CodeGenCXX/x86_64-arguments.cpp b/clang/test/CodeGenCXX/x86_64-arguments.cpp
index 815ef6111a9..64202b4d02c 100644
--- a/clang/test/CodeGenCXX/x86_64-arguments.cpp
+++ b/clang/test/CodeGenCXX/x86_64-arguments.cpp
@@ -196,3 +196,19 @@ namespace test9 {
return sret;
}
}
+
+namespace test10 {
+#pragma pack(1)
+struct BasePacked {
+ char one;
+ short two;
+};
+#pragma pack()
+struct DerivedPacked : public BasePacked {
+ int three;
+};
+// CHECK-LABEL: define i32 @_ZN6test1020FuncForDerivedPackedENS_13DerivedPackedE({{.*}}* byval align 8
+int FuncForDerivedPacked(DerivedPacked d) {
+ return d.three;
+}
+}
OpenPOWER on IntegriCloud