diff options
author | Jan Wen Voung <jvoung@google.com> | 2011-11-03 00:59:44 +0000 |
---|---|---|
committer | Jan Wen Voung <jvoung@google.com> | 2011-11-03 00:59:44 +0000 |
commit | 90306934bccaadaf2b538b3c90c3dd478aa1e7d8 (patch) | |
tree | 416b748b5fcd692534fbdd3248287b12694e2f73 /lib/CodeGen/TargetInfo.cpp | |
parent | 25270b6e6a8416b7532cfe552b41794418ea19b1 (diff) |
Do not add "byval" attribute to records with non-trivial copy constructors
and destructors in the DefaultABIInfo.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143601 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/TargetInfo.cpp')
-rw-r--r-- | lib/CodeGen/TargetInfo.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 2bd341ce21..2c93249e3b 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -339,8 +339,14 @@ llvm::Value *DefaultABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, } ABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty) const { - if (isAggregateTypeForABI(Ty)) + if (isAggregateTypeForABI(Ty)) { + // Records with non trivial destructors/constructors should not be passed + // by value. + if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) + return ABIArgInfo::getIndirect(0, /*ByVal=*/false); + return ABIArgInfo::getIndirect(0); + } // Treat an enum type as its underlying type. if (const EnumType *EnumTy = Ty->getAs<EnumType>()) |