diff options
| author | Bob Haarman <llvm@inglorion.net> | 2019-08-21 18:24:59 +0000 |
|---|---|---|
| committer | Bob Haarman <llvm@inglorion.net> | 2019-08-21 18:24:59 +0000 |
| commit | 5375b94e36b7e557c5546ab0ddf7269884656b2c (patch) | |
| tree | 7d5029eb9bbba1e91f5afc746412570cb4232d7e | |
| parent | 969b3e6a8fa3b324bbae72b089e2047f4741408b (diff) | |
| download | bcm5719-llvm-5375b94e36b7e557c5546ab0ddf7269884656b2c.tar.gz bcm5719-llvm-5375b94e36b7e557c5546ab0ddf7269884656b2c.zip | |
[lld-link] implement -lto-obj-path
Summary:
This adds the -lto-obj-path option to lld-link. This can be
used to specify a path at which to write a native object file for
the full LTO part when using LTO unit splitting.
Reviewers: ruiu, tejohnson, pcc, rnk
Reviewed By: ruiu, rnk
Subscribers: mehdi_amini, steven_wu, dexonsmith, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65964
llvm-svn: 369559
| -rw-r--r-- | lld/COFF/Config.h | 3 | ||||
| -rw-r--r-- | lld/COFF/Driver.cpp | 1 | ||||
| -rw-r--r-- | lld/COFF/LTO.cpp | 2 | ||||
| -rw-r--r-- | lld/COFF/Options.td | 3 | ||||
| -rw-r--r-- | lld/test/COFF/lto-obj-path.ll | 25 |
5 files changed, 34 insertions, 0 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index 7aaa0f5ae4c..309e1fbf99e 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -190,6 +190,9 @@ struct Configuration { // Used for /thinlto-object-suffix-replace: std::pair<llvm::StringRef, llvm::StringRef> thinLTOObjectSuffixReplace; + // Used for /lto-obj-path: + llvm::StringRef ltoObjPath; + uint64_t align = 4096; uint64_t imageBase = -1; uint64_t fileAlign = 512; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index f8743775dea..32b09a736a4 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1475,6 +1475,7 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) { getOldNewOptions(args, OPT_thinlto_prefix_replace); config->thinLTOObjectSuffixReplace = getOldNewOptions(args, OPT_thinlto_object_suffix_replace); + config->ltoObjPath = args.getLastArgValue(OPT_lto_obj_path); // Handle miscellaneous boolean flags. config->allowBind = args.hasFlag(OPT_allowbind, OPT_allowbind_no, true); config->allowIsolation = diff --git a/lld/COFF/LTO.cpp b/lld/COFF/LTO.cpp index 4b71dbdd2e2..7aa3b17e24d 100644 --- a/lld/COFF/LTO.cpp +++ b/lld/COFF/LTO.cpp @@ -177,6 +177,8 @@ std::vector<StringRef> BitcodeCompiler::compile() { // files. After that, we exit from linker and ThinLTO backend runs in a // distributed environment. if (config->thinLTOIndexOnly) { + if (!config->ltoObjPath.empty()) + saveBuffer(buf[0], config->ltoObjPath); if (indexFile) indexFile->close(); return {}; diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td index 024b7be8f78..6b9b26923fb 100644 --- a/lld/COFF/Options.td +++ b/lld/COFF/Options.td @@ -191,6 +191,9 @@ def thinlto_object_suffix_replace : P< def thinlto_prefix_replace: P< "thinlto-prefix-replace", "'old;new' replace old prefix with new prefix in ThinLTO outputs">; +def lto_obj_path : P< + "lto-obj-path", + "output native object for merged LTO unit to this path">; def dash_dash_version : Flag<["--"], "version">, HelpText<"Print version information">; defm threads: B<"threads", diff --git a/lld/test/COFF/lto-obj-path.ll b/lld/test/COFF/lto-obj-path.ll new file mode 100644 index 00000000000..db61ba97046 --- /dev/null +++ b/lld/test/COFF/lto-obj-path.ll @@ -0,0 +1,25 @@ +; REQUIRES: x86 + +; Test to ensure that thinlto-index-only with lto-obj-path creates +; the native object file. +; RUN: opt -module-summary %s -o %t1.obj +; RUN: opt -module-summary %p/Inputs/thinlto.ll -o %t2.obj +; RUN: rm -f %t4.obj +; RUN: lld-link -thinlto-index-only -lto-obj-path:%t4.obj -out:t3.exe \ +; RUN: -entry:main %t1.obj %t2.obj +; RUN: llvm-readobj -h %t4.obj | FileCheck %s +; RUN: llvm-nm %t4.obj 2>&1 | FileCheck %s -check-prefix=SYMBOLS +; RUN: llvm-nm %t4.obj 2>&1 | count 1 + +; CHECK: Format: COFF-x86-64 +; SYMBOLS: @feat.00 + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc19.0.24215" + +declare void @g(...) + +define void @main() { + call void (...) @g() + ret void +} |

