diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-02-20 18:06:48 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-02-20 18:06:48 +0000 |
commit | cdbb5e336d0f6072cc09ec744e1bcf0254c317ab (patch) | |
tree | 8e5f8ec613150fc7434df5174cd10e8ceb47b526 /clang/lib/CodeGen/CGExpr.cpp | |
parent | 9ee23b7f1a4dec2d7c36a5a2f9f5cb1f6581a5d2 (diff) | |
download | bcm5719-llvm-cdbb5e336d0f6072cc09ec744e1bcf0254c317ab.tar.gz bcm5719-llvm-cdbb5e336d0f6072cc09ec744e1bcf0254c317ab.zip |
Set call attribute for direct calls (i.e. noreturn).
- Remove an unused variant of EmitCallExpr overload.
llvm-svn: 65130
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 5da0de9cbb6..22a6a2d02ed 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -966,29 +966,25 @@ LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr* E) RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) { + // Builtins never have block type. + if (E->getCallee()->getType()->isBlockPointerType()) + return EmitBlockCallExpr(E); + + const Decl *TargetDecl = 0; if (const ImplicitCastExpr *IcExpr = - dyn_cast<const ImplicitCastExpr>(E->getCallee())) + dyn_cast<ImplicitCastExpr>(E->getCallee())) { if (const DeclRefExpr *DRExpr = - dyn_cast<const DeclRefExpr>(IcExpr->getSubExpr())) - if (const FunctionDecl *FDecl = - dyn_cast<const FunctionDecl>(DRExpr->getDecl())) + dyn_cast<DeclRefExpr>(IcExpr->getSubExpr())) { + TargetDecl = DRExpr->getDecl(); + if (const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(TargetDecl)) if (unsigned builtinID = FDecl->getBuiltinID(getContext())) return EmitBuiltinExpr(FDecl, builtinID, E); - - if (E->getCallee()->getType()->isBlockPointerType()) - return EmitBlockCallExpr(E); + } + } llvm::Value *Callee = EmitScalarExpr(E->getCallee()); return EmitCallExpr(Callee, E->getCallee()->getType(), - E->arg_begin(), E->arg_end()); -} - -RValue CodeGenFunction::EmitCallExpr(Expr *FnExpr, - CallExpr::const_arg_iterator ArgBeg, - CallExpr::const_arg_iterator ArgEnd) { - - llvm::Value *Callee = EmitScalarExpr(FnExpr); - return EmitCallExpr(Callee, FnExpr->getType(), ArgBeg, ArgEnd); + E->arg_begin(), E->arg_end(), TargetDecl); } LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) { @@ -1108,7 +1104,8 @@ CodeGenFunction::EmitObjCSuperExpr(const ObjCSuperExpr *E) { RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, QualType CalleeType, CallExpr::const_arg_iterator ArgBeg, - CallExpr::const_arg_iterator ArgEnd) { + CallExpr::const_arg_iterator ArgEnd, + const Decl *TargetDecl) { // Get the actual function type. The callee type will always be a // pointer to function type or a block pointer type. QualType ResultType; @@ -1127,5 +1124,5 @@ RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, QualType CalleeType, I->getType())); return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args), - Callee, Args); + Callee, Args, TargetDecl); } |