https://github.com/carlocab updated 
https://github.com/llvm/llvm-project/pull/186683

>From a26f1dca4862d3f46e61c04aa9daf849db870f17 Mon Sep 17 00:00:00 2001
From: Carlo Cabrera <[email protected]>
Date: Tue, 17 Mar 2026 19:12:22 +0800
Subject: [PATCH] [clang][Driver][Darwin] Use `xcselect` for `*-apple-darwin*`
 targets too

This is a follow-up to #119670. There, we introduced a CMake option
`CLANG_USE_XCSELECT`, which, when enabled, uses `libxcselect` to find
the right SDK to inject as an `-isysroot` flag when targeting
`*-apple-macos*`.

We intentionally left out `*-apple-darwin*` targets because it broke
many tests. This is unfortunate because `*-apple-darwin*` is the default
triple when building LLVM on macOS, so one isn't able to take advantage
of `xcselect` without an explicit `-target` flag or a change to the
toolchain's default target.

We fix this in two ways.

First, we move the injection of the `-isysroot` flag using `xcselect`
later, until after we are sure that we are targeting macOS. This avoids
confusing the earlier deployment target detection code when we inject
the macOS SDK but actually intended to target non-macOS.

Second, we introduce a `--no-xcselect` flag. This is useful to avoid
breaking some tests that assume clang is invoked without an `-isysroot`
flag pointing at a macOS SDK.
---
 clang/include/clang/Options/Options.td        |  2 ++
 clang/lib/Driver/ToolChains/Darwin.cpp        | 27 ++++++++-------
 clang/test/Driver/darwin-builtin-modules.c    |  3 +-
 .../Driver/darwin-header-search-system.cpp    |  4 +++
 .../darwin-ld-platform-version-macos-nosdk.c  | 17 ----------
 .../Driver/darwin-ld-platform-version-macos.c | 13 ++++++++
 clang/test/Driver/fsanitize-ignorelist.c      |  3 +-
 clang/test/Driver/xcselect.c                  | 33 +++++++++++++++++--
 8 files changed, 68 insertions(+), 34 deletions(-)
 delete mode 100644 clang/test/Driver/darwin-ld-platform-version-macos-nosdk.c

diff --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index 03353a31221f3..379fbd8c11f62 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -1341,6 +1341,8 @@ def no_cuda_version_check : Flag<["--"], 
"no-cuda-version-check">,
   HelpText<"Don't error out if the detected version of the CUDA install is "
            "too low for the requested CUDA gpu architecture.">;
 def no_cuda_noopt_device_debug : Flag<["--"], "no-cuda-noopt-device-debug">;
+def no_xcselect : Flag<["--"], "no-xcselect">,
+  HelpText<"Disable xcselect SDK injection on macOS">;
 def cuda_path_EQ : Joined<["--"], "cuda-path=">, Group<i_Group>,
   HelpText<"CUDA installation path">;
 def cuda_path_ignore_env : Flag<["--"], "cuda-path-ignore-env">, 
Group<i_Group>,
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp 
b/clang/lib/Driver/ToolChains/Darwin.cpp
index 7251f4a92d92d..4cc0653299807 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -2501,18 +2501,6 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) 
const {
           nullptr, Opts.getOption(options::OPT_isysroot), env));
     }
   }
-#ifdef CLANG_USE_XCSELECT
-  // FIXME: This should check for `getTriple().isMacOSX()`, but this breaks
-  // many tests. See https://github.com/llvm/llvm-project/pull/119670.
-  else if (getTriple().getOS() == llvm::Triple::MacOSX) {
-    char *p;
-    if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
-      Args.append(Args.MakeSeparateArg(
-          nullptr, Opts.getOption(options::OPT_isysroot), p));
-      ::free(p);
-    }
-  }
-#endif
 
   // Read the SDKSettings.json file for more information, like the SDK version
   // that we can pass down to the compiler.
@@ -2651,6 +2639,21 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) 
const {
   const std::string OSVersionStr = OSVersion.getAsString();
   // Set the tool chain target information.
   if (Platform == MacOS) {
+#ifdef CLANG_USE_XCSELECT
+    // If we don't have an SDK yet and are on macOS, try to inject one using
+    // xcselect, except when passed --no-xcselect.
+    if (!Args.hasArg(options::OPT_no_xcselect) &&
+        !Args.getLastArg(options::OPT_isysroot) && !::getenv("SDKROOT") &&
+        !SDKInfo) {
+      char *p;
+      if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
+        Args.append(Args.MakeSeparateArg(
+            nullptr, Opts.getOption(options::OPT_isysroot), p));
+        ::free(p);
+        SDKInfo = parseSDKSettings(getVFS(), Args, getDriver());
+      }
+    }
+#endif
     if (!Driver::GetReleaseVersion(OSVersionStr, Major, Minor, Micro,
                                    HadExtra) ||
         HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
diff --git a/clang/test/Driver/darwin-builtin-modules.c 
b/clang/test/Driver/darwin-builtin-modules.c
index f4c9220b8d577..e643718e95df9 100644
--- a/clang/test/Driver/darwin-builtin-modules.c
+++ b/clang/test/Driver/darwin-builtin-modules.c
@@ -1,7 +1,8 @@
 // Check that darwin passes -fbuiltin-headers-in-system-modules
 // when expected.
 
-// RUN: %clang -target x86_64-apple-darwin22.4 -### %s 2>&1 | FileCheck 
--check-prefix=CHECK_OLD %s
+// Pass --no-xcselect to avoid injecting an SDK that supports builtin modules.
+// RUN: %clang -target x86_64-apple-darwin22.4 --no-xcselect -### %s 2>&1 | 
FileCheck --check-prefix=CHECK_OLD %s
 // RUN: %clang -isysroot %S/Inputs/MacOSX10.15.sdk -target 
x86_64-apple-macos10.15 -### %s 2>&1 | FileCheck --check-prefix=CHECK_OLD %s
 // RUN: %clang -isysroot %S/Inputs/iPhoneOS13.0.sdk -target 
arm64-apple-ios13.0 -### %s 2>&1 | FileCheck --check-prefix=CHECK_OLD %s
 // CHECK_OLD: -fbuiltin-headers-in-system-modules
diff --git a/clang/test/Driver/darwin-header-search-system.cpp 
b/clang/test/Driver/darwin-header-search-system.cpp
index 5fb83b62ce7e6..579ee197ec21b 100644
--- a/clang/test/Driver/darwin-header-search-system.cpp
+++ b/clang/test/Driver/darwin-header-search-system.cpp
@@ -15,8 +15,10 @@
 // RUN:               -DRESOURCE=%S/Inputs/resource_dir \
 // RUN:               --check-prefix=CHECK-SYSTEM %s
 //
+// Pass --no-xcselect to ensure xcselect does not inject an -isysroot flag.
 // RUN: %clang -### %s -fsyntax-only 2>&1 \
 // RUN:     --target=x86_64-apple-darwin \
+// RUN:     --no-xcselect \
 // RUN:     -ccc-install-dir 
%S/Inputs/basic_darwin_toolchain_no_libcxx/usr/bin \
 // RUN:     -resource-dir=%S/Inputs/resource_dir \
 // RUN:     --sysroot %S/Inputs/basic_darwin_sdk_usr_and_usr_local \
@@ -91,8 +93,10 @@
 
 // Check search paths without -isysroot
 //
+// Pass --no-xcselect to ensure xcselect does not inject an -isysroot flag.
 // RUN: %clang -### %s -fsyntax-only 2>&1 \
 // RUN:     --target=x86_64-apple-darwin \
+// RUN:     --no-xcselect \
 // RUN:     -ccc-install-dir 
%S/Inputs/basic_darwin_toolchain_no_libcxx/usr/bin \
 // RUN:     -resource-dir=%S/Inputs/resource_dir \
 // RUN:     --sysroot="" \
diff --git a/clang/test/Driver/darwin-ld-platform-version-macos-nosdk.c 
b/clang/test/Driver/darwin-ld-platform-version-macos-nosdk.c
deleted file mode 100644
index 76f601a2f2679..0000000000000
--- a/clang/test/Driver/darwin-ld-platform-version-macos-nosdk.c
+++ /dev/null
@@ -1,17 +0,0 @@
-// UNSUPPORTED: xcselect
-// CLANG_USE_XCSELECT will always have an SDK inferred.
-
-// RUN: touch %t.o
-
-// RUN: %clang -target x86_64-apple-macos10.13 -mlinker-version=520 \
-// RUN:   -### %t.o 2>&1 \
-// RUN:   | FileCheck --check-prefix=NOSDK %s
-// RUN: %clang -target x86_64-apple-darwin17 -mlinker-version=520 \
-// RUN:   -### %t.o 2>&1 \
-// RUN:   | FileCheck --check-prefix=NOSDK %s
-// NOSDK: "-platform_version" "macos" "10.13.0" "10.13.0"
-
-// RUN: %clang -target arm64-apple-macos26 -mlinker-version=520 \
-// RUN:   -### %t.o 2>&1 \
-// RUN:   | FileCheck --check-prefix=VERSION_BUMP %s
-// VERSION_BUMP: "-platform_version" "macos" "26.0.0" "26.0.0"
diff --git a/clang/test/Driver/darwin-ld-platform-version-macos.c 
b/clang/test/Driver/darwin-ld-platform-version-macos.c
index 72c50d0b32b44..38ef087250bf7 100644
--- a/clang/test/Driver/darwin-ld-platform-version-macos.c
+++ b/clang/test/Driver/darwin-ld-platform-version-macos.c
@@ -40,3 +40,16 @@
 // ARM64_NEW: "-platform_version" "macos" "11.0.0" "10.15"
 // ARM64_NEW_1: "-platform_version" "macos" "11.1.0" "10.15"
 // ARM64_OLD: "-macosx_version_min" "11.0.0"
+
+// RUN: %clang -target x86_64-apple-macos10.13 -mlinker-version=520 \
+// RUN:   --no-xcselect -### %t.o 2>&1 \
+// RUN:   | FileCheck --check-prefix=NOSDK %s
+// RUN: %clang -target x86_64-apple-darwin17 -mlinker-version=520 \
+// RUN:   --no-xcselect -### %t.o 2>&1 \
+// RUN:   | FileCheck --check-prefix=NOSDK %s
+// NOSDK: "-platform_version" "macos" "10.13.0" "10.13.0"
+
+// RUN: %clang -target arm64-apple-macos26 -mlinker-version=520 \
+// RUN:   --no-xcselect -### %t.o 2>&1 \
+// RUN:   | FileCheck --check-prefix=VERSION_BUMP %s
+// VERSION_BUMP: "-platform_version" "macos" "26.0.0" "26.0.0"
diff --git a/clang/test/Driver/fsanitize-ignorelist.c 
b/clang/test/Driver/fsanitize-ignorelist.c
index 7dd666a453198..1c40900b0fb50 100644
--- a/clang/test/Driver/fsanitize-ignorelist.c
+++ b/clang/test/Driver/fsanitize-ignorelist.c
@@ -25,7 +25,8 @@
 // RUN: %clang --target=x86_64-linux-gnu -fsanitize=nullability 
-resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s 
--check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST 
--implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
 // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined 
-resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s 
--check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST 
--implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
 // RUN: %clang --target=x86_64-linux-gnu -fsanitize=alignment 
-resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s 
--check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST 
--implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-// RUN: %clang --target=%itanium_abi_triple -fsanitize=float-divide-by-zero 
-resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s 
--check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST 
--implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+// The driver injects -fdepfile-entry=/path/to/SDKSettings.json when xcselect 
is active.
+// RUN: %clang --target=%itanium_abi_triple --no-xcselect 
-fsanitize=float-divide-by-zero -resource-dir=%S/Inputs/resource_dir %s -### 
2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST 
--implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
 // CHECK-DEFAULT-UBSAN-IGNORELIST: 
-fsanitize-system-ignorelist={{.*}}ubsan_ignorelist.txt
 
 // Check that combining ubsan and another sanitizer results in both 
ignorelists being used.
diff --git a/clang/test/Driver/xcselect.c b/clang/test/Driver/xcselect.c
index 01cd4aca5ec23..7ce5736ca43e0 100644
--- a/clang/test/Driver/xcselect.c
+++ b/clang/test/Driver/xcselect.c
@@ -1,5 +1,32 @@
 // REQUIRES: xcselect
-// RUN: %clang -target arm64-apple-macosx -c -### %s 2> %t.log
-// RUN: FileCheck %s <%t.log
 
-// CHECK: "-isysroot" "{{.*}}/SDKs/MacOSX{{([0-9]+(\.[0-9]+)?)?}}.sdk"
+// xcselect injects -isysroot for -macosx triples.
+// RUN: %clang -target arm64-apple-macosx -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=SDK %s
+// RUN: %clang -target arm64-apple-macosx15 -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=SDK %s
+// RUN: %clang -target arm64-apple-macos -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=SDK %s
+// RUN: %clang -target arm64-apple-macos26 -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=SDK %s
+// RUN: %clang -target x86_64-apple-darwin -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=SDK %s
+// RUN: %clang -target arm64-apple-darwin20 -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=SDK %s
+
+// SDK: "-isysroot" "{{.*}}/SDKs/MacOSX{{([0-9]+(\.[0-9]+)?)?}}.sdk"
+
+// RUN: %clang -target arm64-apple-macosx -c --no-xcselect -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=NO-SDK %s
+// RUN: %clang -target armv7-apple-darwin10 -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=NO-SDK %s
+// RUN: %clang -target arm64-apple-ios18 -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=NO-SDK %s
+// RUN: %clang -target arm64-apple-darwin -mios-simulator-version-min=15.0 \
+// RUN:   -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=NO-SDK %s
+// RUN: env IPHONEOS_DEPLOYMENT_TARGET=14.0 \
+// RUN:   %clang -target x86_64-apple-darwin -c -### %s 2>&1 | \
+// RUN:   FileCheck --check-prefix=NO-SDK %s
+
+// NO-SDK-NOT: "-isysroot"

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to