1e5dd7070Spatrick //===--- XCore.cpp - XCore ToolChain Implementations ------------*- C++ -*-===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick
9e5dd7070Spatrick #include "XCore.h"
10e5dd7070Spatrick #include "CommonArgs.h"
11e5dd7070Spatrick #include "clang/Driver/Compilation.h"
12e5dd7070Spatrick #include "clang/Driver/Driver.h"
13e5dd7070Spatrick #include "clang/Driver/Options.h"
14e5dd7070Spatrick #include "llvm/Option/ArgList.h"
15e5dd7070Spatrick #include <cstdlib> // ::getenv
16e5dd7070Spatrick
17e5dd7070Spatrick using namespace clang::driver;
18e5dd7070Spatrick using namespace clang::driver::toolchains;
19e5dd7070Spatrick using namespace clang;
20e5dd7070Spatrick using namespace llvm::opt;
21e5dd7070Spatrick
22e5dd7070Spatrick /// XCore Tools
23e5dd7070Spatrick // We pass assemble and link construction to the xcc tool.
24e5dd7070Spatrick
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const25e5dd7070Spatrick void tools::XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
26e5dd7070Spatrick const InputInfo &Output,
27e5dd7070Spatrick const InputInfoList &Inputs,
28e5dd7070Spatrick const ArgList &Args,
29e5dd7070Spatrick const char *LinkingOutput) const {
30e5dd7070Spatrick claimNoWarnArgs(Args);
31e5dd7070Spatrick ArgStringList CmdArgs;
32e5dd7070Spatrick
33e5dd7070Spatrick CmdArgs.push_back("-o");
34e5dd7070Spatrick CmdArgs.push_back(Output.getFilename());
35e5dd7070Spatrick
36e5dd7070Spatrick CmdArgs.push_back("-c");
37e5dd7070Spatrick
38e5dd7070Spatrick if (Args.hasArg(options::OPT_v))
39e5dd7070Spatrick CmdArgs.push_back("-v");
40e5dd7070Spatrick
41e5dd7070Spatrick if (Arg *A = Args.getLastArg(options::OPT_g_Group))
42e5dd7070Spatrick if (!A->getOption().matches(options::OPT_g0))
43e5dd7070Spatrick CmdArgs.push_back("-g");
44e5dd7070Spatrick
45e5dd7070Spatrick if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
46e5dd7070Spatrick false))
47e5dd7070Spatrick CmdArgs.push_back("-fverbose-asm");
48e5dd7070Spatrick
49e5dd7070Spatrick Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
50e5dd7070Spatrick
51e5dd7070Spatrick for (const auto &II : Inputs)
52e5dd7070Spatrick CmdArgs.push_back(II.getFilename());
53e5dd7070Spatrick
54e5dd7070Spatrick const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
55ec727ea7Spatrick C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
56a9ac8606Spatrick Exec, CmdArgs, Inputs, Output));
57e5dd7070Spatrick }
58e5dd7070Spatrick
ConstructJob(Compilation & C,const JobAction & JA,const InputInfo & Output,const InputInfoList & Inputs,const ArgList & Args,const char * LinkingOutput) const59e5dd7070Spatrick void tools::XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
60e5dd7070Spatrick const InputInfo &Output,
61e5dd7070Spatrick const InputInfoList &Inputs,
62e5dd7070Spatrick const ArgList &Args,
63e5dd7070Spatrick const char *LinkingOutput) const {
64e5dd7070Spatrick ArgStringList CmdArgs;
65e5dd7070Spatrick
66e5dd7070Spatrick if (Output.isFilename()) {
67e5dd7070Spatrick CmdArgs.push_back("-o");
68e5dd7070Spatrick CmdArgs.push_back(Output.getFilename());
69e5dd7070Spatrick } else {
70e5dd7070Spatrick assert(Output.isNothing() && "Invalid output.");
71e5dd7070Spatrick }
72e5dd7070Spatrick
73e5dd7070Spatrick if (Args.hasArg(options::OPT_v))
74e5dd7070Spatrick CmdArgs.push_back("-v");
75e5dd7070Spatrick
76e5dd7070Spatrick // Pass -fexceptions through to the linker if it was present.
77e5dd7070Spatrick if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
78e5dd7070Spatrick false))
79e5dd7070Spatrick CmdArgs.push_back("-fexceptions");
80e5dd7070Spatrick
81e5dd7070Spatrick AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA);
82e5dd7070Spatrick
83e5dd7070Spatrick const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
84ec727ea7Spatrick C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
85a9ac8606Spatrick Exec, CmdArgs, Inputs, Output));
86e5dd7070Spatrick }
87e5dd7070Spatrick
88e5dd7070Spatrick /// XCore tool chain
XCoreToolChain(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)89e5dd7070Spatrick XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
90e5dd7070Spatrick const ArgList &Args)
91e5dd7070Spatrick : ToolChain(D, Triple, Args) {
92e5dd7070Spatrick // ProgramPaths are found via 'PATH' environment variable.
93e5dd7070Spatrick }
94e5dd7070Spatrick
buildAssembler() const95e5dd7070Spatrick Tool *XCoreToolChain::buildAssembler() const {
96e5dd7070Spatrick return new tools::XCore::Assembler(*this);
97e5dd7070Spatrick }
98e5dd7070Spatrick
buildLinker() const99e5dd7070Spatrick Tool *XCoreToolChain::buildLinker() const {
100e5dd7070Spatrick return new tools::XCore::Linker(*this);
101e5dd7070Spatrick }
102e5dd7070Spatrick
isPICDefault() const103e5dd7070Spatrick bool XCoreToolChain::isPICDefault() const { return false; }
104e5dd7070Spatrick
isPIEDefault(const llvm::opt::ArgList & Args) const105*12c85518Srobert bool XCoreToolChain::isPIEDefault(const llvm::opt::ArgList &Args) const {
106*12c85518Srobert return false;
107*12c85518Srobert }
108e5dd7070Spatrick
isPICDefaultForced() const109e5dd7070Spatrick bool XCoreToolChain::isPICDefaultForced() const { return false; }
110e5dd7070Spatrick
SupportsProfiling() const111e5dd7070Spatrick bool XCoreToolChain::SupportsProfiling() const { return false; }
112e5dd7070Spatrick
hasBlocksRuntime() const113e5dd7070Spatrick bool XCoreToolChain::hasBlocksRuntime() const { return false; }
114e5dd7070Spatrick
AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const115e5dd7070Spatrick void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
116e5dd7070Spatrick ArgStringList &CC1Args) const {
117e5dd7070Spatrick if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
118e5dd7070Spatrick DriverArgs.hasArg(options::OPT_nostdlibinc))
119e5dd7070Spatrick return;
120e5dd7070Spatrick if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
121e5dd7070Spatrick SmallVector<StringRef, 4> Dirs;
122e5dd7070Spatrick const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
123e5dd7070Spatrick StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
124e5dd7070Spatrick ArrayRef<StringRef> DirVec(Dirs);
125e5dd7070Spatrick addSystemIncludes(DriverArgs, CC1Args, DirVec);
126e5dd7070Spatrick }
127e5dd7070Spatrick }
128e5dd7070Spatrick
addClangTargetOptions(const ArgList & DriverArgs,ArgStringList & CC1Args,Action::OffloadKind) const129e5dd7070Spatrick void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
130e5dd7070Spatrick ArgStringList &CC1Args,
131e5dd7070Spatrick Action::OffloadKind) const {
132e5dd7070Spatrick CC1Args.push_back("-nostdsysteminc");
133*12c85518Srobert // Set `-fno-use-cxa-atexit` to default.
134*12c85518Srobert if (!DriverArgs.hasFlag(options::OPT_fuse_cxa_atexit,
135*12c85518Srobert options::OPT_fno_use_cxa_atexit, false))
136*12c85518Srobert CC1Args.push_back("-fno-use-cxa-atexit");
137e5dd7070Spatrick }
138e5dd7070Spatrick
AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const139e5dd7070Spatrick void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
140e5dd7070Spatrick const ArgList &DriverArgs, ArgStringList &CC1Args) const {
141e5dd7070Spatrick if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
142e5dd7070Spatrick DriverArgs.hasArg(options::OPT_nostdlibinc) ||
143e5dd7070Spatrick DriverArgs.hasArg(options::OPT_nostdincxx))
144e5dd7070Spatrick return;
145e5dd7070Spatrick if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
146e5dd7070Spatrick SmallVector<StringRef, 4> Dirs;
147e5dd7070Spatrick const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
148e5dd7070Spatrick StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
149e5dd7070Spatrick ArrayRef<StringRef> DirVec(Dirs);
150e5dd7070Spatrick addSystemIncludes(DriverArgs, CC1Args, DirVec);
151e5dd7070Spatrick }
152e5dd7070Spatrick }
153e5dd7070Spatrick
AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const154e5dd7070Spatrick void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
155e5dd7070Spatrick ArgStringList &CmdArgs) const {
156e5dd7070Spatrick // We don't output any lib args. This is handled by xcc.
157e5dd7070Spatrick }
158