summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-lto2/llvm-lto2.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2016-09-23 21:33:43 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2016-09-23 21:33:43 +0000
commit80186a57d66c4374aea9118045d8489dcdb6071b (patch)
tree757a092ded2644d8663928ae9e30c04f29bb8723 /llvm/tools/llvm-lto2/llvm-lto2.cpp
parent6951707943c771422c4e22ee8b7cd653642272ce (diff)
downloadbcm5719-llvm-80186a57d66c4374aea9118045d8489dcdb6071b.tar.gz
bcm5719-llvm-80186a57d66c4374aea9118045d8489dcdb6071b.zip
LTO: Simplify caching interface.
The NativeObjectOutput class has a design problem: it mixes up the caching policy with the interface for output streams, which makes the client-side code hard to follow and would for example make it harder to replace the cache implementation in an arbitrary client. This change separates the two aspects by moving the caching policy to a separate field in Config, replacing NativeObjectOutput with a NativeObjectStream class which only deals with streams and does not need to be overridden by most clients and introducing an AddFile callback for adding files (e.g. from the cache) to the link. Differential Revision: https://reviews.llvm.org/D24622 llvm-svn: 282299
Diffstat (limited to 'llvm/tools/llvm-lto2/llvm-lto2.cpp')
-rw-r--r--llvm/tools/llvm-lto2/llvm-lto2.cpp53
1 files changed, 21 insertions, 32 deletions
diff --git a/llvm/tools/llvm-lto2/llvm-lto2.cpp b/llvm/tools/llvm-lto2/llvm-lto2.cpp
index e5f0b3a1ad5..2b72615a46e 100644
--- a/llvm/tools/llvm-lto2/llvm-lto2.cpp
+++ b/llvm/tools/llvm-lto2/llvm-lto2.cpp
@@ -95,22 +95,6 @@ template <typename T> static T check(ErrorOr<T> E, std::string Msg) {
return T();
}
-namespace {
-// Define the LTOOutput handling
-class LTOOutput : public lto::NativeObjectOutput {
- std::string Path;
-
-public:
- LTOOutput(std::string Path) : Path(std::move(Path)) {}
- std::unique_ptr<raw_pwrite_stream> getStream() override {
- std::error_code EC;
- auto S = llvm::make_unique<raw_fd_ostream>(Path, EC, sys::fs::F_None);
- check(EC, Path);
- return std::move(S);
- }
-};
-}
-
int main(int argc, char **argv) {
InitializeAllTargets();
InitializeAllTargetMCs();
@@ -203,23 +187,28 @@ int main(int argc, char **argv) {
if (HasErrors)
return 1;
- auto AddOutput =
- [&](size_t Task) -> std::unique_ptr<lto::NativeObjectOutput> {
+ auto AddStream =
+ [&](size_t Task) -> std::unique_ptr<lto::NativeObjectStream> {
std::string Path = OutputFilename + "." + utostr(Task);
- if (CacheDir.empty())
- return llvm::make_unique<LTOOutput>(std::move(Path));
-
- return llvm::make_unique<CacheObjectOutput>(
- 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();
- });
+
+ std::error_code EC;
+ auto S = llvm::make_unique<raw_fd_ostream>(Path, EC, sys::fs::F_None);
+ check(EC, Path);
+ return llvm::make_unique<lto::NativeObjectStream>(std::move(S));
};
- check(Lto.run(AddOutput), "LTO::run failed");
+ auto AddFile = [&](size_t Task, StringRef Path) {
+ auto ReloadedBufferOrErr = MemoryBuffer::getFile(Path);
+ if (auto EC = ReloadedBufferOrErr.getError())
+ report_fatal_error(Twine("Can't reload cached file '") + Path + "': " +
+ EC.message() + "\n");
+
+ *AddStream(Task)->OS << (*ReloadedBufferOrErr)->getBuffer();
+ };
+
+ NativeObjectCache Cache;
+ if (!CacheDir.empty())
+ Cache = localCache(CacheDir, AddFile);
+
+ check(Lto.run(AddStream, Cache), "LTO::run failed");
}
OpenPOWER on IntegriCloud