[clang] [lld] [llvm] [llvm][lld][clang] Delay initializing TargetOptions in LTO builds until a Triple is available (PR #179509)

Nikita Popov via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 6 02:03:58 PST 2026


================
@@ -46,47 +46,52 @@ static std::string getThinLTOOutputFile(Ctx &ctx, StringRef modulePath) {
 static lto::Config createConfig(Ctx &ctx) {
   lto::Config c;
 
-  // LLD supports the new relocations and address-significance tables.
-  c.Options = initTargetOptionsFromCodeGenFlags();
-  c.Options.EmitAddrsig = true;
-  for (StringRef C : ctx.arg.mllvmOpts)
-    c.MllvmArgs.emplace_back(C.str());
-
-  // Always emit a section per function/datum with LTO.
-  c.Options.FunctionSections = true;
-  c.Options.DataSections = true;
-
-  // Check if basic block sections must be used.
-  // Allowed values for --lto-basic-block-sections are "all",
-  // "<file name specifying basic block ids>", or none.  This is the equivalent
-  // of -fbasic-block-sections= flag in clang.
-  if (!ctx.arg.ltoBasicBlockSections.empty()) {
-    if (ctx.arg.ltoBasicBlockSections == "all") {
-      c.Options.BBSections = BasicBlockSection::All;
-    } else if (ctx.arg.ltoBasicBlockSections == "labels") {
-      c.Options.BBAddrMap = true;
-      Warn(ctx)
-          << "'--lto-basic-block-sections=labels' is deprecated; Please use "
-             "'--lto-basic-block-address-map' instead";
-    } else if (ctx.arg.ltoBasicBlockSections == "none") {
-      c.Options.BBSections = BasicBlockSection::None;
-    } else {
-      ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
-          MemoryBuffer::getFile(ctx.arg.ltoBasicBlockSections.str());
-      if (!MBOrErr) {
-        ErrAlways(ctx) << "cannot open " << ctx.arg.ltoBasicBlockSections << ":"
-                       << MBOrErr.getError().message();
+  // Set up the callback to modify TargetOptions.
+  c.ModifyTargetOptions = [&](TargetOptions &Options) -> void {
+    // LLD supports the new relocations and address-significance tables.
+    Options.EmitAddrsig = true;
+    // Always emit a section per function/datum with LTO.
+    Options.FunctionSections = true;
+    Options.DataSections = true;
+
+    // Check if basic block sections must be used.
+    // Allowed values for --lto-basic-block-sections are "all",
+    // "<file name specifying basic block ids>", or none.  This is the
+    // equivalent of -fbasic-block-sections= flag in clang.
+    if (!ctx.arg.ltoBasicBlockSections.empty()) {
+      if (ctx.arg.ltoBasicBlockSections == "all") {
+        Options.BBSections = BasicBlockSection::All;
+      } else if (ctx.arg.ltoBasicBlockSections == "labels") {
+        Options.BBAddrMap = true;
+        Warn(ctx)
+            << "'--lto-basic-block-sections=labels' is deprecated; Please use "
+               "'--lto-basic-block-address-map' instead";
+      } else if (ctx.arg.ltoBasicBlockSections == "none") {
+        Options.BBSections = BasicBlockSection::None;
       } else {
-        c.Options.BBSectionsFuncListBuf = std::move(*MBOrErr);
+        ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
+            MemoryBuffer::getFile(ctx.arg.ltoBasicBlockSections.str());
+        if (!MBOrErr) {
+          ErrAlways(ctx) << "cannot open " << ctx.arg.ltoBasicBlockSections
+                         << ":" << MBOrErr.getError().message();
+        } else {
+          Options.BBSectionsFuncListBuf = std::move(*MBOrErr);
+        }
+        Options.BBSections = BasicBlockSection::List;
       }
-      c.Options.BBSections = BasicBlockSection::List;
     }
-  }
 
-  c.Options.BBAddrMap = ctx.arg.ltoBBAddrMap;
+    Options.BBAddrMap = ctx.arg.ltoBBAddrMap;
----------------
nikic wrote:

Guess this is a pre-existing issue, but I noticed that this overwrites the BBAddrMap = true assignment above...

https://github.com/llvm/llvm-project/pull/179509


More information about the cfe-commits mailing list