[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
This commit is contained in:
Teresa Johnson 2016-08-26 23:29:14 +00:00
parent c215eadb51
commit 048eeff265
4 changed files with 17 additions and 18 deletions

View 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) {}

View 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.

View 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));

View 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();
});
};