[clang] [Driver] Find vendor-prefixed musl GCC toolchains (PR #206477)
Adeel Mujahid via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 29 06:08:13 PDT 2026
https://github.com/am11 updated https://github.com/llvm/llvm-project/pull/206477
>From 67c487c5e3df39375424ee18affb601aaae35070 Mon Sep 17 00:00:00 2001
From: Adeel Mujahid <3840695+am11 at users.noreply.github.com>
Date: Mon, 29 Jun 2026 16:02:53 +0300
Subject: [PATCH 1/6] [Driver] Find vendor-prefixed musl GCC toolchains
---
clang/lib/Driver/ToolChains/Gnu.cpp | 32 +++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index b58c10145e7f3..0f42ec188424d 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -2206,6 +2206,38 @@ void Generic_GCC::GCCInstallationDetector::init(
for (StringRef Candidate : CandidateTripleAliases)
ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate, false,
GCCDirExists, GCCCrossDirExists);
+
+ // Some musl distributions embed a vendor name in their GCC triple that a
+ // neutral --target cannot spell. For example Alpine ships its toolchain
+ // under <arch>-alpine-linux-musl[abi] (e.g. aarch64-alpine-linux-musl,
+ // armv7-alpine-linux-musleabihf), so --target=aarch64-linux-musl or
+ // --target=armv7-linux-musleabihf would otherwise fail to find it.
+ // Enumerate the GCC triple directories and try any entry whose
+ // architecture, OS and environment match the target, ignoring the vendor
+ // field. ScanLibDirForGCCTriple already de-duplicates installations, so
+ // candidates also covered above are harmless. Skip this when the user
+ // pinned an explicit --gcc-triple.
+ if (TargetTriple.isMusl() && !Args.hasArg(options::OPT_gcc_triple_EQ)) {
+ for (const char *GCCDir : {"/gcc", "/gcc-cross"}) {
+ if ((StringRef(GCCDir) == "/gcc" && !GCCDirExists) ||
+ (StringRef(GCCDir) == "/gcc-cross" && !GCCCrossDirExists))
+ continue;
+ std::error_code EC;
+ for (llvm::vfs::directory_iterator
+ LI = VFS.dir_begin(LibDir + GCCDir, EC),
+ LE;
+ !EC && LI != LE; LI = LI.increment(EC)) {
+ StringRef Name = llvm::sys::path::filename(LI->path());
+ llvm::Triple CandidateTriple(Name);
+ if (CandidateTriple.getArch() == TargetTriple.getArch() &&
+ CandidateTriple.getOS() == TargetTriple.getOS() &&
+ CandidateTriple.getEnvironment() ==
+ TargetTriple.getEnvironment())
+ ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Name, false,
+ GCCDirExists, GCCCrossDirExists);
+ }
+ }
+ }
}
for (StringRef Suffix : CandidateBiarchLibDirs) {
const std::string LibDir = Prefix + Suffix.str();
>From 8305cbdda6059d3cb1cb405945649dd4bf968696 Mon Sep 17 00:00:00 2001
From: Adeel Mujahid <3840695+am11 at users.noreply.github.com>
Date: Mon, 29 Jun 2026 16:04:09 +0300
Subject: [PATCH 2/6] .
---
.../Driver/linux-musl-alpine-gcc-detect.c | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
create mode 100644 clang/test/Driver/linux-musl-alpine-gcc-detect.c
diff --git a/clang/test/Driver/linux-musl-alpine-gcc-detect.c b/clang/test/Driver/linux-musl-alpine-gcc-detect.c
new file mode 100644
index 0000000000000..a902bad65f442
--- /dev/null
+++ b/clang/test/Driver/linux-musl-alpine-gcc-detect.c
@@ -0,0 +1,23 @@
+// Alpine Linux ships its GCC toolchain under a vendor-prefixed musl triple
+// (e.g. aarch64-alpine-linux-musl, armv7-alpine-linux-musleabihf). Verify that
+// a neutral --target=<arch>-linux-musl[abi] still locates it, matching the
+// behavior of the exact Alpine triple.
+// See https://github.com/llvm/llvm-project/issues/89146
+
+// RUN: %clang -### %s --target=aarch64-linux-musl --rtlib=libgcc -no-pie \
+// RUN: --sysroot=%S/Inputs/alpine_aarch64_musl_tree 2>&1 \
+// RUN: | FileCheck --check-prefix=AARCH64 %s
+// RUN: %clang -### %s --target=aarch64-alpine-linux-musl --rtlib=libgcc -no-pie \
+// RUN: --sysroot=%S/Inputs/alpine_aarch64_musl_tree 2>&1 \
+// RUN: | FileCheck --check-prefix=AARCH64 %s
+// AARCH64: "{{[^"]*}}/usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1{{/|\\\\}}crtbegin.o"
+
+// RUN: %clang -### %s --target=armv7-linux-musleabihf --rtlib=libgcc -no-pie \
+// RUN: --sysroot=%S/Inputs/alpine_armv7_musl_tree 2>&1 \
+// RUN: | FileCheck --check-prefix=ARMHF %s
+// RUN: %clang -### %s --target=armv7-alpine-linux-musleabihf --rtlib=libgcc -no-pie \
+// RUN: --sysroot=%S/Inputs/alpine_armv7_musl_tree 2>&1 \
+// RUN: | FileCheck --check-prefix=ARMHF %s
+// ARMHF: "{{[^"]*}}/usr/lib/gcc/armv7-alpine-linux-musleabihf/13.2.1{{/|\\\\}}crtbegin.o"
+
+int main(void) {}
>From b596764181c79f363b8bbb300e8d931b19497241 Mon Sep 17 00:00:00 2001
From: Adeel Mujahid <3840695+am11 at users.noreply.github.com>
Date: Mon, 29 Jun 2026 16:04:44 +0300
Subject: [PATCH 3/6] Update ReleaseNotes.rst
---
clang/docs/ReleaseNotes.rst | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index a2eef75e2a719..eb6e6f41ef4aa 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -71,17 +71,6 @@ C/C++ Language Potentially Breaking Changes
Clang would previously ``break`` out of the ``while`` loop, whereas GCC (since version 9) would
``break`` out of the ``for`` loop here. Now, Clang and GCC both break out of the ``for`` loop.
-- Clang now parses line and digit directives, module names, and original filenames as unevaluated
- strings. This means that code containing strings with escape sequences such as
-
- .. code-block:: c++
-
- # 1 "original\x12source.c"
- #pragma clang module import "\x41"
- # 50 "a\012.c"
-
- are now ill-formed.
-
C++ Specific Potentially Breaking Changes
-----------------------------------------
@@ -346,6 +335,11 @@ Non-comprehensive list of changes in this release
- Linux and Windows toolchains now support Clang multilibs using
``-fmultilib-flag=``.
+- The GCC installation detector now finds vendor-prefixed musl toolchains, such
+ as Alpine Linux's ``<arch>-alpine-linux-musl[abi]``, when given a neutral
+ ``--target=<arch>-linux-musl[abi]``. Previously this only worked when the
+ exact distribution triple was passed. (#GH89146)
+
- The SafeStack builtins ``__builtin___get_unsafe_stack_ptr``,
``__builtin___get_unsafe_stack_bottom``, ``__builtin___get_unsafe_stack_top``,
and ``__builtin___get_unsafe_stack_start`` are now deprecated. Use the
@@ -538,9 +532,7 @@ Attribute Changes in Clang
ISO 18037 fixed-point ``printf`` specifiers.
- The ``const`` and ``pure`` attributes only apply to functions; they are now
- diagnosed and ignored when applied to anything else. Additionally, calling
- a function marked ``noreturn`` from a function marked ``const`` or ``pure``
- is now diagnosed as undefined behavior (#GH129022).
+ diagnosed and ignored when applied to anything else.
Improvements to Clang's diagnostics
-----------------------------------
>From 2603a00ef56d7ab5c3febb4032f2ad761d3f9036 Mon Sep 17 00:00:00 2001
From: Adeel Mujahid <3840695+am11 at users.noreply.github.com>
Date: Mon, 29 Jun 2026 16:05:52 +0300
Subject: [PATCH 4/6] .
---
clang/docs/ReleaseNotes.rst | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index eb6e6f41ef4aa..5381e88b0ae9c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -71,6 +71,18 @@ C/C++ Language Potentially Breaking Changes
Clang would previously ``break`` out of the ``while`` loop, whereas GCC (since version 9) would
``break`` out of the ``for`` loop here. Now, Clang and GCC both break out of the ``for`` loop.
+
+- Clang now parses line and digit directives, module names, and original filenames as unevaluated
+ strings. This means that code containing strings with escape sequences such as
+
+ .. code-block:: c++
+
+ # 1 "original\x12source.c"
+ #pragma clang module import "\x41"
+ # 50 "a\012.c"
+
+ are now ill-formed.
+
C++ Specific Potentially Breaking Changes
-----------------------------------------
>From 3e239d1d1fd4d98a5ef3ec910ea8cc04bbbeaad9 Mon Sep 17 00:00:00 2001
From: Adeel Mujahid <3840695+am11 at users.noreply.github.com>
Date: Mon, 29 Jun 2026 16:07:36 +0300
Subject: [PATCH 5/6] .
Co-authored-by: Adeel Mujahid <3840695+am11 at users.noreply.github.com>
---
clang/docs/ReleaseNotes.rst | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 5381e88b0ae9c..f032e6d4230ac 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -71,7 +71,6 @@ C/C++ Language Potentially Breaking Changes
Clang would previously ``break`` out of the ``while`` loop, whereas GCC (since version 9) would
``break`` out of the ``for`` loop here. Now, Clang and GCC both break out of the ``for`` loop.
-
- Clang now parses line and digit directives, module names, and original filenames as unevaluated
strings. This means that code containing strings with escape sequences such as
@@ -544,6 +543,9 @@ Attribute Changes in Clang
ISO 18037 fixed-point ``printf`` specifiers.
- The ``const`` and ``pure`` attributes only apply to functions; they are now
+ diagnosed and ignored when applied to anything else. Additionally, calling
+ a function marked ``noreturn`` from a function marked ``const`` or ``pure``
+ is now diagnosed as undefined behavior (#GH129022).
diagnosed and ignored when applied to anything else.
Improvements to Clang's diagnostics
>From a3a0f35318b91995bc4da71b790706bf8198576e Mon Sep 17 00:00:00 2001
From: Adeel Mujahid <3840695+am11 at users.noreply.github.com>
Date: Mon, 29 Jun 2026 16:08:01 +0300
Subject: [PATCH 6/6] .
---
clang/docs/ReleaseNotes.rst | 1 -
1 file changed, 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index f032e6d4230ac..28b34c345eed1 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -546,7 +546,6 @@ Attribute Changes in Clang
diagnosed and ignored when applied to anything else. Additionally, calling
a function marked ``noreturn`` from a function marked ``const`` or ``pure``
is now diagnosed as undefined behavior (#GH129022).
- diagnosed and ignored when applied to anything else.
Improvements to Clang's diagnostics
-----------------------------------
More information about the cfe-commits
mailing list