diff options
author | Chris Lattner <sabre@nondot.org> | 2007-06-15 21:34:29 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-06-15 21:34:29 +0000 |
commit | 2b228c95aa9bf69f27af12294149f57459ef41b1 (patch) | |
tree | 7fe530597b70eac5ebebd1941e080d4ccc77efcc /clang/CodeGen | |
parent | 52d85bdd2b63825075c50a1fdb2f917bb5252ac5 (diff) | |
download | bcm5719-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.cpp | 27 | ||||
-rw-r--r-- | clang/CodeGen/CodeGenFunction.h | 2 |
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); |