xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/VEToolchain.cpp (revision fcaf7f8644a9988098ac6be2165bce3ea4786e91)
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:
360eae32dcSDimitry Andric   //   ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPath)
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:
480eae32dcSDimitry Andric   //   ${BINPATH}/../lib/ve-unknown-linux-gnu, (== getStdlibPath)
490eae32dcSDimitry Andric   //   ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPath)
500eae32dcSDimitry Andric   //   ${SYSROOT}/opt/nec/ve/lib,
5104eeddc0SDimitry Andric   for (auto &Path : getStdlibPaths())
5204eeddc0SDimitry Andric     getFilePaths().push_back(std::move(Path));
535ffd83dbSDimitry Andric   getFilePaths().push_back(getArchSpecificLibPath());
545ffd83dbSDimitry Andric   getFilePaths().push_back(computeSysRoot() + "/opt/nec/ve/lib");
555ffd83dbSDimitry Andric }
565ffd83dbSDimitry Andric 
575ffd83dbSDimitry Andric Tool *VEToolChain::buildAssembler() const {
585ffd83dbSDimitry Andric   return new tools::gnutools::Assembler(*this);
595ffd83dbSDimitry Andric }
605ffd83dbSDimitry Andric 
615ffd83dbSDimitry Andric Tool *VEToolChain::buildLinker() const {
625ffd83dbSDimitry Andric   return new tools::gnutools::Linker(*this);
635ffd83dbSDimitry Andric }
645ffd83dbSDimitry Andric 
655ffd83dbSDimitry Andric bool VEToolChain::isPICDefault() const { return false; }
665ffd83dbSDimitry Andric 
67349cc55cSDimitry Andric bool VEToolChain::isPIEDefault(const llvm::opt::ArgList &Args) const {
68349cc55cSDimitry Andric   return false;
69349cc55cSDimitry Andric }
705ffd83dbSDimitry Andric 
715ffd83dbSDimitry Andric bool VEToolChain::isPICDefaultForced() const { return false; }
725ffd83dbSDimitry Andric 
735ffd83dbSDimitry Andric bool VEToolChain::SupportsProfiling() const { return false; }
745ffd83dbSDimitry Andric 
755ffd83dbSDimitry Andric bool VEToolChain::hasBlocksRuntime() const { return false; }
765ffd83dbSDimitry Andric 
775ffd83dbSDimitry Andric void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
785ffd83dbSDimitry Andric                                             ArgStringList &CC1Args) const {
795ffd83dbSDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
805ffd83dbSDimitry Andric     return;
815ffd83dbSDimitry Andric 
825ffd83dbSDimitry Andric   if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
835ffd83dbSDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc))
845ffd83dbSDimitry Andric     return;
855ffd83dbSDimitry Andric 
865ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
875ffd83dbSDimitry Andric     SmallString<128> P(getDriver().ResourceDir);
885ffd83dbSDimitry Andric     llvm::sys::path::append(P, "include");
895ffd83dbSDimitry Andric     addSystemInclude(DriverArgs, CC1Args, P);
905ffd83dbSDimitry Andric   }
915ffd83dbSDimitry Andric 
925ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
935ffd83dbSDimitry Andric     if (const char *cl_include_dir = getenv("NCC_C_INCLUDE_PATH")) {
945ffd83dbSDimitry Andric       SmallVector<StringRef, 4> Dirs;
955ffd83dbSDimitry Andric       const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
965ffd83dbSDimitry Andric       StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
975ffd83dbSDimitry Andric       ArrayRef<StringRef> DirVec(Dirs);
985ffd83dbSDimitry Andric       addSystemIncludes(DriverArgs, CC1Args, DirVec);
995ffd83dbSDimitry Andric     } else {
1005ffd83dbSDimitry Andric       addSystemInclude(DriverArgs, CC1Args,
1015ffd83dbSDimitry Andric                        getDriver().SysRoot + "/opt/nec/ve/include");
1025ffd83dbSDimitry Andric     }
1035ffd83dbSDimitry Andric   }
1045ffd83dbSDimitry Andric }
1055ffd83dbSDimitry Andric 
1065ffd83dbSDimitry Andric void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
1075ffd83dbSDimitry Andric                                         ArgStringList &CC1Args,
1085ffd83dbSDimitry Andric                                         Action::OffloadKind) const {
1095ffd83dbSDimitry Andric   CC1Args.push_back("-nostdsysteminc");
1105ffd83dbSDimitry Andric   bool UseInitArrayDefault = true;
1115ffd83dbSDimitry Andric   if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
1125ffd83dbSDimitry Andric                           options::OPT_fno_use_init_array, UseInitArrayDefault))
1135ffd83dbSDimitry Andric     CC1Args.push_back("-fno-use-init-array");
1145ffd83dbSDimitry Andric }
1155ffd83dbSDimitry Andric 
1165ffd83dbSDimitry Andric void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1175ffd83dbSDimitry Andric                                                ArgStringList &CC1Args) const {
118e8d8bef9SDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
119e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc) ||
120e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdincxx))
121e8d8bef9SDimitry Andric     return;
122e8d8bef9SDimitry Andric   if (const char *cl_include_dir = getenv("NCC_CPLUS_INCLUDE_PATH")) {
123e8d8bef9SDimitry Andric     SmallVector<StringRef, 4> Dirs;
124e8d8bef9SDimitry Andric     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
125e8d8bef9SDimitry Andric     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
126e8d8bef9SDimitry Andric     ArrayRef<StringRef> DirVec(Dirs);
127e8d8bef9SDimitry Andric     addSystemIncludes(DriverArgs, CC1Args, DirVec);
128e8d8bef9SDimitry Andric   } else {
1290eae32dcSDimitry Andric     // Add following paths for multiple target installation.
1300eae32dcSDimitry Andric     //   ${INSTALLDIR}/include/ve-unknown-linux-gnu/c++/v1,
1310eae32dcSDimitry Andric     //   ${INSTALLDIR}/include/c++/v1,
1320eae32dcSDimitry Andric     addLibCxxIncludePaths(DriverArgs, CC1Args);
133e8d8bef9SDimitry Andric   }
1345ffd83dbSDimitry Andric }
1355ffd83dbSDimitry Andric 
1365ffd83dbSDimitry Andric void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
1375ffd83dbSDimitry Andric                                       ArgStringList &CmdArgs) const {
138e8d8bef9SDimitry Andric   assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
139e8d8bef9SDimitry Andric          "Only -lc++ (aka libxx) is supported in this toolchain.");
140e8d8bef9SDimitry Andric 
141e8d8bef9SDimitry Andric   tools::addArchSpecificRPath(*this, Args, CmdArgs);
142e8d8bef9SDimitry Andric 
143e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++");
144*fcaf7f86SDimitry Andric   if (Args.hasArg(options::OPT_fexperimental_library))
145*fcaf7f86SDimitry Andric     CmdArgs.push_back("-lc++experimental");
146e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++abi");
147e8d8bef9SDimitry Andric   CmdArgs.push_back("-lunwind");
148e8d8bef9SDimitry Andric   // libc++ requires -lpthread under glibc environment
149e8d8bef9SDimitry Andric   CmdArgs.push_back("-lpthread");
150e8d8bef9SDimitry Andric   // libunwind requires -ldl under glibc environment
151e8d8bef9SDimitry Andric   CmdArgs.push_back("-ldl");
1525ffd83dbSDimitry Andric }
1535ffd83dbSDimitry Andric 
1545ffd83dbSDimitry Andric llvm::ExceptionHandling
1555ffd83dbSDimitry Andric VEToolChain::GetExceptionModel(const ArgList &Args) const {
1565ffd83dbSDimitry Andric   // VE uses SjLj exceptions.
1575ffd83dbSDimitry Andric   return llvm::ExceptionHandling::SjLj;
1585ffd83dbSDimitry Andric }
159