xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/VEToolchain.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
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 
315ffd83dbSDimitry Andric   // default file paths are:
325ffd83dbSDimitry Andric   //   ${RESOURCEDIR}/lib/linux/ve (== getArchSpecificLibPath)
335ffd83dbSDimitry Andric   //   /lib/../lib64
345ffd83dbSDimitry Andric   //   /usr/lib/../lib64
355ffd83dbSDimitry Andric   //   ${BINPATH}/../lib
365ffd83dbSDimitry Andric   //   /lib
375ffd83dbSDimitry Andric   //   /usr/lib
385ffd83dbSDimitry Andric   //
395ffd83dbSDimitry Andric   // These are OK for host, but no go for VE.  So, defines them all
405ffd83dbSDimitry Andric   // from scratch here.
415ffd83dbSDimitry Andric   getFilePaths().clear();
425ffd83dbSDimitry Andric   getFilePaths().push_back(getArchSpecificLibPath());
435ffd83dbSDimitry Andric   getFilePaths().push_back(computeSysRoot() + "/opt/nec/ve/lib");
445ffd83dbSDimitry Andric }
455ffd83dbSDimitry Andric 
465ffd83dbSDimitry Andric Tool *VEToolChain::buildAssembler() const {
475ffd83dbSDimitry Andric   return new tools::gnutools::Assembler(*this);
485ffd83dbSDimitry Andric }
495ffd83dbSDimitry Andric 
505ffd83dbSDimitry Andric Tool *VEToolChain::buildLinker() const {
515ffd83dbSDimitry Andric   return new tools::gnutools::Linker(*this);
525ffd83dbSDimitry Andric }
535ffd83dbSDimitry Andric 
545ffd83dbSDimitry Andric bool VEToolChain::isPICDefault() const { return false; }
555ffd83dbSDimitry Andric 
56*349cc55cSDimitry Andric bool VEToolChain::isPIEDefault(const llvm::opt::ArgList &Args) const {
57*349cc55cSDimitry Andric   return false;
58*349cc55cSDimitry Andric }
595ffd83dbSDimitry Andric 
605ffd83dbSDimitry Andric bool VEToolChain::isPICDefaultForced() const { return false; }
615ffd83dbSDimitry Andric 
625ffd83dbSDimitry Andric bool VEToolChain::SupportsProfiling() const { return false; }
635ffd83dbSDimitry Andric 
645ffd83dbSDimitry Andric bool VEToolChain::hasBlocksRuntime() const { return false; }
655ffd83dbSDimitry Andric 
665ffd83dbSDimitry Andric void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
675ffd83dbSDimitry Andric                                             ArgStringList &CC1Args) const {
685ffd83dbSDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
695ffd83dbSDimitry Andric     return;
705ffd83dbSDimitry Andric 
715ffd83dbSDimitry Andric   if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
725ffd83dbSDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc))
735ffd83dbSDimitry Andric     return;
745ffd83dbSDimitry Andric 
755ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
765ffd83dbSDimitry Andric     SmallString<128> P(getDriver().ResourceDir);
775ffd83dbSDimitry Andric     llvm::sys::path::append(P, "include");
785ffd83dbSDimitry Andric     addSystemInclude(DriverArgs, CC1Args, P);
795ffd83dbSDimitry Andric   }
805ffd83dbSDimitry Andric 
815ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
825ffd83dbSDimitry Andric     if (const char *cl_include_dir = getenv("NCC_C_INCLUDE_PATH")) {
835ffd83dbSDimitry Andric       SmallVector<StringRef, 4> Dirs;
845ffd83dbSDimitry Andric       const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
855ffd83dbSDimitry Andric       StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
865ffd83dbSDimitry Andric       ArrayRef<StringRef> DirVec(Dirs);
875ffd83dbSDimitry Andric       addSystemIncludes(DriverArgs, CC1Args, DirVec);
885ffd83dbSDimitry Andric     } else {
895ffd83dbSDimitry Andric       addSystemInclude(DriverArgs, CC1Args,
905ffd83dbSDimitry Andric                        getDriver().SysRoot + "/opt/nec/ve/include");
915ffd83dbSDimitry Andric     }
925ffd83dbSDimitry Andric   }
935ffd83dbSDimitry Andric }
945ffd83dbSDimitry Andric 
955ffd83dbSDimitry Andric void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
965ffd83dbSDimitry Andric                                         ArgStringList &CC1Args,
975ffd83dbSDimitry Andric                                         Action::OffloadKind) const {
985ffd83dbSDimitry Andric   CC1Args.push_back("-nostdsysteminc");
995ffd83dbSDimitry Andric   bool UseInitArrayDefault = true;
1005ffd83dbSDimitry Andric   if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
1015ffd83dbSDimitry Andric                           options::OPT_fno_use_init_array, UseInitArrayDefault))
1025ffd83dbSDimitry Andric     CC1Args.push_back("-fno-use-init-array");
1035ffd83dbSDimitry Andric }
1045ffd83dbSDimitry Andric 
1055ffd83dbSDimitry Andric void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1065ffd83dbSDimitry Andric                                                ArgStringList &CC1Args) const {
107e8d8bef9SDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
108e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc) ||
109e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdincxx))
110e8d8bef9SDimitry Andric     return;
111e8d8bef9SDimitry Andric   if (const char *cl_include_dir = getenv("NCC_CPLUS_INCLUDE_PATH")) {
112e8d8bef9SDimitry Andric     SmallVector<StringRef, 4> Dirs;
113e8d8bef9SDimitry Andric     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
114e8d8bef9SDimitry Andric     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
115e8d8bef9SDimitry Andric     ArrayRef<StringRef> DirVec(Dirs);
116e8d8bef9SDimitry Andric     addSystemIncludes(DriverArgs, CC1Args, DirVec);
117e8d8bef9SDimitry Andric   } else {
118e8d8bef9SDimitry Andric     SmallString<128> P(getDriver().ResourceDir);
119e8d8bef9SDimitry Andric     llvm::sys::path::append(P, "include/c++/v1");
120e8d8bef9SDimitry Andric     addSystemInclude(DriverArgs, CC1Args, P);
121e8d8bef9SDimitry Andric   }
1225ffd83dbSDimitry Andric }
1235ffd83dbSDimitry Andric 
1245ffd83dbSDimitry Andric void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
1255ffd83dbSDimitry Andric                                       ArgStringList &CmdArgs) const {
126e8d8bef9SDimitry Andric   assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
127e8d8bef9SDimitry Andric          "Only -lc++ (aka libxx) is supported in this toolchain.");
128e8d8bef9SDimitry Andric 
129e8d8bef9SDimitry Andric   tools::addArchSpecificRPath(*this, Args, CmdArgs);
130e8d8bef9SDimitry Andric 
131e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++");
132e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++abi");
133e8d8bef9SDimitry Andric   CmdArgs.push_back("-lunwind");
134e8d8bef9SDimitry Andric   // libc++ requires -lpthread under glibc environment
135e8d8bef9SDimitry Andric   CmdArgs.push_back("-lpthread");
136e8d8bef9SDimitry Andric   // libunwind requires -ldl under glibc environment
137e8d8bef9SDimitry Andric   CmdArgs.push_back("-ldl");
1385ffd83dbSDimitry Andric }
1395ffd83dbSDimitry Andric 
1405ffd83dbSDimitry Andric llvm::ExceptionHandling
1415ffd83dbSDimitry Andric VEToolChain::GetExceptionModel(const ArgList &Args) const {
1425ffd83dbSDimitry Andric   // VE uses SjLj exceptions.
1435ffd83dbSDimitry Andric   return llvm::ExceptionHandling::SjLj;
1445ffd83dbSDimitry Andric }
145