[klee-dev] make KLEE compile with LLVM 3.5-svn (almost)

Martin Nowack martin_nowack at tu-dresden.de
Sun Feb 16 21:18:18 GMT 2014


Hi Martin,

On 16 Feb 2014, at 15:00, Martin Pelikan <pelikan at storkhole.cz> wrote:
> I can't get LLVM to produce libLLVM-3.5svn.so, which is why I haven't tested
> this diff.  But I've had similar changes on my machines for a while (Gentoo
> and OpenBSD) and most of them are inevitable as the interfaces have already
> been removed from LLVM.
To produce the libLLVM-3.5svn.so file, please configure your compile your LLVM with `--enable-shared`

If you have a chance/time, could you please try the following branch for LLVM 3.4 [1]
and check what is needed to make it work for you on LLVM 3.5?

Thanks a lot in advance.

Anyway, thanks a lot for your patch. I’ll try to have a look at it.

Best wishes,
Martin


[1] https://github.com/MartinNowack/klee/tree/llvm_34


> 
> It probably won't get accepted as a whole, but might get you the idea of
> what is required to work against a recent LLVM version.
> --
> Martin Pelikan
> 
> 
> diff --git a/configure b/configure
> index 55497c3..9820390 100755
> --- a/configure
> +++ b/configure
> @@ -2658,28 +2658,31 @@ else
> fi
> 
> 
> -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking llvm build mode" >&5
> -$as_echo_n "checking llvm build mode... " >&6; }
> +if false; then
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking llvm build mode" >&5
> +	$as_echo_n "checking llvm build mode... " >&6; }
> +
> +	if test X${with_llvm_build_mode} = Xcheck ; then
> +	  llvm_configs="`ls -1 $llvm_obj/*/bin/llvm-config 2>/dev/null | head -n 1`"
> +	  if test -x "$llvm_configs" ; then
> +	    llvm_build_mode="`$llvm_configs --build-mode`"
> +	  else
> +	    as_fn_error $? "Could not autodetect build mode" "$LINENO" 5
> +	  fi
> +	else
> +	  llvm_configs="`echo $llvm_obj/*/bin/llvm-config`"
> +	  if test -x "$llvm_obj/$with_llvm_build_mode/bin/llvm-config" ; then
> +	    llvm_build_mode=$with_llvm_build_mode
> +	  else
> +	    as_fn_error $? "Invalid build mode: $llvm_build_mode" "$LINENO" 5
> +	  fi
> +	fi
> 
> -if test X${with_llvm_build_mode} = Xcheck ; then
> -  llvm_configs="`ls -1 $llvm_obj/*/bin/llvm-config 2>/dev/null | head -n 1`"
> -  if test -x "$llvm_configs" ; then
> -    llvm_build_mode="`$llvm_configs --build-mode`"
> -  else
> -    as_fn_error $? "Could not autodetect build mode" "$LINENO" 5
> -  fi
> -else
> -  llvm_configs="`echo $llvm_obj/*/bin/llvm-config`"
> -  if test -x "$llvm_obj/$with_llvm_build_mode/bin/llvm-config" ; then
> -    llvm_build_mode=$with_llvm_build_mode
> -  else
> -    as_fn_error $? "Invalid build mode: $llvm_build_mode" "$LINENO" 5
> -  fi
> +	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $llvm_build_mode" >&5
> +	$as_echo "$llvm_build_mode" >&6; }
> +	LLVM_BUILD_MODE=$llvm_build_mode
> fi
> -
> -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $llvm_build_mode" >&5
> -$as_echo "$llvm_build_mode" >&6; }
> -LLVM_BUILD_MODE=$llvm_build_mode
> +LLVM_BUILD_MODE=
> 
> 
> 
> diff --git a/lib/Core/StatsTracker.cpp b/lib/Core/StatsTracker.cpp
> index 8161a52..0eafbc2 100644
> --- a/lib/Core/StatsTracker.cpp
> +++ b/lib/Core/StatsTracker.cpp
> @@ -55,6 +55,7 @@
> 
> #include <iostream>
> #include <fstream>
> +#include <unistd.h>
> 
> using namespace klee;
> using namespace llvm;
> @@ -182,14 +183,16 @@ StatsTracker::StatsTracker(Executor &_executor, std::string _objectFilename,
>     updateMinDistToUncovered(_updateMinDistToUncovered) {
>   KModule *km = executor.kmodule;
> 
> -  sys::Path module(objectFilename);
> +  SmallString<128> module(objectFilename);
> #if LLVM_VERSION_CODE < LLVM_VERSION(3, 1)
>   if (!sys::Path(objectFilename).isAbsolute()) {
> #else
>   if (!sys::path::is_absolute(objectFilename)) {
> #endif
> -    sys::Path current = sys::Path::GetCurrentDirectory();
> -    current.appendComponent(objectFilename);
> +    SmallString<128> current;
> +    if (sys::fs::current_path(current))
> +      klee_error("can't get current path");
> +    sys::path::append(current, objectFilename);
> #if LLVM_VERSION_CODE < LLVM_VERSION(3, 1)
>     if (current.exists())
> #else
> @@ -446,7 +449,7 @@ void StatsTracker::writeIStats() {
> 
>   of << "version: 1\n";
>   of << "creator: klee\n";
> -  of << "pid: " << sys::Process::GetCurrentUserId() << "\n";
> +  of << "pid: " << getpid() << "\n";
>   of << "cmd: " << m->getModuleIdentifier() << "\n\n";
>   of << "\n";
> 
> diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp
> index 2ecb14b..fc49849 100644
> --- a/lib/Module/KModule.cpp
> +++ b/lib/Module/KModule.cpp
> @@ -375,11 +375,11 @@ void KModule::prepare(const Interpreter::ModuleOptions &opts,
>   // FIXME: Find a way that we can test programs without requiring
>   // this to be linked in, it makes low level debugging much more
>   // annoying.
> -  llvm::sys::Path path(opts.LibraryDir);
> +  SmallString<128> path(opts.LibraryDir);
> #if LLVM_VERSION_CODE >= LLVM_VERSION(3, 3)
> -  path.appendComponent("kleeRuntimeIntrinsic.bc");
> +  llvm::sys::path::append(path, "kleeRuntimeIntrinsic.bc");
> #else
> -  path.appendComponent("libkleeRuntimeIntrinsic.bca");
> +  llvm::sys::path::append(path, "libkleeRuntimeIntrinsic.bca");
> #endif
>   module = linkWithLibrary(module, path.c_str());
> 
> diff --git a/lib/Module/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp
> index 58096de..6a598b0 100644
> --- a/lib/Module/ModuleUtil.cpp
> +++ b/lib/Module/ModuleUtil.cpp
> @@ -19,6 +19,7 @@
> #include "llvm/IR/Instructions.h"
> #include "llvm/IR/IntrinsicInst.h"
> #include "llvm/IRReader/IRReader.h"
> +#include "llvm/IR/LLVMContext.h"
> #include "llvm/IR/Module.h"
> #include "llvm/Object/Archive.h"
> #include "llvm/Object/ObjectFile.h"
> @@ -82,7 +83,7 @@ GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols) {
>       if (I->isDeclaration())
>         UndefinedSymbols.insert(I->getName());
>       else if (!I->hasLocalLinkage()) {
> -        assert(!I->hasDLLImportLinkage()
> +        assert(!I->hasDLLImportStorageClass()
>                && "Found dllimported non-external symbol!");
>         DefinedSymbols.insert(I->getName());
>       }
> @@ -94,7 +95,7 @@ GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols) {
>       if (I->isDeclaration())
>         UndefinedSymbols.insert(I->getName());
>       else if (!I->hasLocalLinkage()) {
> -        assert(!I->hasDLLImportLinkage()
> +        assert(!I->hasDLLImportStorageClass()
>                && "Found dllimported non-external symbol!");
>         DefinedSymbols.insert(I->getName());
>       }
> @@ -191,8 +192,8 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
> 
>   DEBUG_WITH_TYPE("klee_linker", dbgs() << "Loading modules\n");
>   // Load all bitcode files in to memory so we can examine their symbols
> -  for (object::Archive::child_iterator AI = archive->begin_children(),
> -       AE = archive->end_children(); AI != AE; ++AI)
> +  for (object::Archive::child_iterator AI = archive->child_begin(),
> +       AE = archive->child_end(); AI != AE; ++AI)
>   {
> 
>     StringRef memberName;
> @@ -215,7 +216,6 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
>       // If we can't open as a binary object file its hopefully a bitcode file
> 
>       OwningPtr<MemoryBuffer> buff; // Once this is destroyed will Module still be valid??
> -      Module *Result = 0;
> 
>       if (error_code ec = AI->getMemoryBuffer(buff))
>       {
> @@ -227,15 +227,15 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
>       if (buff)
>       {
>         // FIXME: Maybe load bitcode file lazily? Then if we need to link, materialise the module
> -        Result = ParseBitcodeFile(buff.get(), getGlobalContext(), &errorMessage);
> +	ErrorOr<Module *> bcfileOrErr = parseBitcodeFile(buff.get(), getGlobalContext());
> 
> -        if(!Result)
> +        if (error_code ec = bcfileOrErr.getError())
>         {
> -          SS << "Loading module failed : " << errorMessage << "\n";
> +          SS << "Loading module failed : " << ec.message() << "\n";
>           SS.flush();
>           return false;
>         }
> -        archiveModules.push_back(Result);
> +        archiveModules.push_back(bcfileOrErr.get());
>       }
>       else
>       {
> @@ -349,17 +349,16 @@ DEBUG_WITH_TYPE("klee_linker", dbgs() << "Linking file " << libraryName << "\n")
>         libraryName.c_str());
>   }
> 
> -  OwningPtr<MemoryBuffer> Buffer;
> -  if (error_code ec = MemoryBuffer::getFile(libraryName,Buffer)) {
> +  ErrorOr<object::Binary *> binOrErr = object::createBinary(libraryName);
> +  if (error_code ec = binOrErr.getError()) {
>     klee_error("Link with library %s failed: %s", libraryName.c_str(),
>         ec.message().c_str());
>   }
> 
> -  sys::fs::file_magic magic = sys::fs::identify_magic(Buffer->getBuffer());
> -
> -  LLVMContext &Context = getGlobalContext();
>   std::string ErrorMessage;
> +  OwningPtr<object::Binary> binary(binOrErr.get());
> 
> +  #if 0
>   if (magic == sys::fs::file_magic::bitcode) {
>     Module *Result = 0;
>     Result = ParseBitcodeFile(Buffer.get(), Context, &ErrorMessage);
> @@ -372,29 +371,18 @@ DEBUG_WITH_TYPE("klee_linker", dbgs() << "Linking file " << libraryName << "\n")
> 
>     delete Result;
> 
> -  } else if (magic == sys::fs::file_magic::archive) {
> -    OwningPtr<object::Binary> arch;
> -    if (error_code ec = object::createBinary(Buffer.take(), arch))
> +  }
> +  #endif
> +  if (object::Archive *a = dyn_cast<object::Archive>(binary.get())) {
> +    // Handle in helper
> +    if (!linkBCA(a, module, ErrorMessage))
>       klee_error("Link with library %s failed: %s", libraryName.c_str(),
> -          ec.message().c_str());
> -
> -    if (object::Archive *a = dyn_cast<object::Archive>(arch.get())) {
> -      // Handle in helper
> -      if (!linkBCA(a, module, ErrorMessage))
> -        klee_error("Link with library %s failed: %s", libraryName.c_str(),
> -            ErrorMessage.c_str());
> -    }
> -    else {
> -    	klee_error("Link with library %s failed: Cast to archive failed", libraryName.c_str());
> -    }
> +          ErrorMessage.c_str());
> 
> -  } else if (magic.is_object()) {
> -    OwningPtr<object::Binary> obj;
> -    if (object::ObjectFile *o = dyn_cast<object::ObjectFile>(obj.get())) {
> -      klee_warning("Link with library: Object file %s in archive %s found. "
> -          "Currently not supported.",
> -          o->getFileName().data(), libraryName.c_str());
> -    }
> +  } else if (object::ObjectFile *o = dyn_cast<object::ObjectFile>(binary.get())) {
> +    klee_warning("Link with library: Object file %s in archive %s found. "
> +        "Currently not supported.",
> +        o->getFileName().data(), libraryName.c_str());
>   } else {
>     klee_error("Link with library %s failed: Unrecognized file type.",
>         libraryName.c_str());
> @@ -404,7 +392,7 @@ DEBUG_WITH_TYPE("klee_linker", dbgs() << "Linking file " << libraryName << "\n")
> #else
>   Linker linker("klee", module, false);
> 
> -  llvm::sys::Path libraryPath(libraryName);
> +  SmallString<128> libraryPath(libraryName);
>   bool native = false;
> 
>   if (linker.LinkInFile(libraryPath, native)) {
> diff --git a/lib/Module/Optimize.cpp b/lib/Module/Optimize.cpp
> index 41a106f..0ef1c16 100644
> --- a/lib/Module/Optimize.cpp
> +++ b/lib/Module/Optimize.cpp
> @@ -124,7 +124,11 @@ static void AddStandardCompilePasses(PassManager &PM) {
>     addPass(PM, createFunctionInliningPass());   // Inline small functions
>   addPass(PM, createArgumentPromotionPass());    // Scalarize uninlined fn args
> 
> +#if defined(LLVM_3_1) || defined(LLVM_3_2) || defined(LLVM_3_3)
> +  // Starting from 3.4 this functionality was moved to
> +  // InstructionCombiningPass. See r184459 for details.
>   addPass(PM, createSimplifyLibCallsPass());     // Library Call Optimizations
> +#endif
>   addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl.
>   addPass(PM, createJumpThreadingPass());        // Thread jumps.
>   addPass(PM, createCFGSimplificationPass());    // Merge & remove BBs
> diff --git a/tools/klee/main.cpp b/tools/klee/main.cpp
> index f9698fd..74a3616 100644
> --- a/tools/klee/main.cpp
> +++ b/tools/klee/main.cpp
> @@ -220,7 +220,7 @@ private:
>   TreeStreamWriter *m_pathWriter, *m_symPathWriter;
>   std::ostream *m_infoFile;
> 
> -  sys::Path m_outputDirectory;
> +  SmallString<128> m_outputDirectory;
>   unsigned m_testIndex;  // number of tests written so far
>   unsigned m_pathsExplored; // number of paths explored so far
> 
> @@ -259,7 +259,7 @@ public:
>   static void getOutFiles(std::string path,
> 			  std::vector<std::string> &results);
> 
> -  static llvm::sys::Path getRunTimeLibraryPath(const char* argv0, void *MainExecAddr);
> +  static SmallString<128> getRunTimeLibraryPath(const char* argv0, void *MainExecAddr);
> };
> 
> KleeHandler::KleeHandler(int argc, char **argv) 
> @@ -274,25 +274,24 @@ KleeHandler::KleeHandler(int argc, char **argv)
>     m_argv(argv) {
> 
>   if (OutputDir=="") {
> -    llvm::sys::Path directory(InputFile);
> +    SmallString<128> directory(InputFile);
>     std::stringstream dirname;
> -    directory.eraseComponent();
> +    llvm::sys::path::remove_filename(directory);
> 
> -    if (directory.isEmpty())
> -      directory.set(".");
> +    if (directory.empty())
> +      directory = ".";
> 
>     for (int i = 0; i< INT_MAX ; i++) {
>       dirname << "klee-out-";
>       dirname << i;
> 
> -      m_outputDirectory = llvm::sys::Path(directory); // Copy
> -      if (!m_outputDirectory.appendComponent(dirname.str()))
> -        klee_error("Failed to append \"%s\" to \"%s\"", dirname.str().c_str(), directory.c_str());
> +      m_outputDirectory = directory;
> +      llvm::sys::path::append(m_outputDirectory, dirname.str());
> 
>       bool isDir = true;
>       llvm::error_code e = llvm::sys::fs::exists(m_outputDirectory.str(), isDir);
>       if ( e != llvm::errc::success )
> -        klee_error("Failed to check if \"%s\" exists.", m_outputDirectory.str().c_str());
> +        klee_error("Failed to check if \"%s\" exists.", m_outputDirectory.c_str());
> 
>       if (!isDir)
>       {
> @@ -303,7 +302,7 @@ KleeHandler::KleeHandler(int argc, char **argv)
>       e = llvm::sys::fs::is_directory(m_outputDirectory.str(), isDir);
>       if ( e == llvm::errc::success && !isDir )
>         klee_warning("A file \"%s\" exists, but it is not a directory",
> -                     m_outputDirectory.str().c_str());
> +                     m_outputDirectory.c_str());
> 
>       dirname.str(""); // Clear
>       m_outputDirectory.clear();
> @@ -314,9 +313,8 @@ KleeHandler::KleeHandler(int argc, char **argv)
> 
>     std::cerr << "KLEE: output directory = \"" << dirname.str() << "\"\n";
> 
> -    llvm::sys::Path klee_last(directory);
> -    if(!klee_last.appendComponent("klee-last"))
> -      klee_error("cannot create path name for klee-last");
> +    SmallString<128> klee_last(directory);
> +    llvm::sys::path::append(klee_last, "klee-last");
> 
>     if ((unlink(klee_last.c_str()) < 0) && (errno != ENOENT))
>       klee_error("cannot unlink klee-last: %s", strerror(errno));
> @@ -325,14 +323,14 @@ KleeHandler::KleeHandler(int argc, char **argv)
>       klee_error("cannot create klee-last symlink: %s", strerror(errno));
> 
>   } else {
> -    if (!m_outputDirectory.set(OutputDir))
> -      klee_error("cannot use klee output directory: %s", OutputDir.c_str());
> +    m_outputDirectory = OutputDir;
>   }
> 
>   if (!sys::path::is_absolute(m_outputDirectory.c_str())) {
> -    sys::Path cwd = sys::Path::GetCurrentDirectory();
> -    if(!cwd.appendComponent( m_outputDirectory.c_str()))
> -      klee_error("cannot create absolute path name for output directory");
> +    SmallString<128> cwd;
> +    if (sys::fs::current_path(cwd))
> +      klee_error("can't get current path");
> +    llvm::sys::path::append(cwd, m_outputDirectory.c_str());
> 
>     m_outputDirectory = cwd;
>   }
> @@ -376,10 +374,8 @@ void KleeHandler::setInterpreter(Interpreter *i) {
> }
> 
> std::string KleeHandler::getOutputFilename(const std::string &filename) {
> -  sys::Path path(m_outputDirectory);
> -  if(!path.appendComponent(filename)) {
> -    klee_error("cannot create path name for \"%s\"", filename.c_str());
> -  }
> +  SmallString<128> path(m_outputDirectory);
> +  llvm::sys::path::append(path, filename);
> 
>   return path.str();
> }
> @@ -555,42 +551,39 @@ void KleeHandler::loadPathFile(std::string name,
> 
> void KleeHandler::getOutFiles(std::string path,
> 			      std::vector<std::string> &results) {
> -  llvm::sys::Path p(path);
> -  std::set<llvm::sys::Path> contents;
> -  std::string error;
> -  if (p.getDirectoryContents(contents, &error)) {
> +  llvm::error_code ec;
> +  for (llvm::sys::fs::directory_iterator Entry(path, ec), End;
> +   Entry != End && !ec; Entry.increment(ec)) {
> +    std::string f = Entry->path();
> +    if (f.substr(f.size()-6,f.size()) == ".ktest")
> +      results.push_back(f);
> +  }
> +  if (ec) {
>     std::cerr << "ERROR: unable to read output directory: " << path 
> -               << ": " << error << "\n";
> +               << ": " << ec.message() << "\n";
>     exit(1);
>   }
> -  for (std::set<llvm::sys::Path>::iterator it = contents.begin(),
> -         ie = contents.end(); it != ie; ++it) {
> -    std::string f = it->str();
> -    if (f.substr(f.size()-6,f.size()) == ".ktest") {
> -      results.push_back(f);
> -    }
> -  }
> }
> 
> 
> -llvm::sys::Path KleeHandler::getRunTimeLibraryPath(const char* argv0, void* MainExecAddr)
> +SmallString<128> KleeHandler::getRunTimeLibraryPath(const char* argv0, void* MainExecAddr)
> {
> -  llvm::sys::Path toolRoot = llvm::sys::Path::GetMainExecutable(argv0, MainExecAddr);
> -  toolRoot.eraseComponent(); // Strip off executable so we have a directory path
> +  SmallString<128> toolRoot(llvm::sys::fs::getMainExecutable(argv0, MainExecAddr));
> +  llvm::sys::path::remove_filename(toolRoot);
> 
> -  llvm::sys::Path libDir;
> +  SmallString<128> libDir;
> 
>   if ( strcmp(toolRoot.c_str(), KLEE_INSTALL_BIN_DIR ) == 0)
>   {
>     DEBUG_WITH_TYPE("klee_runtime", llvm::dbgs() <<
>                     "Using installed KLEE library runtime: ");
> -    libDir = llvm::sys::Path( KLEE_INSTALL_LIB_DIR );
> +    libDir = SmallString<128>( KLEE_INSTALL_LIB_DIR );
>   }
>   else
>   {
>     DEBUG_WITH_TYPE("klee_runtime", llvm::dbgs() <<
>                     "Using build directory KLEE library runtime :");
> -    libDir = llvm::sys::Path(KLEE_DIR "/" RUNTIME_CONFIGURATION "/lib");
> +    libDir = SmallString<128>(KLEE_DIR "/" RUNTIME_CONFIGURATION "/lib");
>   }
> 
>   DEBUG_WITH_TYPE("klee_runtime", llvm::dbgs() <<
> @@ -1007,7 +1000,7 @@ static char *format_tdiff(char *buf, long seconds)
> }
> 
> #ifndef SUPPORT_KLEE_UCLIBC
> -static llvm::Module *linkWithUclibc(llvm::Module *mainModule, llvm::sys::Path libDir) {
> +static llvm::Module *linkWithUclibc(llvm::Module *mainModule, SmallString<128> libDir) {
>   fprintf(stderr, "error: invalid libc, no uclibc support!\n");
>   exit(1);
>   return 0;
> @@ -1030,9 +1023,9 @@ static void replaceOrRenameFunction(llvm::Module *module,
>   }
> }
> 
> -static llvm::Module *linkWithUclibc(llvm::Module *mainModule, llvm::sys::Path libDir) {
> +static llvm::Module *linkWithUclibc(llvm::Module *mainModule, SmallString<128> libDir) {
>   // Ensure that klee-uclibc exists
> -  llvm::sys::Path uclibcBCA(libDir);
> +  SmallString<128> uclibcBCA(libDir);
>   uclibcBCA.appendComponent(KLEE_UCLIBC_BCA_NAME);
> 
>   bool uclibcExists=false;
> @@ -1233,25 +1226,27 @@ int main(int argc, char **argv, char **envp) {
>   sys::SetInterruptFunction(interrupt_handle);
> 
>   // Load the bytecode...
> -  std::string ErrorMsg;
> -  Module *mainModule = 0;
>   OwningPtr<MemoryBuffer> BufferPtr;
>   error_code ec=MemoryBuffer::getFileOrSTDIN(InputFile.c_str(), BufferPtr);
>   if (ec) {
>     klee_error("error loading program '%s': %s", InputFile.c_str(),
>                ec.message().c_str());
>   }
> -  mainModule = getLazyBitcodeModule(BufferPtr.get(), getGlobalContext(), &ErrorMsg);
> +  ErrorOr<Module *> modOrErr = getLazyBitcodeModule(BufferPtr.get(), getGlobalContext());
> +  if (!modOrErr) {
> +    klee_error("couldn't getLazyBitcodeModule %s: %s", InputFile.c_str(),
> +               ec.message().c_str());
> +  }
> 
> +  Module *mainModule = modOrErr.get();
>   if (mainModule) {
> -    if (mainModule->MaterializeAllPermanently(&ErrorMsg)) {
> +    if (error_code ec = mainModule->materializeAllPermanently()) {
> +      klee_error("couldn't materializeAllPermanently %s: %s", InputFile.c_str(),
> +                 ec.message().c_str());
>       delete mainModule;
>       mainModule = 0;
>     }
>   }
> -  if (!mainModule)
> -    klee_error("error loading program '%s': %s", InputFile.c_str(),
> -               ErrorMsg.c_str());
> 
>   if (WithPOSIXRuntime) {
>     int r = initEnv(mainModule);
> @@ -1259,7 +1254,7 @@ int main(int argc, char **argv, char **envp) {
>       return r;
>   }
> 
> -  llvm::sys::Path LibraryDir = KleeHandler::getRunTimeLibraryPath(argv[0], 
> +  SmallString<128> LibraryDir = KleeHandler::getRunTimeLibraryPath(argv[0], 
>                               reinterpret_cast<void*>(main));
>   Interpreter::ModuleOptions Opts(LibraryDir.c_str(),
>                                   /*Optimize=*/OptimizeModule, 
> @@ -1272,9 +1267,9 @@ int main(int argc, char **argv, char **envp) {
> 
>   case KleeLibc: {
>     // FIXME: Find a reasonable solution for this.
> -    llvm::sys::Path Path(Opts.LibraryDir);
> +    SmallString<128> Path(Opts.LibraryDir);
> #if LLVM_VERSION_CODE >= LLVM_VERSION(3, 3)
> -    Path.appendComponent("klee-libc.bc");
> +    llvm::sys::path::append(Path, "klee-libc.bc");
> #else
>     Path.appendComponent("libklee-libc.bca");
> #endif
> @@ -1289,8 +1284,8 @@ int main(int argc, char **argv, char **envp) {
>   }
> 
>   if (WithPOSIXRuntime) {
> -    llvm::sys::Path Path(Opts.LibraryDir);
> -    Path.appendComponent("libkleeRuntimePOSIX.bca");
> +    SmallString<128> Path(Opts.LibraryDir);
> +    llvm::sys::path::append(Path, "libkleeRuntimePOSIX.bca");
>     klee_message("NOTE: Using model: %s", Path.c_str());
>     mainModule = klee::linkWithLibrary(mainModule, Path.c_str());
>     assert(mainModule && "unable to link with simple model");
> 
> _______________________________________________
> klee-dev mailing list
> klee-dev at imperial.ac.uk
> https://mailman.ic.ac.uk/mailman/listinfo/klee-dev

---------------------------------------------------
Martin Nowack
Research Assistant

Technische Universität Dresden
Computer Science
Institute of Systems Architecture
Systems Engineering
01062 Dresden

Phone: +49 351 463 39608
Email: martin_nowack at tu-dresden.de
----------------------------------------------------

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 496 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://mailman.ic.ac.uk/pipermail/klee-dev/attachments/20140216/a187041a/attachment.sig>


More information about the klee-dev mailing list