Fix passing and returning of objects with non trivial copy constructors on

ARM.

Fixes PR7310.

llvm-svn: 105592
This commit is contained in:
Rafael Espindola 2010-06-08 02:42:08 +00:00
parent 0271c5928e
commit bbd44ef673
1 changed files with 10 additions and 0 deletions

View File

@ -1808,6 +1808,11 @@ ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty,
if (isEmptyRecord(Context, Ty, true))
return ABIArgInfo::getIgnore();
// Structures with either a non-trivial destructor or a non-trivial
// copy constructor are always indirect.
if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty))
return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
// FIXME: This is kind of nasty... but there isn't much choice because the ARM
// backend doesn't support byval.
// FIXME: This doesn't handle alignment > 64 bits.
@ -1927,6 +1932,11 @@ ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy,
ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
}
// Structures with either a non-trivial destructor or a non-trivial
// copy constructor are always indirect.
if (isRecordWithNonTrivialDestructorOrCopyConstructor(RetTy))
return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
// Are we following APCS?
if (getABIKind() == APCS) {
if (isEmptyRecord(Context, RetTy, false))