diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2015-07-08 05:14:29 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2015-07-08 05:14:29 +0000 |
| commit | cefbc7cfcb7538b89a921226ee87e3ab66ffeb94 (patch) | |
| tree | dc087d41d6b66c3598e60f85f07bbf63667f62ef | |
| parent | 699dd04a13beb0ebb4a4fca8d5646c9ede3da4ab (diff) | |
| download | bcm5719-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.cpp | 6 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/x86_64-arguments.cpp | 16 |
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; +} +} |

