diff options
author | Mike Stump <mrs@apple.com> | 2009-12-15 00:35:12 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-12-15 00:35:12 +0000 |
commit | 15037caa1542bb810ad54c653aeb80f61df7b00c (patch) | |
tree | 9d077c2126bc2964760c9bdf6a73efa42af18ab0 | |
parent | fcc9322479e863640b6aa0c1e4b4644a9e41e1c1 (diff) |
Switch codegen for -fcatch-undefined-bahavior over to __builtin_trap
instead of abort to improve codesize and codegen.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91374 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 32 | ||||
-rw-r--r-- | lib/CodeGen/CGExprScalar.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 8 |
4 files changed, 20 insertions, 26 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index b9334d0a84..975f749255 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -17,6 +17,7 @@ #include "CGObjCRuntime.h" #include "clang/AST/ASTContext.h" #include "clang/AST/DeclObjC.h" +#include "llvm/Intrinsics.h" #include "llvm/Target/TargetData.h" using namespace clang; using namespace CodeGen; @@ -1012,34 +1013,27 @@ LValue CodeGenFunction::EmitPredefinedLValue(const PredefinedExpr *E) { } } -static llvm::Constant *getAbortFn(CodeGenFunction &CGF) { - // void abort(); - - const llvm::FunctionType *FTy = - llvm::FunctionType::get(llvm::Type::getVoidTy(CGF.getLLVMContext()), false); - - return CGF.CGM.CreateRuntimeFunction(FTy, "abort"); -} - -llvm::BasicBlock*CodeGenFunction::getAbortBB() { - if (AbortBB) - return AbortBB; +llvm::BasicBlock*CodeGenFunction::getTrapBB() { + if (TrapBB) + return TrapBB; llvm::BasicBlock *Cont = 0; if (HaveInsertPoint()) { Cont = createBasicBlock("cont"); EmitBranch(Cont); } - AbortBB = createBasicBlock("abort"); - EmitBlock(AbortBB); - llvm::CallInst *AbortCall = Builder.CreateCall(getAbortFn(*this)); - AbortCall->setDoesNotReturn(); - AbortCall->setDoesNotThrow(); + TrapBB = createBasicBlock("trap"); + EmitBlock(TrapBB); + + llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::trap, 0, 0); + llvm::CallInst *TrapCall = Builder.CreateCall(F); + TrapCall->setDoesNotReturn(); + TrapCall->setDoesNotThrow(); Builder.CreateUnreachable(); if (Cont) EmitBlock(Cont); - return AbortBB; + return TrapBB; } LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) { @@ -1080,7 +1074,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) { llvm::BasicBlock *Cont = createBasicBlock("cont"); Builder.CreateCondBr(Builder.CreateICmpULE(Idx, llvm::ConstantInt::get(Idx->getType(), Size)), - Cont, getAbortBB()); + Cont, getTrapBB()); EmitBlock(Cont); } } diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index a25e369766..2f31c051a7 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -1532,7 +1532,7 @@ Value *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) { llvm::BasicBlock *Cont = CGF.createBasicBlock("cont"); CGF.Builder.CreateCondBr(Builder.CreateICmpULT(RHS, llvm::ConstantInt::get(RHS->getType(), Width)), - Cont, CGF.getAbortBB()); + Cont, CGF.getTrapBB()); CGF.EmitBlock(Cont); } @@ -1552,7 +1552,7 @@ Value *ScalarExprEmitter::EmitShr(const BinOpInfo &Ops) { llvm::BasicBlock *Cont = CGF.createBasicBlock("cont"); CGF.Builder.CreateCondBr(Builder.CreateICmpULT(RHS, llvm::ConstantInt::get(RHS->getType(), Width)), - Cont, CGF.getAbortBB()); + Cont, CGF.getTrapBB()); CGF.EmitBlock(Cont); } diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index c3bae0768c..28df9e4d78 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -31,7 +31,7 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm) DebugInfo(0), IndirectBranch(0), SwitchInsn(0), CaseRangeBlock(0), InvokeDest(0), CXXThisDecl(0), CXXVTTDecl(0), - ConditionalBranchLevel(0), TerminateHandler(0), AbortBB(0), + ConditionalBranchLevel(0), TerminateHandler(0), TrapBB(0), UniqueAggrDestructorCount(0) { LLVMIntTy = ConvertType(getContext().IntTy); LLVMPointerWidth = Target.getPointerWidth(0); diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index a44e53b4e3..12e636c897 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -425,7 +425,7 @@ private: unsigned getByRefValueLLVMField(const ValueDecl *VD) const; llvm::BasicBlock *TerminateHandler; - llvm::BasicBlock *AbortBB; + llvm::BasicBlock *TrapBB; int UniqueAggrDestructorCount; public: @@ -1196,9 +1196,9 @@ public: void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock); - /// getAbortBB - Create a basic block that will call abort. We'll generate - /// a branch around the created basic block as necessary. - llvm::BasicBlock* getAbortBB(); + /// getTrapBB - Create a basic block that will call the trap intrinsic. We'll + /// generate a branch around the created basic block as necessary. + llvm::BasicBlock* getTrapBB(); private: void EmitReturnOfRValue(RValue RV, QualType Ty); |