[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