From 093145f1e207c523165188fd727d58eb2a0bbf5e Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Wed, 21 Oct 2026 23:58:48 -0400 Subject: [PATCH] [clang][Driver] Fix libc++ include path on OpenBSD (#212979) `clang++` defaults to `-stdlib=libc++` on OpenBSD. 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++` 22.1.8, thus inconsistent with the `libc++` being built. OpenBSD has its own version of addLibCxxIncludePaths which just includes `/usr/include/c++/v1`. This patch removes OpenBSD::addLibCxxIncludePaths in favour of the generic version in `Gnu.cpp`. (cherry picked from commit 1204f6b4e9d6bef8ec319d121942dca5cbf94a26) --- clang/lib/Driver/ToolChains/OpenBSD.cpp | 6 ------ clang/lib/Driver/ToolChains/OpenBSD.h | 3 --- clang/test/Driver/openbsd.cpp | 14 ++++++++++++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp b/clang/lib/Driver/ToolChains/OpenBSD.cpp index de5284ddf6e6..cc171d9f80c5 100644 --- a/clang/lib/Driver/ToolChains/OpenBSD.cpp +++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp @@ -349,12 +349,6 @@ void OpenBSD::AddClangSystemIncludeArgs( concat(D.SysRoot, "/usr/include")); } -void OpenBSD::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, - llvm::opt::ArgStringList &CC1Args) const { - addSystemInclude(DriverArgs, CC1Args, - concat(getDriver().SysRoot, "/usr/include/c++/v1")); -} - void OpenBSD::AddCXXStdlibLibArgs(const ArgList &Args, ArgStringList &CmdArgs) const { bool Profiling = Args.hasArg(options::OPT_pg); diff --git a/clang/lib/Driver/ToolChains/OpenBSD.h b/clang/lib/Driver/ToolChains/OpenBSD.h index a92c4d321bac..47c86d95313b 100644 --- a/clang/lib/Driver/ToolChains/OpenBSD.h +++ b/clang/lib/Driver/ToolChains/OpenBSD.h @@ -73,9 +73,6 @@ public: void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; - - 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; diff --git a/clang/test/Driver/openbsd.cpp b/clang/test/Driver/openbsd.cpp index 01aa09b75f27..108fbf5d6580 100644 --- a/clang/test/Driver/openbsd.cpp +++ b/clang/test/Driver/openbsd.cpp @@ -20,22 +20,32 @@ // RUN: | FileCheck --check-prefix=CHECK-PG-CXX %s // CHECK-PG-CXX: "-lc++_p" "-lc++abi_p" "-lpthread_p" "-lm_p" +// Test that OpenBSD prefers install tree libc++ headers over system ones. +// RUN: %clang -### %s --target=amd64-pc-openbsd -r 2>&1 \ +// RUN: -ccc-install-dir %S/Inputs/install_tree_with_libcxx/bin \ +// RUN: --sysroot=%S/Inputs/basic_openbsd_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" "{{.*}}usr[[SEP]]include[[SEP]]c++[[SEP]]v1" + // Test include paths with a sysroot. // RUN: %clangxx %s -### -fsyntax-only 2>&1 \ // RUN: --target=amd64-pc-openbsd \ +// 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-pc-openbsd \ +// 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"