about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorDan Liew <daniel.liew@imperial.ac.uk>2014-01-29 17:18:22 +0000
committerMartin Nowack <martin@se.inf.tu-dresden.de>2014-02-06 23:55:29 +0100
commitbaa7bff33bc9e69bdd4f0d6621b9c06ff82e11b4 (patch)
tree91f88884be2e5dddeff136063b1350cfe0bc8944
parentebaad172d4aab5fbaeca8c2658aaa94fc2e9b08e (diff)
downloadklee-baa7bff33bc9e69bdd4f0d6621b9c06ff82e11b4.tar.gz
When using KLEE's built-in Bitcode archive linker do not consider
KLEE intrinsics as undefined symbols
-rw-r--r--lib/Module/ModuleUtil.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/Module/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp
index 1881c817..54cc0429 100644
--- a/lib/Module/ModuleUtil.cpp
+++ b/lib/Module/ModuleUtil.cpp
@@ -11,6 +11,7 @@
 #include "klee/Config/Version.h"
 // FIXME: This does not belong here.
 #include "../Core/Common.h"
+#include "../Core/SpecialFunctionHandler.h"
 
 #if LLVM_VERSION_CODE >= LLVM_VERSION(3, 3)
 #include "llvm/Bitcode/ReaderWriter.h"
@@ -103,6 +104,7 @@ GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols) {
     if (I->hasName())
       DefinedSymbols.insert(I->getName());
 
+
   // Prune out any defined symbols from the undefined symbols set
   // and other symbols we don't want to treat as an undefined symbol
   for (std::set<std::string>::iterator I = UndefinedSymbols.begin();
@@ -124,15 +126,28 @@ GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols) {
       continue;
     }
 
+    // Remove KLEE intrinsics from set of undefined symbols
+    bool kleeIntrinsicStripped=false;
+    for (SpecialFunctionHandler::const_iterator sf = SpecialFunctionHandler::begin(),
+         se = SpecialFunctionHandler::end(); sf != se; ++sf)
+    {
+      if (*I == sf->name)
+      {
+        DEBUG_WITH_TYPE("klee_linker", dbgs() << "KLEE intrinsic " << sf->name <<
+                        " has been removed from undefined symbols"<< "\n");
+        UndefinedSymbols.erase(I++);
+        kleeIntrinsicStripped=true;
+        break;
+      }
+    }
+
+    if (kleeIntrinsicStripped) continue;
+
     // Symbol really is undefined
     DEBUG_WITH_TYPE("klee_linker", dbgs() << "Symbol " << *I << " is undefined.\n");
     ++I; // Keep this symbol in the undefined symbols list
   }
 
-  // FIXME: Remove KLEE special functions
-  // from the list of undefined symbols. HandlerInfo in SpecialFunctionHandler
-  // needs to be moved so we can use it here.
-
   DEBUG_WITH_TYPE("klee_linker", dbgs() << "*** Finished computing undefined symbols ***\n");
 }