diff options
author | Cristian Cadar <c.cadar@imperial.ac.uk> | 2017-02-27 14:47:33 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-27 14:47:33 +0000 |
commit | bff9fb9277f890f2fd9b4acd3b9d5eed0e78f967 (patch) | |
tree | 29e23676c07a95e83c58b5bcb5f8fd4189efaf45 /lib | |
parent | 1b67624c3a2fc1ca6f60d0a2b0f675d046dbba76 (diff) | |
parent | 4c8fabc7de30e17ef116b8f413f3a973c29cb56c (diff) | |
download | klee-bff9fb9277f890f2fd9b4acd3b9d5eed0e78f967.tar.gz |
Merge pull request #600 from jirislaby/no_global_context
llvm: stop using global context
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Core/Executor.cpp | 13 | ||||
-rw-r--r-- | lib/Core/Executor.h | 4 | ||||
-rw-r--r-- | lib/Core/ExternalDispatcher.cpp | 20 | ||||
-rw-r--r-- | lib/Core/ExternalDispatcher.h | 3 | ||||
-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 |
9 files changed, 58 insertions, 47 deletions
diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 58603e7c..19a5e3f8 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -343,9 +343,10 @@ const char *Executor::TerminateReasonNames[] = { [ Unhandled ] = "xxx", }; -Executor::Executor(const InterpreterOptions &opts, InterpreterHandler *ih) +Executor::Executor(LLVMContext &ctx, const InterpreterOptions &opts, + InterpreterHandler *ih) : Interpreter(opts), kmodule(0), interpreterHandler(ih), searcher(0), - externalDispatcher(new ExternalDispatcher()), statsTracker(0), + externalDispatcher(new ExternalDispatcher(ctx)), statsTracker(0), pathWriter(0), symPathWriter(0), specialFunctionHandler(0), processTree(0), replayKTest(0), replayPath(0), usingSeeds(0), atMemoryLimit(false), inhibitForking(false), haltExecution(false), @@ -1552,7 +1553,7 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) { if (!isVoidReturn) { LLVM_TYPE_Q Type *t = caller->getType(); - if (t != Type::getVoidTy(getGlobalContext())) { + if (t != Type::getVoidTy(i->getContext())) { // may need to do coercion due to bitcasts Expr::Width from = result->getWidth(); Expr::Width to = getWidthForLLVMType(t); @@ -3087,7 +3088,7 @@ void Executor::callExternalFunction(ExecutionState &state, } LLVM_TYPE_Q Type *resultType = target->inst->getType(); - if (resultType != Type::getVoidTy(getGlobalContext())) { + if (resultType != Type::getVoidTy(function->getContext())) { ref<Expr> e = ConstantExpr::fromMemory((void*) args, getWidthForLLVMType(resultType)); bindLocal(target, state, e); @@ -3756,7 +3757,7 @@ Expr::Width Executor::getWidthForLLVMType(LLVM_TYPE_Q llvm::Type *type) const { /// -Interpreter *Interpreter::create(const InterpreterOptions &opts, +Interpreter *Interpreter::create(LLVMContext &ctx, const InterpreterOptions &opts, InterpreterHandler *ih) { - return new Executor(opts, ih); + return new Executor(ctx, opts, ih); } diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index 93d1443e..4970b8a0 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -41,6 +41,7 @@ namespace llvm { class Function; class GlobalValue; class Instruction; + class LLVMContext; #if LLVM_VERSION_CODE <= LLVM_VERSION(3, 1) class TargetData; #else @@ -434,7 +435,8 @@ private: void doDumpStates(); public: - Executor(const InterpreterOptions &opts, InterpreterHandler *ie); + Executor(llvm::LLVMContext &ctx, const InterpreterOptions &opts, + InterpreterHandler *ie); virtual ~Executor(); const InterpreterHandler& getHandler() { diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp index ecc9912e..01c5f935 100644 --- a/lib/Core/ExternalDispatcher.cpp +++ b/lib/Core/ExternalDispatcher.cpp @@ -85,8 +85,8 @@ void *ExternalDispatcher::resolveSymbol(const std::string &name) { return addr; } -ExternalDispatcher::ExternalDispatcher() { - dispatchModule = new Module("ExternalDispatcher", getGlobalContext()); +ExternalDispatcher::ExternalDispatcher(LLVMContext &ctx) { + dispatchModule = new Module("ExternalDispatcher", ctx); std::string error; executionEngine = ExecutionEngine::createJIT(dispatchModule, &error); @@ -195,6 +195,7 @@ Function *ExternalDispatcher::createDispatcher(Function *target, Instruction *in if (!resolveSymbol(target->getName())) return 0; + LLVMContext &ctx = target->getContext(); CallSite cs; if (inst->getOpcode()==Instruction::Call) { cs = CallSite(cast<CallInst>(inst)); @@ -206,20 +207,20 @@ Function *ExternalDispatcher::createDispatcher(Function *target, Instruction *in std::vector<LLVM_TYPE_Q Type*> nullary; - Function *dispatcher = Function::Create(FunctionType::get(Type::getVoidTy(getGlobalContext()), + Function *dispatcher = Function::Create(FunctionType::get(Type::getVoidTy(ctx), nullary, false), GlobalVariable::ExternalLinkage, "", dispatchModule); - BasicBlock *dBB = BasicBlock::Create(getGlobalContext(), "entry", dispatcher); + BasicBlock *dBB = BasicBlock::Create(ctx, "entry", dispatcher); // Get a Value* for &gTheArgsP, as an i64**. Instruction *argI64sp = - new IntToPtrInst(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), + new IntToPtrInst(ConstantInt::get(Type::getInt64Ty(ctx), (uintptr_t) (void*) &gTheArgsP), - PointerType::getUnqual(PointerType::getUnqual(Type::getInt64Ty(getGlobalContext()))), + PointerType::getUnqual(PointerType::getUnqual(Type::getInt64Ty(ctx))), "argsp", dBB); Instruction *argI64s = new LoadInst(argI64sp, "args", dBB); @@ -238,8 +239,7 @@ Function *ExternalDispatcher::createDispatcher(Function *target, Instruction *in (*ai)->getType()); Instruction *argI64p = GetElementPtrInst::Create(argI64s, - ConstantInt::get(Type::getInt32Ty(getGlobalContext()), - idx), + ConstantInt::get(Type::getInt32Ty(ctx), idx), "", dBB); Instruction *argp = new BitCastInst(argI64p, PointerType::getUnqual(argTy), @@ -260,14 +260,14 @@ Function *ExternalDispatcher::createDispatcher(Function *target, Instruction *in #else Instruction *result = CallInst::Create(dispatchTarget, args, args+i, "", dBB); #endif - if (result->getType() != Type::getVoidTy(getGlobalContext())) { + if (result->getType() != Type::getVoidTy(ctx)) { Instruction *resp = new BitCastInst(argI64s, PointerType::getUnqual(result->getType()), "", dBB); new StoreInst(result, resp, dBB); } - ReturnInst::Create(getGlobalContext(), dBB); + ReturnInst::Create(ctx, dBB); delete[] args; diff --git a/lib/Core/ExternalDispatcher.h b/lib/Core/ExternalDispatcher.h index d8d9dc58..94363bab 100644 --- a/lib/Core/ExternalDispatcher.h +++ b/lib/Core/ExternalDispatcher.h @@ -17,6 +17,7 @@ namespace llvm { class ExecutionEngine; class Instruction; + class LLVMContext; class Function; class FunctionType; class Module; @@ -35,7 +36,7 @@ namespace klee { bool runProtectedCall(llvm::Function *f, uint64_t *args); public: - ExternalDispatcher(); + ExternalDispatcher(llvm::LLVMContext &ctx); ~ExternalDispatcher(); /* Call the given function using the parameter passing convention of 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) { |