summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Haarman <llvm@inglorion.net>2019-08-21 18:24:59 +0000
committerBob Haarman <llvm@inglorion.net>2019-08-21 18:24:59 +0000
commit5375b94e36b7e557c5546ab0ddf7269884656b2c (patch)
tree7d5029eb9bbba1e91f5afc746412570cb4232d7e
parent969b3e6a8fa3b324bbae72b089e2047f4741408b (diff)
downloadbcm5719-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.h3
-rw-r--r--lld/COFF/Driver.cpp1
-rw-r--r--lld/COFF/LTO.cpp2
-rw-r--r--lld/COFF/Options.td3
-rw-r--r--lld/test/COFF/lto-obj-path.ll25
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
+}
OpenPOWER on IntegriCloud