aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/Module
diff options
context:
space:
mode:
authorCristian Cadar <c.cadar@imperial.ac.uk>2017-02-27 14:47:33 +0000
committerGitHub <noreply@github.com>2017-02-27 14:47:33 +0000
commitbff9fb9277f890f2fd9b4acd3b9d5eed0e78f967 (patch)
tree29e23676c07a95e83c58b5bcb5f8fd4189efaf45 /lib/Module
parent1b67624c3a2fc1ca6f60d0a2b0f675d046dbba76 (diff)
parent4c8fabc7de30e17ef116b8f413f3a973c29cb56c (diff)
downloadklee-bff9fb9277f890f2fd9b4acd3b9d5eed0e78f967.tar.gz
Merge pull request #600 from jirislaby/no_global_context
llvm: stop using global context
Diffstat (limited to 'lib/Module')
-rw-r--r--lib/Module/Checks.cpp19
-rw-r--r--lib/Module/IntrinsicCleaner.cpp11
-rw-r--r--lib/Module/KModule.cpp26
-rw-r--r--lib/Module/LowerSwitch.cpp4
-rw-r--r--lib/Module/ModuleUtil.cpp5
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) {