Author: Rainer Orth Date: 2026-08-23T08:59:23+02:00 New Revision: 7f9b3b671718ce555e76b0eb7f728f1e41ca05e2
URL: https://github.com/llvm/llvm-project/commit/7f9b3b671718ce555e76b0eb7f728f1e41ca05e2 DIFF: https://github.com/llvm/llvm-project/commit/7f9b3b671718ce555e76b0eb7f728f1e41ca05e2.diff LOG: [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`. Added: clang/test/Driver/Inputs/install_tree_without_libcxx/bin/.keep clang/test/Driver/Inputs/install_tree_without_libcxx/include/.keep clang/test/Driver/Inputs/install_tree_without_libcxx/lib/.keep Modified: clang/lib/Driver/ToolChains/FreeBSD.cpp clang/lib/Driver/ToolChains/FreeBSD.h clang/test/Driver/freebsd-include-paths.c clang/test/Driver/freebsd.cpp Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index 724ccbefd790f..dcf2973c364d1 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" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
