[clang] [Darwin][Driver][clang] Prioritise `-isysroot` over `--sysroot` consistently (PR #115993)
Carlo Cabrera via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 4 17:36:07 PST 2024
https://github.com/carlocab updated https://github.com/llvm/llvm-project/pull/115993
>From e257a7924d15e3f19fe483ea81d792feb4644874 Mon Sep 17 00:00:00 2001
From: Carlo Cabrera <github at carlo.cab>
Date: Wed, 13 Nov 2024 13:09:59 +0800
Subject: [PATCH] [Darwin][Driver][clang] Prioritise command line flags over
`DEFAULT_SYSROOT`
If a toolchain is configured with `DEFAULT_SYSROOT`, then this could
result in an unintended value for `-syslibroot` being passed to the
linker if the user manually sets `-isysroot` or `SDKROOT`.
Let's fix this by prioritising command line flags when determining
`-syslibroot` before checking `getSysRoot`.
Downstream bug report: https://github.com/Homebrew/homebrew-core/issues/197277
Co-authored-by: Bo Anderson <mail at boanderson.me>
---
clang/lib/Driver/ToolChains/Darwin.cpp | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index 87380869f6fdab..cdb6d21a0148b6 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -430,13 +430,17 @@ void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
// Give --sysroot= preference, over the Apple specific behavior to also use
// --isysroot as the syslibroot.
- StringRef sysroot = C.getSysRoot();
- if (sysroot != "") {
+ // We check `OPT__sysroot_EQ` directly instead of `getSysRoot` to make sure we
+ // prioritise command line arguments over configuration of `DEFAULT_SYSROOT`.
+ if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
CmdArgs.push_back("-syslibroot");
- CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
+ CmdArgs.push_back(A->getValue());
} else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
CmdArgs.push_back("-syslibroot");
CmdArgs.push_back(A->getValue());
+ } else if (StringRef sysroot = C.getSysRoot(); sysroot != "") {
+ CmdArgs.push_back("-syslibroot");
+ CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
}
Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
More information about the cfe-commits
mailing list