clang: lib/Driver/ToolChains/RISCVToolchain.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
14#include "llvm/Option/ArgList.h"
15#include "llvm/Support/FileSystem.h"
16#include "llvm/Support/Path.h"
17#include "llvm/Support/raw_ostream.h"
18
22using namespace clang;
24
27 StringRef InstallPath,
30 for (const auto &Path : PathsCallback(Multilib))
32}
33
34
35
36
37
39 const llvm::opt::ArgList &Args) {
40 if (Args.getLastArg(options::OPT_gcc_toolchain))
41 return true;
42
44 llvm::sys::path::append(GCCDir, D.Dir, "..", D.getTargetTriple(),
45 "lib/crt0.o");
46 return llvm::sys::fs::exists(GCCDir);
47}
48
49
51 const ArgList &Args)
58
63
64
67 .str());
69 } else {
71 }
72 getFilePaths().push_back(computeSysRoot() + "/lib");
73}
74
77}
78
82}
83
87}
88
90 const llvm::opt::ArgList &Args) const {
92}
93
95 const llvm::opt::ArgList &DriverArgs,
96 llvm::opt::ArgStringList &CC1Args,
98 CC1Args.push_back("-nostdsysteminc");
99}
100
102 ArgStringList &CC1Args) const {
103 if (DriverArgs.hasArg(options::OPT_nostdinc))
104 return;
105
106 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
108 llvm::sys::path::append(Dir, "include");
110 }
111
112 if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
114 llvm::sys::path::append(Dir, "include");
116 }
117}
118
120 const llvm::opt::ArgList &DriverArgs,
121 llvm::opt::ArgStringList &CC1Args) const {
127 CC1Args);
128}
129
130std::string RISCVToolChain::computeSysRoot() const {
131 if (().SysRoot.empty())
133
138 llvm::sys::path::append(SysRootDir, LibDir, "..", TripleStr);
139 } else {
140
141
142 llvm::sys::path::append(SysRootDir, getDriver().Dir, "..",
144 }
145
146 if (!llvm::sys::fs::exists(SysRootDir))
147 return std::string();
148
149 return std::string(SysRootDir);
150}
151
155 const ArgList &Args,
156 const char *LinkingOutput) const {
159 ArgStringList CmdArgs;
160
161 if (.SysRoot.empty())
162 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
163
164 if (Args.hasArg(options::OPT_mno_relax))
165 CmdArgs.push_back("--no-relax");
166
168 CmdArgs.push_back("-m");
169 if (IsRV64) {
170 CmdArgs.push_back("elf64lriscv");
171 } else {
172 CmdArgs.push_back("elf32lriscv");
173 }
174 CmdArgs.push_back("-X");
175
176 std::string Linker = getToolChain().GetLinkerPath();
177
178 bool WantCRTs =
179 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
180
181 const char *crtbegin, *crtend;
184 crtbegin = "crtbegin.o";
185 crtend = "crtend.o";
186 } else {
192 }
193
194 if (WantCRTs) {
197 }
198
200
201 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});
202
204 Args.addAllArgs(CmdArgs, {options::OPT_T_Group, options::OPT_s,
205 options::OPT_t, options::OPT_r});
206
207
208
209 if (!Args.hasArg(options::OPT_nostdlib) &&
210 !Args.hasArg(options::OPT_nodefaultlibs)) {
211 if (D.CCCIsCXX()) {
214 CmdArgs.push_back("-lm");
215 }
216 CmdArgs.push_back("--start-group");
217 CmdArgs.push_back("-lc");
218 CmdArgs.push_back("-lgloss");
219 CmdArgs.push_back("--end-group");
221 }
222
223 if (WantCRTs)
225
226 CmdArgs.push_back("-o");
228 C.addCommand(std::make_unique(
230 CmdArgs, Inputs, Output));
231}
232
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string SysRoot
sysroot, if present
InputInfo - Wrapper for information about an input source.
const char * getFilename() const
See also MultilibSetBuilder for combining multilibs into a set.
const IncludeDirsFunc & filePathsCallback() const
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
const std::string & includeSuffix() const
Get the include directory suffix.
The JSON file list parser is used to communicate input to InstallAPI.
static constexpr ResponseFileSupport AtFileCurCP()