diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/klee/Makefile | 10 | ||||
-rw-r--r-- | tools/klee/main.cpp | 46 |
2 files changed, 32 insertions, 24 deletions
diff --git a/tools/klee/Makefile b/tools/klee/Makefile index 8d50403f..2930427c 100644 --- a/tools/klee/Makefile +++ b/tools/klee/Makefile @@ -13,7 +13,13 @@ TOOLNAME = klee include $(LEVEL)/Makefile.config USEDLIBS = kleeCore.a kleeBasic.a kleeModule.a kleaverSolver.a kleaverExpr.a kleeSupport.a -LINK_COMPONENTS = jit bitreader bitwriter ipo linker engine +LINK_COMPONENTS = bitreader bitwriter ipo linker engine + +ifeq ($(shell python -c "print($(LLVM_VERSION_MAJOR).$(LLVM_VERSION_MINOR) >= 3.6)"), True) +LINK_COMPONENTS += mcjit +else +LINK_COMPONENTS += jit +endif ifeq ($(shell python -c "print($(LLVM_VERSION_MAJOR).$(LLVM_VERSION_MINOR) >= 3.3)"), True) LINK_COMPONENTS += irreader @@ -36,4 +42,4 @@ endif ifeq ($(HAVE_ZLIB),1) LIBS += -lz -endif \ No newline at end of file +endif diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp index c65953d1..b74789fa 100644 --- a/tools/klee/main.cpp +++ b/tools/klee/main.cpp @@ -9,18 +9,19 @@ // //===----------------------------------------------------------------------===// +#include "klee/Config/Version.h" #include "klee/ExecutionState.h" #include "klee/Expr.h" -#include "klee/Interpreter.h" -#include "klee/Statistics.h" -#include "klee/Config/Version.h" #include "klee/Internal/ADT/KTest.h" #include "klee/Internal/ADT/TreeStream.h" #include "klee/Internal/Support/Debug.h" +#include "klee/Internal/Support/ErrorHandling.h" +#include "klee/Internal/Support/FileHandling.h" #include "klee/Internal/Support/ModuleUtil.h" -#include "klee/Internal/System/Time.h" #include "klee/Internal/Support/PrintVersion.h" -#include "klee/Internal/Support/ErrorHandling.h" +#include "klee/Internal/System/Time.h" +#include "klee/Interpreter.h" +#include "klee/Statistics.h" #if LLVM_VERSION_CODE > LLVM_VERSION(3, 2) #include "llvm/IR/Constants.h" @@ -131,7 +132,7 @@ namespace { cl::desc("Write .sym.path files for each test case")); cl::opt<bool> - ExitOnError("exit-on-error", + OptExitOnError("exit-on-error", cl::desc("Exit if errors occur")); @@ -385,22 +386,14 @@ llvm::raw_fd_ostream *KleeHandler::openOutputFile(const std::string &filename) { llvm::raw_fd_ostream *f; std::string Error; std::string path = getOutputFilename(filename); -#if LLVM_VERSION_CODE >= LLVM_VERSION(3,5) - f = new llvm::raw_fd_ostream(path.c_str(), Error, llvm::sys::fs::F_None); -#elif LLVM_VERSION_CODE >= LLVM_VERSION(3,4) - f = new llvm::raw_fd_ostream(path.c_str(), Error, llvm::sys::fs::F_Binary); -#else - f = new llvm::raw_fd_ostream(path.c_str(), Error, llvm::raw_fd_ostream::F_Binary); -#endif + f = klee_open_output_file(path, Error); if (!Error.empty()) { klee_warning("error opening file \"%s\". KLEE may have run out of file " - "descriptors: try to increase the maximum number of open file " - "descriptors by using ulimit (%s).", - filename.c_str(), Error.c_str()); - delete f; - f = NULL; + "descriptors: try to increase the maximum number of open file " + "descriptors by using ulimit (%s).", + path.c_str(), Error.c_str()); + return NULL; } - return f; } @@ -420,9 +413,9 @@ llvm::raw_fd_ostream *KleeHandler::openTestFile(const std::string &suffix, void KleeHandler::processTestCase(const ExecutionState &state, const char *errorMessage, const char *errorSuffix) { - if (errorMessage && ExitOnError) { - llvm::errs() << "EXITING ON ERROR:\n" << errorMessage << "\n"; - exit(1); + if (errorMessage && OptExitOnError) { + m_interpreter->prepareForEarlyExit(); + klee_error("EXITING ON ERROR:\n%s\n", errorMessage); } if (!NoOutput) { @@ -1038,9 +1031,14 @@ static llvm::Module *linkWithUclibc(llvm::Module *mainModule, StringRef libDir) SmallString<128> uclibcBCA(libDir); llvm::sys::path::append(uclibcBCA, KLEE_UCLIBC_BCA_NAME); +#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6) + Twine uclibcBCA_twine(uclibcBCA.c_str()); + if (!llvm::sys::fs::exists(uclibcBCA_twine)) +#else bool uclibcExists=false; llvm::sys::fs::exists(uclibcBCA.c_str(), uclibcExists); if (!uclibcExists) +#endif klee_error("Cannot find klee-uclibc : %s", uclibcBCA.c_str()); Function *f; @@ -1265,7 +1263,11 @@ int main(int argc, char **argv, char **envp) { klee_error("error loading program '%s': %s", InputFile.c_str(), Buffer.getError().message().c_str()); +#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6) + auto mainModuleOrError = getLazyBitcodeModule(std::move(Buffer.get()), ctx); +#else auto mainModuleOrError = getLazyBitcodeModule(Buffer->get(), ctx); +#endif if (!mainModuleOrError) { klee_error("error loading program '%s': %s", InputFile.c_str(), |