xref: /freebsd-src/contrib/llvm-project/clang/lib/Driver/ToolChains/VEToolchain.cpp (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
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 
565ffd83dbSDimitry Andric bool VEToolChain::isPIEDefault() const { return false; }
575ffd83dbSDimitry Andric 
585ffd83dbSDimitry Andric bool VEToolChain::isPICDefaultForced() const { return false; }
595ffd83dbSDimitry Andric 
605ffd83dbSDimitry Andric bool VEToolChain::SupportsProfiling() const { return false; }
615ffd83dbSDimitry Andric 
625ffd83dbSDimitry Andric bool VEToolChain::hasBlocksRuntime() const { return false; }
635ffd83dbSDimitry Andric 
645ffd83dbSDimitry Andric void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
655ffd83dbSDimitry Andric                                             ArgStringList &CC1Args) const {
665ffd83dbSDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
675ffd83dbSDimitry Andric     return;
685ffd83dbSDimitry Andric 
695ffd83dbSDimitry Andric   if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
705ffd83dbSDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc))
715ffd83dbSDimitry Andric     return;
725ffd83dbSDimitry Andric 
735ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
745ffd83dbSDimitry Andric     SmallString<128> P(getDriver().ResourceDir);
755ffd83dbSDimitry Andric     llvm::sys::path::append(P, "include");
765ffd83dbSDimitry Andric     addSystemInclude(DriverArgs, CC1Args, P);
775ffd83dbSDimitry Andric   }
785ffd83dbSDimitry Andric 
795ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
805ffd83dbSDimitry Andric     if (const char *cl_include_dir = getenv("NCC_C_INCLUDE_PATH")) {
815ffd83dbSDimitry Andric       SmallVector<StringRef, 4> Dirs;
825ffd83dbSDimitry Andric       const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
835ffd83dbSDimitry Andric       StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
845ffd83dbSDimitry Andric       ArrayRef<StringRef> DirVec(Dirs);
855ffd83dbSDimitry Andric       addSystemIncludes(DriverArgs, CC1Args, DirVec);
865ffd83dbSDimitry Andric     } else {
875ffd83dbSDimitry Andric       addSystemInclude(DriverArgs, CC1Args,
885ffd83dbSDimitry Andric                        getDriver().SysRoot + "/opt/nec/ve/include");
895ffd83dbSDimitry Andric     }
905ffd83dbSDimitry Andric   }
915ffd83dbSDimitry Andric }
925ffd83dbSDimitry Andric 
935ffd83dbSDimitry Andric void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
945ffd83dbSDimitry Andric                                         ArgStringList &CC1Args,
955ffd83dbSDimitry Andric                                         Action::OffloadKind) const {
965ffd83dbSDimitry Andric   CC1Args.push_back("-nostdsysteminc");
975ffd83dbSDimitry Andric   bool UseInitArrayDefault = true;
985ffd83dbSDimitry Andric   if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
995ffd83dbSDimitry Andric                           options::OPT_fno_use_init_array, UseInitArrayDefault))
1005ffd83dbSDimitry Andric     CC1Args.push_back("-fno-use-init-array");
1015ffd83dbSDimitry Andric }
1025ffd83dbSDimitry Andric 
1035ffd83dbSDimitry Andric void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1045ffd83dbSDimitry Andric                                                ArgStringList &CC1Args) const {
105*e8d8bef9SDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
106*e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc) ||
107*e8d8bef9SDimitry Andric       DriverArgs.hasArg(options::OPT_nostdincxx))
108*e8d8bef9SDimitry Andric     return;
109*e8d8bef9SDimitry Andric   if (const char *cl_include_dir = getenv("NCC_CPLUS_INCLUDE_PATH")) {
110*e8d8bef9SDimitry Andric     SmallVector<StringRef, 4> Dirs;
111*e8d8bef9SDimitry Andric     const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
112*e8d8bef9SDimitry Andric     StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
113*e8d8bef9SDimitry Andric     ArrayRef<StringRef> DirVec(Dirs);
114*e8d8bef9SDimitry Andric     addSystemIncludes(DriverArgs, CC1Args, DirVec);
115*e8d8bef9SDimitry Andric   } else {
116*e8d8bef9SDimitry Andric     SmallString<128> P(getDriver().ResourceDir);
117*e8d8bef9SDimitry Andric     llvm::sys::path::append(P, "include/c++/v1");
118*e8d8bef9SDimitry Andric     addSystemInclude(DriverArgs, CC1Args, P);
119*e8d8bef9SDimitry Andric   }
1205ffd83dbSDimitry Andric }
1215ffd83dbSDimitry Andric 
1225ffd83dbSDimitry Andric void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
1235ffd83dbSDimitry Andric                                       ArgStringList &CmdArgs) const {
124*e8d8bef9SDimitry Andric   assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
125*e8d8bef9SDimitry Andric          "Only -lc++ (aka libxx) is supported in this toolchain.");
126*e8d8bef9SDimitry Andric 
127*e8d8bef9SDimitry Andric   tools::addArchSpecificRPath(*this, Args, CmdArgs);
128*e8d8bef9SDimitry Andric 
129*e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++");
130*e8d8bef9SDimitry Andric   CmdArgs.push_back("-lc++abi");
131*e8d8bef9SDimitry Andric   CmdArgs.push_back("-lunwind");
132*e8d8bef9SDimitry Andric   // libc++ requires -lpthread under glibc environment
133*e8d8bef9SDimitry Andric   CmdArgs.push_back("-lpthread");
134*e8d8bef9SDimitry Andric   // libunwind requires -ldl under glibc environment
135*e8d8bef9SDimitry Andric   CmdArgs.push_back("-ldl");
1365ffd83dbSDimitry Andric }
1375ffd83dbSDimitry Andric 
1385ffd83dbSDimitry Andric llvm::ExceptionHandling
1395ffd83dbSDimitry Andric VEToolChain::GetExceptionModel(const ArgList &Args) const {
1405ffd83dbSDimitry Andric   // VE uses SjLj exceptions.
1415ffd83dbSDimitry Andric   return llvm::ExceptionHandling::SjLj;
1425ffd83dbSDimitry Andric }
143