1ec727ea7Spatrick //===--- VE.cpp - VE ToolChain Implementations ------------------*- C++ -*-===//
2ec727ea7Spatrick //
3ec727ea7Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ec727ea7Spatrick // See https://llvm.org/LICENSE.txt for license information.
5ec727ea7Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ec727ea7Spatrick //
7ec727ea7Spatrick //===----------------------------------------------------------------------===//
8ec727ea7Spatrick
9ec727ea7Spatrick #include "VEToolchain.h"
10ec727ea7Spatrick #include "CommonArgs.h"
11ec727ea7Spatrick #include "clang/Driver/Compilation.h"
12ec727ea7Spatrick #include "clang/Driver/Driver.h"
13ec727ea7Spatrick #include "clang/Driver/Options.h"
14ec727ea7Spatrick #include "llvm/Option/ArgList.h"
15ec727ea7Spatrick #include "llvm/Support/FileSystem.h"
16ec727ea7Spatrick #include "llvm/Support/Path.h"
17ec727ea7Spatrick #include <cstdlib> // ::getenv
18ec727ea7Spatrick
19ec727ea7Spatrick using namespace clang::driver;
20ec727ea7Spatrick using namespace clang::driver::toolchains;
21ec727ea7Spatrick using namespace clang;
22ec727ea7Spatrick using namespace llvm::opt;
23ec727ea7Spatrick
24ec727ea7Spatrick /// VE tool chain
VEToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)25ec727ea7Spatrick VEToolChain::VEToolChain(const Driver &D, const llvm::Triple &Triple,
26ec727ea7Spatrick const ArgList &Args)
27ec727ea7Spatrick : Linux(D, Triple, Args) {
28ec727ea7Spatrick getProgramPaths().push_back("/opt/nec/ve/bin");
29ec727ea7Spatrick // ProgramPaths are found via 'PATH' environment variable.
30ec727ea7Spatrick
31*12c85518Srobert // Default library paths are following:
32*12c85518Srobert // ${RESOURCEDIR}/lib/ve-unknown-linux-gnu,
33*12c85518Srobert // These are OK.
34*12c85518Srobert
35*12c85518Srobert // Default file paths are following:
36*12c85518Srobert // ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPath)
37*12c85518Srobert // /lib/../lib64,
38*12c85518Srobert // /usr/lib/../lib64,
39*12c85518Srobert // ${BINPATH}/../lib,
40*12c85518Srobert // /lib,
41*12c85518Srobert // /usr/lib,
42*12c85518Srobert // These are OK for host, but no go for VE.
43*12c85518Srobert
44*12c85518Srobert // Define file paths from scratch here.
45ec727ea7Spatrick getFilePaths().clear();
46*12c85518Srobert
47*12c85518Srobert // Add library directories:
48*12c85518Srobert // ${BINPATH}/../lib/ve-unknown-linux-gnu, (== getStdlibPath)
49*12c85518Srobert // ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPath)
50*12c85518Srobert // ${SYSROOT}/opt/nec/ve/lib,
51*12c85518Srobert for (auto &Path : getStdlibPaths())
52*12c85518Srobert getFilePaths().push_back(std::move(Path));
53ec727ea7Spatrick getFilePaths().push_back(getArchSpecificLibPath());
54ec727ea7Spatrick getFilePaths().push_back(computeSysRoot() + "/opt/nec/ve/lib");
55ec727ea7Spatrick }
56ec727ea7Spatrick
buildAssembler() const57ec727ea7Spatrick Tool *VEToolChain::buildAssembler() const {
58ec727ea7Spatrick return new tools::gnutools::Assembler(*this);
59ec727ea7Spatrick }
60ec727ea7Spatrick
buildLinker() const61ec727ea7Spatrick Tool *VEToolChain::buildLinker() const {
62ec727ea7Spatrick return new tools::gnutools::Linker(*this);
63ec727ea7Spatrick }
64ec727ea7Spatrick
isPICDefault() const65ec727ea7Spatrick bool VEToolChain::isPICDefault() const { return false; }
66ec727ea7Spatrick
isPIEDefault(const llvm::opt::ArgList & Args) const67*12c85518Srobert bool VEToolChain::isPIEDefault(const llvm::opt::ArgList &Args) const {
68*12c85518Srobert return false;
69*12c85518Srobert }
70ec727ea7Spatrick
isPICDefaultForced() const71ec727ea7Spatrick bool VEToolChain::isPICDefaultForced() const { return false; }
72ec727ea7Spatrick
SupportsProfiling() const73ec727ea7Spatrick bool VEToolChain::SupportsProfiling() const { return false; }
74ec727ea7Spatrick
hasBlocksRuntime() const75ec727ea7Spatrick bool VEToolChain::hasBlocksRuntime() const { return false; }
76ec727ea7Spatrick
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const77ec727ea7Spatrick void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
78ec727ea7Spatrick ArgStringList &CC1Args) const {
79ec727ea7Spatrick if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
80ec727ea7Spatrick return;
81ec727ea7Spatrick
82ec727ea7Spatrick if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
83ec727ea7Spatrick DriverArgs.hasArg(options::OPT_nostdlibinc))
84ec727ea7Spatrick return;
85ec727ea7Spatrick
86ec727ea7Spatrick if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
87ec727ea7Spatrick SmallString<128> P(getDriver().ResourceDir);
88ec727ea7Spatrick llvm::sys::path::append(P, "include");
89ec727ea7Spatrick addSystemInclude(DriverArgs, CC1Args, P);
90ec727ea7Spatrick }
91ec727ea7Spatrick
92ec727ea7Spatrick if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
93ec727ea7Spatrick if (const char *cl_include_dir = getenv("NCC_C_INCLUDE_PATH")) {
94ec727ea7Spatrick SmallVector<StringRef, 4> Dirs;
95ec727ea7Spatrick const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
96ec727ea7Spatrick StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
97ec727ea7Spatrick ArrayRef<StringRef> DirVec(Dirs);
98ec727ea7Spatrick addSystemIncludes(DriverArgs, CC1Args, DirVec);
99ec727ea7Spatrick } else {
100ec727ea7Spatrick addSystemInclude(DriverArgs, CC1Args,
101ec727ea7Spatrick getDriver().SysRoot + "/opt/nec/ve/include");
102ec727ea7Spatrick }
103ec727ea7Spatrick }
104ec727ea7Spatrick }
105ec727ea7Spatrick
addClangTargetOptions(const ArgList & DriverArgs,ArgStringList & CC1Args,Action::OffloadKind) const106ec727ea7Spatrick void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
107ec727ea7Spatrick ArgStringList &CC1Args,
108ec727ea7Spatrick Action::OffloadKind) const {
109ec727ea7Spatrick CC1Args.push_back("-nostdsysteminc");
110ec727ea7Spatrick bool UseInitArrayDefault = true;
111ec727ea7Spatrick if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
112ec727ea7Spatrick options::OPT_fno_use_init_array, UseInitArrayDefault))
113ec727ea7Spatrick CC1Args.push_back("-fno-use-init-array");
114ec727ea7Spatrick }
115ec727ea7Spatrick
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const116ec727ea7Spatrick void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
117ec727ea7Spatrick ArgStringList &CC1Args) const {
118a9ac8606Spatrick if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
119a9ac8606Spatrick DriverArgs.hasArg(options::OPT_nostdlibinc) ||
120a9ac8606Spatrick DriverArgs.hasArg(options::OPT_nostdincxx))
121a9ac8606Spatrick return;
122a9ac8606Spatrick if (const char *cl_include_dir = getenv("NCC_CPLUS_INCLUDE_PATH")) {
123a9ac8606Spatrick SmallVector<StringRef, 4> Dirs;
124a9ac8606Spatrick const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
125a9ac8606Spatrick StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
126a9ac8606Spatrick ArrayRef<StringRef> DirVec(Dirs);
127a9ac8606Spatrick addSystemIncludes(DriverArgs, CC1Args, DirVec);
128a9ac8606Spatrick } else {
129*12c85518Srobert // Add following paths for multiple target installation.
130*12c85518Srobert // ${INSTALLDIR}/include/ve-unknown-linux-gnu/c++/v1,
131*12c85518Srobert // ${INSTALLDIR}/include/c++/v1,
132*12c85518Srobert addLibCxxIncludePaths(DriverArgs, CC1Args);
133a9ac8606Spatrick }
134ec727ea7Spatrick }
135ec727ea7Spatrick
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const136ec727ea7Spatrick void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
137ec727ea7Spatrick ArgStringList &CmdArgs) const {
138a9ac8606Spatrick assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
139a9ac8606Spatrick "Only -lc++ (aka libxx) is supported in this toolchain.");
140a9ac8606Spatrick
141a9ac8606Spatrick tools::addArchSpecificRPath(*this, Args, CmdArgs);
142a9ac8606Spatrick
143a9ac8606Spatrick CmdArgs.push_back("-lc++");
144*12c85518Srobert if (Args.hasArg(options::OPT_fexperimental_library))
145*12c85518Srobert CmdArgs.push_back("-lc++experimental");
146a9ac8606Spatrick CmdArgs.push_back("-lc++abi");
147a9ac8606Spatrick CmdArgs.push_back("-lunwind");
148a9ac8606Spatrick // libc++ requires -lpthread under glibc environment
149a9ac8606Spatrick CmdArgs.push_back("-lpthread");
150a9ac8606Spatrick // libunwind requires -ldl under glibc environment
151a9ac8606Spatrick CmdArgs.push_back("-ldl");
152ec727ea7Spatrick }
153ec727ea7Spatrick
154ec727ea7Spatrick llvm::ExceptionHandling
GetExceptionModel(const ArgList & Args) const155ec727ea7Spatrick VEToolChain::GetExceptionModel(const ArgList &Args) const {
156ec727ea7Spatrick // VE uses SjLj exceptions.
157ec727ea7Spatrick return llvm::ExceptionHandling::SjLj;
158ec727ea7Spatrick }
159