[lld] 64be5b7 - [lld/mac] Implement -arch_multiple

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 5 21:27:46 PDT 2021


Author: Nico Weber
Date: 2021-07-06T00:25:18-04:00
New Revision: 64be5b7d87139c5fa9cfbe9ee413dc15d04cedb7

URL: https://github.com/llvm/llvm-project/commit/64be5b7d87139c5fa9cfbe9ee413dc15d04cedb7
DIFF: https://github.com/llvm/llvm-project/commit/64be5b7d87139c5fa9cfbe9ee413dc15d04cedb7.diff

LOG: [lld/mac] Implement -arch_multiple

This is the other flag clang passes when calling clang with two -arch
flags (which means with this, `clang -arch x86_64 -arch arm64 -fuse-ld=lld ...`
now no longer prints any warnings \o/). Since clang calls the linker several
times in that setup, it's not clear to the user from which invocation the
errors are. The flag's help text is

    Specifies that the linker should augment error and warning messages
    with the architecture name.

In ld64, the only effect of the flag is that undefined symbols are prefaced
with

    Undefined symbols for architecture x86_64:

instead of the usual "Undefined symbols:". So for now, let's add this
only to undefined symbol errors too. That's probably the most common
linker diagnostic.

Another idea would be to prefix errors and warnings with "ld64.lld(x86_64):"
instead of the usual "ld64.lld:", but I'm not sure if people would
misunderstand that as a comment about the arch of ld itself.
But open to suggestions on what effect this flag should have :) And we
don't have to get it perfect now, we can iterate on it.

Differential Revision: https://reviews.llvm.org/D105450

Added: 
    lld/test/MachO/arch-multiple.s

Modified: 
    lld/MachO/Config.h
    lld/MachO/Driver.cpp
    lld/MachO/Options.td
    lld/MachO/SymbolTable.cpp

Removed: 
    


################################################################################
diff  --git a/lld/MachO/Config.h b/lld/MachO/Config.h
index 297d5fa4a381..f285a18f4190 100644
--- a/lld/MachO/Config.h
+++ b/lld/MachO/Config.h
@@ -95,6 +95,7 @@ struct Configuration {
   Symbol *entry = nullptr;
   bool hasReexports = false;
   bool allLoad = false;
+  bool archMultiple = false;
   bool forceLoadObjC = false;
   bool forceLoadSwift = false;
   bool staticLink = false;

diff  --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index e03871bcce1f..28239ea95e14 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -1139,6 +1139,7 @@ bool macho::link(ArrayRef<const char *> argsArr, bool canExitEarly,
     error("--lto-O: invalid optimization level: " + Twine(config->ltoo));
   config->runtimePaths = args::getStrings(args, OPT_rpath);
   config->allLoad = args.hasArg(OPT_all_load);
+  config->archMultiple = args.hasArg(OPT_arch_multiple);
   config->forceLoadObjC = args.hasArg(OPT_ObjC);
   config->forceLoadSwift = args.hasArg(OPT_force_load_swift_libs);
   config->deadStripDylibs = args.hasArg(OPT_dead_strip_dylibs);

diff  --git a/lld/MachO/Options.td b/lld/MachO/Options.td
index 76937b8db95d..ffaec4e96df7 100644
--- a/lld/MachO/Options.td
+++ b/lld/MachO/Options.td
@@ -877,7 +877,6 @@ def final_output : Separate<["-"], "final_output">,
     Group<grp_rare>;
 def arch_multiple : Flag<["-"], "arch_multiple">,
     HelpText<"Augment error and warning messages with the architecture name">,
-    Flags<[HelpHidden]>,
     Group<grp_rare>;
 def dot : Separate<["-"], "dot">,
     MetaVarName<"<path>">,

diff  --git a/lld/MachO/SymbolTable.cpp b/lld/MachO/SymbolTable.cpp
index b2a6046e81cf..a6936293eb94 100644
--- a/lld/MachO/SymbolTable.cpp
+++ b/lld/MachO/SymbolTable.cpp
@@ -198,7 +198,10 @@ Defined *SymbolTable::addSynthetic(StringRef name, InputSection *isec,
 
 void lld::macho::treatUndefinedSymbol(const Undefined &sym, StringRef source) {
   auto message = [source, &sym]() {
-    std::string message = "undefined symbol: " + toString(sym);
+    std::string message = "undefined symbol";
+    if (config->archMultiple)
+      message += (" for arch " + getArchitectureName(config->arch())).str();
+    message += ": " + toString(sym);
     if (!source.empty())
       message += "\n>>> referenced by " + source.str();
     else

diff  --git a/lld/test/MachO/arch-multiple.s b/lld/test/MachO/arch-multiple.s
new file mode 100644
index 000000000000..1ec064e505d2
--- /dev/null
+++ b/lld/test/MachO/arch-multiple.s
@@ -0,0 +1,11 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o %t.o %s
+# RUN: not %lld -o %t.out -arch_multiple %t.o 2>&1 | FileCheck %s
+
+# CHECK: error: undefined symbol for arch x86_64: _foo
+
+.globl _main
+_main:
+  callq _foo
+  ret


        


More information about the llvm-commits mailing list