diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2017-03-20 16:41:57 +0000 |
|---|---|---|
| committer | Peter Collingbourne <peter@pcc.me.uk> | 2017-03-20 16:41:57 +0000 |
| commit | 25a17ba4c7cae20b301e01c6654c272fe38314b9 (patch) | |
| tree | 5dd3af1e8aee5ca2f1c04b3be25ff320d90b2723 | |
| parent | e593049fb057a014e912973e8717463e060c9d60 (diff) | |
| download | bcm5719-llvm-25a17ba4c7cae20b301e01c6654c272fe38314b9.tar.gz bcm5719-llvm-25a17ba4c7cae20b301e01c6654c272fe38314b9.zip | |
Support, LTO: When pruning a directory, ignore files matching a prefix.
This is a safeguard against data loss if the user specifies a directory
that is not a cache directory. Teach the existing cache pruning clients
to create files with appropriate names.
Differential Revision: https://reviews.llvm.org/D31109
llvm-svn: 298271
| -rw-r--r-- | lld/test/ELF/lto/cache.ll | 9 | ||||
| -rw-r--r-- | llvm/include/llvm/Support/CachePruning.h | 4 | ||||
| -rw-r--r-- | llvm/lib/LTO/Caching.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/LTO/ThinLTOCodeGenerator.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/Support/CachePruning.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/ThinLTO/X86/cache.ll | 10 |
6 files changed, 30 insertions, 11 deletions
diff --git a/lld/test/ELF/lto/cache.ll b/lld/test/ELF/lto/cache.ll index deb11b61de2..55e3a3d6f6c 100644 --- a/lld/test/ELF/lto/cache.ll +++ b/lld/test/ELF/lto/cache.ll @@ -4,12 +4,13 @@ ; RUN: opt -module-hash -module-summary %p/Inputs/cache.ll -o %t2.o ; RUN: rm -Rf %t.cache && mkdir %t.cache -; Create a file that will be removed by cache pruning due to age. -; RUN: touch -t 197001011200 %t.cache/foo +; Create two files that would be removed by cache pruning due to age. +; We should only remove files matching the pattern "llvmcache-*". +; RUN: touch -t 197001011200 %t.cache/llvmcache-foo %t.cache/foo ; RUN: ld.lld --thinlto-cache-dir=%t.cache --thinlto-cache-policy prune_after=1h -o %t3 %t2.o %t.o -; Two cached objects, plus a timestamp file, minus the file we removed. -; RUN: ls %t.cache | count 3 +; Two cached objects, plus a timestamp file and "foo", minus the file we removed. +; RUN: ls %t.cache | count 4 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/llvm/include/llvm/Support/CachePruning.h b/llvm/include/llvm/Support/CachePruning.h index 46bab386a21..e826938878e 100644 --- a/llvm/include/llvm/Support/CachePruning.h +++ b/llvm/include/llvm/Support/CachePruning.h @@ -52,6 +52,10 @@ Expected<CachePruningPolicy> parseCachePruningPolicy(StringRef PolicyStr); /// Peform pruning using the supplied policy, returns true if pruning /// occured, i.e. if Policy.Interval was expired. +/// +/// As a safeguard against data loss if the user specifies the wrong directory +/// as their cache directory, this function will ignore files not matching the +/// pattern "llvmcache-*". bool pruneCache(StringRef Path, CachePruningPolicy Policy); } // namespace llvm diff --git a/llvm/lib/LTO/Caching.cpp b/llvm/lib/LTO/Caching.cpp index 16edbece145..00373ddd1c4 100644 --- a/llvm/lib/LTO/Caching.cpp +++ b/llvm/lib/LTO/Caching.cpp @@ -27,9 +27,11 @@ Expected<NativeObjectCache> lto::localCache(StringRef CacheDirectoryPath, return errorCodeToError(EC); return [=](unsigned Task, StringRef Key) -> AddStreamFn { - // First, see if we have a cache hit. + // This choice of file name allows the cache to be pruned (see pruneCache() + // in include/llvm/Support/CachePruning.h). SmallString<64> EntryPath; - sys::path::append(EntryPath, CacheDirectoryPath, Key); + sys::path::append(EntryPath, CacheDirectoryPath, "llvmcache-" + Key); + // First, see if we have a cache hit. ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getFile(EntryPath); if (MBOrErr) { diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp index b793d0c9e3e..aa4d32a9c57 100644 --- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp @@ -348,7 +348,10 @@ public: ArrayRef<uint8_t>((const uint8_t *)&Entry, sizeof(GlobalValue::GUID))); } - sys::path::append(EntryPath, CachePath, toHex(Hasher.result())); + // This choice of file name allows the cache to be pruned (see pruneCache() + // in include/llvm/Support/CachePruning.h). + sys::path::append(EntryPath, CachePath, + "llvmcache-" + toHex(Hasher.result())); } // Access the path to this entry in the cache. diff --git a/llvm/lib/Support/CachePruning.cpp b/llvm/lib/Support/CachePruning.cpp index 5d81e10469b..aca12363956 100644 --- a/llvm/lib/Support/CachePruning.cpp +++ b/llvm/lib/Support/CachePruning.cpp @@ -180,8 +180,11 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy) { // Walk all of the files within this directory. for (sys::fs::directory_iterator File(CachePathNative, EC), FileEnd; File != FileEnd && !EC; File.increment(EC)) { - // Do not touch the timestamp. - if (File->path() == TimestampFile) + // Ignore any files not beginning with the string "llvmcache-". This + // includes the timestamp file as well as any files created by the user. + // This acts as a safeguard against data loss if the user specifies the + // wrong directory as their cache directory. + if (!sys::path::filename(File->path()).startswith("llvmcache-")) continue; // Look at this file. If we can't stat it, there's nothing interesting diff --git a/llvm/test/ThinLTO/X86/cache.ll b/llvm/test/ThinLTO/X86/cache.ll index d654d3468e3..426654f31d2 100644 --- a/llvm/test/ThinLTO/X86/cache.ll +++ b/llvm/test/ThinLTO/X86/cache.ll @@ -23,11 +23,16 @@ ; RUN: opt -module-hash -module-summary %s -o %t.bc ; RUN: opt -module-hash -module-summary %p/Inputs/cache.ll -o %t2.bc -; Verify that enabling caching is working +; Verify that enabling caching is working, and that the pruner only removes +; files matching the pattern "llvmcache-*". ; RUN: rm -Rf %t.cache && mkdir %t.cache +; RUN: touch -t 197001011200 %t.cache/llvmcache-foo %t.cache/foo ; RUN: llvm-lto -thinlto-action=run -exported-symbol=globalfunc %t2.bc %t.bc -thinlto-cache-dir %t.cache +; RUN: ls %t.cache | count 4 ; RUN: ls %t.cache/llvmcache.timestamp -; RUN: ls %t.cache | count 3 +; RUN: ls %t.cache/foo +; RUN: not ls %t.cache/llvmcache-foo +; RUN: ls %t.cache/llvmcache-* | count 2 ; Verify that enabling caching is working with llvm-lto2 ; RUN: rm -Rf %t.cache @@ -36,6 +41,7 @@ ; RUN: -r=%t2.bc,_globalfunc,lx \ ; RUN: -r=%t.bc,_globalfunc,plx ; RUN: ls %t.cache | count 2 +; RUN: ls %t.cache/llvmcache-* | count 2 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.11.0" |

