about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
-rw-r--r--Makefile.common7
-rw-r--r--include/klee/Internal/Module/InstructionInfoTable.h2
-rw-r--r--include/klee/Internal/Module/KInstruction.h5
-rw-r--r--include/klee/Statistic.h5
-rw-r--r--include/klee/util/Bits.h5
-rw-r--r--lib/Core/Executor.cpp18
-rw-r--r--lib/Core/ExecutorUtil.cpp2
-rw-r--r--lib/Core/ExternalDispatcher.cpp26
-rw-r--r--lib/Core/StatsTracker.cpp5
-rw-r--r--lib/Module/Checks.cpp3
-rw-r--r--lib/Module/InstructionInfoTable.cpp54
-rw-r--r--lib/Module/IntrinsicCleaner.cpp5
-rw-r--r--lib/Module/KModule.cpp7
-rw-r--r--lib/Module/LowerSwitch.cpp3
-rw-r--r--lib/Module/Optimize.cpp6
-rw-r--r--lib/Module/RaiseAsm.cpp3
-rw-r--r--test/Makefile6
-rw-r--r--test/lib/llvm.exp6
-rw-r--r--tools/klee/main.cpp32
19 files changed, 169 insertions, 31 deletions
diff --git a/Makefile.common b/Makefile.common
index 5b093e6b..4cbe3302 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -20,7 +20,12 @@ endif
 
 include $(LLVM_SRC_ROOT)/Makefile.rules
 
+# LLVMCC was added in 2.7.
+ifeq ($(LLVMCC),)
+LLVMCC := $(LLVMGCC)
+LLVMCXX := $(LLVMGXX)
+endif
+
 LD.Flags += -L$(PROJ_SRC_ROOT)/stp/lib
-CXX.Flags += -DLLVM_23
 CXX.Flags += -I$(PROJ_SRC_ROOT)/stp/include
 CXX.Flags += -DKLEE_DIR=\"$(PROJ_SRC_ROOT)\"
diff --git a/include/klee/Internal/Module/InstructionInfoTable.h b/include/klee/Internal/Module/InstructionInfoTable.h
index c93f5ddb..98af6ac9 100644
--- a/include/klee/Internal/Module/InstructionInfoTable.h
+++ b/include/klee/Internal/Module/InstructionInfoTable.h
@@ -55,6 +55,8 @@ namespace klee {
 
   private:
     const std::string *internString(std::string s);
+    bool getInstructionDebugInfo(const llvm::Instruction *I,
+                                 const std::string *&File, unsigned &Line);
 
   public:
     InstructionInfoTable(llvm::Module *m);
diff --git a/include/klee/Internal/Module/KInstruction.h b/include/klee/Internal/Module/KInstruction.h
index 89b9dbfc..b35cf107 100644
--- a/include/klee/Internal/Module/KInstruction.h
+++ b/include/klee/Internal/Module/KInstruction.h
@@ -10,7 +10,12 @@
 #ifndef KLEE_KINSTRUCTION_H
 #define KLEE_KINSTRUCTION_H
 
+#include "klee/Config/config.h"
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
 #include "llvm/Support/DataTypes.h"
+#else
+#include "llvm/System/DataTypes.h"
+#endif
 #include <vector>
 
 namespace llvm {
diff --git a/include/klee/Statistic.h b/include/klee/Statistic.h
index 6baaedf4..7ade8dd0 100644
--- a/include/klee/Statistic.h
+++ b/include/klee/Statistic.h
@@ -10,7 +10,12 @@
 #ifndef KLEE_STATISTIC_H
 #define KLEE_STATISTIC_H
 
+#include "klee/Config/config.h"
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
 #include "llvm/Support/DataTypes.h"
+#else
+#include "llvm/System/DataTypes.h"
+#endif
 #include <string>
 
 namespace klee {
diff --git a/include/klee/util/Bits.h b/include/klee/util/Bits.h
index ffbda09e..db45acac 100644
--- a/include/klee/util/Bits.h
+++ b/include/klee/util/Bits.h
@@ -10,7 +10,12 @@
 #ifndef KLEE_UTIL_BITS_H
 #define KLEE_UTIL_BITS_H
 
+#include "klee/Config/config.h"
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
 #include "llvm/Support/DataTypes.h"
+#else
+#include "llvm/System/DataTypes.h"
+#endif
 
 namespace klee {
   namespace bits32 {
diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp
index 26c082af..ce80ea37 100644
--- a/lib/Core/Executor.cpp
+++ b/lib/Core/Executor.cpp
@@ -49,6 +49,9 @@
 #include "llvm/Function.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/ADT/StringExtras.h"
 #include "llvm/Support/CallSite.h"
@@ -1279,6 +1282,7 @@ Function* Executor::getCalledFunction(CallSite &cs, ExecutionState &state) {
 }
 
 static bool isDebugIntrinsic(const Function *f, KModule *KM) {
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
   // Fast path, getIntrinsicID is slow.
   if (f == KM->dbgStopPointFn)
     return true;
@@ -1294,6 +1298,9 @@ static bool isDebugIntrinsic(const Function *f, KModule *KM) {
   default:
     return false;
   }
+#else
+  return false;
+#endif
 }
 
 void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) {
@@ -1807,9 +1814,14 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) {
   }
  
     // Memory instructions...
-  case Instruction::Alloca:
-  case Instruction::Malloc: {
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
+  case Instruction::Malloc:
+  case Instruction::Alloca: {
     AllocationInst *ai = cast<AllocationInst>(i);
+#else
+  case Instruction::Alloca: {
+    AllocaInst *ai = cast<AllocaInst>(i);
+#endif
     unsigned elementSize = 
       kmodule->targetData->getTypeStoreSize(ai->getAllocatedType());
     ref<Expr> size = Expr::createPointer(elementSize);
@@ -1822,10 +1834,12 @@ void Executor::executeInstruction(ExecutionState &state, KInstruction *ki) {
     executeAlloc(state, size, isLocal, ki);
     break;
   }
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
   case Instruction::Free: {
     executeFree(state, eval(ki, 0, state).value);
     break;
   }
+#endif
 
   case Instruction::Load: {
     ref<Expr> base = eval(ki, 0, state).value;
diff --git a/lib/Core/ExecutorUtil.cpp b/lib/Core/ExecutorUtil.cpp
index 32fee991..d2878878 100644
--- a/lib/Core/ExecutorUtil.cpp
+++ b/lib/Core/ExecutorUtil.cpp
@@ -21,7 +21,9 @@
 #include "llvm/Function.h"
 #include "llvm/Instructions.h"
 #include "llvm/Module.h"
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
 #include "llvm/ModuleProvider.h"
+#endif
 #include "llvm/Support/CallSite.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
 #include "llvm/Target/TargetData.h"
diff --git a/lib/Core/ExternalDispatcher.cpp b/lib/Core/ExternalDispatcher.cpp
index 94dad33c..f746e6fa 100644
--- a/lib/Core/ExternalDispatcher.cpp
+++ b/lib/Core/ExternalDispatcher.cpp
@@ -8,12 +8,25 @@
 //===----------------------------------------------------------------------===//
 
 #include "ExternalDispatcher.h"
+#include "klee/Config/config.h"
+
+// Ugh.
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
 
 #include "llvm/Module.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Instructions.h"
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
 #include "llvm/ModuleProvider.h"
+#endif
+#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
+#include "llvm/LLVMContext.h"
+#endif
 #include "llvm/ExecutionEngine/JIT.h"
 #include "llvm/ExecutionEngine/GenericValue.h"
 #include "llvm/Support/CallSite.h"
@@ -68,10 +81,16 @@ void *ExternalDispatcher::resolveSymbol(const std::string &name) {
 
 ExternalDispatcher::ExternalDispatcher() {
   dispatchModule = new Module("ExternalDispatcher", getGlobalContext());
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
   ExistingModuleProvider* MP = new ExistingModuleProvider(dispatchModule);
-  
+#endif
+
   std::string error;
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
   executionEngine = ExecutionEngine::createJIT(MP, &error);
+#else
+  executionEngine = ExecutionEngine::createJIT(dispatchModule, &error);
+#endif
   if (!executionEngine) {
     std::cerr << "unable to make jit: " << error << "\n";
     abort();
@@ -229,7 +248,10 @@ Function *ExternalDispatcher::createDispatcher(Function *target, Instruction *in
     args[i] = new LoadInst(argp, "", dBB);
   }
 
-  Instruction *result = CallInst::Create(target, args, args+i, "", dBB);
+  Constant *dispatchTarget =
+    dispatchModule->getOrInsertFunction(target->getName(), FTy,
+                                        target->getAttributes());
+  Instruction *result = CallInst::Create(dispatchTarget, args, args+i, "", dBB);
   if (result->getType() != Type::getVoidTy(getGlobalContext())) {
     Instruction *resp = 
       new BitCastInst(argI64s, PointerType::getUnqual(result->getType()), 
diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp
index 3437e10c..d84db648 100644
--- a/lib/Core/StatsTracker.cpp
+++ b/lib/Core/StatsTracker.cpp
@@ -269,7 +269,12 @@ void StatsTracker::stepInstruction(ExecutionState &es) {
       if (!theStatisticManager->getIndexedValue(stats::coveredInstructions, ii.id)) {
         // Checking for actual stoppoints avoids inconsistencies due
         // to line number propogation.
+        //
+        // FIXME: This trick no longer works, we should fix this in the line
+        // number propogation.
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
         if (isa<DbgStopPointInst>(inst))
+#endif
           es.coveredLines[&ii.file].insert(ii.line);
 	es.coveredNew = true;
         es.instsSinceCovNew = 1;
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;
diff --git a/test/Makefile b/test/Makefile
index 3cd461d7..01def0f1 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -89,10 +89,8 @@ site.exp: Makefile $(LEVEL)/Makefile.config
 	@echo 'set compile_c "$(CC) $(CPP.Flags) $(C.Flags) $(CompileCommonOpts) -c "' >>site.tmp
 	@echo 'set compile_cxx "$(CXX) $(CPP.Flags) $(CXX.Flags) $(CompileCommonOpts) - c"' >> site.tmp
 	@echo 'set link "$(CXX) $(CPP.Flags) $(CXX.Flags) $(CompileCommonOpts) $(LD.Flags)"' >>site.tmp
-	@echo 'set llvmgcc "$(LLVMGCC)"' >> site.tmp
-	@echo 'set llvmgxx "$(LLVMGCC)"' >> site.tmp
-	@echo 'set llvmgccmajvers "$(LLVMGCC_MAJVERS)"' >> site.tmp
-	@echo 'set shlibext "$(SHLIBEXT)"' >> site.tmp
+	@echo 'set llvmgcc "$(LLVMCC)"' >> site.tmp
+	@echo 'set llvmgxx "$(LLVMCXX)"' >> site.tmp
 	@echo '## All variables above are generated by configure. Do Not Edit ## ' >>site.tmp
 	@test ! -f site.exp || \
 	sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
diff --git a/test/lib/llvm.exp b/test/lib/llvm.exp
index 2857dd82..158cc54c 100644
--- a/test/lib/llvm.exp
+++ b/test/lib/llvm.exp
@@ -43,8 +43,8 @@ proc execOneLine { test PRS outcome lineno line } {
 # cases.
 proc substitute { line test tmpFile } {
   global srcroot objroot srcdir objdir subdir target_triplet prcontext 
-  global llvmgcc llvmgxx llvmgcc_version llvmgccmajvers 
-  global gccpath gxxpath compile_c compile_cxx link shlibext llvmlibsdir
+  global llvmgcc llvmgxx llvmgcc_version 
+  global gccpath gxxpath compile_c compile_cxx link llvmlibsdir
   global llvmtoolsdir
   set path [file join $srcdir $subdir]
 
@@ -63,8 +63,6 @@ proc substitute { line test tmpFile } {
   regsub -all {%compile_cxx} $new_line "$compile_cxx" new_line
   #replace %link with C++ link command
   regsub -all {%link} $new_line "$link" new_line
-  #replace %shlibext with shared library extension
-  regsub -all {%shlibext} $new_line "$shlibext" new_line
   #replace %llvmlibsdir with configure library directory
   regsub -all {%llvmlibsdir} $new_line "$llvmlibsdir" new_line
   #replace %klee with klee binary
diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp
index b0b44bb8..08c33cae 100644
--- a/tools/klee/main.cpp
+++ b/tools/klee/main.cpp
@@ -15,11 +15,16 @@
 
 #include "llvm/Constants.h"
 #include "llvm/Module.h"
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
 #include "llvm/ModuleProvider.h"
+#endif
 #include "llvm/Type.h"
 #include "llvm/InstrTypes.h"
 #include "llvm/Instruction.h"
 #include "llvm/Instructions.h"
+#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
+#include "llvm/LLVMContext.h"
+#endif
 #include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ManagedStatic.h"
@@ -516,10 +521,10 @@ void KleeHandler::getOutFiles(std::string path,
   }
   for (std::set<llvm::sys::Path>::iterator it = contents.begin(),
          ie = contents.end(); it != ie; ++it) {
-#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR == 6)
-    std::string f = it->toString();
-#else
+#if !(LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR == 6)
     std::string f = it->str();
+#else
+    std::string f = it->toString();
 #endif
     if (f.substr(f.size()-6,f.size()) == ".ktest") {
       results.push_back(f);
@@ -1137,6 +1142,7 @@ int main(int argc, char **argv, char **envp) {
   sys::SetInterruptFunction(interrupt_handle);
 
   // Load the bytecode...
+#if (LLVM_VERSION_MAJOR == 2 && LLVM_VERSION_MINOR < 7)
   std::string ErrorMsg;
   ModuleProvider *MP = 0;
   if (MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFile, &ErrorMsg)) {
@@ -1150,8 +1156,24 @@ int main(int argc, char **argv, char **envp) {
   Module *mainModule = MP->materializeModule();
   MP->releaseModule();
   delete MP;
-
-  assert(mainModule && "unable to materialize");
+#else
+  std::string ErrorMsg;
+  Module *mainModule = 0;
+  MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFile, &ErrorMsg);
+  if (Buffer) {
+    mainModule = getLazyBitcodeModule(Buffer, getGlobalContext(), &ErrorMsg);
+    if (!mainModule) delete Buffer;
+  }
+  if (mainModule) {
+    if (mainModule->MaterializeAllPermanently(&ErrorMsg)) {
+      delete mainModule;
+      mainModule = 0;
+    }
+  }
+  if (!mainModule)
+    klee_error("error loading program '%s': %s", InputFile.c_str(),
+               ErrorMsg.c_str());
+#endif
   
   if (WithPOSIXRuntime)
     InitEnv = true;