From 700e23c19319d7158f369b89ea1280629388439f Mon Sep 17 00:00:00 2001 From: Egor Zhdan Date: Wed, 13 Jul 2022 16:40:24 +0100 Subject: [PATCH] [Clang][Driver] Fix include paths for `--sysroot /` on OpenBSD/FreeBSD This is the same change as https://reviews.llvm.org/D126289, but applied for OpenBSD & FreeBSD. Differential Revision: https://reviews.llvm.org/D129654 --- clang/lib/Driver/ToolChains/FreeBSD.cpp | 12 +++++------ clang/lib/Driver/ToolChains/OpenBSD.cpp | 7 ++++--- .../basic_freebsd_libcxx_tree/usr/bin/.keep | 0 .../usr/include/c++/v1/.keep | 0 .../basic_freebsd_libcxx_tree/usr/lib/.keep | 0 .../basic_openbsd_libcxx_tree/usr/bin/.keep | 0 .../usr/include/c++/v1/.keep | 0 .../basic_openbsd_libcxx_tree/usr/lib/.keep | 0 clang/test/Driver/freebsd.cpp | 20 +++++++++++++++++++ clang/test/Driver/openbsd.cpp | 20 +++++++++++++++++++ 10 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/bin/.keep create mode 100644 clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/include/c++/v1/.keep create mode 100644 clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/lib/.keep create mode 100644 clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/bin/.keep create mode 100644 clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/include/c++/v1/.keep create mode 100644 clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/lib/.keep diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index 05c58a8f43a8f..8a8f97bc29ac1 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -387,10 +387,10 @@ FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple, // back to '/usr/lib' if it doesn't exist. if ((Triple.getArch() == llvm::Triple::x86 || Triple.isMIPS32() || Triple.isPPC32()) && - D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o")) - getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32"); + D.getVFS().exists(concat(getDriver().SysRoot, "/usr/lib32/crt1.o"))) + getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib32")); else - getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); + getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib")); } ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const { @@ -409,14 +409,14 @@ unsigned FreeBSD::GetDefaultDwarfVersion() const { void FreeBSD::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const { addSystemInclude(DriverArgs, CC1Args, - getDriver().SysRoot + "/usr/include/c++/v1"); + concat(getDriver().SysRoot, "/usr/include/c++/v1")); } void FreeBSD::addLibStdCxxIncludePaths( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const { - addLibStdCXXIncludePaths(getDriver().SysRoot + "/usr/include/c++/4.2", "", "", - DriverArgs, CC1Args); + addLibStdCXXIncludePaths(concat(getDriver().SysRoot, "/usr/include/c++/4.2"), + "", "", DriverArgs, CC1Args); } void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args, diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp b/clang/lib/Driver/ToolChains/OpenBSD.cpp index 249a00ebb003a..b84e19631338e 100644 --- a/clang/lib/Driver/ToolChains/OpenBSD.cpp +++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp @@ -279,7 +279,7 @@ SanitizerMask OpenBSD::getSupportedSanitizers() const { OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : Generic_ELF(D, Triple, Args) { - getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); + getFilePaths().push_back(concat(getDriver().SysRoot, "/usr/lib")); } void OpenBSD::AddClangSystemIncludeArgs( @@ -312,13 +312,14 @@ void OpenBSD::AddClangSystemIncludeArgs( return; } - addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include"); + addExternCSystemInclude(DriverArgs, CC1Args, + concat(D.SysRoot, "/usr/include")); } void OpenBSD::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const { addSystemInclude(DriverArgs, CC1Args, - getDriver().SysRoot + "/usr/include/c++/v1"); + concat(getDriver().SysRoot, "/usr/include/c++/v1")); } void OpenBSD::AddCXXStdlibLibArgs(const ArgList &Args, diff --git a/clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/bin/.keep b/clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/bin/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/include/c++/v1/.keep b/clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/include/c++/v1/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/lib/.keep b/clang/test/Driver/Inputs/basic_freebsd_libcxx_tree/usr/lib/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/bin/.keep b/clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/bin/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/include/c++/v1/.keep b/clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/include/c++/v1/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/lib/.keep b/clang/test/Driver/Inputs/basic_openbsd_libcxx_tree/usr/lib/.keep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/clang/test/Driver/freebsd.cpp b/clang/test/Driver/freebsd.cpp index 2304a61fa9eaf..56c3d3cba1fe5 100644 --- a/clang/test/Driver/freebsd.cpp +++ b/clang/test/Driver/freebsd.cpp @@ -20,3 +20,23 @@ // CHECK-PG-FOURTEEN: "-lc++" "-lm" // CHECK-PG-TEN: "-lc++_p" "-lm_p" // CHECK-PG-NINE: "-lstdc++_p" "-lm_p" + +// Test include paths with a sysroot. +// RUN: %clangxx %s -### -fsyntax-only 2>&1 \ +// RUN: --target=amd64-unknown-freebsd \ +// 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" + +// Test include paths when the sysroot path ends with `/`. +// RUN: %clangxx %s -### -fsyntax-only 2>&1 \ +// RUN: --target=amd64-unknown-freebsd \ +// 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" diff --git a/clang/test/Driver/openbsd.cpp b/clang/test/Driver/openbsd.cpp index 417783b8d5a2b..906b0d22242d2 100644 --- a/clang/test/Driver/openbsd.cpp +++ b/clang/test/Driver/openbsd.cpp @@ -19,3 +19,23 @@ // RUN: %clangxx %s -### -pg -o %t.o -target arm-unknown-openbsd 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-PG-CXX %s // CHECK-PG-CXX: "-lc++_p" "-lc++abi_p" "-lpthread_p" "-lm_p" + +// Test include paths with a sysroot. +// RUN: %clangxx %s -### -fsyntax-only 2>&1 \ +// RUN: --target=amd64-pc-openbsd \ +// 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" + +// Test include paths when the sysroot path ends with `/`. +// RUN: %clangxx %s -### -fsyntax-only 2>&1 \ +// RUN: --target=amd64-pc-openbsd \ +// 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"