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 1/8] [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" >From 365ffcf3dcab89030f5827695d32cf96cbd9e8ea Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <[email protected]> Date: Wed, 18 Mar 2026 00:53:31 +0800 Subject: [PATCH 2/8] Use a bool flag to track whether we should try xcselect --- clang/lib/Driver/ToolChains/Darwin.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 4cc0653299807..244697855d386 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -2484,6 +2484,7 @@ std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS, void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { const OptTable &Opts = getDriver().getOpts(); + bool TryXcselect = false; // Support allowing the SDKROOT environment variable used by xcrun and other // Xcode tools to define the default sysroot, by making it the default for @@ -2500,6 +2501,9 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { Args.append(Args.MakeSeparateArg( nullptr, Opts.getOption(options::OPT_isysroot), env)); } + } else { + TryXcselect = !Args.getLastArg(options::OPT__sysroot_EQ) && + !Args.getLastArg(options::OPT_no_xcselect); } // Read the SDKSettings.json file for more information, like the SDK version @@ -2642,9 +2646,7 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { #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) { + if (TryXcselect && !SDKInfo) { char *p; if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) { Args.append(Args.MakeSeparateArg( >From 6f95ff67d6388f28afbea555e9ba76b4e8cf08cc Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <[email protected]> Date: Wed, 18 Mar 2026 01:02:41 +0800 Subject: [PATCH 3/8] Rename `--no-xcselect` to `--no-sysroot` We can also remove some of these extra `--no-xcselect` flags because we skip xcselect when `--sysroot` is passed. --- clang/include/clang/Options/Options.td | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 4 ++-- clang/test/Driver/darwin-builtin-modules.c | 4 ++-- clang/test/Driver/darwin-header-search-system.cpp | 4 ---- clang/test/Driver/darwin-ld-platform-version-macos.c | 6 +++--- clang/test/Driver/fsanitize-ignorelist.c | 4 ++-- clang/test/Driver/xcselect.c | 2 +- 7 files changed, 11 insertions(+), 15 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 379fbd8c11f62..0e947befaacc6 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -1341,7 +1341,7 @@ 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">, +def no_sysroot : Flag<["--"], "no-sysroot">, HelpText<"Disable xcselect SDK injection on macOS">; def cuda_path_EQ : Joined<["--"], "cuda-path=">, Group<i_Group>, HelpText<"CUDA installation path">; diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 244697855d386..fa55746fe0e99 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -2503,7 +2503,7 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { } } else { TryXcselect = !Args.getLastArg(options::OPT__sysroot_EQ) && - !Args.getLastArg(options::OPT_no_xcselect); + !Args.getLastArg(options::OPT_no_sysroot); } // Read the SDKSettings.json file for more information, like the SDK version @@ -2645,7 +2645,7 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 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. + // xcselect, except when passed --no-sysroot. if (TryXcselect && !SDKInfo) { char *p; if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) { diff --git a/clang/test/Driver/darwin-builtin-modules.c b/clang/test/Driver/darwin-builtin-modules.c index e643718e95df9..557ed125f0f7b 100644 --- a/clang/test/Driver/darwin-builtin-modules.c +++ b/clang/test/Driver/darwin-builtin-modules.c @@ -1,8 +1,8 @@ // Check that darwin passes -fbuiltin-headers-in-system-modules // when expected. -// 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 +// Pass --no-sysroot to avoid injecting an SDK that supports builtin modules. +// RUN: %clang -target x86_64-apple-darwin22.4 --no-sysroot -### %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 579ee197ec21b..5fb83b62ce7e6 100644 --- a/clang/test/Driver/darwin-header-search-system.cpp +++ b/clang/test/Driver/darwin-header-search-system.cpp @@ -15,10 +15,8 @@ // 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 \ @@ -93,10 +91,8 @@ // 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.c b/clang/test/Driver/darwin-ld-platform-version-macos.c index 38ef087250bf7..440eae2eaa8a8 100644 --- a/clang/test/Driver/darwin-ld-platform-version-macos.c +++ b/clang/test/Driver/darwin-ld-platform-version-macos.c @@ -42,14 +42,14 @@ // 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: --no-sysroot -### %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: --no-sysroot -### %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: --no-sysroot -### %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 1c40900b0fb50..6eee1dee1a188 100644 --- a/clang/test/Driver/fsanitize-ignorelist.c +++ b/clang/test/Driver/fsanitize-ignorelist.c @@ -25,8 +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= -// 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= +// Pass `--no-sysroot` to prevent the driver injecting -fdepfile-entry=<sysroot>/SDKSettings.json when xcselect is active. +// RUN: %clang --target=%itanium_abi_triple --no-sysroot -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 7ce5736ca43e0..ac1c37a9152bc 100644 --- a/clang/test/Driver/xcselect.c +++ b/clang/test/Driver/xcselect.c @@ -16,7 +16,7 @@ // SDK: "-isysroot" "{{.*}}/SDKs/MacOSX{{([0-9]+(\.[0-9]+)?)?}}.sdk" -// RUN: %clang -target arm64-apple-macosx -c --no-xcselect -### %s 2>&1 | \ +// RUN: %clang -target arm64-apple-macosx -c --no-sysroot -### %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 >From c207da139a8b3dde42b09d9a0ed7391a21f88133 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <[email protected]> Date: Wed, 18 Mar 2026 01:12:34 +0800 Subject: [PATCH 4/8] Move `no_sysroot` definition to a more sensible location I accidentally included this under the CUDA options. --- clang/include/clang/Options/Options.td | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 0e947befaacc6..669764a5195b1 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -1341,8 +1341,6 @@ 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_sysroot : Flag<["--"], "no-sysroot">, - 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>, @@ -6800,6 +6798,8 @@ def _help_hidden : Flag<["--"], "help-hidden">, HelpText<"Display help for hidden options">; def _sysroot_EQ : Joined<["--"], "sysroot=">, Visibility<[ClangOption, FlangOption]>; def _sysroot : Separate<["--"], "sysroot">, Alias<_sysroot_EQ>; +def no_sysroot : Flag<["--"], "no-sysroot">, + HelpText<"Disable xcselect SDK injection on macOS">; //===----------------------------------------------------------------------===// // pie/pic options (clang + flang) >From 9432443f8ecaa129fbe0b74b0c41d1e84a564d36 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <[email protected]> Date: Wed, 18 Mar 2026 01:21:07 +0800 Subject: [PATCH 5/8] Avoid unused variable warning This variable is unused when `CLANG_USE_XCSELECT` is not defined, so let's avoid it to prevent `-Werror` failures. --- clang/lib/Driver/ToolChains/Darwin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index fa55746fe0e99..55911f61338fe 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -2485,6 +2485,7 @@ std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS, void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { const OptTable &Opts = getDriver().getOpts(); bool TryXcselect = false; + (void)TryXcselect; // Support allowing the SDKROOT environment variable used by xcrun and other // Xcode tools to define the default sysroot, by making it the default for >From 64a1d70524456982ba8888dfafd5449042c27386 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <[email protected]> Date: Wed, 18 Mar 2026 02:50:25 +0800 Subject: [PATCH 6/8] Revert the rename of `--no-xcselect` to `--no-sysroot` --- clang/include/clang/Options/Options.td | 2 +- clang/lib/Driver/ToolChains/Darwin.cpp | 4 ++-- clang/test/Driver/darwin-builtin-modules.c | 4 ++-- clang/test/Driver/darwin-ld-platform-version-macos.c | 6 +++--- clang/test/Driver/fsanitize-ignorelist.c | 4 ++-- clang/test/Driver/xcselect.c | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 669764a5195b1..01950784280ff 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -6798,7 +6798,7 @@ def _help_hidden : Flag<["--"], "help-hidden">, HelpText<"Display help for hidden options">; def _sysroot_EQ : Joined<["--"], "sysroot=">, Visibility<[ClangOption, FlangOption]>; def _sysroot : Separate<["--"], "sysroot">, Alias<_sysroot_EQ>; -def no_sysroot : Flag<["--"], "no-sysroot">, +def no_xcselect : Flag<["--"], "no-xcselect">, HelpText<"Disable xcselect SDK injection on macOS">; //===----------------------------------------------------------------------===// diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 55911f61338fe..be37e821b9c70 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -2504,7 +2504,7 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { } } else { TryXcselect = !Args.getLastArg(options::OPT__sysroot_EQ) && - !Args.getLastArg(options::OPT_no_sysroot); + !Args.getLastArg(options::OPT_no_xcselect); } // Read the SDKSettings.json file for more information, like the SDK version @@ -2646,7 +2646,7 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 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-sysroot. + // xcselect, except when passed --no-xcselect. if (TryXcselect && !SDKInfo) { char *p; if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) { diff --git a/clang/test/Driver/darwin-builtin-modules.c b/clang/test/Driver/darwin-builtin-modules.c index 557ed125f0f7b..e643718e95df9 100644 --- a/clang/test/Driver/darwin-builtin-modules.c +++ b/clang/test/Driver/darwin-builtin-modules.c @@ -1,8 +1,8 @@ // Check that darwin passes -fbuiltin-headers-in-system-modules // when expected. -// Pass --no-sysroot to avoid injecting an SDK that supports builtin modules. -// RUN: %clang -target x86_64-apple-darwin22.4 --no-sysroot -### %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-ld-platform-version-macos.c b/clang/test/Driver/darwin-ld-platform-version-macos.c index 440eae2eaa8a8..38ef087250bf7 100644 --- a/clang/test/Driver/darwin-ld-platform-version-macos.c +++ b/clang/test/Driver/darwin-ld-platform-version-macos.c @@ -42,14 +42,14 @@ // ARM64_OLD: "-macosx_version_min" "11.0.0" // RUN: %clang -target x86_64-apple-macos10.13 -mlinker-version=520 \ -// RUN: --no-sysroot -### %t.o 2>&1 \ +// 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-sysroot -### %t.o 2>&1 \ +// 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-sysroot -### %t.o 2>&1 \ +// 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 6eee1dee1a188..33645955d548e 100644 --- a/clang/test/Driver/fsanitize-ignorelist.c +++ b/clang/test/Driver/fsanitize-ignorelist.c @@ -25,8 +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= -// Pass `--no-sysroot` to prevent the driver injecting -fdepfile-entry=<sysroot>/SDKSettings.json when xcselect is active. -// RUN: %clang --target=%itanium_abi_triple --no-sysroot -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= +// Pass `--no-xcselect` to prevent the driver injecting -fdepfile-entry=<sysroot>/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 ac1c37a9152bc..7ce5736ca43e0 100644 --- a/clang/test/Driver/xcselect.c +++ b/clang/test/Driver/xcselect.c @@ -16,7 +16,7 @@ // SDK: "-isysroot" "{{.*}}/SDKs/MacOSX{{([0-9]+(\.[0-9]+)?)?}}.sdk" -// RUN: %clang -target arm64-apple-macosx -c --no-sysroot -### %s 2>&1 | \ +// 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 >From 09c72d75f4fa9fa3e806c449626583ff631de159 Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <[email protected]> Date: Wed, 18 Mar 2026 02:54:45 +0800 Subject: [PATCH 7/8] Relocate comment --- clang/lib/Driver/ToolChains/Darwin.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index be37e821b9c70..cb1d57db1e0a8 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -2484,6 +2484,10 @@ std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS, void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { const OptTable &Opts = getDriver().getOpts(); + // TryXcselect keeps track of whether we use xcselect to find the SDK + // when CLANG_USE_XCSELECT is enabled. Currently, we do this when we + // do not have a sysroot from -isysroot, --sysroot, or SDKROOT, and + // we do not have --no-xcselect. bool TryXcselect = false; (void)TryXcselect; @@ -2645,8 +2649,6 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { // 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 (TryXcselect && !SDKInfo) { char *p; if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) { >From e3868a14509c9ddc4f7785d230495335f4648f8f Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <[email protected]> Date: Wed, 18 Mar 2026 03:00:29 +0800 Subject: [PATCH 8/8] Allow using xcselect even if SDKInfo is set --- clang/lib/Driver/ToolChains/Darwin.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index cb1d57db1e0a8..1315c26cb0c73 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -2649,13 +2649,14 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { // Set the tool chain target information. if (Platform == MacOS) { #ifdef CLANG_USE_XCSELECT - if (TryXcselect && !SDKInfo) { + if (TryXcselect) { 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()); + if (!SDKInfo) + SDKInfo = parseSDKSettings(getVFS(), Args, getDriver()); } } #endif _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
