diff options
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); |