summaryrefslogtreecommitdiffstats
path: root/clang/CodeGen
diff options
context:
space:
mode:
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