xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/VEToolchain.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1*5ffd83dbSDimitry Andric //===--- VE.cpp - VE ToolChain Implementations ------------------*- C++ -*-===//
2*5ffd83dbSDimitry Andric //
3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5ffd83dbSDimitry Andric //
7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
8*5ffd83dbSDimitry Andric 
9*5ffd83dbSDimitry Andric #include "VEToolchain.h"
10*5ffd83dbSDimitry Andric #include "CommonArgs.h"
11*5ffd83dbSDimitry Andric #include "clang/Driver/Compilation.h"
12*5ffd83dbSDimitry Andric #include "clang/Driver/Driver.h"
13*5ffd83dbSDimitry Andric #include "clang/Driver/Options.h"
14*5ffd83dbSDimitry Andric #include "llvm/Option/ArgList.h"
15*5ffd83dbSDimitry Andric #include "llvm/Support/FileSystem.h"
16*5ffd83dbSDimitry Andric #include "llvm/Support/Path.h"
17*5ffd83dbSDimitry Andric #include <cstdlib> // ::getenv
18*5ffd83dbSDimitry Andric 
19*5ffd83dbSDimitry Andric using namespace clang::driver;
20*5ffd83dbSDimitry Andric using namespace clang::driver::toolchains;
21*5ffd83dbSDimitry Andric using namespace clang;
22*5ffd83dbSDimitry Andric using namespace llvm::opt;
23*5ffd83dbSDimitry Andric 
24*5ffd83dbSDimitry Andric /// VE tool chain
25*5ffd83dbSDimitry Andric VEToolChain::VEToolChain(const Driver &D, const llvm::Triple &Triple,
26*5ffd83dbSDimitry Andric                          const ArgList &Args)
27*5ffd83dbSDimitry Andric     : Linux(D, Triple, Args) {
28*5ffd83dbSDimitry Andric   getProgramPaths().push_back("/opt/nec/ve/bin");
29*5ffd83dbSDimitry Andric   // ProgramPaths are found via 'PATH' environment variable.
30*5ffd83dbSDimitry Andric 
31*5ffd83dbSDimitry Andric   // default file paths are:
32*5ffd83dbSDimitry Andric   //   ${RESOURCEDIR}/lib/linux/ve (== getArchSpecificLibPath)
33*5ffd83dbSDimitry Andric   //   /lib/../lib64
34*5ffd83dbSDimitry Andric   //   /usr/lib/../lib64
35*5ffd83dbSDimitry Andric   //   ${BINPATH}/../lib
36*5ffd83dbSDimitry Andric   //   /lib
37*5ffd83dbSDimitry Andric   //   /usr/lib
38*5ffd83dbSDimitry Andric   //
39*5ffd83dbSDimitry Andric   // These are OK for host, but no go for VE.  So, defines them all
40*5ffd83dbSDimitry Andric   // from scratch here.
41*5ffd83dbSDimitry Andric   getFilePaths().clear();
42*5ffd83dbSDimitry Andric   getFilePaths().push_back(getArchSpecificLibPath());
43*5ffd83dbSDimitry Andric   getFilePaths().push_back(computeSysRoot() + "/opt/nec/ve/lib");
44*5ffd83dbSDimitry Andric }
45*5ffd83dbSDimitry Andric 
46*5ffd83dbSDimitry Andric Tool *VEToolChain::buildAssembler() const {
47*5ffd83dbSDimitry Andric   return new tools::gnutools::Assembler(*this);
48*5ffd83dbSDimitry Andric }
49*5ffd83dbSDimitry Andric 
50*5ffd83dbSDimitry Andric Tool *VEToolChain::buildLinker() const {
51*5ffd83dbSDimitry Andric   return new tools::gnutools::Linker(*this);
52*5ffd83dbSDimitry Andric }
53*5ffd83dbSDimitry Andric 
54*5ffd83dbSDimitry Andric bool VEToolChain::isPICDefault() const { return false; }
55*5ffd83dbSDimitry Andric 
56*5ffd83dbSDimitry Andric bool VEToolChain::isPIEDefault() const { return false; }
57*5ffd83dbSDimitry Andric 
58*5ffd83dbSDimitry Andric bool VEToolChain::isPICDefaultForced() const { return false; }
59*5ffd83dbSDimitry Andric 
60*5ffd83dbSDimitry Andric bool VEToolChain::SupportsProfiling() const { return false; }
61*5ffd83dbSDimitry Andric 
62*5ffd83dbSDimitry Andric bool VEToolChain::hasBlocksRuntime() const { return false; }
63*5ffd83dbSDimitry Andric 
64*5ffd83dbSDimitry Andric void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
65*5ffd83dbSDimitry Andric                                             ArgStringList &CC1Args) const {
66*5ffd83dbSDimitry Andric   if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
67*5ffd83dbSDimitry Andric     return;
68*5ffd83dbSDimitry Andric 
69*5ffd83dbSDimitry Andric   if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
70*5ffd83dbSDimitry Andric       DriverArgs.hasArg(options::OPT_nostdlibinc))
71*5ffd83dbSDimitry Andric     return;
72*5ffd83dbSDimitry Andric 
73*5ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
74*5ffd83dbSDimitry Andric     SmallString<128> P(getDriver().ResourceDir);
75*5ffd83dbSDimitry Andric     llvm::sys::path::append(P, "include");
76*5ffd83dbSDimitry Andric     addSystemInclude(DriverArgs, CC1Args, P);
77*5ffd83dbSDimitry Andric   }
78*5ffd83dbSDimitry Andric 
79*5ffd83dbSDimitry Andric   if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
80*5ffd83dbSDimitry Andric     if (const char *cl_include_dir = getenv("NCC_C_INCLUDE_PATH")) {
81*5ffd83dbSDimitry Andric       SmallVector<StringRef, 4> Dirs;
82*5ffd83dbSDimitry Andric       const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
83*5ffd83dbSDimitry Andric       StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
84*5ffd83dbSDimitry Andric       ArrayRef<StringRef> DirVec(Dirs);
85*5ffd83dbSDimitry Andric       addSystemIncludes(DriverArgs, CC1Args, DirVec);
86*5ffd83dbSDimitry Andric     } else {
87*5ffd83dbSDimitry Andric       addSystemInclude(DriverArgs, CC1Args,
88*5ffd83dbSDimitry Andric                        getDriver().SysRoot + "/opt/nec/ve/include");
89*5ffd83dbSDimitry Andric     }
90*5ffd83dbSDimitry Andric   }
91*5ffd83dbSDimitry Andric }
92*5ffd83dbSDimitry Andric 
93*5ffd83dbSDimitry Andric void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
94*5ffd83dbSDimitry Andric                                         ArgStringList &CC1Args,
95*5ffd83dbSDimitry Andric                                         Action::OffloadKind) const {
96*5ffd83dbSDimitry Andric   CC1Args.push_back("-nostdsysteminc");
97*5ffd83dbSDimitry Andric   bool UseInitArrayDefault = true;
98*5ffd83dbSDimitry Andric   if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
99*5ffd83dbSDimitry Andric                           options::OPT_fno_use_init_array, UseInitArrayDefault))
100*5ffd83dbSDimitry Andric     CC1Args.push_back("-fno-use-init-array");
101*5ffd83dbSDimitry Andric }
102*5ffd83dbSDimitry Andric 
103*5ffd83dbSDimitry Andric void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
104*5ffd83dbSDimitry Andric                                                ArgStringList &CC1Args) const {
105*5ffd83dbSDimitry Andric   // TODO upstream VE libc++ patches
106*5ffd83dbSDimitry Andric   llvm_unreachable("The VE target has no C++ stdlib for Clang yet");
107*5ffd83dbSDimitry Andric }
108*5ffd83dbSDimitry Andric 
109*5ffd83dbSDimitry Andric void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
110*5ffd83dbSDimitry Andric                                       ArgStringList &CmdArgs) const {
111*5ffd83dbSDimitry Andric   // TODO upstream VE libc++ patches
112*5ffd83dbSDimitry Andric   llvm_unreachable("The VE target has no C++ stdlib for Clang yet");
113*5ffd83dbSDimitry Andric }
114*5ffd83dbSDimitry Andric 
115*5ffd83dbSDimitry Andric llvm::ExceptionHandling
116*5ffd83dbSDimitry Andric VEToolChain::GetExceptionModel(const ArgList &Args) const {
117*5ffd83dbSDimitry Andric   // VE uses SjLj exceptions.
118*5ffd83dbSDimitry Andric   return llvm::ExceptionHandling::SjLj;
119*5ffd83dbSDimitry Andric }
120