[lld-macho] Require -arch and -platform_version to always be specified
We previously defaulted to x86_64 and an unknown platform, which was fine when
we only supported one arch and did no platform checks, but that will no longer
be true going ahead. Therefore, we should require those flags to be specified
whenever the linker is invoked.
Note that LLD-ELF and ld64 both infer the arch from their input object files,
but the usefulness of that is questionable since clang will always specify these
flags, and most of the time `lld` will be invoked via clang.
Reviewed By: #lld-macho, thakis
Differential Revision: https://reviews.llvm.org/D97799
GitOrigin-RevId: b63919e18001500c1b549ae0ce2440944e1df8e7
diff --git a/MachO/Driver.cpp b/MachO/Driver.cpp
index 6179adb..f6d22c8 100644
--- a/MachO/Driver.cpp
+++ b/MachO/Driver.cpp
@@ -126,11 +126,9 @@
}
static TargetInfo *createTargetInfo(opt::InputArgList &args) {
- // TODO: should unspecified arch be an error rather than defaulting?
- // Jez: ld64 seems to make unspecified arch an error when LTO is
- // being used. I'm not sure why though. Feels like we should be able
- // to infer the arch from our input files regardless
- StringRef archName = args.getLastArgValue(OPT_arch, "x86_64");
+ StringRef archName = args.getLastArgValue(OPT_arch);
+ if (archName.empty())
+ fatal("must specify -arch");
config->arch = MachO::getArchitectureFromName(archName);
switch (MachO::getCPUTypeFromArchitecture(config->arch).first) {
case MachO::CPU_TYPE_X86_64:
@@ -563,8 +561,10 @@
static PlatformInfo getPlatformVersion(const opt::ArgList &args) {
const opt::Arg *arg = args.getLastArg(OPT_platform_version);
PlatformInfo platform;
- if (!arg)
+ if (!arg) {
+ error("must specify -platform_version");
return platform;
+ }
StringRef platformStr = arg->getValue(0);
StringRef minVersionStr = arg->getValue(1);
diff --git a/MachO/InputFiles.cpp b/MachO/InputFiles.cpp
index feab688..e33cae8 100644
--- a/MachO/InputFiles.cpp
+++ b/MachO/InputFiles.cpp
@@ -486,6 +486,7 @@
getArchitectureName(config->arch));
return;
}
+ // TODO: check platform too
if (const load_command *cmd = findCommand(hdr, LC_LINKER_OPTION)) {
auto *c = reinterpret_cast<const linker_option_command *>(cmd);
diff --git a/test/MachO/lit.local.cfg b/test/MachO/lit.local.cfg
index 9394353..dd5d7cb 100644
--- a/test/MachO/lit.local.cfg
+++ b/test/MachO/lit.local.cfg
@@ -2,7 +2,13 @@
import os
-lld = ('ld64.lld -syslibroot ' +
+# We specify the most commonly-used arch and platform version in our tests here
+# Tests which need different settings can just append to this, as only the last
+# value will be used.
+#
+# Note however that this does not apply to `-syslibroot`: each instance of that
+# flag will append to the set of library roots.
+lld = ('ld64.lld -arch x86_64 -platform_version macos 10.0 11.0 -syslibroot ' +
os.path.join(config.test_source_root, "MachO", "Inputs", "MacOSX.sdk"))
config.substitutions.append(('%lld', lld + ' -fatal_warnings'))
config.substitutions.append(('%no_fatal_warnings_lld', lld))
diff --git a/test/MachO/syslibroot.test b/test/MachO/syslibroot.test
index fcf8bbe..1a71ea5 100644
--- a/test/MachO/syslibroot.test
+++ b/test/MachO/syslibroot.test
@@ -1,56 +1,68 @@
# Ensure that a nonexistent path is ignored with a syslibroot
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot /var/empty | FileCheck %s -check-prefix CHECK-NONEXISTENT-SYSLIBROOT
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot /var/empty | FileCheck %s -check-prefix CHECK-NONEXISTENT-SYSLIBROOT
CHECK-NONEXISTENT-SYSLIBROOT: Library search paths:
CHECK-NONEXISTENT-SYSLIBROOT-NEXT: Framework search paths:
RUN: mkdir -p %t/usr/lib
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot %t 2>&1 | FileCheck %s -check-prefix CHECK-SYSLIBROOT -DROOT=%t
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot %t 2>&1 | FileCheck %s -check-prefix CHECK-SYSLIBROOT -DROOT=%t
CHECK-SYSLIBROOT-NOT: directory not found{{.*}}usr/local/lib
CHECK-SYSLIBROOT: Library search paths:
CHECK-SYSLIBROOT-NEXT: [[ROOT]]/usr/lib
RUN: mkdir -p %t/Library/libxml2-development
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot %t -L /Library/libxml2-development | FileCheck %s -check-prefix CHECK-ABSOLUTE-PATH-REROOTED -DROOT=%t
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot %t -L /Library/libxml2-development | FileCheck %s -check-prefix CHECK-ABSOLUTE-PATH-REROOTED -DROOT=%t
CHECK-ABSOLUTE-PATH-REROOTED: Library search paths:
CHECK-ABSOLUTE-PATH-REROOTED: [[ROOT]]/Library/libxml2-development
CHECK-ABSOLUTE-PATH-REROOTED: [[ROOT]]/usr/lib
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot %t -L %t/Library/libxml2-development | FileCheck %s -check-prefix CHECK-PATH-WITHOUT-REROOT -DPATH=%t/Library/libxml2-development
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot %t -L %t/Library/libxml2-development | FileCheck %s -check-prefix CHECK-PATH-WITHOUT-REROOT -DPATH=%t/Library/libxml2-development
CHECK-PATH-WITHOUT-REROOT: Library search paths:
CHECK-PATH-WITHOUT-REROOT-NEXT: [[PATH]]
RUN: mkdir -p %t.2/usr/lib
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot %t -syslibroot %t.2 | FileCheck %s -check-prefix CHECK-SYSLIBROOT-MATRIX -DROOT=%t
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot %t -syslibroot %t.2 | FileCheck %s -check-prefix CHECK-SYSLIBROOT-MATRIX -DROOT=%t
CHECK-SYSLIBROOT-MATRIX: Library search paths:
CHECK-SYSLIBROOT-MATRIX: [[ROOT]]/usr/lib
CHECK-SYSLIBROOT-MATRIX: [[ROOT]].2/usr/lib
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot %t -syslibroot %t.2 -syslibroot / | FileCheck %s -check-prefix CHECK-SYSLIBROOT-IGNORED -DROOT=%t
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot %t -syslibroot %t.2 -syslibroot / | \
+RUN: FileCheck %s -check-prefix CHECK-SYSLIBROOT-IGNORED -DROOT=%t
CHECK-SYSLIBROOT-IGNORED: Library search paths:
CHECK-SYSLIBROOT-IGNORED-NOT: [[ROOT]]/usr/lib
CHECK-SYSLIBROOT-IGNORED-NOT: [[ROOT]].2/usr/lib
RUN: mkdir -p %t/System/Library/Frameworks
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot %t | FileCheck %s -check-prefix CHECK-SYSLIBROOT-FRAMEWORK -DROOT=%t
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot %t | FileCheck %s -check-prefix CHECK-SYSLIBROOT-FRAMEWORK -DROOT=%t
CHECK-SYSLIBROOT-FRAMEWORK: Framework search paths:
CHECK-SYSLIBROOT-FRAMEWORK: [[ROOT]]/System/Library/Frameworks
RUN: mkdir -p %t/Library/Frameworks
RUN: mkdir -p %t.2/Library/Frameworks
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot %t -syslibroot %t.2 -F /Library/Frameworks | FileCheck %s -check-prefix CHECK-SYSLIBROOT-FRAMEWORK-MATRIX -DROOT=%t
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot %t -syslibroot %t.2 -F /Library/Frameworks | \
+RUN: FileCheck %s -check-prefix CHECK-SYSLIBROOT-FRAMEWORK-MATRIX -DROOT=%t
CHECK-SYSLIBROOT-FRAMEWORK-MATRIX: Framework search paths:
CHECK-SYSLIBROOT-FRAMEWORK-MATRIX: [[ROOT]]/Library/Frameworks
CHECK-SYSLIBROOT-FRAMEWORK-MATRIX: [[ROOT]].2/Library/Frameworks
-RUN: ld64.lld -v -dylib -o /dev/null -syslibroot %t -syslibroot %t.2 -syslibroot / -F /Library/Frameworks | FileCheck %s -check-prefix CHECK-SYSLIBROOT-FRAMEWORK-IGNORED -DROOT=%t
+RUN: ld64.lld -arch x86_64 -platform_version macos 10 11 -v -dylib -o /dev/null \
+RUN: -syslibroot %t -syslibroot %t.2 -syslibroot / -F /Library/Frameworks | \
+RUN: FileCheck %s -check-prefix CHECK-SYSLIBROOT-FRAMEWORK-IGNORED -DROOT=%t
CHECK-SYSLIBROOT-FRAMEWORK-IGNORED: Framework search paths:
CHECK-SYSLIBROOT-FRAMEWORK-IGNORED-NOT: [[ROOT]]/Library/Frameworks