xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/VEToolchain.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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*5f757f3fSDimitry Andric   //   ${RESOURCEDIR}/lib/ve-unknown-linux-gnu, (== getArchSpecificLibPaths)
3706c3fb27SDimitry Andric   //   ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPaths)
380eae32dcSDimitry Andric   //   /lib/../lib64,
390eae32dcSDimitry Andric   //   /usr/lib/../lib64,
400eae32dcSDimitry Andric   //   ${BINPATH}/../lib,
410eae32dcSDimitry Andric   //   /lib,
420eae32dcSDimitry Andric   //   /usr/lib,
430eae32dcSDimitry Andric   // These are OK for host, but no go for VE.
440eae32dcSDimitry Andric 
450eae32dcSDimitry Andric   // Define file paths from scratch here.
465ffd83dbSDimitry Andric   getFilePaths().clear();
470eae32dcSDimitry Andric 
480eae32dcSDimitry Andric   // Add library directories:
49*5f757f3fSDimitry Andric   //   ${BINPATH}/../lib/ve-unknown-linux-gnu, (== getStdlibPath)
50*5f757f3fSDimitry Andric   //   ${RESOURCEDIR}/lib/ve-unknown-linux-gnu, (== getArchSpecificLibPaths)
5106c3fb27SDimitry Andric   //   ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPaths)
520eae32dcSDimitry Andric   //   ${SYSROOT}/opt/nec/ve/lib,
53*5f757f3fSDimitry Andric   if (std::optional<std::string> Path = getStdlibPath())
54*5f757f3fSDimitry Andric     getFilePaths().push_back(std::move(*Path));
5506c3fb27SDimitry Andric   for (const auto &Path : getArchSpecificLibPaths())
5606c3fb27SDimitry Andric     getFilePaths().push_back(Path);
575ffd83dbSDimitry Andric   getFilePaths().push_back(computeSysRoot() + "/opt/nec/ve/lib");
585ffd83dbSDimitry Andric }
595ffd83dbSDimitry Andric 
605ffd83dbSDimitry Andric Tool *VEToolChain::buildAssembler() const {
615ffd83dbSDimitry Andric   return new tools::gnutools::Assembler(*this);
625ffd83dbSDimitry Andric }
635ffd83dbSDimitry Andric 
645ffd83dbSDimitry Andric Tool *VEToolChain::buildLinker() const {
655ffd83dbSDimitry Andric   return new tools::gnutools::Linker(*this);
665ffd83dbSDimitry Andric }
675ffd83dbSDimitry Andric 
685ffd83dbSDimitry Andric bool VEToolChain::isPICDefault() const { return false; }
695ffd83dbSDimitry Andric 
70349cc55cSDimitry Andric bool VEToolChain::isPIEDefault(const llvm::opt::ArgList &Args) const {
71349cc55cSDimitry Andric   return false;
72349cc55cSDimitry Andric }
735ffd83dbSDimitry Andric 
745ffd83dbSDimitry Andric bool VEToolChain::isPICDefaultForced() const { return false; }
755ffd83dbSDimitry Andric 
765ffd83dbSDimitry Andric bool VEToolChain::SupportsProfiling() const { return false; }
775ffd83dbSDimitry Andric 
785ffd83dbSDimitry Andric bool VEToolChain::hasBlocksRuntime() const { return false; }
795ffd83dbSDimitry Andric 
805ffd83dbSDimitry Andric void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
815ffd83dbSDimitry Andric                                             ArgStringList &CC1Args) const {
825ffd83dbSDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
835ffd83dbSDimitry Andric     return;
845ffd83dbSDimitry Andric 
855ffd83dbSDimitry Andric   if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
865ffd83dbSDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc))
875ffd83dbSDimitry Andric     return;
885ffd83dbSDimitry Andric 
895ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
905ffd83dbSDimitry Andric     SmallString<128> P(getDriver().ResourceDir);
915ffd83dbSDimitry Andric     llvm::sys::path::append(P, "include");
925ffd83dbSDimitry Andric     addSystemInclude(DriverArgs, CC1Args, P);
935ffd83dbSDimitry Andric   }
945ffd83dbSDimitry Andric 
955ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
965ffd83dbSDimitry Andric     if (const char *cl_include_dir = getenv("NCC_C_INCLUDE_PATH")) {
975ffd83dbSDimitry Andric       SmallVector<StringRef, 4> Dirs;
985ffd83dbSDimitry Andric       const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
995ffd83dbSDimitry Andric       StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
1005ffd83dbSDimitry Andric       ArrayRef<StringRef> DirVec(Dirs);
1015ffd83dbSDimitry Andric       addSystemIncludes(DriverArgs, CC1Args, DirVec);
1025ffd83dbSDimitry Andric     } else {
1035ffd83dbSDimitry Andric       addSystemInclude(DriverArgs, CC1Args,
1045ffd83dbSDimitry Andric                        getDriver().SysRoot + "/opt/nec/ve/include");
1055ffd83dbSDimitry Andric     }
1065ffd83dbSDimitry Andric   }
1075ffd83dbSDimitry Andric }
1085ffd83dbSDimitry Andric 
1095ffd83dbSDimitry Andric void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
1105ffd83dbSDimitry Andric                                         ArgStringList &CC1Args,
1115ffd83dbSDimitry Andric                                         Action::OffloadKind) const {
1125ffd83dbSDimitry Andric   CC1Args.push_back("-nostdsysteminc");
1135ffd83dbSDimitry Andric   bool UseInitArrayDefault = true;
1145ffd83dbSDimitry Andric   if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
1155ffd83dbSDimitry Andric                           options::OPT_fno_use_init_array, UseInitArrayDefault))
1165ffd83dbSDimitry Andric     CC1Args.push_back("-fno-use-init-array");
1175ffd83dbSDimitry Andric }
1185ffd83dbSDimitry Andric 
1195ffd83dbSDimitry Andric void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1205ffd83dbSDimitry Andric                                                ArgStringList &CC1Args) const {
121e8d8bef9SDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
122e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc) ||
123e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdincxx))
124e8d8bef9SDimitry Andric     return;
125e8d8bef9SDimitry Andric   if (const char *cl_include_dir = getenv("NCC_CPLUS_INCLUDE_PATH")) {
126e8d8bef9SDimitry Andric     SmallVector<StringRef, 4> Dirs;
127e8d8bef9SDimitry Andric     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
128e8d8bef9SDimitry Andric     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
129e8d8bef9SDimitry Andric     ArrayRef<StringRef> DirVec(Dirs);
130e8d8bef9SDimitry Andric     addSystemIncludes(DriverArgs, CC1Args, DirVec);
131e8d8bef9SDimitry Andric   } else {
1320eae32dcSDimitry Andric     // Add following paths for multiple target installation.
1330eae32dcSDimitry Andric     //   ${INSTALLDIR}/include/ve-unknown-linux-gnu/c++/v1,
1340eae32dcSDimitry Andric     //   ${INSTALLDIR}/include/c++/v1,
1350eae32dcSDimitry Andric     addLibCxxIncludePaths(DriverArgs, CC1Args);
136e8d8bef9SDimitry Andric   }
1375ffd83dbSDimitry Andric }
1385ffd83dbSDimitry Andric 
1395ffd83dbSDimitry Andric void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
1405ffd83dbSDimitry Andric                                       ArgStringList &CmdArgs) const {
141e8d8bef9SDimitry Andric   assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
142e8d8bef9SDimitry Andric          "Only -lc++ (aka libxx) is supported in this toolchain.");
143e8d8bef9SDimitry Andric 
144e8d8bef9SDimitry Andric   tools::addArchSpecificRPath(*this, Args, CmdArgs);
145e8d8bef9SDimitry Andric 
146*5f757f3fSDimitry Andric   // Add paths for libc++.so and other shared libraries.
147*5f757f3fSDimitry Andric   if (std::optional<std::string> Path = getStdlibPath()) {
148*5f757f3fSDimitry Andric     CmdArgs.push_back("-rpath");
149*5f757f3fSDimitry Andric     CmdArgs.push_back(Args.MakeArgString(*Path));
150*5f757f3fSDimitry Andric   }
151*5f757f3fSDimitry Andric 
152e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++");
153fcaf7f86SDimitry Andric   if (Args.hasArg(options::OPT_fexperimental_library))
154fcaf7f86SDimitry Andric     CmdArgs.push_back("-lc++experimental");
155e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++abi");
156e8d8bef9SDimitry Andric   CmdArgs.push_back("-lunwind");
157e8d8bef9SDimitry Andric   // libc++ requires -lpthread under glibc environment
158e8d8bef9SDimitry Andric   CmdArgs.push_back("-lpthread");
159e8d8bef9SDimitry Andric   // libunwind requires -ldl under glibc environment
160e8d8bef9SDimitry Andric   CmdArgs.push_back("-ldl");
1615ffd83dbSDimitry Andric }
1625ffd83dbSDimitry Andric 
1635ffd83dbSDimitry Andric llvm::ExceptionHandling
1645ffd83dbSDimitry Andric VEToolChain::GetExceptionModel(const ArgList &Args) const {
1655ffd83dbSDimitry Andric   // VE uses SjLj exceptions.
1665ffd83dbSDimitry Andric   return llvm::ExceptionHandling::SjLj;
1675ffd83dbSDimitry Andric }
168