diff options
| author | Anders Carlsson <andersca@mac.com> | 2010-01-27 03:25:19 +0000 | 
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2010-01-27 03:25:19 +0000 | 
| commit | 40446e8a0afbf9b18e387b8f2c324d1e219c148b (patch) | |
| tree | 93022e4c31cbb9679770066427ef7919ff2d6797 /clang/lib | |
| parent | 0af6ac417fa64e6cca28b275bd97026d32f5e77c (diff) | |
| download | bcm5719-llvm-40446e8a0afbf9b18e387b8f2c324d1e219c148b.tar.gz bcm5719-llvm-40446e8a0afbf9b18e387b8f2c324d1e219c148b.zip  | |
Structs and classes with non-trivial destructors or copy constructors should be passed indirectly in the 32-bit ABI. Fixes PR6094.
llvm-svn: 94656
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 4454662a930..bc512e7a276 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -358,6 +358,8 @@ bool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty,    const RecordType *RT = Ty->getAs<RecordType>();    if (!RT) return false; +  // FIXME: Traverse bases here too. +    // Structure types are passed in register if all fields would be    // passed in a register.    for (RecordDecl::field_iterator i = RT->getDecl()->field_begin(), @@ -404,7 +406,7 @@ ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,      return ABIArgInfo::getDirect();    } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { -    if (const RecordType *RT = RetTy->getAsStructureType()) { +    if (const RecordType *RT = RetTy->getAs<RecordType>()) {        // Structures with either a non-trivial destructor or a non-trivial        // copy constructor are always indirect.        if (hasNonTrivialDestructorOrCopyConstructor(RT)) @@ -484,10 +486,16 @@ ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,    // FIXME: Set alignment on indirect arguments.    if (CodeGenFunction::hasAggregateLLVMType(Ty)) {      // Structures with flexible arrays are always indirect. -    if (const RecordType *RT = Ty->getAsStructureType()) +    if (const RecordType *RT = Ty->getAs<RecordType>()) { +      // 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); +                if (RT->getDecl()->hasFlexibleArrayMember())          return ABIArgInfo::getIndirect(getIndirectArgumentAlignment(Ty,                                                                      Context)); +    }      // Ignore empty structs.      if (Ty->isStructureType() && Context.getTypeSize(Ty) == 0)  | 

