[llvm-branch-commits] [clang] release/23.x: [clang][Driver] Fix libc++ include path on FreeBSD (#212725) (PR #218211)
Douglas Yung via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 24 05:26:57 PDT 2026
https://github.com/dyung updated https://github.com/llvm/llvm-project/pull/218211
>From 14140e8595721f22d7a2420becc4df1864a65368 Mon Sep 17 00:00:00 2001
From: Rainer Orth <ro at gcc.gnu.org>
Date: Sun, 23 Aug 2026 08:59:23 +0200
Subject: [PATCH] [clang][Driver] Fix libc++ include path on FreeBSD (#212725)
`clang++` defaults to `-stdlib=libc++` on FreeBSD. When building with
both `clang` and `libcxx` included, the freshly built `clang++` uses the
system version of the `libc++` headers. However, this is from the
bundled `libc++` 19.1.7, thus inconsistent with the `libc++` being
built.
Similarly to the NetBSD case, FreeBSD has its own version of
`addLibCxxIncludePaths` which just includes `/usr/include/c++/v1`.
This patch removes `FreeBSD::addLibCxxIncludePaths` in favour of the
generic version in `Gnu.cpp`.
Tested on `amd64-pc-freebsd15.1`.
(cherry picked from commit 7f9b3b671718ce555e76b0eb7f728f1e41ca05e2)
---
clang/lib/Driver/ToolChains/FreeBSD.cpp | 6 ------
clang/lib/Driver/ToolChains/FreeBSD.h | 2 --
.../Inputs/install_tree_without_libcxx/bin/.keep | 0
.../install_tree_without_libcxx/include/.keep | 0
.../Inputs/install_tree_without_libcxx/lib/.keep | 0
clang/test/Driver/freebsd-include-paths.c | 6 ++++--
clang/test/Driver/freebsd.cpp | 14 ++++++++++++--
7 files changed, 16 insertions(+), 12 deletions(-)
create mode 100644 clang/test/Driver/Inputs/install_tree_without_libcxx/bin/.keep
create mode 100644 clang/test/Driver/Inputs/install_tree_without_libcxx/include/.keep
create mode 100644 clang/test/Driver/Inputs/install_tree_without_libcxx/lib/.keep
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index c45ae14f4e643..51feff241c544 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -432,12 +432,6 @@ void FreeBSD::AddClangSystemIncludeArgs(
concat(D.SysRoot, "/usr/include"));
}
-void FreeBSD::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
- llvm::opt::ArgStringList &CC1Args) const {
- addSystemInclude(DriverArgs, CC1Args,
- concat(getDriver().SysRoot, "/usr/include/c++/v1"));
-}
-
void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
ArgStringList &CmdArgs) const {
Generic_ELF::AddCXXStdlibLibArgs(Args, CmdArgs);
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.h b/clang/lib/Driver/ToolChains/FreeBSD.h
index 55400e17b5ea4..a8f4226a88274 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.h
+++ b/clang/lib/Driver/ToolChains/FreeBSD.h
@@ -69,8 +69,6 @@ class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
return ToolChain::CST_Libcxx;
}
- void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
- llvm::opt::ArgStringList &CC1Args) const override;
void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override;
void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,
diff --git a/clang/test/Driver/Inputs/install_tree_without_libcxx/bin/.keep b/clang/test/Driver/Inputs/install_tree_without_libcxx/bin/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/install_tree_without_libcxx/include/.keep b/clang/test/Driver/Inputs/install_tree_without_libcxx/include/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/install_tree_without_libcxx/lib/.keep b/clang/test/Driver/Inputs/install_tree_without_libcxx/lib/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/freebsd-include-paths.c b/clang/test/Driver/freebsd-include-paths.c
index 872b2386ce9f1..96c97d9ea276c 100644
--- a/clang/test/Driver/freebsd-include-paths.c
+++ b/clang/test/Driver/freebsd-include-paths.c
@@ -9,8 +9,10 @@
// Check that the driver passes include paths to cc1 on FreeBSD in C++ mode.
// RUN: %clang -### -xc++ %s --target=x86_64-unknown-freebsd13.1 2>&1 \
+// RUN: -ccc-install-dir %S/Inputs/install_tree_without_libcxx/bin \
+// RUN: --sysroot=%S/Inputs/basic_freebsd_libcxx_tree \
// RUN: | FileCheck %s --check-prefix=DRIVER-PASS-INCLUDES-CXX
// DRIVER-PASS-INCLUDES-CXX: "-cc1" {{.*}}"-resource-dir" "[[RESOURCE:[^"]+]]"
-// DRIVER-PASS-INCLUDES-CXX-SAME: "-internal-isystem" "/usr/include/c++/v1"
+// DRIVER-PASS-INCLUDES-CXX-SAME: "-internal-isystem" "{{.*}}/usr/include/c++/v1"
// DRIVER-PASS-INCLUDES-CXX-SAME: {{^}} "-internal-isystem" "[[RESOURCE]]/include"
-// DRIVER-PASS-INCLUDES-CXX-SAME: {{^}} "-internal-externc-isystem" "/usr/include"
+// DRIVER-PASS-INCLUDES-CXX-SAME: {{^}} "-internal-externc-isystem" "{{.*}}/usr/include"
diff --git a/clang/test/Driver/freebsd.cpp b/clang/test/Driver/freebsd.cpp
index e2f76cd013f7f..83f8bdafbb7e5 100644
--- a/clang/test/Driver/freebsd.cpp
+++ b/clang/test/Driver/freebsd.cpp
@@ -19,22 +19,32 @@
// CHECK-PG-FOURTEEN: "-lc++" "-lm"
// CHECK-PG-TEN: "-lc++_p" "-lm_p"
+// Test that FreeBSD prefers install tree libc++ headers over system ones.
+// RUN: %clang -### %s --target=amd64-unknown-freebsd -r 2>&1 \
+// RUN: -ccc-install-dir %S/Inputs/install_tree_with_libcxx/bin \
+// RUN: --sysroot=%S/Inputs/basic_freebsd_libcxx_tree \
+// RUN: | FileCheck %s --check-prefix=DRIVER-INSTALL-INCLUDES
+// DRIVER-INSTALL-INCLUDES: "-internal-isystem" "{{.*}}bin[[SEP:/|\\\\]]..[[SEP]]include[[SEP]]c++[[SEP]]v1"
+// DRIVER-INSTALL-INCLUDES-NOT: "-internal-isystem" "{{.*}}[[SEP]]/usr[[SEP]]include[[SEP]]c++[[SEP]]v1"
+
// Test include paths with a sysroot.
// RUN: %clangxx %s -### -fsyntax-only 2>&1 \
// RUN: --target=amd64-unknown-freebsd \
+// RUN: -ccc-install-dir %S/Inputs/install_tree_without_libcxx/bin \
// RUN: --sysroot=%S/Inputs/basic_openbsd_libcxx_tree \
// RUN: -resource-dir=%S/Inputs/resource_dir \
// RUN: | FileCheck --check-prefix=CHECK-LIBCXX-SYSROOT %s
// CHECK-LIBCXX-SYSROOT: "-cc1"
// CHECK-LIBCXX-SYSROOT-SAME: "-isysroot" "[[SYSROOT:[^"]+]]"
-// CHECK-LIBCXX-SYSROOT-SAME: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
+// CHECK-LIBCXX-SYSROOT-SAME: "-internal-isystem" "[[SYSROOT]][[SEP:/|\\\\]]usr[[SEP]]include[[SEP]]c++[[SEP]]v1"
// Test include paths when the sysroot path ends with `/`.
// RUN: %clangxx %s -### -fsyntax-only 2>&1 \
// RUN: --target=amd64-unknown-freebsd \
+// RUN: -ccc-install-dir %S/Inputs/install_tree_without_libcxx/bin \
// RUN: --sysroot=%S/Inputs/basic_openbsd_libcxx_tree/ \
// RUN: -resource-dir=%S/Inputs/resource_dir \
// RUN: | FileCheck --check-prefix=CHECK-LIBCXX-SYSROOT-SLASH %s
// CHECK-LIBCXX-SYSROOT-SLASH: "-cc1"
// CHECK-LIBCXX-SYSROOT-SLASH-SAME: "-isysroot" "[[SYSROOT:[^"]+/]]"
-// CHECK-LIBCXX-SYSROOT-SLASH-SAME: "-internal-isystem" "[[SYSROOT]]usr/include/c++/v1"
+// CHECK-LIBCXX-SYSROOT-SLASH-SAME: "-internal-isystem" "[[SYSROOT]]usr[[SEP:/|\\\\]]include[[SEP]]c++[[SEP]]v1"
More information about the llvm-branch-commits
mailing list