From 26a462877b325db106e3a08cdd0dbda5533913a5 Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Fri, 26 Aug 2016 23:29:14 +0000 Subject: [PATCH] [ThinLTO] Move loading of cache entry to client Summary: Have the cache pass back the path to the cache entry when it is ready to be loaded, instead of a buffer. For gold-plugin we can simply pass this file back to gold directly, which avoids expensive writing of a separate tmp file. Ensure the cache entry is not deleted on cleanup by adjusting the setting of the IsTemporary flags. Moved the loading of the buffer into llvm-lto2 to maintain current behavior. Reviewers: mehdi_amini Subscribers: llvm-commits, mehdi_amini Differential Revision: https://reviews.llvm.org/D23946 llvm-svn: 279883 --- llvm/include/llvm/LTO/Caching.h | 8 ++++---- llvm/lib/LTO/Caching.cpp | 10 ++-------- llvm/tools/gold/gold-plugin.cpp | 7 +++---- llvm/tools/llvm-lto2/llvm-lto2.cpp | 10 ++++++++-- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/llvm/include/llvm/LTO/Caching.h b/llvm/include/llvm/LTO/Caching.h index 8b01578..7470058 100644 --- a/llvm/include/llvm/LTO/Caching.h +++ b/llvm/include/llvm/LTO/Caching.h @@ -22,7 +22,7 @@ namespace llvm { namespace lto { /// Type for client-supplied callback when a buffer is loaded from the cache. -typedef std::function)> AddBufferFn; +typedef std::function AddBufferFn; /// Manage caching on the filesystem. /// @@ -65,7 +65,7 @@ class CacheObjectOutput : public NativeObjectOutput { /// Path to temporary file used to buffer output that will be committed to the /// cache entry when this object is destroyed SmallString<128> TempFilename; - /// User-supplied callback, called when the buffer is pulled out of the cache + /// User-supplied callback, used to provide path to cache entry /// (potentially after creating it). AddBufferFn AddBuffer; @@ -77,8 +77,8 @@ public: /// Create a CacheObjectOutput: the client is supposed to create it in the /// callback supplied to LTO::run. The \p CacheDirectoryPath points to the /// directory on disk where to store the cache, and \p AddBuffer will be - /// called when the buffer is pulled out of the cache (potentially after - /// creating it). + /// called when the buffer is ready to be pulled out of the cache + /// (potentially after creating it). CacheObjectOutput(StringRef CacheDirectoryPath, AddBufferFn AddBuffer) : CacheDirectoryPath(CacheDirectoryPath), AddBuffer(AddBuffer) {} diff --git a/llvm/lib/LTO/Caching.cpp b/llvm/lib/LTO/Caching.cpp index 118efde..728e516 100644 --- a/llvm/lib/LTO/Caching.cpp +++ b/llvm/lib/LTO/Caching.cpp @@ -64,14 +64,8 @@ CacheObjectOutput::~CacheObjectOutput() { // We commit the tempfile into the cache now, by moving it to EntryPath. commitEntry(TempFilename, EntryPath); } - // Load the entry from the cache now. - auto ReloadedBufferOrErr = MemoryBuffer::getFile(EntryPath); - if (auto EC = ReloadedBufferOrErr.getError()) - report_fatal_error(Twine("Can't reload cached file '") + EntryPath + "': " + - EC.message() + "\n"); - - // Supply the resulting buffer to the user. - AddBuffer(std::move(*ReloadedBufferOrErr)); + // Supply the cache path to the user. + AddBuffer(EntryPath.str()); } // Return an allocated stream for the output, or null in case of failure. diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index 9a6fe27..9c2280e 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -802,14 +802,13 @@ static ld_plugin_status allSymbolsReadHook() { auto &OutputName = Filenames[Task]; getOutputFileName(Filename, /*TempOutFile=*/!SaveTemps, OutputName, MaxTasks > 1 ? Task : -1); - IsTemporary[Task] = !SaveTemps; + IsTemporary[Task] = !SaveTemps && options::cache_dir.empty(); if (options::cache_dir.empty()) return llvm::make_unique(OutputName); return llvm::make_unique( - options::cache_dir, [OutputName](std::unique_ptr Buffer) { - *LTOOutput(OutputName).getStream() << Buffer->getBuffer(); - }); + options::cache_dir, + [&OutputName](std::string EntryPath) { OutputName = EntryPath; }); }; check(Lto->run(AddOutput)); diff --git a/llvm/tools/llvm-lto2/llvm-lto2.cpp b/llvm/tools/llvm-lto2/llvm-lto2.cpp index 722eec6..06c3d04 100644 --- a/llvm/tools/llvm-lto2/llvm-lto2.cpp +++ b/llvm/tools/llvm-lto2/llvm-lto2.cpp @@ -198,8 +198,14 @@ int main(int argc, char **argv) { return llvm::make_unique(std::move(Path)); return llvm::make_unique( - CacheDir, [Path](std::unique_ptr Buffer) { - *LTOOutput(Path).getStream() << Buffer->getBuffer(); + CacheDir, [Path](std::string EntryPath) { + // Load the entry from the cache now. + auto ReloadedBufferOrErr = MemoryBuffer::getFile(EntryPath); + if (auto EC = ReloadedBufferOrErr.getError()) + report_fatal_error(Twine("Can't reload cached file '") + EntryPath + + "': " + EC.message() + "\n"); + + *LTOOutput(Path).getStream() << (*ReloadedBufferOrErr)->getBuffer(); }); }; -- 2.7.4