21#include "llvm/Option/ArgList.h"
22#include "llvm/Support/Path.h"
23#include "llvm/Support/VirtualFileSystem.h"
24#include "llvm/Support/raw_ostream.h"
33 const llvm::Triple &TargetTriple,
39 if (TargetTriple.isRISCV64()) {
43 .
flag(
"+march=rv64imafdc")
48 (Arch ==
"rv64imafdc") || (Arch ==
"rv64gc");
57 return Result.Multilibs.select(Flags, Result.SelectedMultilib);
59 if (TargetTriple.isRISCV32()) {
66 .
flag(
"+march=rv32im")
69 .
flag(
"+march=rv32iac")
72 .
flag(
"+march=rv32imafc")
73 .
flag(
"+mabi=ilp32f");
76 bool UseI = (Arch ==
"rv32i") || (Arch ==
"rv32ic");
77 bool UseIm = (Arch ==
"rv32im") || (Arch ==
"rv32imc");
78 bool UseImafc = (Arch ==
"rv32imafc") || (Arch ==
"rv32imafdc") ||
91 return Result.Multilibs.select(Flags, Result.SelectedMultilib);
105 if (!SysRoot.empty()) {
106 llvm::sys::path::append(SysRoot,
"lib");
114 if (Triple.getArch() != llvm::Triple::arm &&
115 Triple.getArch() != llvm::Triple::thumb)
118 if (Triple.getVendor() != llvm::Triple::UnknownVendor)
121 if (Triple.getOS() != llvm::Triple::UnknownOS)
124 if (Triple.getEnvironment() != llvm::Triple::EABI &&
125 Triple.getEnvironment() != llvm::Triple::EABIHF)
133 if (Triple.getArch() != llvm::Triple::aarch64)
136 if (Triple.getVendor() != llvm::Triple::UnknownVendor)
139 if (Triple.getOS() != llvm::Triple::UnknownOS)
142 return Triple.getEnvironmentName() ==
"elf";
146 if (!Triple.isRISCV())
149 if (Triple.getVendor() != llvm::Triple::UnknownVendor)
152 if (Triple.getOS() != llvm::Triple::UnknownOS)
155 return Triple.getEnvironmentName() ==
"elf";
159 const ArgList &Args) {
183 llvm::sys::path::append(SysRootDir,
getDriver().Dir,
"../lib/clang-runtimes",
187 return std::string(SysRootDir);
191 ArgStringList &CC1Args)
const {
192 if (DriverArgs.hasArg(options::OPT_nostdinc))
195 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
197 llvm::sys::path::append(Dir,
"include");
201 if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
204 llvm::sys::path::append(Dir,
"include");
211 ArgStringList &CC1Args,
213 CC1Args.push_back(
"-nostdsysteminc");
217 ArgStringList &CC1Args)
const {
218 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
219 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
220 DriverArgs.hasArg(options::OPT_nostdincxx))
232 llvm::sys::path::append(TargetDir,
"usr",
"include",
"c++",
"v1");
233 if (D.
getVFS().exists(TargetDir)) {
239 llvm::sys::path::append(Dir,
"include",
"c++",
"v1");
245 llvm::sys::path::append(Dir,
"include",
"c++");
249 for (llvm::vfs::directory_iterator LI = D.
getVFS().dir_begin(Dir.str(), EC),
251 !EC && LI != LE; LI = LI.increment(EC)) {
252 StringRef VersionText = llvm::sys::path::filename(LI->path());
254 if (CandidateVersion.Major == -1)
256 if (CandidateVersion <= Version)
258 Version = CandidateVersion;
260 if (Version.
Major == -1)
262 llvm::sys::path::append(Dir, Version.
Text);
270 ArgStringList &CmdArgs)
const {
273 CmdArgs.push_back(
"-lc++");
274 if (Args.hasArg(options::OPT_fexperimental_library))
275 CmdArgs.push_back(
"-lc++experimental");
276 CmdArgs.push_back(
"-lc++abi");
279 CmdArgs.push_back(
"-lstdc++");
280 CmdArgs.push_back(
"-lsupc++");
283 CmdArgs.push_back(
"-lunwind");
287 ArgStringList &CmdArgs)
const {
291 const std::string FileName =
getCompilerRT(Args,
"builtins");
292 llvm::StringRef BaseName = llvm::sys::path::filename(FileName);
293 BaseName.consume_front(
"lib");
294 BaseName.consume_back(
".a");
295 CmdArgs.push_back(Args.MakeArgString(
"-l" + BaseName));
299 CmdArgs.push_back(
"-lgcc");
302 llvm_unreachable(
"Unhandled RuntimeLibType.");
309 const char *LinkingOutput)
const {
310 ArgStringList CmdArgs;
316 CmdArgs.push_back(
"-Bstatic");
318 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
319 options::OPT_e, options::OPT_s, options::OPT_t,
320 options::OPT_Z_Flag, options::OPT_r});
322 TC.AddFilePathLibArgs(Args, CmdArgs);
324 for (
const auto &LibPath : TC.getLibraryPaths())
325 CmdArgs.push_back(Args.MakeArgString(llvm::Twine(
"-L", LibPath)));
327 const std::string FileName = TC.getCompilerRT(Args,
"builtins");
329 llvm::sys::path::remove_filename(PathBuf);
330 CmdArgs.push_back(Args.MakeArgString(
"-L" + PathBuf));
332 if (TC.ShouldLinkCXXStdlib(Args))
333 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
335 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
336 CmdArgs.push_back(
"-lc");
337 CmdArgs.push_back(
"-lm");
339 TC.AddLinkRuntimeLib(Args, CmdArgs);
342 if (TC.getTriple().isRISCV())
343 CmdArgs.push_back(
"-X");
345 CmdArgs.push_back(
"-o");
349 Args.MakeArgString(TC.GetLinkerPath()),
350 CmdArgs, Inputs, Output));
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
llvm::vfs::FileSystem & getVFS() const
This corresponds to a single GCC multilib, or a segment of one controlled by a command line flag.
MultilibBuilder & flag(StringRef F)
Add a flag to the flags list Flag must be a flag accepted by the driver with its leading '-' removed,...
This class can be used to create a MultilibSet, and contains helper functions to add combinations of ...
MultilibSetBuilder & Either(const MultilibBuilder &M1, const MultilibBuilder &M2)
Add a set of mutually incompatible Multilib segments.
MultilibSet makeMultilibSet() const
const std::string & osSuffix() const
Get the detected os path suffix for the multi-arch target variant.
std::vector< std::string > flags_list
@ C
Languages that the frontend can parse and compile.
@ Result
The result type of a method or function.
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.