summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-08-10 17:02:28 +0000
committerChris Lattner <sabre@nondot.org>2007-08-10 17:02:28 +0000
commit90d9120453ed84fdf737ffaf492fb6e7673b31aa (patch)
tree10f9b8fe17225d0f585b68f3adb05000b96665dd
parent02697701d923deb360f0ce62182808a37d48c13b (diff)
downloadbcm5719-llvm-90d9120453ed84fdf737ffaf492fb6e7673b31aa.tar.gz
bcm5719-llvm-90d9120453ed84fdf737ffaf492fb6e7673b31aa.zip
implement initial codegen for aggregate return functions. This implements
codegen for: _Complex double bar(int); void test(_Complex double*); void test2(int c) { _Complex double X; X = bar(1); test(&X); } llvm-svn: 40993
-rw-r--r--clang/CodeGen/CGExpr.cpp15
-rw-r--r--clang/CodeGen/CodeGenFunction.cpp2
2 files changed, 13 insertions, 4 deletions
diff --git a/clang/CodeGen/CGExpr.cpp b/clang/CodeGen/CGExpr.cpp
index 65d03c2d1ea..08bd93f22db 100644
--- a/clang/CodeGen/CGExpr.cpp
+++ b/clang/CodeGen/CGExpr.cpp
@@ -721,7 +721,14 @@ RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
llvm::SmallVector<llvm::Value*, 16> Args;
- // FIXME: Handle struct return.
+ // Handle struct-return functions by passing a pointer to the location that
+ // we would like to return into.
+ if (hasAggregateLLVMType(E->getType())) {
+ // Create a temporary alloca to hold the result of the call. :(
+ Args.push_back(CreateTempAlloca(ConvertType(E->getType())));
+ // FIXME: set the stret attribute on the argument.
+ }
+
for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
QualType ArgTy = E->getArg(i)->getType();
RValue ArgVal = EmitExpr(E->getArg(i));
@@ -752,8 +759,10 @@ RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
llvm::Value *V = Builder.CreateCall(Callee, &Args[0], &Args[0]+Args.size());
if (V->getType() != llvm::Type::VoidTy)
V->setName("call");
-
- // FIXME: Struct return;
+ else if (hasAggregateLLVMType(E->getType()))
+ // Struct return.
+ return RValue::getAggregate(Args[0]);
+
return RValue::get(V);
}
diff --git a/clang/CodeGen/CodeGenFunction.cpp b/clang/CodeGen/CodeGenFunction.cpp
index 8cea3e7aafb..389bd05a70d 100644
--- a/clang/CodeGen/CodeGenFunction.cpp
+++ b/clang/CodeGen/CodeGenFunction.cpp
@@ -45,7 +45,7 @@ const llvm::Type *CodeGenFunction::ConvertType(QualType T) {
bool CodeGenFunction::hasAggregateLLVMType(QualType T) {
return !T->isRealType() && !T->isPointerType() && !T->isVoidType() &&
- !T->isVectorType();
+ !T->isVectorType() && !T->isFunctionType();
}
OpenPOWER on IntegriCloud