1 //===--- XCore.cpp - XCore ToolChain Implementations ------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 #include "CommonArgs.h"
11 #include "clang/Driver/Compilation.h"
12 #include "clang/Driver/Driver.h"
13 #include "clang/Driver/Options.h"
14 #include "llvm/Option/ArgList.h"
15 #include <cstdlib> // ::getenv
17 using namespace clang::driver
;
18 using namespace clang::driver::toolchains
;
19 using namespace clang
;
20 using namespace llvm::opt
;
23 // We pass assemble and link construction to the xcc tool.
25 void tools::XCore::Assembler::ConstructJob(Compilation
&C
, const JobAction
&JA
,
26 const InputInfo
&Output
,
27 const InputInfoList
&Inputs
,
29 const char *LinkingOutput
) const {
30 claimNoWarnArgs(Args
);
31 ArgStringList CmdArgs
;
33 CmdArgs
.push_back("-o");
34 CmdArgs
.push_back(Output
.getFilename());
36 CmdArgs
.push_back("-c");
38 if (Args
.hasArg(options::OPT_v
))
39 CmdArgs
.push_back("-v");
41 if (Arg
*A
= Args
.getLastArg(options::OPT_g_Group
))
42 if (!A
->getOption().matches(options::OPT_g0
))
43 CmdArgs
.push_back("-g");
45 if (Args
.hasFlag(options::OPT_fverbose_asm
, options::OPT_fno_verbose_asm
,
47 CmdArgs
.push_back("-fverbose-asm");
49 Args
.AddAllArgValues(CmdArgs
, options::OPT_Wa_COMMA
, options::OPT_Xassembler
);
51 for (const auto &II
: Inputs
)
52 CmdArgs
.push_back(II
.getFilename());
54 const char *Exec
= Args
.MakeArgString(getToolChain().GetProgramPath("xcc"));
55 C
.addCommand(std::make_unique
<Command
>(JA
, *this, ResponseFileSupport::None(),
56 Exec
, CmdArgs
, Inputs
, Output
));
59 void tools::XCore::Linker::ConstructJob(Compilation
&C
, const JobAction
&JA
,
60 const InputInfo
&Output
,
61 const InputInfoList
&Inputs
,
63 const char *LinkingOutput
) const {
64 ArgStringList CmdArgs
;
66 assert((Output
.isFilename() || Output
.isNothing()) && "Invalid output.");
67 if (Output
.isFilename()) {
68 CmdArgs
.push_back("-o");
69 CmdArgs
.push_back(Output
.getFilename());
72 if (Args
.hasArg(options::OPT_v
))
73 CmdArgs
.push_back("-v");
75 // Pass -fexceptions through to the linker if it was present.
76 if (Args
.hasFlag(options::OPT_fexceptions
, options::OPT_fno_exceptions
,
78 CmdArgs
.push_back("-fexceptions");
80 AddLinkerInputs(getToolChain(), Inputs
, Args
, CmdArgs
, JA
);
82 const char *Exec
= Args
.MakeArgString(getToolChain().GetProgramPath("xcc"));
83 C
.addCommand(std::make_unique
<Command
>(JA
, *this, ResponseFileSupport::None(),
84 Exec
, CmdArgs
, Inputs
, Output
));
88 XCoreToolChain::XCoreToolChain(const Driver
&D
, const llvm::Triple
&Triple
,
90 : ToolChain(D
, Triple
, Args
) {
91 // ProgramPaths are found via 'PATH' environment variable.
94 Tool
*XCoreToolChain::buildAssembler() const {
95 return new tools::XCore::Assembler(*this);
98 Tool
*XCoreToolChain::buildLinker() const {
99 return new tools::XCore::Linker(*this);
102 bool XCoreToolChain::isPICDefault() const { return false; }
104 bool XCoreToolChain::isPIEDefault(const llvm::opt::ArgList
&Args
) const {
108 bool XCoreToolChain::isPICDefaultForced() const { return false; }
110 bool XCoreToolChain::SupportsProfiling() const { return false; }
112 bool XCoreToolChain::hasBlocksRuntime() const { return false; }
114 void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList
&DriverArgs
,
115 ArgStringList
&CC1Args
) const {
116 if (DriverArgs
.hasArg(clang::driver::options::OPT_nostdinc
) ||
117 DriverArgs
.hasArg(options::OPT_nostdlibinc
))
119 if (const char *cl_include_dir
= getenv("XCC_C_INCLUDE_PATH")) {
120 SmallVector
<StringRef
, 4> Dirs
;
121 const char EnvPathSeparatorStr
[] = {llvm::sys::EnvPathSeparator
, '\0'};
122 StringRef(cl_include_dir
).split(Dirs
, StringRef(EnvPathSeparatorStr
));
123 ArrayRef
<StringRef
> DirVec(Dirs
);
124 addSystemIncludes(DriverArgs
, CC1Args
, DirVec
);
128 void XCoreToolChain::addClangTargetOptions(const ArgList
&DriverArgs
,
129 ArgStringList
&CC1Args
,
130 Action::OffloadKind
) const {
131 CC1Args
.push_back("-nostdsysteminc");
132 // Set `-fno-use-cxa-atexit` to default.
133 if (!DriverArgs
.hasFlag(options::OPT_fuse_cxa_atexit
,
134 options::OPT_fno_use_cxa_atexit
, false))
135 CC1Args
.push_back("-fno-use-cxa-atexit");
138 void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
139 const ArgList
&DriverArgs
, ArgStringList
&CC1Args
) const {
140 if (DriverArgs
.hasArg(clang::driver::options::OPT_nostdinc
) ||
141 DriverArgs
.hasArg(options::OPT_nostdlibinc
) ||
142 DriverArgs
.hasArg(options::OPT_nostdincxx
))
144 if (const char *cl_include_dir
= getenv("XCC_CPLUS_INCLUDE_PATH")) {
145 SmallVector
<StringRef
, 4> Dirs
;
146 const char EnvPathSeparatorStr
[] = {llvm::sys::EnvPathSeparator
, '\0'};
147 StringRef(cl_include_dir
).split(Dirs
, StringRef(EnvPathSeparatorStr
));
148 ArrayRef
<StringRef
> DirVec(Dirs
);
149 addSystemIncludes(DriverArgs
, CC1Args
, DirVec
);
153 void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList
&Args
,
154 ArgStringList
&CmdArgs
) const {
155 // We don't output any lib args. This is handled by xcc.