diff options
Diffstat (limited to 'lib/Module')
-rw-r--r-- | lib/Module/Checks.cpp | 3 | ||||
-rw-r--r-- | lib/Module/InstructionInfoTable.cpp | 54 | ||||
-rw-r--r-- | lib/Module/IntrinsicCleaner.cpp | 5 | ||||
-rw-r--r-- | lib/Module/KModule.cpp | 7 | ||||
-rw-r--r-- | lib/Module/LowerSwitch.cpp | 3 | ||||
-rw-r--r-- | lib/Module/Optimize.cpp | 6 | ||||
-rw-r--r-- | lib/Module/RaiseAsm.cpp | 3 |
7 files changed, 68 insertions, 13 deletions
diff --git a/lib/Module/Checks.cpp b/lib/Module/Checks.cpp index ee7029c7..2edcf940 100644 --- a/lib/Module/Checks.cpp +++ b/lib/Module/Checks.cpp @@ -16,6 +16,9 @@ #include "llvm/Instruction.h" #include "llvm/Instructions.h" #include "llvm/IntrinsicInst.h" +#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) +#include "llvm/LLVMContext.h" +#endif #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Type.h" diff --git a/lib/Module/InstructionInfoTable.cpp b/lib/Module/InstructionInfoTable.cpp index 196d9dc7..2efe981b 100644 --- a/lib/Module/InstructionInfoTable.cpp +++ b/lib/Module/InstructionInfoTable.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "klee/Config/config.h" #include "klee/Internal/Module/InstructionInfoTable.h" #include "llvm/Function.h" @@ -18,6 +19,9 @@ #include "llvm/Support/CFG.h" #include "llvm/Support/InstIterator.h" #include "llvm/Support/raw_ostream.h" +#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) +#include "llvm/Analysis/DebugInfo.h" +#endif #include "llvm/Analysis/ValueTracking.h" #include <map> @@ -59,7 +63,8 @@ static void buildInstructionToLineMap(Module *m, } } -static std::string getDSPIPath(DbgStopPointInst *dspi) { +#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) +static std::string getDSPIPath(const DbgStopPointInst *dspi) { std::string dir, file; bool res = GetConstantStringInfo(dspi->getDirectory(), dir); assert(res && "GetConstantStringInfo failed"); @@ -73,6 +78,40 @@ static std::string getDSPIPath(DbgStopPointInst *dspi) { return dir + "/" + file; } } +#else +static std::string getDSPIPath(DILocation Loc) { + std::string dir = Loc.getDirectory(); + std::string file = Loc.getFilename(); + if (dir.empty()) { + return file; + } else if (*dir.rbegin() == '/') { + return dir + file; + } else { + return dir + "/" + file; + } +} +#endif + +bool InstructionInfoTable::getInstructionDebugInfo(const llvm::Instruction *I, + const std::string *&File, + unsigned &Line) { +#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) + if (const DbgStopPointInst *dspi = dyn_cast<DbgStopPointInst>(I)) { + File = internString(getDSPIPath(dspi)); + Line = dspi->getLine(); + return true; + } +#else + if (MDNode *N = I->getMetadata("dbg")) { + DILocation Loc(N); + File = internString(getDSPIPath(Loc)); + Line = Loc.getLineNumber(); + return true; + } +#endif + + return false; +} InstructionInfoTable::InstructionInfoTable(Module *m) : dummyString(""), dummyInfo(0, dummyString, 0, 0) { @@ -89,13 +128,9 @@ InstructionInfoTable::InstructionInfoTable(Module *m) // following the CFG, but it is not clear that it ever matters in // practice. for (inst_iterator it = inst_begin(fnIt), ie = inst_end(fnIt); - it != ie; ++it) { - if (DbgStopPointInst *dspi = dyn_cast<DbgStopPointInst>(&*it)) { - initialFile = internString(getDSPIPath(dspi)); - initialLine = dspi->getLine(); + it != ie; ++it) + if (getInstructionDebugInfo(&*it, initialFile, initialLine)) break; - } - } typedef std::map<BasicBlock*, std::pair<const std::string*,unsigned> > sourceinfo_ty; @@ -129,10 +164,7 @@ InstructionInfoTable::InstructionInfoTable(Module *m) lineTable.find(instr); if (ltit!=lineTable.end()) assemblyLine = ltit->second; - if (DbgStopPointInst *dspi = dyn_cast<DbgStopPointInst>(instr)) { - file = internString(getDSPIPath(dspi)); - line = dspi->getLine(); - } + getInstructionDebugInfo(instr, file, line); infos.insert(std::make_pair(instr, InstructionInfo(id++, *file, diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp index a73d8ca6..4d44f800 100644 --- a/lib/Module/IntrinsicCleaner.cpp +++ b/lib/Module/IntrinsicCleaner.cpp @@ -16,6 +16,9 @@ #include "llvm/Instruction.h" #include "llvm/Instructions.h" #include "llvm/IntrinsicInst.h" +#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) +#include "llvm/LLVMContext.h" +#endif #include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Type.h" @@ -85,6 +88,7 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b) { break; } +#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) case Intrinsic::dbg_stoppoint: { // We can remove this stoppoint if the next instruction is // sure to be another stoppoint. This is nice for cleanliness @@ -117,6 +121,7 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b) { case Intrinsic::dbg_region_start: case Intrinsic::dbg_region_end: case Intrinsic::dbg_func_start: +#endif case Intrinsic::dbg_declare: // Remove these regardless of lower intrinsics flag. This can // be removed once IntrinsicLowering is fixed to not have bad diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp index 108adabd..76291cdc 100644 --- a/lib/Module/KModule.cpp +++ b/lib/Module/KModule.cpp @@ -22,12 +22,15 @@ #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Instructions.h" +#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) +#include "llvm/LLVMContext.h" +#endif #include "llvm/Module.h" #include "llvm/PassManager.h" #include "llvm/ValueSymbolTable.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" -#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR == 6) +#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) #include "llvm/Support/raw_os_ostream.h" #endif #include "llvm/System/Path.h" @@ -329,7 +332,7 @@ void KModule::prepare(const Interpreter::ModuleOptions &opts, std::ostream *os = ih->openOutputFile("assembly.ll"); assert(os && os->good() && "unable to open source output"); -#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR == 6) +#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 6) // We have an option for this in case the user wants a .ll they // can compile. if (NoTruncateSourceLines) { diff --git a/lib/Module/LowerSwitch.cpp b/lib/Module/LowerSwitch.cpp index 381ebd29..7d6920be 100644 --- a/lib/Module/LowerSwitch.cpp +++ b/lib/Module/LowerSwitch.cpp @@ -15,6 +15,9 @@ //===----------------------------------------------------------------------===// #include "Passes.h" +#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) +#include "llvm/LLVMContext.h" +#endif #include <algorithm> using namespace llvm; diff --git a/lib/Module/Optimize.cpp b/lib/Module/Optimize.cpp index 83e67292..affe9392 100644 --- a/lib/Module/Optimize.cpp +++ b/lib/Module/Optimize.cpp @@ -94,7 +94,9 @@ static void AddStandardCompilePasses(PassManager &PM) { if (DisableOptimizations) return; +#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) addPass(PM, createRaiseAllocationsPass()); // call %malloc -> malloc inst +#endif addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code addPass(PM, createPromoteMemoryToRegisterPass());// Kill useless allocas addPass(PM, createGlobalOptimizerPass()); // Optimize out global vars @@ -117,7 +119,9 @@ static void AddStandardCompilePasses(PassManager &PM) { addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs addPass(PM, createScalarReplAggregatesPass()); // Break up aggregate allocas addPass(PM, createInstructionCombiningPass()); // Combine silly seq's +#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) addPass(PM, createCondPropagationPass()); // Propagate conditionals +#endif addPass(PM, createTailCallEliminationPass()); // Eliminate tail calls addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs @@ -139,7 +143,9 @@ static void AddStandardCompilePasses(PassManager &PM) { // Run instcombine after redundancy elimination to exploit opportunities // opened up by them. addPass(PM, createInstructionCombiningPass()); +#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) addPass(PM, createCondPropagationPass()); // Propagate conditionals +#endif addPass(PM, createDeadStoreEliminationPass()); // Delete dead stores addPass(PM, createAggressiveDCEPass()); // Delete dead instructions diff --git a/lib/Module/RaiseAsm.cpp b/lib/Module/RaiseAsm.cpp index b62338a6..42940fda 100644 --- a/lib/Module/RaiseAsm.cpp +++ b/lib/Module/RaiseAsm.cpp @@ -10,6 +10,9 @@ #include "Passes.h" #include "llvm/InlineAsm.h" +#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7) +#include "llvm/LLVMContext.h" +#endif using namespace llvm; using namespace klee; |