16#include "llvm/Option/ArgList.h"
17#include "llvm/Support/Error.h"
18#include "llvm/Support/RISCVISAInfo.h"
19#include "llvm/Support/raw_ostream.h"
20#include "llvm/TargetParser/Host.h"
21#include "llvm/TargetParser/RISCVTargetParser.h"
30 std::vector<StringRef> &Features,
31 const ArgList &Args) {
32 bool EnableExperimentalExtensions =
33 Args.hasArg(options::OPT_menable_experimental_extensions);
35 llvm::RISCVISAInfo::parseArchString(Arch, EnableExperimentalExtensions);
37 handleAllErrors(ISAInfo.takeError(), [&](llvm::StringError &ErrMsg) {
38 D.Diag(diag::err_drv_invalid_riscv_arch_name)
39 << Arch << ErrMsg.getMessage();
45 for (
const std::string &Str : (*ISAInfo)->toFeatures(
true,
47 Features.push_back(Args.MakeArgString(Str));
49 if (EnableExperimentalExtensions)
50 Features.push_back(Args.MakeArgString(
"+experimental"));
57 const llvm::Triple &Triple,
59 std::vector<StringRef> &Features) {
60 bool Is64Bit = Triple.isRISCV64();
61 if (!llvm::RISCV::parseCPU(Mcpu, Is64Bit)) {
63 if (llvm::RISCV::parseCPU(Mcpu, !Is64Bit))
64 D.
Diag(clang::diag::err_drv_invalid_riscv_cpu_name_for_target)
67 D.
Diag(clang::diag::err_drv_unsupported_option_argument)
68 << A->getSpelling() << Mcpu;
71 if (llvm::RISCV::hasFastUnalignedAccess(Mcpu)) {
72 Features.push_back(
"+unaligned-scalar-mem");
73 Features.push_back(
"+unaligned-vector-mem");
79 std::vector<StringRef> &Features) {
87 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
88 StringRef CPU = A->getValue();
90 CPU = llvm::sys::getHostCPUName();
96 if (Args.hasArg(options::OPT_ffixed_x1))
97 Features.push_back(
"+reserve-x1");
98 if (Args.hasArg(options::OPT_ffixed_x2))
99 Features.push_back(
"+reserve-x2");
100 if (Args.hasArg(options::OPT_ffixed_x3))
101 Features.push_back(
"+reserve-x3");
102 if (Args.hasArg(options::OPT_ffixed_x4))
103 Features.push_back(
"+reserve-x4");
104 if (Args.hasArg(options::OPT_ffixed_x5))
105 Features.push_back(
"+reserve-x5");
106 if (Args.hasArg(options::OPT_ffixed_x6))
107 Features.push_back(
"+reserve-x6");
108 if (Args.hasArg(options::OPT_ffixed_x7))
109 Features.push_back(
"+reserve-x7");
110 if (Args.hasArg(options::OPT_ffixed_x8))
111 Features.push_back(
"+reserve-x8");
112 if (Args.hasArg(options::OPT_ffixed_x9))
113 Features.push_back(
"+reserve-x9");
114 if (Args.hasArg(options::OPT_ffixed_x10))
115 Features.push_back(
"+reserve-x10");
116 if (Args.hasArg(options::OPT_ffixed_x11))
117 Features.push_back(
"+reserve-x11");
118 if (Args.hasArg(options::OPT_ffixed_x12))
119 Features.push_back(
"+reserve-x12");
120 if (Args.hasArg(options::OPT_ffixed_x13))
121 Features.push_back(
"+reserve-x13");
122 if (Args.hasArg(options::OPT_ffixed_x14))
123 Features.push_back(
"+reserve-x14");
124 if (Args.hasArg(options::OPT_ffixed_x15))
125 Features.push_back(
"+reserve-x15");
126 if (Args.hasArg(options::OPT_ffixed_x16))
127 Features.push_back(
"+reserve-x16");
128 if (Args.hasArg(options::OPT_ffixed_x17))
129 Features.push_back(
"+reserve-x17");
130 if (Args.hasArg(options::OPT_ffixed_x18))
131 Features.push_back(
"+reserve-x18");
132 if (Args.hasArg(options::OPT_ffixed_x19))
133 Features.push_back(
"+reserve-x19");
134 if (Args.hasArg(options::OPT_ffixed_x20))
135 Features.push_back(
"+reserve-x20");
136 if (Args.hasArg(options::OPT_ffixed_x21))
137 Features.push_back(
"+reserve-x21");
138 if (Args.hasArg(options::OPT_ffixed_x22))
139 Features.push_back(
"+reserve-x22");
140 if (Args.hasArg(options::OPT_ffixed_x23))
141 Features.push_back(
"+reserve-x23");
142 if (Args.hasArg(options::OPT_ffixed_x24))
143 Features.push_back(
"+reserve-x24");
144 if (Args.hasArg(options::OPT_ffixed_x25))
145 Features.push_back(
"+reserve-x25");
146 if (Args.hasArg(options::OPT_ffixed_x26))
147 Features.push_back(
"+reserve-x26");
148 if (Args.hasArg(options::OPT_ffixed_x27))
149 Features.push_back(
"+reserve-x27");
150 if (Args.hasArg(options::OPT_ffixed_x28))
151 Features.push_back(
"+reserve-x28");
152 if (Args.hasArg(options::OPT_ffixed_x29))
153 Features.push_back(
"+reserve-x29");
154 if (Args.hasArg(options::OPT_ffixed_x30))
155 Features.push_back(
"+reserve-x30");
156 if (Args.hasArg(options::OPT_ffixed_x31))
157 Features.push_back(
"+reserve-x31");
160 if (Args.hasFlag(options::OPT_mrelax, options::OPT_mno_relax,
true)) {
161 Features.push_back(
"+relax");
166 D.
Diag(clang::diag::err_drv_riscv_unsupported_with_linker_relaxation)
167 << A->getAsString(Args);
169 Features.push_back(
"-relax");
173 if (Triple.isAndroid()) {
174 Features.push_back(
"+unaligned-scalar-mem");
175 Features.push_back(
"+unaligned-vector-mem");
180 options::OPT_mstrict_align,
"unaligned-scalar-mem");
182 options::OPT_mstrict_align,
"unaligned-vector-mem");
187 options::OPT_m_riscv_Features_Group);
191 assert(Triple.isRISCV() &&
"Unexpected triple");
214 if (
const Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
215 return A->getValue();
227 auto ParseResult = llvm::RISCVISAInfo::parseArchString(
230 if (!llvm::errorToBool(ParseResult.takeError()))
231 return (*ParseResult)->computeDefaultABI();
238 if (Triple.isRISCV32()) {
239 if (Triple.getOS() == llvm::Triple::UnknownOS)
244 if (Triple.getOS() == llvm::Triple::UnknownOS)
252 const llvm::Triple &Triple) {
253 assert(Triple.isRISCV() &&
"Unexpected triple");
282 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
283 return A->getValue();
286 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
287 StringRef CPU = A->getValue();
289 CPU = llvm::sys::getHostCPUName();
290 StringRef MArch = llvm::RISCV::getMArchFromMcpu(CPU);
302 if (
const Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
303 StringRef MABI = A->getValue();
305 if (MABI.equals_insensitive(
"ilp32e"))
307 else if (MABI.equals_insensitive(
"lp64e"))
309 else if (MABI.starts_with_insensitive(
"ilp32"))
311 else if (MABI.starts_with_insensitive(
"lp64")) {
312 if (Triple.isAndroid())
313 return "rv64imafdcv_zba_zbb_zbs";
324 if (Triple.isRISCV32()) {
325 if (Triple.getOS() == llvm::Triple::UnknownOS)
330 if (Triple.getOS() == llvm::Triple::UnknownOS)
332 else if (Triple.isAndroid())
333 return "rv64imafdcv_zba_zbb_zbs";
340 const llvm::Triple &Triple) {
343 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
348 CPU = llvm::sys::getHostCPUName();
353 return Triple.isRISCV64() ?
"generic-rv64" :
"generic-rv32";
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticBuilder Diag(unsigned DiagID) const
The JSON file list parser is used to communicate input to InstallAPI.