[ThinLTO] Move loading of cache entry to client
authorTeresa Johnson <tejohnson@google.com>
Fri, 26 Aug 2016 23:29:14 +0000 (23:29 +0000)
committerTeresa Johnson <tejohnson@google.com>
Fri, 26 Aug 2016 23:29:14 +0000 (23:29 +0000)
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
llvm/lib/LTO/Caching.cpp
llvm/tools/gold/gold-plugin.cpp
llvm/tools/llvm-lto2/llvm-lto2.cpp

index 8b01578..7470058 100644 (file)
@@ -22,7 +22,7 @@
 namespace llvm {
 namespace lto {
 /// Type for client-supplied callback when a buffer is loaded from the cache.
-typedef std::function<void(std::unique_ptr<MemoryBuffer>)> AddBufferFn;
+typedef std::function<void(std::string)> 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) {}
 
index 118efde..728e516 100644 (file)
@@ -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.
index 9a6fe27..9c2280e 100644 (file)
@@ -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<LTOOutput>(OutputName);
 
     return llvm::make_unique<CacheObjectOutput>(
-        options::cache_dir, [OutputName](std::unique_ptr<MemoryBuffer> Buffer) {
-          *LTOOutput(OutputName).getStream() << Buffer->getBuffer();
-        });
+        options::cache_dir,
+        [&OutputName](std::string EntryPath) { OutputName = EntryPath; });
   };
 
   check(Lto->run(AddOutput));
index 722eec6..06c3d04 100644 (file)
@@ -198,8 +198,14 @@ int main(int argc, char **argv) {
       return llvm::make_unique<LTOOutput>(std::move(Path));
 
     return llvm::make_unique<CacheObjectOutput>(
-        CacheDir, [Path](std::unique_ptr<MemoryBuffer> 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();
         });
   };