diff options
Diffstat (limited to 'lib/Module')
-rw-r--r-- | lib/Module/Checks.cpp | 19 | ||||
-rw-r--r-- | lib/Module/IntrinsicCleaner.cpp | 11 | ||||
-rw-r--r-- | lib/Module/KModule.cpp | 26 | ||||
-rw-r--r-- | lib/Module/LowerSwitch.cpp | 4 | ||||
-rw-r--r-- | lib/Module/ModuleUtil.cpp | 5 |
5 files changed, 36 insertions, 29 deletions
diff --git a/lib/Module/Checks.cpp b/lib/Module/Checks.cpp index 7d9b7284..44b35e6e 100644 --- a/lib/Module/Checks.cpp +++ b/lib/Module/Checks.cpp @@ -53,6 +53,7 @@ char DivCheckPass::ID; bool DivCheckPass::runOnModule(Module &M) { Function *divZeroCheckFunction = 0; + LLVMContext &ctx = M.getContext(); bool moduleChanged = false; @@ -67,7 +68,7 @@ bool DivCheckPass::runOnModule(Module &M) { CastInst *denominator = CastInst::CreateIntegerCast(i->getOperand(1), - Type::getInt64Ty(getGlobalContext()), + Type::getInt64Ty(ctx), false, /* sign doesn't matter */ "int_cast_to_i64", i); @@ -75,8 +76,8 @@ bool DivCheckPass::runOnModule(Module &M) { // Lazily bind the function to avoid always importing it. if (!divZeroCheckFunction) { Constant *fc = M.getOrInsertFunction("klee_div_zero_check", - Type::getVoidTy(getGlobalContext()), - Type::getInt64Ty(getGlobalContext()), + Type::getVoidTy(ctx), + Type::getInt64Ty(ctx), NULL); divZeroCheckFunction = cast<Function>(fc); } @@ -100,6 +101,7 @@ char OvershiftCheckPass::ID; bool OvershiftCheckPass::runOnModule(Module &M) { Function *overshiftCheckFunction = 0; + LLVMContext &ctx = M.getContext(); bool moduleChanged = false; @@ -118,12 +120,13 @@ bool OvershiftCheckPass::runOnModule(Module &M) { // Determine bit width of first operand uint64_t bitWidth=i->getOperand(0)->getType()->getScalarSizeInBits(); - ConstantInt *bitWidthC = ConstantInt::get(Type::getInt64Ty(getGlobalContext()),bitWidth,false); + ConstantInt *bitWidthC = ConstantInt::get(Type::getInt64Ty(ctx), + bitWidth, false); args.push_back(bitWidthC); CastInst *shift = CastInst::CreateIntegerCast(i->getOperand(1), - Type::getInt64Ty(getGlobalContext()), + Type::getInt64Ty(ctx), false, /* sign doesn't matter */ "int_cast_to_i64", i); @@ -133,9 +136,9 @@ bool OvershiftCheckPass::runOnModule(Module &M) { // Lazily bind the function to avoid always importing it. if (!overshiftCheckFunction) { Constant *fc = M.getOrInsertFunction("klee_overshift_check", - Type::getVoidTy(getGlobalContext()), - Type::getInt64Ty(getGlobalContext()), - Type::getInt64Ty(getGlobalContext()), + Type::getVoidTy(ctx), + Type::getInt64Ty(ctx), + Type::getInt64Ty(ctx), NULL); overshiftCheckFunction = cast<Function>(fc); } diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp index 54582e69..3f7644af 100644 --- a/lib/Module/IntrinsicCleaner.cpp +++ b/lib/Module/IntrinsicCleaner.cpp @@ -70,6 +70,7 @@ bool IntrinsicCleanerPass::runOnModule(Module &M) { bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { bool dirty = false; bool block_split=false; + LLVMContext &ctx = M.getContext(); #if LLVM_VERSION_CODE <= LLVM_VERSION(3, 1) unsigned WordSize = TargetData.getPointerSizeInBits() / 8; @@ -97,18 +98,18 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { Value *src = ii->getArgOperand(1); if (WordSize == 4) { - Type *i8pp = PointerType::getUnqual(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext()))); + Type *i8pp = PointerType::getUnqual(PointerType::getUnqual(Type::getInt8Ty(ctx))); Value *castedDst = CastInst::CreatePointerCast(dst, i8pp, "vacopy.cast.dst", ii); Value *castedSrc = CastInst::CreatePointerCast(src, i8pp, "vacopy.cast.src", ii); Value *load = new LoadInst(castedSrc, "vacopy.read", ii); new StoreInst(load, castedDst, false, ii); } else { assert(WordSize == 8 && "Invalid word size!"); - Type *i64p = PointerType::getUnqual(Type::getInt64Ty(getGlobalContext())); + Type *i64p = PointerType::getUnqual(Type::getInt64Ty(ctx)); Value *pDst = CastInst::CreatePointerCast(dst, i64p, "vacopy.cast.dst", ii); Value *pSrc = CastInst::CreatePointerCast(src, i64p, "vacopy.cast.src", ii); Value *val = new LoadInst(pSrc, std::string(), ii); new StoreInst(val, pDst, ii); - Value *off = ConstantInt::get(Type::getInt64Ty(getGlobalContext()), 1); + Value *off = ConstantInt::get(Type::getInt64Ty(ctx), 1); pDst = GetElementPtrInst::Create(pDst, off, std::string(), ii); pSrc = GetElementPtrInst::Create(pSrc, off, std::string(), ii); val = new LoadInst(pSrc, std::string(), ii); new StoreInst(val, pDst, ii); @@ -223,12 +224,12 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { // a call of the abort() function. Function *F = cast<Function>( M.getOrInsertFunction( - "abort", Type::getVoidTy(getGlobalContext()), NULL)); + "abort", Type::getVoidTy(ctx), NULL)); F->setDoesNotReturn(); F->setDoesNotThrow(); CallInst::Create(F, Twine(), ii); - new UnreachableInst(getGlobalContext(), ii); + new UnreachableInst(ctx, ii); ii->eraseFromParent(); diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp index 57346a31..3259873e 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -144,12 +144,12 @@ static Function *getStubFunctionForCtorList(Module *m, std::vector<LLVM_TYPE_Q Type*> nullary; - Function *fn = Function::Create(FunctionType::get(Type::getVoidTy(getGlobalContext()), + Function *fn = Function::Create(FunctionType::get(Type::getVoidTy(m->getContext()), nullary, false), GlobalVariable::InternalLinkage, name, m); - BasicBlock *bb = BasicBlock::Create(getGlobalContext(), "entry", fn); + BasicBlock *bb = BasicBlock::Create(m->getContext(), "entry", fn); // From lli: // Should be an array of '{ int, void ()* }' structs. The first value is @@ -174,7 +174,7 @@ static Function *getStubFunctionForCtorList(Module *m, } } - ReturnInst::Create(getGlobalContext(), bb); + ReturnInst::Create(m->getContext(), bb); return fn; } @@ -241,11 +241,13 @@ void KModule::addInternalFunction(const char* functionName){ void KModule::prepare(const Interpreter::ModuleOptions &opts, InterpreterHandler *ih) { + LLVMContext &ctx = module->getContext(); + if (!MergeAtExit.empty()) { Function *mergeFn = module->getFunction("klee_merge"); if (!mergeFn) { LLVM_TYPE_Q llvm::FunctionType *Ty = - FunctionType::get(Type::getVoidTy(getGlobalContext()), + FunctionType::get(Type::getVoidTy(ctx), std::vector<LLVM_TYPE_Q Type*>(), false); mergeFn = Function::Create(Ty, GlobalVariable::ExternalLinkage, "klee_merge", @@ -264,16 +266,16 @@ void KModule::prepare(const Interpreter::ModuleOptions &opts, name.c_str()); } - BasicBlock *exit = BasicBlock::Create(getGlobalContext(), "exit", f); + BasicBlock *exit = BasicBlock::Create(ctx, "exit", f); PHINode *result = 0; - if (f->getReturnType() != Type::getVoidTy(getGlobalContext())) + if (f->getReturnType() != Type::getVoidTy(ctx)) #if LLVM_VERSION_CODE >= LLVM_VERSION(3, 0) result = PHINode::Create(f->getReturnType(), 0, "retval", exit); #else result = PHINode::Create(f->getReturnType(), "retval", exit); #endif CallInst::Create(mergeFn, "", exit); - ReturnInst::Create(getGlobalContext(), result, exit); + ReturnInst::Create(ctx, result, exit); llvm::errs() << "KLEE: adding klee_merge at exit of: " << name << "\n"; for (llvm::Function::iterator bbit = f->begin(), bbie = f->end(); @@ -317,19 +319,19 @@ void KModule::prepare(const Interpreter::ModuleOptions &opts, // by name. We only add them if such a function doesn't exist to // avoid creating stale uses. - LLVM_TYPE_Q llvm::Type *i8Ty = Type::getInt8Ty(getGlobalContext()); + LLVM_TYPE_Q llvm::Type *i8Ty = Type::getInt8Ty(ctx); forceImport(module, "memcpy", PointerType::getUnqual(i8Ty), PointerType::getUnqual(i8Ty), PointerType::getUnqual(i8Ty), - targetData->getIntPtrType(getGlobalContext()), (Type*) 0); + targetData->getIntPtrType(ctx), (Type*) 0); forceImport(module, "memmove", PointerType::getUnqual(i8Ty), PointerType::getUnqual(i8Ty), PointerType::getUnqual(i8Ty), - targetData->getIntPtrType(getGlobalContext()), (Type*) 0); + targetData->getIntPtrType(ctx), (Type*) 0); forceImport(module, "memset", PointerType::getUnqual(i8Ty), PointerType::getUnqual(i8Ty), - Type::getInt32Ty(getGlobalContext()), - targetData->getIntPtrType(getGlobalContext()), (Type*) 0); + Type::getInt32Ty(ctx), + targetData->getIntPtrType(ctx), (Type*) 0); #endif // FIXME: Missing force import for various math functions. diff --git a/lib/Module/LowerSwitch.cpp b/lib/Module/LowerSwitch.cpp index a98b84ad..7f28748a 100644 --- a/lib/Module/LowerSwitch.cpp +++ b/lib/Module/LowerSwitch.cpp @@ -66,7 +66,7 @@ void LowerSwitchPass::switchConvert(CaseItr begin, CaseItr end, // iterate through all the cases, creating a new BasicBlock for each for (CaseItr it = begin; it < end; ++it) { - BasicBlock *newBlock = BasicBlock::Create(getGlobalContext(), "NodeBlock"); + BasicBlock *newBlock = BasicBlock::Create(F->getContext(), "NodeBlock"); Function::iterator FI = origBlock; F->getBasicBlockList().insert(++FI, newBlock); @@ -102,7 +102,7 @@ void LowerSwitchPass::processSwitchInst(SwitchInst *SI) { // Create a new, empty default block so that the new hierarchy of // if-then statements go to this and the PHI nodes are happy. - BasicBlock* newDefault = BasicBlock::Create(getGlobalContext(), "newDefault"); + BasicBlock* newDefault = BasicBlock::Create(F->getContext(), "newDefault"); F->getBasicBlockList().insert(defaultBlock, newDefault); BranchInst::Create(defaultBlock, newDefault); diff --git a/lib/Module/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp index 2cd41c89..94a37e08 100644 --- a/lib/Module/ModuleUtil.cpp +++ b/lib/Module/ModuleUtil.cpp @@ -248,7 +248,8 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er if (buff) { // FIXME: Maybe load bitcode file lazily? Then if we need to link, materialise the module - Result = ParseBitcodeFile(buff.get(), getGlobalContext(), &errorMessage); + Result = ParseBitcodeFile(buff.get(), composite->getContext(), + &errorMessage); if(!Result) { @@ -378,7 +379,7 @@ Module *klee::linkWithLibrary(Module *module, sys::fs::file_magic magic = sys::fs::identify_magic(Buffer->getBuffer()); - LLVMContext &Context = getGlobalContext(); + LLVMContext &Context = module->getContext(); std::string ErrorMessage; if (magic == sys::fs::file_magic::bitcode) { |