summaryrefslogtreecommitdiffstats
path: root/clang/CodeGen
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-06-15 21:34:29 +0000
committerChris Lattner <sabre@nondot.org>2007-06-15 21:34:29 +0000
commit2b228c95aa9bf69f27af12294149f57459ef41b1 (patch)
tree7fe530597b70eac5ebebd1941e080d4ccc77efcc /clang/CodeGen
parent52d85bdd2b63825075c50a1fdb2f917bb5252ac5 (diff)
downloadbcm5719-llvm-2b228c95aa9bf69f27af12294149f57459ef41b1.tar.gz
bcm5719-llvm-2b228c95aa9bf69f27af12294149f57459ef41b1.zip
implement codegen of calls. We can now compile:
double foo( int (*FP)(int, int, int)) { return FP(1, 2, 3); } to: define double @foo(i32 (i32, i32, i32)* %FP) { entry: %call = tail call i32 %FP( i32 1, i32 2, i32 3 ) %conv = sitofp i32 %call to double ret double %conv } llvm-svn: 39658
Diffstat (limited to 'clang/CodeGen')
-rw-r--r--clang/CodeGen/CGExpr.cpp27
-rw-r--r--clang/CodeGen/CodeGenFunction.h2
2 files changed, 29 insertions, 0 deletions
diff --git a/clang/CodeGen/CGExpr.cpp b/clang/CodeGen/CGExpr.cpp
index 53ea63d09bf..20d7c7f7cb2 100644
--- a/clang/CodeGen/CGExpr.cpp
+++ b/clang/CodeGen/CGExpr.cpp
@@ -360,6 +360,8 @@ RValue CodeGenFunction::EmitExpr(const Expr *E) {
return EmitUnaryOperator(cast<UnaryOperator>(E));
case Expr::CastExprClass:
return EmitCastExpr(cast<CastExpr>(E));
+ case Expr::CallExprClass:
+ return EmitCallExpr(cast<CallExpr>(E));
case Expr::BinaryOperatorClass:
return EmitBinaryOperator(cast<BinaryOperator>(E));
}
@@ -381,6 +383,31 @@ RValue CodeGenFunction::EmitCastExpr(const CastExpr *E) {
return EmitConversion(Src, SrcTy, E->getType(), E->getLParenLoc());
}
+RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
+ QualType Ty;
+ Value *Callee =EmitExprWithUsualUnaryConversions(E->getCallee(), Ty).getVal();
+
+ SmallVector<Value*, 16> Args;
+
+ // FIXME: Handle struct return.
+ for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
+ RValue ArgVal = EmitExprWithUsualUnaryConversions(E->getArg(i), Ty);
+
+ if (ArgVal.isScalar())
+ Args.push_back(ArgVal.getVal());
+ else // Pass by-address. FIXME: Set attribute bit on call.
+ Args.push_back(ArgVal.getAggregateVal());
+ }
+
+ Value *V = Builder.CreateCall(Callee, &Args[0], Args.size());
+ if (V->getType() != llvm::Type::VoidTy)
+ V->setName("call");
+
+ // FIXME: Struct return;
+ return RValue::get(V);
+}
+
+
//===----------------------------------------------------------------------===//
// Unary Operator Emission
//===----------------------------------------------------------------------===//
diff --git a/clang/CodeGen/CodeGenFunction.h b/clang/CodeGen/CodeGenFunction.h
index ad80b382e27..1b078879dff 100644
--- a/clang/CodeGen/CodeGenFunction.h
+++ b/clang/CodeGen/CodeGenFunction.h
@@ -45,6 +45,7 @@ namespace clang {
class StringLiteral;
class IntegerLiteral;
class CastExpr;
+ class CallExpr;
class UnaryOperator;
class BinaryOperator;
class ArraySubscriptExpr;
@@ -251,6 +252,7 @@ public:
RValue EmitIntegerLiteral(const IntegerLiteral *E);
RValue EmitCastExpr(const CastExpr *E);
+ RValue EmitCallExpr(const CallExpr *E);
// Unary Operators.
RValue EmitUnaryOperator(const UnaryOperator *E);
OpenPOWER on IntegriCloud