about summary refs log tree commit diff homepage
path: root/lib/Module/KModule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Module/KModule.cpp')
-rw-r--r--lib/Module/KModule.cpp61
1 files changed, 36 insertions, 25 deletions
diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp
index cbcd395c..74d91a8f 100644
--- a/lib/Module/KModule.cpp
+++ b/lib/Module/KModule.cpp
@@ -22,11 +22,12 @@
 #include "klee/Internal/Support/ModuleUtil.h"
 
 #include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Module.h"
 #include "llvm/IR/ValueSymbolTable.h"
-#include "llvm/IR/DataLayout.h"
 
 #if LLVM_VERSION_CODE < LLVM_VERSION(3, 5)
 #include "llvm/Analysis/Verifier.h"
@@ -105,14 +106,15 @@ static Function *getStubFunctionForCtorList(Module *m,
 				  name,
                               m);
   BasicBlock *bb = BasicBlock::Create(m->getContext(), "entry", fn);
-  
+  llvm::IRBuilder<> Builder(bb);
+
   // From lli:
   // Should be an array of '{ int, void ()* }' structs.  The first value is
   // the init priority, which we ignore.
-  ConstantArray *arr = dyn_cast<ConstantArray>(gv->getInitializer());
+  auto arr = dyn_cast<ConstantArray>(gv->getInitializer());
   if (arr) {
     for (unsigned i=0; i<arr->getNumOperands(); i++) {
-      ConstantStruct *cs = cast<ConstantStruct>(arr->getOperand(i));
+      auto cs = cast<ConstantStruct>(arr->getOperand(i));
 #if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
       // There is a third *optional* element in global_ctor elements (``i8
       // @data``).
@@ -121,21 +123,21 @@ static Function *getStubFunctionForCtorList(Module *m,
 #else
       assert(cs->getNumOperands()==2 && "unexpected element in ctor initializer list");
 #endif
-      Constant *fp = cs->getOperand(1);      
+      auto fp = cs->getOperand(1);
       if (!fp->isNullValue()) {
-        if (llvm::ConstantExpr *ce = dyn_cast<llvm::ConstantExpr>(fp))
+        if (auto ce = dyn_cast<llvm::ConstantExpr>(fp))
           fp = ce->getOperand(0);
 
-        if (Function *f = dyn_cast<Function>(fp)) {
-	  CallInst::Create(f, "", bb);
+        if (auto f = dyn_cast<Function>(fp)) {
+          Builder.CreateCall(f);
         } else {
           assert(0 && "unable to get function pointer from ctor initializer list");
         }
       }
     }
   }
-  
-  ReturnInst::Create(m->getContext(), bb);
+
+  Builder.CreateRetVoid();
 
   return fn;
 }
@@ -143,21 +145,30 @@ static Function *getStubFunctionForCtorList(Module *m,
 static void injectStaticConstructorsAndDestructors(Module *m) {
   GlobalVariable *ctors = m->getNamedGlobal("llvm.global_ctors");
   GlobalVariable *dtors = m->getNamedGlobal("llvm.global_dtors");
-  
-  if (ctors || dtors) {
-    Function *mainFn = m->getFunction("main");
-    if (!mainFn)
-      klee_error("Could not find main() function.");
-
-    if (ctors)
-    CallInst::Create(getStubFunctionForCtorList(m, ctors, "klee.ctor_stub"),
-		     "", &*(mainFn->begin()->begin()));
-    if (dtors) {
-      Function *dtorStub = getStubFunctionForCtorList(m, dtors, "klee.dtor_stub");
-      for (Function::iterator it = mainFn->begin(), ie = mainFn->end();
-           it != ie; ++it) {
-        if (isa<ReturnInst>(it->getTerminator()))
-	  CallInst::Create(dtorStub, "", it->getTerminator());
+
+  if (!ctors && !dtors)
+    return;
+
+  Function *mainFn = m->getFunction("main");
+  if (!mainFn)
+    klee_error("Could not find main() function.");
+
+  if (ctors) {
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 8)
+    llvm::IRBuilder<> Builder(&*mainFn->begin()->begin());
+#else
+    llvm::IRBuilder<> Builder(mainFn->begin()->begin());
+#endif
+    Builder.CreateCall(getStubFunctionForCtorList(m, ctors, "klee.ctor_stub"));
+  }
+
+  if (dtors) {
+    Function *dtorStub = getStubFunctionForCtorList(m, dtors, "klee.dtor_stub");
+    for (Function::iterator it = mainFn->begin(), ie = mainFn->end(); it != ie;
+         ++it) {
+      if (isa<ReturnInst>(it->getTerminator())) {
+        llvm::IRBuilder<> Builder(it->getTerminator());
+        Builder.CreateCall(dtorStub);
       }
     }
   }