[PATCH] D114229: [clang][driver] Always add LTO options when using GNU toolchain

Timm Bäder via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 19 02:09:04 PST 2021


tbaeder created this revision.
tbaeder added reviewers: MaskRay, fhahn, tejohnson.
Herald added subscribers: ormris, steven_wu, hiraditya, inglorion.
tbaeder requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This is what the GCC driver does as well.

This way, ld.bfd can properly handle inputs from a clang LTO build,
without `-flto` being specified at link time explicitly.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D114229

Files:
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/test/Driver/lto.c


Index: clang/test/Driver/lto.c
===================================================================
--- clang/test/Driver/lto.c
+++ clang/test/Driver/lto.c
@@ -104,4 +104,19 @@
 // FLTO-THIN-NOT: "-flto"
 // FLTO-THIN: -flto=thin
 // FLTO-THIN-NOT: "-flto"
-// FLTO-THIN-NOT: -flto=full
\ No newline at end of file
+// FLTO-THIN-NOT: -flto=full
+
+// When ld.bfd is being used and no lto option has been specified, the driver
+// should pass the lto plugin options to the linker anyway, so LTO
+// input files can be linked.
+// RUN: %clang -target x86_64-unknown-linux -fuse-ld=bfd -### %s 2>&1 | \
+// RUN: FileCheck --check-prefix=FLTO-NOT-SPECIFIED-BFD %s
+//
+// FLTO-NOT-SPECIFIED-BFD: "-plugin" "{{.*}}{{[/\\]}}LLVMgold.{{dll|dylib|so}}"
+//
+//
+// But not when LLD is used:
+// RUN: %clang -target x86_64-unknown-linux -fuse-ld=lld -### %s 2>&1 | \
+// RUN: FileCheck --check-prefix=FLTO-NOT-SPECIFIED-LLD %s
+//
+// FLTO-NOT-SPECIFIED-LLD-NOT: "-plugin" "{{.*}}{{[/\\]}}LLVMgold.{{dll|dylib|so}}"
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -546,7 +546,14 @@
 
   ToolChain.AddFilePathLibArgs(Args, CmdArgs);
 
-  if (D.isUsingLTO()) {
+  // If no LTO option has been specified, add the LTO options anyway.
+  // This has the upside of making the linking automatically work with
+  // LLVM bitcode files created from an LTO compile. If the input is not
+  // an LTO file, the LTO plugin will not be invoked.
+  // This is the same behavior the GCC driver uses.
+  if ((!Args.hasArg(options::OPT_flto_EQ) &&
+       !Args.hasArg(options::OPT_fno_lto)) ||
+      D.isUsingLTO()) {
     assert(!Inputs.empty() && "Must have at least one input.");
     addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs[0],
                   D.getLTOMode() == LTOK_Thin);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114229.388431.patch
Type: text/x-patch
Size: 1916 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211119/3c406c3d/attachment.bin>


More information about the cfe-commits mailing list