diff options
author | Kazushi (Jam) Marukawa <marukawa@nec.com> | 2020-12-01 03:41:12 +0900 |
---|---|---|
committer | Kazushi (Jam) Marukawa <marukawa@nec.com> | 2020-12-03 22:22:56 +0900 |
commit | 7d30df7b59973a42a93c86cb501bd3d0fbb07404 (patch) | |
tree | 5bf357f5233b1ef0fa64cc967dd4f28830370e33 /clang/lib | |
parent | 78c0ea54a22aea5c3ff9030b66d2e1c50ca2c1a3 (diff) | |
download | llvm-7d30df7b59973a42a93c86cb501bd3d0fbb07404.zip llvm-7d30df7b59973a42a93c86cb501bd3d0fbb07404.tar.gz llvm-7d30df7b59973a42a93c86cb501bd3d0fbb07404.tar.bz2 |
[VE] Add standard include path and library path for C++
We have a plan to add libcxx and libcxxabi for VE. In order to do so,
we need to compile cxx source code with bootstarapped header files.
This patch adds such expected path to make clang++ work, at least
not crash at the startup. Add regression test for that, also.
Reviewed By: simoll
Differential Revision: https://reviews.llvm.org/D92386
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Driver/ToolChains/VEToolchain.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/clang/lib/Driver/ToolChains/VEToolchain.cpp b/clang/lib/Driver/ToolChains/VEToolchain.cpp index 6ea405c..e28f340 100644 --- a/clang/lib/Driver/ToolChains/VEToolchain.cpp +++ b/clang/lib/Driver/ToolChains/VEToolchain.cpp @@ -102,14 +102,37 @@ void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs, void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - // TODO upstream VE libc++ patches - llvm_unreachable("The VE target has no C++ stdlib for Clang yet"); + if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) || + DriverArgs.hasArg(options::OPT_nostdlibinc) || + DriverArgs.hasArg(options::OPT_nostdincxx)) + return; + if (const char *cl_include_dir = getenv("NCC_CPLUS_INCLUDE_PATH")) { + SmallVector<StringRef, 4> Dirs; + const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'}; + StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr)); + ArrayRef<StringRef> DirVec(Dirs); + addSystemIncludes(DriverArgs, CC1Args, DirVec); + } else { + SmallString<128> P(getDriver().ResourceDir); + llvm::sys::path::append(P, "include/c++/v1"); + addSystemInclude(DriverArgs, CC1Args, P); + } } void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args, ArgStringList &CmdArgs) const { - // TODO upstream VE libc++ patches - llvm_unreachable("The VE target has no C++ stdlib for Clang yet"); + assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) && + "Only -lc++ (aka libxx) is supported in this toolchain."); + + tools::addArchSpecificRPath(*this, Args, CmdArgs); + + CmdArgs.push_back("-lc++"); + CmdArgs.push_back("-lc++abi"); + CmdArgs.push_back("-lunwind"); + // libc++ requires -lpthread under glibc environment + CmdArgs.push_back("-lpthread"); + // libunwind requires -ldl under glibc environment + CmdArgs.push_back("-ldl"); } llvm::ExceptionHandling |