From 6b45b67b261a557b9e02afe9962aeefffb587f45 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 14 May 2010 03:40:53 +0000 Subject: [PATCH] C++/Darwin/x86: Teach IRgen it can pass reference types in registers. llvm-svn: 103761 --- clang/lib/CodeGen/TargetInfo.cpp | 4 ++-- clang/test/CodeGenCXX/x86_32-arguments.cpp | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index bcd332ac95fe..09baf2e83396 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -188,7 +188,7 @@ static const Type *isSingleElementStruct(QualType T, ASTContext &Context) { } static bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) { - if (!Ty->getAs() && !Ty->isAnyPointerType() && + if (!Ty->getAs() && !Ty->hasPointerRepresentation() && !Ty->isAnyComplexType() && !Ty->isEnumeralType() && !Ty->isBlockPointerType()) return false; @@ -388,7 +388,7 @@ bool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty, } // If this is a builtin, pointer, enum, or complex type, it is ok. - if (Ty->getAs() || Ty->isAnyPointerType() || + if (Ty->getAs() || Ty->hasPointerRepresentation() || Ty->isAnyComplexType() || Ty->isEnumeralType() || Ty->isBlockPointerType()) return true; diff --git a/clang/test/CodeGenCXX/x86_32-arguments.cpp b/clang/test/CodeGenCXX/x86_32-arguments.cpp index 3af2746345d4..a92ba78b9f6d 100644 --- a/clang/test/CodeGenCXX/x86_32-arguments.cpp +++ b/clang/test/CodeGenCXX/x86_32-arguments.cpp @@ -83,3 +83,7 @@ struct s4_0 { float x; }; struct s4_1 { float x; }; struct s4_2 : s4_0, s4_1 { }; s4_2 f4() { return s4_2(); } + +// CHECK: define i32 @_Z2f5v() +struct s5 { s5(); int &x; }; +s5 f5() { return s5(); }