Add an "-object-cache-dir=<string>" option to LLI. This option specifies the

root path to which object files managed by the LLIObjectCache instance should be
written. This option defaults to "", in which case objects are cached in the
same directory as the bitcode they are derived from.

The load-object-a.ll test has been rewritten to use this option to support
testing in environments where the test directory is not writable.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198852 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Lang Hames 2014-01-09 05:24:05 +00:00
parent 5f0929577b
commit 4442b6ec3a
2 changed files with 29 additions and 18 deletions

View File

@ -1,23 +1,18 @@
; REQUIRES: shell ; REQUIRES: shell
; This first line will generate the .o files for the next run line ; 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 ; 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 ; 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 %t.cachedir/%p/Inputs/load-object.a %t.cachedir/%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-c.o
; This line test MCJIT archive loading ; This line test MCJIT archive loading
; RUN: %lli_mcjit -extra-archive=%p/Inputs/load-object.a %s ; RUN: %lli_mcjit -extra-archive=%t.cachedir/%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
declare i32 @FB() declare i32 @FB()

View File

@ -153,9 +153,15 @@ namespace {
cl::opt<bool> cl::opt<bool>
EnableCacheManager("enable-cache-manager", 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::init(false));
cl::opt<std::string>
ObjectCacheDir("object-cache-dir",
cl::desc("Directory to store cached object files "
"(must be user writable)"),
cl::init(""));
cl::opt<std::string> cl::opt<std::string>
FakeArgv0("fake-argv0", FakeArgv0("fake-argv0",
cl::desc("Override the 'argv[0]' value passed into the executing" cl::desc("Override the 'argv[0]' value passed into the executing"
@ -240,13 +246,19 @@ namespace {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Object cache // Object cache
// //
// This object cache implementation writes cached objects to disk using a // This object cache implementation writes cached objects to disk to the
// filename provided in the module descriptor and tries to load a saved object // directory specified by CacheDir, using a filename provided in the module
// using that filename if the file exists. // 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 { class LLIObjectCache : public ObjectCache {
public: 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 ~LLIObjectCache() {}
virtual void notifyObjectCompiled(const Module *M, const MemoryBuffer *Obj) { virtual void notifyObjectCompiled(const Module *M, const MemoryBuffer *Obj) {
@ -255,6 +267,8 @@ public:
if (!getCacheFilename(ModuleID, CacheName)) if (!getCacheFilename(ModuleID, CacheName))
return; return;
std::string errStr; 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); raw_fd_ostream outfile(CacheName.c_str(), errStr, sys::fs::F_Binary);
outfile.write(Obj->getBufferStart(), Obj->getBufferSize()); outfile.write(Obj->getBufferStart(), Obj->getBufferSize());
outfile.close(); outfile.close();
@ -279,12 +293,14 @@ public:
} }
private: private:
std::string CacheDir;
bool getCacheFilename(const std::string &ModID, std::string &CacheName) { bool getCacheFilename(const std::string &ModID, std::string &CacheName) {
std::string Prefix("file:"); std::string Prefix("file:");
size_t PrefixLength = Prefix.length(); size_t PrefixLength = Prefix.length();
if (ModID.substr(0, PrefixLength) != Prefix) if (ModID.substr(0, PrefixLength) != Prefix)
return false; return false;
CacheName = ModID.substr(PrefixLength); CacheName = CacheDir + ModID.substr(PrefixLength);
size_t pos = CacheName.rfind('.'); size_t pos = CacheName.rfind('.');
CacheName.replace(pos, CacheName.length() - pos, ".o"); CacheName.replace(pos, CacheName.length() - pos, ".o");
return true; return true;
@ -476,7 +492,7 @@ int main(int argc, char **argv, char * const *envp) {
} }
if (EnableCacheManager) { if (EnableCacheManager) {
CacheManager = new LLIObjectCache; CacheManager = new LLIObjectCache(ObjectCacheDir);
EE->setObjectCache(CacheManager); EE->setObjectCache(CacheManager);
} }