forked from OSchip/llvm-project
Check for trivial constructibility before emptiness in ARM ABI.
According to the Itanium ABI (3.1.1), types with non-trivial copy constructors passed by value should be passed indirectly, with the caller creating a temporary. We got this mostly correct, but forgot that empty structs can have non-trivial constructors too and passed them incorrectly. This simply reverses the order of the check. llvm-svn: 184603
This commit is contained in:
parent
fe941943a6
commit
1060eae78e
|
@ -3340,13 +3340,13 @@ ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty, int *VFPRegs,
|
|||
ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
|
||||
}
|
||||
|
||||
if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT))
|
||||
return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
|
||||
|
||||
// Ignore empty records.
|
||||
if (isEmptyRecord(getContext(), Ty, true))
|
||||
return ABIArgInfo::getIgnore();
|
||||
|
||||
if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT))
|
||||
return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
|
||||
|
||||
if (getABIKind() == ARMABIInfo::AAPCS_VFP) {
|
||||
// Homogeneous Aggregates need to be expanded when we can fit the aggregate
|
||||
// into VFP registers.
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
// RUN: %clang_cc1 -triple armv7-apple-ios -x c++ -emit-llvm -o - %s | FileCheck %s
|
||||
|
||||
// According to the Itanium ABI (3.1.1), types with non-trivial copy
|
||||
// constructors passed by value should be passed indirectly, with the caller
|
||||
// creating a temporary.
|
||||
|
||||
struct Empty;
|
||||
|
||||
struct Empty {
|
||||
Empty(const Empty &e);
|
||||
bool check();
|
||||
};
|
||||
|
||||
bool foo(Empty e) {
|
||||
// CHECK: @_Z3foo5Empty(%struct.Empty* %e)
|
||||
// CHECK: call {{.*}} @_ZN5Empty5checkEv(%struct.Empty* %e)
|
||||
return e.check();
|
||||
}
|
||||
|
||||
void caller(Empty &e) {
|
||||
// CHECK: @_Z6callerR5Empty(%struct.Empty* %e)
|
||||
// CHECK: call {{.*}} @_ZN5EmptyC1ERKS_(%struct.Empty* [[NEWTMP:%.*]], %struct.Empty*
|
||||
// CHECK: call {{.*}} @_Z3foo5Empty(%struct.Empty* [[NEWTMP]])
|
||||
foo(e);
|
||||
}
|
Loading…
Reference in New Issue