aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/Module
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Module')
-rw-r--r--lib/Module/IntrinsicCleaner.cpp25
-rw-r--r--lib/Module/Passes.h2
2 files changed, 24 insertions, 3 deletions
diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp
index 9c2f4455..64a47e1b 100644
--- a/lib/Module/IntrinsicCleaner.cpp
+++ b/lib/Module/IntrinsicCleaner.cpp
@@ -60,11 +60,11 @@ bool IntrinsicCleanerPass::runOnModule(Module &M) {
bool dirty = false;
for (Module::iterator f = M.begin(), fe = M.end(); f != fe; ++f)
for (Function::iterator b = f->begin(), be = f->end(); b != be; ++b)
- dirty |= runOnBasicBlock(*b);
+ dirty |= runOnBasicBlock(*b, M);
return dirty;
}
-bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b) {
+bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) {
bool dirty = false;
#if LLVM_VERSION_CODE <= LLVM_VERSION(3, 1)
@@ -195,6 +195,27 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b) {
ii->eraseFromParent();
dirty = true;
break;
+
+ case Intrinsic::trap: {
+ // Intrisic instruction "llvm.trap" found. Directly lower it to
+ // a call of the abort() function.
+ Function *F = cast<Function>(
+ M.getOrInsertFunction(
+ "abort", Type::getVoidTy(getGlobalContext()), NULL));
+ F->setDoesNotReturn();
+ F->setDoesNotThrow();
+
+ CallInst::Create(F, Twine(), ii);
+ new UnreachableInst(getGlobalContext(), ii);
+
+ ii->eraseFromParent();
+
+ if (Function *Declare = M.getFunction("llvm.trap"))
+ Declare->eraseFromParent();
+
+ dirty = true;
+ break;
+ }
default:
if (LowerIntrinsics)
diff --git a/lib/Module/Passes.h b/lib/Module/Passes.h
index ebe89b2b..d83e57ec 100644
--- a/lib/Module/Passes.h
+++ b/lib/Module/Passes.h
@@ -82,7 +82,7 @@ class IntrinsicCleanerPass : public llvm::ModulePass {
llvm::IntrinsicLowering *IL;
bool LowerIntrinsics;
- bool runOnBasicBlock(llvm::BasicBlock &b);
+ bool runOnBasicBlock(llvm::BasicBlock &b, llvm::Module &M);
public:
#if LLVM_VERSION_CODE <= LLVM_VERSION(3, 1)
IntrinsicCleanerPass(const llvm::TargetData &TD,