;
37 constllvm::Triple &TargetTriple,
43 if(TargetTriple.isRISCV64()) {
47.
flag(
"-march=rv64imafdc")
48.
flag(
"-mabi=lp64d");
52(Arch ==
"rv64imafdc") || (Arch ==
"rv64gc");
61 returnResult.Multilibs.select(
D, Flags, Result.SelectedMultilibs);
63 if(TargetTriple.isRISCV32()) {
67.
flag(
"-march=rv32i")
68.
flag(
"-mabi=ilp32");
70.
flag(
"-march=rv32im")
71.
flag(
"-mabi=ilp32");
73.
flag(
"-march=rv32iac")
74.
flag(
"-mabi=ilp32");
76.
flag(
"-march=rv32imafc")
77.
flag(
"-mabi=ilp32f");
80 boolUseI = (Arch ==
"rv32i") || (Arch ==
"rv32ic");
81 boolUseIm = (Arch ==
"rv32im") || (Arch ==
"rv32imc");
82 boolUseImafc = (Arch ==
"rv32imafc") || (Arch ==
"rv32imafdc") ||
95 returnResult.Multilibs.select(
D, Flags, Result.SelectedMultilibs);
101 if(!
D.SysRoot.empty())
105llvm::sys::path::append(SysRootDir,
"..",
"lib",
"clang-runtimes");
108llvm::sys::path::append(SysRootDir,
D.getTargetTriple());
110 returnstd::string(SysRootDir);
121 if(!SysRoot.empty()) {
122 for(
const Multilib&M : getOrderedMultilibs()) {
124llvm::sys::path::append(Dir, M.osSuffix(),
"lib");
133 if(Triple.getArch() != llvm::Triple::aarch64 &&
134Triple.getArch() != llvm::Triple::aarch64_be)
137 if(Triple.getVendor() != llvm::Triple::UnknownVendor)
140 if(Triple.getOS() != llvm::Triple::UnknownOS)
143 returnTriple.getEnvironmentName() ==
"elf";
147 if(!Triple.isRISCV())
150 if(Triple.getVendor() != llvm::Triple::UnknownVendor)
153 if(Triple.getOS() != llvm::Triple::UnknownOS)
156 returnTriple.getEnvironmentName() ==
"elf";
161 returnTriple.isPPC() && Triple.getOS() == llvm::Triple::UnknownOS &&
162Triple.getEnvironment() == llvm::Triple::EABI;
167StringRef MultilibPath,
constArgList &Args,
170llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB =
171 D.getVFS().getBufferForFile(MultilibPath);
175llvm::ErrorOr<MultilibSet> ErrorOrMultilibSet =
177 if(ErrorOrMultilibSet.getError())
179 Result.Multilibs = ErrorOrMultilibSet.get();
180 if(
Result.Multilibs.select(
D, Flags,
Result.SelectedMultilibs,
181&CustomFlagsMacroDefines))
183 D.Diag(clang::diag::warn_drv_missing_multilib) << llvm::join(Flags,
" ");
184std::stringstream ss;
191 D.Diag(clang::diag::note_drv_available_multilibs) << ss.str();
200 D.Diag(clang::diag::err_drv_multilib_custom_error)
205 Result.SelectedMultilibs.clear();
210staticstd::optional<llvm::SmallString<128>>
212 constArgList &Args) {
214 if(Arg *ConfigFileArg = Args.getLastArg(options::OPT_multi_lib_config)) {
215MultilibPath = ConfigFileArg->getValue();
216 if(!
D.getVFS().exists(MultilibPath)) {
217 D.Diag(clang::diag::err_drv_no_such_file) << MultilibPath.str();
228 constArgList &Args) {
232std::optional<llvm::SmallString<128>> MultilibPath =
236 if(
D.getVFS().exists(*MultilibPath)) {
242CustomFlagMacroDefines);
245MultilibMacroDefines.append(CustomFlagMacroDefines.begin(),
246CustomFlagMacroDefines.end());
270BareMetal::OrderedMultilibs BareMetal::getOrderedMultilibs()
const{
277 returnllvm::reverse(
Default);
281ArgStringList &CC1Args)
const{
282 if(DriverArgs.hasArg(options::OPT_nostdinc))
285 if(!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
287llvm::sys::path::append(Dir,
"include");
291 if(DriverArgs.hasArg(options::OPT_nostdlibinc))
298 if(!SysRoot.empty()) {
299 for(
const Multilib&M : getOrderedMultilibs()) {
301llvm::sys::path::append(Dir, M.includeSuffix());
302llvm::sys::path::append(Dir,
"include");
309ArgStringList &CC1Args,
311CC1Args.push_back(
"-nostdsysteminc");
315ArgStringList &CC1Args)
const{
316 if(DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
317options::OPT_nostdincxx))
323 autoAddCXXIncludePath = [&](StringRef
Path) {
331llvm::sys::path::append(TargetDir,
Target,
"c++", Version);
338llvm::sys::path::append(Dir,
"c++", Version);
346llvm::sys::path::append(
P,
"..",
"include");
347AddCXXIncludePath(
P);
359 for(
const Multilib&M : getOrderedMultilibs()) {
361llvm::sys::path::append(Dir, M.gccSuffix());
366llvm::sys::path::append(TargetDir,
"usr",
"include",
"c++",
"v1");
367 if(
D.getVFS().exists(TargetDir)) {
372llvm::sys::path::append(Dir,
"include",
"c++",
"v1");
377llvm::sys::path::append(Dir,
"include",
"c++");
381 for(llvm::vfs::directory_iterator
382LI =
D.getVFS().dir_begin(Dir.str(), EC),
384!EC && LI != LE; LI = LI.increment(EC)) {
385StringRef VersionText = llvm::sys::path::filename(LI->path());
387 if(CandidateVersion.Major == -1)
389 if(CandidateVersion <= Version)
391Version = CandidateVersion;
393 if(Version.
Major!= -1) {
394llvm::sys::path::append(Dir, Version.
Text);
407 const char*LinkingOutput)
const{
408 const Driver&
D= getToolChain().getDriver();
411Args.ClaimAllArgs(options::OPT_g_Group);
413Args.ClaimAllArgs(options::OPT_emit_llvm);
416Args.ClaimAllArgs(options::OPT_w);
418Args.ClaimAllArgs(options::OPT_stdlib_EQ);
421ArgStringList CmdArgs;
423CmdArgs.push_back(
"rcsD");
426 for(
const auto&II : Inputs) {
427 if(II.isFilename()) {
428CmdArgs.push_back(II.getFilename());
434 const char*OutputFileName = Output.
getFilename();
435 if(Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
436 if(std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
437 D.Diag(diag::err_drv_unable_to_remove_file) << EC.message();
442 const char*Exec = Args.MakeArgString(getToolChain().GetStaticLibToolPath());
443 C.addCommand(std::make_unique<Command>(JA, *
this,
445Exec, CmdArgs, Inputs, Output));
452 const char*LinkingOutput)
const{
453ArgStringList CmdArgs;
456 const Driver&
D= getToolChain().getDriver();
457 constllvm::Triple::ArchType Arch = TC.getArch();
458 constllvm::Triple &Triple = getToolChain().getEffectiveTriple();
462CmdArgs.push_back(
"-Bstatic");
464 if(TC.getTriple().isRISCV() && Args.hasArg(options::OPT_mno_relax))
465CmdArgs.push_back(
"--no-relax");
467 if(Triple.isARM() || Triple.isThumb()) {
471CmdArgs.push_back(IsBigEndian ?
"-EB":
"-EL");
472}
else if(Triple.isAArch64()) {
473CmdArgs.push_back(Arch == llvm::Triple::aarch64_be ?
"-EB":
"-EL");
476 if(!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles,
478CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath(
"crt0.o")));
481Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
482options::OPT_s, options::OPT_t, options::OPT_r});
484TC.AddFilePathLibArgs(Args, CmdArgs);
486 for(
const auto&LibPath : TC.getLibraryPaths())
487CmdArgs.push_back(Args.MakeArgString(llvm::Twine(
"-L", LibPath)));
489 if(TC.ShouldLinkCXXStdlib(Args)) {
490 boolOnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
491!Args.hasArg(options::OPT_static);
492 if(OnlyLibstdcxxStatic)
493CmdArgs.push_back(
"-Bstatic");
494TC.AddCXXStdlibLibArgs(Args, CmdArgs);
495 if(OnlyLibstdcxxStatic)
496CmdArgs.push_back(
"-Bdynamic");
497CmdArgs.push_back(
"-lm");
500 if(!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
503CmdArgs.push_back(
"-lc");
506 if(
D.isUsingLTO()) {
507assert(!Inputs.empty() &&
"Must have at least one input.");
509 autoInput = llvm::find_if(
511 if(Input == Inputs.end())
514Input = Inputs.begin();
519 if(TC.getTriple().isRISCV())
520CmdArgs.push_back(
"-X");
526CmdArgs.push_back(
"--target2=rel");
528CmdArgs.push_back(
"-o");
531 C.addCommand(std::make_unique<Command>(
533Args.MakeArgString(TC.GetLinkerPath()), CmdArgs, Inputs, Output));
540 const boolIsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
541 const boolIsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64 ||
542 getTriple().getArch() == llvm::Triple::aarch64_be;
543 const boolIsRISCV64 =
getTriple().getArch() == llvm::Triple::riscv64;
545Res |= SanitizerKind::Address;
546Res |= SanitizerKind::KernelAddress;
547Res |= SanitizerKind::PointerCompare;
548Res |= SanitizerKind::PointerSubtract;
549Res |= SanitizerKind::Fuzzer;
550Res |= SanitizerKind::FuzzerNoLink;
551Res |= SanitizerKind::Vptr;
552Res |= SanitizerKind::SafeStack;
553Res |= SanitizerKind::Thread;
554Res |= SanitizerKind::Scudo;
555 if(IsX86_64 || IsAArch64 || IsRISCV64) {
556Res |= SanitizerKind::HWAddress;
557Res |= SanitizerKind::KernelHWAddress;
564 returnMultilibMacroDefines;
llvm::MachO::Target Target
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...
InputInfo - Wrapper for information about an input source.
const char * getFilename() const
This corresponds to a single GCC multilib, or a segment of one controlled by a command line flag.
MultilibBuilder & flag(StringRef Flag, bool Disallow=false)
Add a flag to the flags list Flag must be a flag accepted by the driver.
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
static llvm::ErrorOr< MultilibSet > parseYaml(llvm::MemoryBufferRef, llvm::SourceMgr::DiagHandlerTy=nullptr, void *DiagHandlerCtxt=nullptr)
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
const std::string & getErrorMessage() const
const flags_list & flags() const
Get the flags that indicate or contraindicate this multilib's use All elements begin with either '-' ...
std::vector< std::string > flags_list
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
static constexpr ResponseFileSupport AtFileCurCP()
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4