diff options
author | Anders Carlsson <andersca@mac.com> | 2009-10-20 22:07:59 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-10-20 22:07:59 +0000 |
commit | 5789c497a0e3d64ff1551c4469cde1cb2283e613 (patch) | |
tree | 7ad7bd9dc6e917a6b01cc73bd6b2090acd7cc408 /clang/lib/CodeGen/TargetABIInfo.cpp | |
parent | d45ff6cced877257fbf5ea0e67f08287fb3c6c3a (diff) | |
download | bcm5719-llvm-5789c497a0e3d64ff1551c4469cde1cb2283e613.tar.gz bcm5719-llvm-5789c497a0e3d64ff1551c4469cde1cb2283e613.zip |
Fix the 32-bit ABI to return structures with non-trivial copy ctors or dtors indirectly.
llvm-svn: 84686
Diffstat (limited to 'clang/lib/CodeGen/TargetABIInfo.cpp')
-rw-r--r-- | clang/lib/CodeGen/TargetABIInfo.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/TargetABIInfo.cpp b/clang/lib/CodeGen/TargetABIInfo.cpp index ea1426277d1..ad5dbd22763 100644 --- a/clang/lib/CodeGen/TargetABIInfo.cpp +++ b/clang/lib/CodeGen/TargetABIInfo.cpp @@ -353,11 +353,17 @@ ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy, return ABIArgInfo::getDirect(); } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { - // Structures with flexible arrays are always indirect. - if (const RecordType *RT = RetTy->getAsStructureType()) + if (const RecordType *RT = RetTy->getAsStructureType()) { + // Structures with either a non-trivial destructor or a non-trivial + // copy constructor are always indirect. + if (hasNonTrivialDestructorOrCopyConstructor(RT)) + return ABIArgInfo::getIndirect(0, /*ByVal=*/false); + + // Structures with flexible arrays are always indirect. if (RT->getDecl()->hasFlexibleArrayMember()) return ABIArgInfo::getIndirect(0); - + } + // If specified, structs and unions are always indirect. if (!IsSmallStructInRegABI && !RetTy->isAnyComplexType()) return ABIArgInfo::getIndirect(0); |