From: Teresa Johnson Date: Wed, 24 Aug 2016 15:11:47 +0000 (+0000) Subject: [ThinLTO/gold] Add caching support to gold-plugin X-Git-Tag: llvmorg-4.0.0-rc1~11579 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=57891a50a8d938f37ff1956c98dc73ffcdc81549;p=platform%2Fupstream%2Fllvm.git [ThinLTO/gold] Add caching support to gold-plugin Summary: With support now in the new LTO API for caching (r279576), add optional ThinLTO caching in the gold-plugin. Reviewers: mehdi_amini Subscribers: mehdi_amini, llvm-commits Differential Revision: https://reviews.llvm.org/D23836 llvm-svn: 279631 --- diff --git a/llvm/test/tools/gold/X86/Inputs/cache.ll b/llvm/test/tools/gold/X86/Inputs/cache.ll new file mode 100644 index 0000000..39fa05a --- /dev/null +++ b/llvm/test/tools/gold/X86/Inputs/cache.ll @@ -0,0 +1,9 @@ +target triple = "x86_64-unknown-linux-gnu" + +define i32 @main() { +entry: + call void (...) @globalfunc() + ret i32 0 +} + +declare void @globalfunc(...) diff --git a/llvm/test/tools/gold/X86/cache.ll b/llvm/test/tools/gold/X86/cache.ll new file mode 100644 index 0000000..8502bc9 --- /dev/null +++ b/llvm/test/tools/gold/X86/cache.ll @@ -0,0 +1,18 @@ +; RUN: opt -module-summary %s -o %t.o +; RUN: opt -module-summary %p/Inputs/cache.ll -o %t2.o + +; Verify that enabling caching is working +; RUN: rm -Rf %t.cache && mkdir %t.cache +; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=thinlto \ +; RUN: --plugin-opt=cache-dir=%t.cache \ +; RUN: -o %t3.o %t2.o %t.o + +; RUN: ls %t.cache | count 2 + +target triple = "x86_64-unknown-linux-gnu" + +define void @globalfunc() #0 { +entry: + ret void +} diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index 070b984..9a6fe27 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -17,6 +17,7 @@ #include "llvm/Config/config.h" // plugin-api.h requires HAVE_STDINT_H #include "llvm/IR/Constants.h" #include "llvm/IR/DiagnosticPrinter.h" +#include "llvm/LTO/Caching.h" #include "llvm/LTO/LTO.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" @@ -161,6 +162,8 @@ namespace options { // corresponding bitcode file, will use a path formed by replacing the // bitcode file's path prefix matching oldprefix with newprefix. static std::string thinlto_prefix_replace; + // Optional path to a directory for caching ThinLTO objects. + static std::string cache_dir; // Additional options to pass into the code generator. // Note: This array will contain all plugin options which are not claimed // as plugin exclusive to pass to the code generator. @@ -199,6 +202,8 @@ namespace options { thinlto_prefix_replace = opt.substr(strlen("thinlto-prefix-replace=")); if (thinlto_prefix_replace.find(";") == std::string::npos) message(LDPL_FATAL, "thinlto-prefix-replace expects 'old;new' format"); + } else if (opt.startswith("cache-dir=")) { + cache_dir = opt.substr(strlen("cache-dir=")); } else if (opt.size() == 2 && opt[0] == 'O') { if (opt[1] < '0' || opt[1] > '3') message(LDPL_FATAL, "Optimization level must be between 0 and 3"); @@ -792,12 +797,19 @@ static ld_plugin_status allSymbolsReadHook() { std::vector IsTemporary(MaxTasks); std::vector> Filenames(MaxTasks); - auto AddOutput = [&](size_t Task) { + auto AddOutput = + [&](size_t Task) -> std::unique_ptr { auto &OutputName = Filenames[Task]; getOutputFileName(Filename, /*TempOutFile=*/!SaveTemps, OutputName, MaxTasks > 1 ? Task : -1); IsTemporary[Task] = !SaveTemps; - return llvm::make_unique(OutputName); + 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(); + }); }; check(Lto->run(AddOutput));