xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/VEToolchain.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
15ffd83dbSDimitry Andric //===--- VE.cpp - VE ToolChain Implementations ------------------*- C++ -*-===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric 
95ffd83dbSDimitry Andric #include "VEToolchain.h"
105ffd83dbSDimitry Andric #include "CommonArgs.h"
115ffd83dbSDimitry Andric #include "clang/Driver/Compilation.h"
125ffd83dbSDimitry Andric #include "clang/Driver/Driver.h"
135ffd83dbSDimitry Andric #include "clang/Driver/Options.h"
145ffd83dbSDimitry Andric #include "llvm/Option/ArgList.h"
155ffd83dbSDimitry Andric #include "llvm/Support/FileSystem.h"
165ffd83dbSDimitry Andric #include "llvm/Support/Path.h"
175ffd83dbSDimitry Andric #include <cstdlib> // ::getenv
185ffd83dbSDimitry Andric 
195ffd83dbSDimitry Andric using namespace clang::driver;
205ffd83dbSDimitry Andric using namespace clang::driver::toolchains;
215ffd83dbSDimitry Andric using namespace clang;
225ffd83dbSDimitry Andric using namespace llvm::opt;
235ffd83dbSDimitry Andric 
245ffd83dbSDimitry Andric /// VE tool chain
255ffd83dbSDimitry Andric VEToolChain::VEToolChain(const Driver &D, const llvm::Triple &Triple,
265ffd83dbSDimitry Andric                          const ArgList &Args)
275ffd83dbSDimitry Andric     : Linux(D, Triple, Args) {
285ffd83dbSDimitry Andric   getProgramPaths().push_back("/opt/nec/ve/bin");
295ffd83dbSDimitry Andric   // ProgramPaths are found via 'PATH' environment variable.
305ffd83dbSDimitry Andric 
310eae32dcSDimitry Andric   // Default library paths are following:
320eae32dcSDimitry Andric   //   ${RESOURCEDIR}/lib/ve-unknown-linux-gnu,
330eae32dcSDimitry Andric   // These are OK.
340eae32dcSDimitry Andric 
350eae32dcSDimitry Andric   // Default file paths are following:
36*06c3fb27SDimitry Andric   //   ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPaths)
370eae32dcSDimitry Andric   //   /lib/../lib64,
380eae32dcSDimitry Andric   //   /usr/lib/../lib64,
390eae32dcSDimitry Andric   //   ${BINPATH}/../lib,
400eae32dcSDimitry Andric   //   /lib,
410eae32dcSDimitry Andric   //   /usr/lib,
420eae32dcSDimitry Andric   // These are OK for host, but no go for VE.
430eae32dcSDimitry Andric 
440eae32dcSDimitry Andric   // Define file paths from scratch here.
455ffd83dbSDimitry Andric   getFilePaths().clear();
460eae32dcSDimitry Andric 
470eae32dcSDimitry Andric   // Add library directories:
48*06c3fb27SDimitry Andric   //   ${BINPATH}/../lib/ve-unknown-linux-gnu, (== getStdlibPaths)
49*06c3fb27SDimitry Andric   //   ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPaths)
500eae32dcSDimitry Andric   //   ${SYSROOT}/opt/nec/ve/lib,
5104eeddc0SDimitry Andric   for (auto &Path : getStdlibPaths())
5204eeddc0SDimitry Andric     getFilePaths().push_back(std::move(Path));
53*06c3fb27SDimitry Andric   for (const auto &Path : getArchSpecificLibPaths())
54*06c3fb27SDimitry Andric     getFilePaths().push_back(Path);
555ffd83dbSDimitry Andric   getFilePaths().push_back(computeSysRoot() + "/opt/nec/ve/lib");
565ffd83dbSDimitry Andric }
575ffd83dbSDimitry Andric 
585ffd83dbSDimitry Andric Tool *VEToolChain::buildAssembler() const {
595ffd83dbSDimitry Andric   return new tools::gnutools::Assembler(*this);
605ffd83dbSDimitry Andric }
615ffd83dbSDimitry Andric 
625ffd83dbSDimitry Andric Tool *VEToolChain::buildLinker() const {
635ffd83dbSDimitry Andric   return new tools::gnutools::Linker(*this);
645ffd83dbSDimitry Andric }
655ffd83dbSDimitry Andric 
665ffd83dbSDimitry Andric bool VEToolChain::isPICDefault() const { return false; }
675ffd83dbSDimitry Andric 
68349cc55cSDimitry Andric bool VEToolChain::isPIEDefault(const llvm::opt::ArgList &Args) const {
69349cc55cSDimitry Andric   return false;
70349cc55cSDimitry Andric }
715ffd83dbSDimitry Andric 
725ffd83dbSDimitry Andric bool VEToolChain::isPICDefaultForced() const { return false; }
735ffd83dbSDimitry Andric 
745ffd83dbSDimitry Andric bool VEToolChain::SupportsProfiling() const { return false; }
755ffd83dbSDimitry Andric 
765ffd83dbSDimitry Andric bool VEToolChain::hasBlocksRuntime() const { return false; }
775ffd83dbSDimitry Andric 
785ffd83dbSDimitry Andric void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
795ffd83dbSDimitry Andric                                             ArgStringList &CC1Args) const {
805ffd83dbSDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
815ffd83dbSDimitry Andric     return;
825ffd83dbSDimitry Andric 
835ffd83dbSDimitry Andric   if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
845ffd83dbSDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc))
855ffd83dbSDimitry Andric     return;
865ffd83dbSDimitry Andric 
875ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
885ffd83dbSDimitry Andric     SmallString<128> P(getDriver().ResourceDir);
895ffd83dbSDimitry Andric     llvm::sys::path::append(P, "include");
905ffd83dbSDimitry Andric     addSystemInclude(DriverArgs, CC1Args, P);
915ffd83dbSDimitry Andric   }
925ffd83dbSDimitry Andric 
935ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
945ffd83dbSDimitry Andric     if (const char *cl_include_dir = getenv("NCC_C_INCLUDE_PATH")) {
955ffd83dbSDimitry Andric       SmallVector<StringRef, 4> Dirs;
965ffd83dbSDimitry Andric       const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
975ffd83dbSDimitry Andric       StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
985ffd83dbSDimitry Andric       ArrayRef<StringRef> DirVec(Dirs);
995ffd83dbSDimitry Andric       addSystemIncludes(DriverArgs, CC1Args, DirVec);
1005ffd83dbSDimitry Andric     } else {
1015ffd83dbSDimitry Andric       addSystemInclude(DriverArgs, CC1Args,
1025ffd83dbSDimitry Andric                        getDriver().SysRoot + "/opt/nec/ve/include");
1035ffd83dbSDimitry Andric     }
1045ffd83dbSDimitry Andric   }
1055ffd83dbSDimitry Andric }
1065ffd83dbSDimitry Andric 
1075ffd83dbSDimitry Andric void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
1085ffd83dbSDimitry Andric                                         ArgStringList &CC1Args,
1095ffd83dbSDimitry Andric                                         Action::OffloadKind) const {
1105ffd83dbSDimitry Andric   CC1Args.push_back("-nostdsysteminc");
1115ffd83dbSDimitry Andric   bool UseInitArrayDefault = true;
1125ffd83dbSDimitry Andric   if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
1135ffd83dbSDimitry Andric                           options::OPT_fno_use_init_array, UseInitArrayDefault))
1145ffd83dbSDimitry Andric     CC1Args.push_back("-fno-use-init-array");
1155ffd83dbSDimitry Andric }
1165ffd83dbSDimitry Andric 
1175ffd83dbSDimitry Andric void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1185ffd83dbSDimitry Andric                                                ArgStringList &CC1Args) const {
119e8d8bef9SDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
120e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc) ||
121e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdincxx))
122e8d8bef9SDimitry Andric     return;
123e8d8bef9SDimitry Andric   if (const char *cl_include_dir = getenv("NCC_CPLUS_INCLUDE_PATH")) {
124e8d8bef9SDimitry Andric     SmallVector<StringRef, 4> Dirs;
125e8d8bef9SDimitry Andric     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
126e8d8bef9SDimitry Andric     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
127e8d8bef9SDimitry Andric     ArrayRef<StringRef> DirVec(Dirs);
128e8d8bef9SDimitry Andric     addSystemIncludes(DriverArgs, CC1Args, DirVec);
129e8d8bef9SDimitry Andric   } else {
1300eae32dcSDimitry Andric     // Add following paths for multiple target installation.
1310eae32dcSDimitry Andric     //   ${INSTALLDIR}/include/ve-unknown-linux-gnu/c++/v1,
1320eae32dcSDimitry Andric     //   ${INSTALLDIR}/include/c++/v1,
1330eae32dcSDimitry Andric     addLibCxxIncludePaths(DriverArgs, CC1Args);
134e8d8bef9SDimitry Andric   }
1355ffd83dbSDimitry Andric }
1365ffd83dbSDimitry Andric 
1375ffd83dbSDimitry Andric void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
1385ffd83dbSDimitry Andric                                       ArgStringList &CmdArgs) const {
139e8d8bef9SDimitry Andric   assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
140e8d8bef9SDimitry Andric          "Only -lc++ (aka libxx) is supported in this toolchain.");
141e8d8bef9SDimitry Andric 
142e8d8bef9SDimitry Andric   tools::addArchSpecificRPath(*this, Args, CmdArgs);
143e8d8bef9SDimitry Andric 
144e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++");
145fcaf7f86SDimitry Andric   if (Args.hasArg(options::OPT_fexperimental_library))
146fcaf7f86SDimitry Andric     CmdArgs.push_back("-lc++experimental");
147e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++abi");
148e8d8bef9SDimitry Andric   CmdArgs.push_back("-lunwind");
149e8d8bef9SDimitry Andric   // libc++ requires -lpthread under glibc environment
150e8d8bef9SDimitry Andric   CmdArgs.push_back("-lpthread");
151e8d8bef9SDimitry Andric   // libunwind requires -ldl under glibc environment
152e8d8bef9SDimitry Andric   CmdArgs.push_back("-ldl");
1535ffd83dbSDimitry Andric }
1545ffd83dbSDimitry Andric 
1555ffd83dbSDimitry Andric llvm::ExceptionHandling
1565ffd83dbSDimitry Andric VEToolChain::GetExceptionModel(const ArgList &Args) const {
1575ffd83dbSDimitry Andric   // VE uses SjLj exceptions.
1585ffd83dbSDimitry Andric   return llvm::ExceptionHandling::SjLj;
1595ffd83dbSDimitry Andric }
160