aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-12-15 00:35:12 +0000
committerMike Stump <mrs@apple.com>2009-12-15 00:35:12 +0000
commit15037caa1542bb810ad54c653aeb80f61df7b00c (patch)
tree9d077c2126bc2964760c9bdf6a73efa42af18ab0
parentfcc9322479e863640b6aa0c1e4b4644a9e41e1c1 (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.cpp32
-rw-r--r--lib/CodeGen/CGExprScalar.cpp4
-rw-r--r--lib/CodeGen/CodeGenFunction.cpp2
-rw-r--r--lib/CodeGen/CodeGenFunction.h8
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);