diff --git a/test/ExecutionEngine/MCJIT/load-object-a.ll b/test/ExecutionEngine/MCJIT/load-object-a.ll index fc795fede55..28cfc7903fa 100644 --- a/test/ExecutionEngine/MCJIT/load-object-a.ll +++ b/test/ExecutionEngine/MCJIT/load-object-a.ll @@ -1,23 +1,18 @@ ; REQUIRES: shell ; This first line will generate the .o files for the next run line -; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -enable-cache-manager %s +; RUN: mkdir -p %t.cachedir +; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -enable-cache-manager -object-cache-dir=%t.cachedir %s ; This line tests MCJIT object loading -; RUN: %lli_mcjit -extra-object=%p/Inputs/multi-module-b.o -extra-object=%p/Inputs/multi-module-c.o %s +; RUN: %lli_mcjit -extra-object=%t.cachedir/%p/Inputs/multi-module-b.o -extra-object=%t.cachedir/%p/Inputs/multi-module-c.o %s ; These lines put the object files into an archive -; RUN: llvm-ar r %p/Inputs/load-object.a %p/Inputs/multi-module-b.o -; RUN: llvm-ar r %p/Inputs/load-object.a %p/Inputs/multi-module-c.o +; RUN: llvm-ar r %t.cachedir/%p/Inputs/load-object.a %t.cachedir/%p/Inputs/multi-module-b.o +; RUN: llvm-ar r %t.cachedir/%p/Inputs/load-object.a %t.cachedir/%p/Inputs/multi-module-c.o ; This line test MCJIT archive loading -; RUN: %lli_mcjit -extra-archive=%p/Inputs/load-object.a %s - -; These lines clean up our temporary files -; RUN: rm -f %p/Inputs/load-object-a.o -; RUN: rm -f %p/Inputs/multi-module-b.o -; RUN: rm -f %p/Inputs/multi-module-c.o -; RUN: rm -f %p/Inputs/load-object.a +; RUN: %lli_mcjit -extra-archive=%t.cachedir/%p/Inputs/load-object.a %s declare i32 @FB() diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 62e232ad68e..5694715d128 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -153,9 +153,15 @@ namespace { cl::opt EnableCacheManager("enable-cache-manager", - cl::desc("Use cache manager to save/load mdoules."), + cl::desc("Use cache manager to save/load mdoules"), cl::init(false)); + cl::opt + ObjectCacheDir("object-cache-dir", + cl::desc("Directory to store cached object files " + "(must be user writable)"), + cl::init("")); + cl::opt FakeArgv0("fake-argv0", cl::desc("Override the 'argv[0]' value passed into the executing" @@ -240,13 +246,19 @@ namespace { //===----------------------------------------------------------------------===// // Object cache // -// This object cache implementation writes cached objects to disk using a -// filename provided in the module descriptor and tries to load a saved object -// using that filename if the file exists. +// This object cache implementation writes cached objects to disk to the +// directory specified by CacheDir, using a filename provided in the module +// descriptor. The cache tries to load a saved object using that path if the +// file exists. CacheDir defaults to "", in which case objects are cached +// alongside their originating bitcodes. // class LLIObjectCache : public ObjectCache { public: - LLIObjectCache() { } + LLIObjectCache(const std::string& CacheDir) : CacheDir(CacheDir) { + // Add trailing '/' to cache dir if necessary. + if (!this->CacheDir.empty() && this->CacheDir.back() != '/') + this->CacheDir += '/'; + } virtual ~LLIObjectCache() {} virtual void notifyObjectCompiled(const Module *M, const MemoryBuffer *Obj) { @@ -255,6 +267,8 @@ public: if (!getCacheFilename(ModuleID, CacheName)) return; std::string errStr; + if (!CacheDir.empty()) // Create user-defined cache dir. + sys::fs::create_directories(CacheName.substr(0, CacheName.rfind('/'))); raw_fd_ostream outfile(CacheName.c_str(), errStr, sys::fs::F_Binary); outfile.write(Obj->getBufferStart(), Obj->getBufferSize()); outfile.close(); @@ -279,12 +293,14 @@ public: } private: + std::string CacheDir; + bool getCacheFilename(const std::string &ModID, std::string &CacheName) { std::string Prefix("file:"); size_t PrefixLength = Prefix.length(); if (ModID.substr(0, PrefixLength) != Prefix) return false; - CacheName = ModID.substr(PrefixLength); + CacheName = CacheDir + ModID.substr(PrefixLength); size_t pos = CacheName.rfind('.'); CacheName.replace(pos, CacheName.length() - pos, ".o"); return true; @@ -476,7 +492,7 @@ int main(int argc, char **argv, char * const *envp) { } if (EnableCacheManager) { - CacheManager = new LLIObjectCache; + CacheManager = new LLIObjectCache(ObjectCacheDir); EE->setObjectCache(CacheManager); }