kaz7 created this revision. kaz7 added reviewers: simoll, k-ishizaka. kaz7 added projects: clang, VE. Herald added subscribers: cfe-commits, ormris. kaz7 requested review of this revision.
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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D92386 Files: clang/lib/Driver/ToolChains/VEToolchain.cpp clang/test/Driver/ve-toolchain.cpp
Index: clang/test/Driver/ve-toolchain.cpp =================================================================== --- /dev/null +++ clang/test/Driver/ve-toolchain.cpp @@ -0,0 +1,120 @@ +/// Check the behavior of toolchain for NEC Aurora VE +/// REQUIRES: ve-registered-target + +///----------------------------------------------------------------------------- +/// Checking dwarf-version + +// RUN: %clangxx -### -g -target ve %s 2>&1 | FileCheck -check-prefix=DWARF_VER %s +// DWARF_VER: "-dwarf-version=4" + +///----------------------------------------------------------------------------- +/// Checking dynamic-linker + +// RUN: %clangxx -### -target ve %s 2>&1 | FileCheck -check-prefix=DYNLINKER %s +// DYNLINKER: nld{{.*}} "-dynamic-linker" "/opt/nec/ve/lib/ld-linux-ve.so.1" + +///----------------------------------------------------------------------------- +/// Checking VE specific option + +// RUN: %clangxx -### -target ve %s 2>&1 | FileCheck -check-prefix=VENLDOPT %s +// VENLDOPT: nld{{.*}} "-z" "max-page-size=0x4000000" + +///----------------------------------------------------------------------------- +/// Checking include-path + +// RUN: %clangxx -### -target ve %s 2>&1 | FileCheck -check-prefix=DEFINC %s +// DEFINC: clang{{.*}} "-cc1" +// DEFINC: "-nostdsysteminc" +// DEFINC: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include/c++/v1" +// DEFINC: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include" +// DEFINC: "-internal-isystem" "/opt/nec/ve/include" + +// RUN: %clangxx -### -target ve %s -nostdlibinc 2>&1 | \ +// RUN: FileCheck -check-prefix=NOSTDLIBINC %s +// NOSTDLIBINC: clang{{.*}} "-cc1" +// NOSTDLIBINC-NOT: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include/c++/v1" +// NOSTDLIBINC: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include" +// NOSTDLIBINC-NOT: "-internal-isystem" "/opt/nec/ve/include" + +// RUN: %clangxx -### -target ve %s -nobuiltininc 2>&1 | \ +// RUN: FileCheck -check-prefix=NOBUILTININC %s +// NOBUILTININC: clang{{.*}} "-cc1" +// NOBUILTININC: "-nobuiltininc" +// NOBUILTININC: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include/c++/v1" +// NOBUILTININC-NOT: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include" +// NOBUILTININC: "-internal-isystem" "/opt/nec/ve/include" + +// RUN: %clangxx -### -target ve %s -nostdinc 2>&1 | \ +// RUN: FileCheck -check-prefix=NOSTDINC %s +// NOSTDINC: clang{{.*}} "-cc1" +// NOSTDINC: "-nobuiltininc" +// NOSTDINC-NOT: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include/c++/v1" +// NOSTDINC-NOT: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include" +// NOSTDINC-NOT: "-internal-isystem" "/opt/nec/ve/include" + +// RUN: %clangxx -### -target ve %s -nostdinc++ 2>&1 | \ +// RUN: FileCheck -check-prefix=NOSTDINCXX %s +// NOSTDINCXX: clang{{.*}} "-cc1" +// NOSTDINCXX: "-nostdinc++" +// NOSTDINCXX-NOT: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include/c++/v1" +// NOSTDINCXX: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9.]*}}/include" +// NOSTDINCXX: "-internal-isystem" "/opt/nec/ve/include" + +///----------------------------------------------------------------------------- +/// Checking -fuse-init-array + +// RUN: %clangxx -### -target ve %s 2>&1 | FileCheck -check-prefix=DEFINITARRAY %s +// DEFINITARRAY: clang{{.*}} "-cc1" +// DEFINITARRAY-NOT: "-fuse-init-array" + +// RUN: %clangxx -### -target ve %s -fno-use-init-array 2>&1 | \ +// RUN: FileCheck -check-prefix=NOTINITARRAY %s +// NOTINITARRAY: clang{{.*}} "-cc1" +// NOTINITARRAY: "-fno-use-init-array" + +///----------------------------------------------------------------------------- +/// Checking -faddrsig + +// RUN: %clangxx -### -target ve %s 2>&1 | FileCheck -check-prefix=DEFADDESIG %s +// DEFADDESIG: clang{{.*}} "-cc1" +// DEFADDESIG-NOT: "-faddrsig" + +// RUN: %clangxx -### -target ve %s -faddrsig 2>&1 | \ +// RUN: FileCheck -check-prefix=ADDRSIG %s +// ADDRSIG: clang{{.*}} "-cc1" +// ADDRSIG: "-faddrsig" + +// RUN: %clangxx -### -target ve %s -fno-addrsig 2>&1 | \ +// RUN: FileCheck -check-prefix=NOADDRSIG %s +// NOADDRSIG: clang{{.*}} "-cc1" +// NOADDRSIG-NOT: "-faddrsig" + +///----------------------------------------------------------------------------- +/// Checking exceptions + +// RUN: %clangxx -### -target ve %s 2>&1 | FileCheck -check-prefix=DEFEXCEPTION %s +// DEFEXCEPTION: clang{{.*}} "-cc1" +// DEFEXCEPTION: "-fsjlj-exceptions" + +///----------------------------------------------------------------------------- +/// Passing -fintegrated-as + +// RUN: %clangxx -### -target ve -x assembler %s 2>&1 | \ +// RUN: FileCheck -check-prefix=AS_LINK %s +// RUN: %clangxx -### -target ve -fno-integrated-as -x assembler %s 2>&1 | \ +// RUN: FileCheck -check-prefix=NAS_LINK %s + +// AS_LINK: clang{{.*}} "-cc1as" +// AS_LINK: nld{{.*}} + +// NAS_LINK: nas{{.*}} +// NAS_LINK: nld{{.*}} + +///----------------------------------------------------------------------------- +/// Checking default libraries + +// RUN: %clangxx -### -target ve --stdlib=c++ %s 2>&1 | \ +// RUN: FileCheck -check-prefix=LINK %s + +// LINK: clang{{.*}} "-cc1" +// LINK: nld{{.*}} "{{.*}}/crt1.o" "{{.*}}/crti.o"{{.*}}"crtbegin.o"{{.*}}"-lc++" "-lc++abi" "-lunwind" "-lpthread" "-ldl" Index: clang/lib/Driver/ToolChains/VEToolchain.cpp =================================================================== --- clang/lib/Driver/ToolChains/VEToolchain.cpp +++ clang/lib/Driver/ToolChains/VEToolchain.cpp @@ -102,14 +102,37 @@ 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
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits