[clang] [clang] Enhance handling of Apple-specific '-arch'/'-target' option values (PR #72821)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Nov 19 22:07:10 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Daniil Kovalev (kovdan01)
<details>
<summary>Changes</summary>
The '-arch' option itself is Apple-specific, so, if '-target' is not passed explicitely, we try to construct an Apple triple. If the default triple is Apple-specific, we just update it's arch so it matches the one passed via '-arch' option, otherwise, we construct a '<arch>-apple-darwin10' triple "from scratch".
The arm64e arch value is also Apple-specific, so, if we have 'arm64e' or 'arm64e-apple' triple, append missing parts to it so it becomes 'arm64e-apple-darwin10'.
See tests in Driver/apple-specific-options.c for detailed description of how different cases are handled.
---
Full diff: https://github.com/llvm/llvm-project/pull/72821.diff
2 Files Affected:
- (modified) clang/lib/Driver/Driver.cpp (+28)
- (added) clang/test/Driver/apple-specific-options.c (+60)
``````````diff
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 6f5ff8141032677..4663189933cc1c2 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -521,6 +521,34 @@ static llvm::Triple computeTargetTriple(const Driver &D,
if (TargetTriple.contains("-unknown-gnu") || TargetTriple.contains("-pc-gnu"))
Target.setOSName("hurd");
+ auto SetDefaultAppleTarget = [&Target]() {
+ if (Target.getVendorName().empty())
+ Target.setVendor(llvm::Triple::Apple);
+ if (Target.getVendor() == llvm::Triple::Apple &&
+ Target.getOSAndEnvironmentName().empty())
+ Target.setOSName("darwin10");
+ };
+
+ // Since '-arch' is an Apple-specific option, construct a default Apple triple
+ // when '-target' is not explicitely passed.
+ if (Args.hasArg(options::OPT_arch) && !Args.hasArg(options::OPT_target)) {
+ StringRef ArchName = Args.getLastArg(options::OPT_arch)->getValue();
+ if (Target.isOSBinFormatMachO()) {
+ // The default triple is already Apple-specific - just update the arch.
+ tools::darwin::setTripleTypeForMachOArchName(Target, ArchName, Args);
+ } else {
+ // The default triple is not Apple-specific - construct a new one to avoid
+ // handling unrelated info from the default one (e.g. environment).
+ Target = llvm::Triple(ArchName);
+ SetDefaultAppleTarget();
+ }
+ }
+
+ // Since arm64e arch is Apple-specific, set VendorName and OS correspondingly
+ // if not set already.
+ if (Target.getArchName() == "arm64e")
+ SetDefaultAppleTarget();
+
// Handle Apple-specific options available here.
if (Target.isOSBinFormatMachO()) {
// If an explicit Darwin arch name is given, that trumps all.
diff --git a/clang/test/Driver/apple-specific-options.c b/clang/test/Driver/apple-specific-options.c
new file mode 100644
index 000000000000000..b683bf5a3de3a8f
--- /dev/null
+++ b/clang/test/Driver/apple-specific-options.c
@@ -0,0 +1,60 @@
+// Without '-target' explicitly passed, construct the default triple.
+// If the LLVM_DEFAULT_TARGET_TRIPLE is a Darwin triple, change it's architecture
+// to a one passed via '-arch'. Otherwise, use '<arch>-apple-darwin10'.
+
+// RUN: %clang -arch x86_64 -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARCH
+
+// ARCH: "-triple" "x86_64-apple-
+
+// For non-Darwin explicitly passed '-target', ignore '-arch'.
+
+// RUN: %clang -arch arm64 -target x86_64-unknown-linux -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARCH_NON_DARWIN1
+
+// ARCH_NON_DARWIN1: "-triple" "x86_64-unknown-linux"
+
+// RUN: %clang -arch arm64 -target x86_64-apple -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARCH_NON_DARWIN2
+
+// ARCH_NON_DARWIN2: "-triple" "x86_64-apple"
+
+
+// For Darwin explicitly passed '-target', the '-arch' option overrides the architecture
+
+// RUN: %clang -arch arm64 -target x86_64-apple-ios7.0.0 -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARCH_DARWIN
+
+// ARCH_DARWIN: "-triple" "arm64-apple-ios7.0.0"
+
+
+// For 'arm64e' and 'arm64e-apple' explicitly passed as '-target',
+// construct the default 'arm64e-apple-darwin10' triple.
+
+// RUN: %clang -target arm64e -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARM64E
+// RUN: %clang -target arm64e-apple -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARM64E
+// ARM64E: "-triple" "arm64e-apple-macosx10.6.0"
+
+
+// For non-Darwin explicitly passed '-target', keep it unchanged if not 'arm64e' and
+// 'arm64e-apple', which we implicitly narrow to the default 'arm64e-apple-darwin10'.
+
+// RUN: %clang -target arm64e-pc -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARM64E_NON_DARWIN1
+
+// ARM64E_NON_DARWIN1: "-triple" "arm64e-pc"
+
+// RUN: %clang -target arm64e-unknown-linux -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARM64E_NON_DARWIN2
+
+// ARM64E_NON_DARWIN2: "-triple" "arm64e-unknown-linux"
+
+
+// For Darwin explicitly passed '-target', keep it unchanged
+
+// RUN: %clang -target arm64e-apple-ios7.0.0 -c %s -### 2>&1 | \
+// RUN: FileCheck %s --check-prefix ARM64E_DARWIN
+
+// ARM64E_DARWIN: "-triple" "arm64e-apple-ios7.0.0"
``````````
</details>
https://github.com/llvm/llvm-project/pull/72821
More information about the cfe-commits
mailing list