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 (*ISAInfo)->toFeatures(
46 Features, [&Args](
const Twine &Str) {
return Args.MakeArgString(Str); },
53 const llvm::Triple &Triple,
55 std::vector<StringRef> &Features) {
56 bool Is64Bit = Triple.isRISCV64();
57 if (!llvm::RISCV::parseCPU(Mcpu, Is64Bit)) {
59 if (llvm::RISCV::parseCPU(Mcpu, !Is64Bit))
60 D.
Diag(clang::diag::err_drv_invalid_riscv_cpu_name_for_target)
63 D.
Diag(clang::diag::err_drv_unsupported_option_argument)
64 << A->getSpelling() << Mcpu;
70 std::vector<StringRef> &Features) {
78 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
79 StringRef CPU = A->getValue();
81 CPU = llvm::sys::getHostCPUName();
87 if (Args.hasArg(options::OPT_ffixed_x1))
88 Features.push_back(
"+reserve-x1");
89 if (Args.hasArg(options::OPT_ffixed_x2))
90 Features.push_back(
"+reserve-x2");
91 if (Args.hasArg(options::OPT_ffixed_x3))
92 Features.push_back(
"+reserve-x3");
93 if (Args.hasArg(options::OPT_ffixed_x4))
94 Features.push_back(
"+reserve-x4");
95 if (Args.hasArg(options::OPT_ffixed_x5))
96 Features.push_back(
"+reserve-x5");
97 if (Args.hasArg(options::OPT_ffixed_x6))
98 Features.push_back(
"+reserve-x6");
99 if (Args.hasArg(options::OPT_ffixed_x7))
100 Features.push_back(
"+reserve-x7");
101 if (Args.hasArg(options::OPT_ffixed_x8))
102 Features.push_back(
"+reserve-x8");
103 if (Args.hasArg(options::OPT_ffixed_x9))
104 Features.push_back(
"+reserve-x9");
105 if (Args.hasArg(options::OPT_ffixed_x10))
106 Features.push_back(
"+reserve-x10");
107 if (Args.hasArg(options::OPT_ffixed_x11))
108 Features.push_back(
"+reserve-x11");
109 if (Args.hasArg(options::OPT_ffixed_x12))
110 Features.push_back(
"+reserve-x12");
111 if (Args.hasArg(options::OPT_ffixed_x13))
112 Features.push_back(
"+reserve-x13");
113 if (Args.hasArg(options::OPT_ffixed_x14))
114 Features.push_back(
"+reserve-x14");
115 if (Args.hasArg(options::OPT_ffixed_x15))
116 Features.push_back(
"+reserve-x15");
117 if (Args.hasArg(options::OPT_ffixed_x16))
118 Features.push_back(
"+reserve-x16");
119 if (Args.hasArg(options::OPT_ffixed_x17))
120 Features.push_back(
"+reserve-x17");
121 if (Args.hasArg(options::OPT_ffixed_x18))
122 Features.push_back(
"+reserve-x18");
123 if (Args.hasArg(options::OPT_ffixed_x19))
124 Features.push_back(
"+reserve-x19");
125 if (Args.hasArg(options::OPT_ffixed_x20))
126 Features.push_back(
"+reserve-x20");
127 if (Args.hasArg(options::OPT_ffixed_x21))
128 Features.push_back(
"+reserve-x21");
129 if (Args.hasArg(options::OPT_ffixed_x22))
130 Features.push_back(
"+reserve-x22");
131 if (Args.hasArg(options::OPT_ffixed_x23))
132 Features.push_back(
"+reserve-x23");
133 if (Args.hasArg(options::OPT_ffixed_x24))
134 Features.push_back(
"+reserve-x24");
135 if (Args.hasArg(options::OPT_ffixed_x25))
136 Features.push_back(
"+reserve-x25");
137 if (Args.hasArg(options::OPT_ffixed_x26))
138 Features.push_back(
"+reserve-x26");
139 if (Args.hasArg(options::OPT_ffixed_x27))
140 Features.push_back(
"+reserve-x27");
141 if (Args.hasArg(options::OPT_ffixed_x28))
142 Features.push_back(
"+reserve-x28");
143 if (Args.hasArg(options::OPT_ffixed_x29))
144 Features.push_back(
"+reserve-x29");
145 if (Args.hasArg(options::OPT_ffixed_x30))
146 Features.push_back(
"+reserve-x30");
147 if (Args.hasArg(options::OPT_ffixed_x31))
148 Features.push_back(
"+reserve-x31");
151 if (Args.hasFlag(options::OPT_mrelax, options::OPT_mno_relax,
true)) {
152 Features.push_back(
"+relax");
157 D.
Diag(clang::diag::err_drv_riscv_unsupported_with_linker_relaxation)
158 << A->getAsString(Args);
160 Features.push_back(
"-relax");
165 if (Args.hasFlag(options::OPT_msave_restore, options::OPT_mno_save_restore,
false))
166 Features.push_back(
"+save-restore");
168 Features.push_back(
"-save-restore");
171 bool HasV = llvm::is_contained(Features,
"+zve32x");
172 if (
const Arg *A = Args.getLastArg(options::OPT_munaligned_access,
173 options::OPT_mno_unaligned_access)) {
174 if (A->getOption().matches(options::OPT_munaligned_access)) {
175 Features.push_back(
"+unaligned-scalar-mem");
177 Features.push_back(
"+unaligned-vector-mem");
179 Features.push_back(
"-unaligned-scalar-mem");
181 Features.push_back(
"-unaligned-vector-mem");
188 options::OPT_m_riscv_Features_Group);
192 assert(Triple.isRISCV() &&
"Unexpected triple");
215 if (
const Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
216 return A->getValue();
227 auto ParseResult = llvm::RISCVISAInfo::parseArchString(
231 consumeError(ParseResult.takeError());
233 return (*ParseResult)->computeDefaultABI();
240 if (Triple.isRISCV32()) {
241 if (Triple.getOS() == llvm::Triple::UnknownOS)
246 if (Triple.getOS() == llvm::Triple::UnknownOS)
254 const llvm::Triple &Triple) {
255 assert(Triple.isRISCV() &&
"Unexpected triple");
284 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
285 return A->getValue();
288 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
289 StringRef CPU = A->getValue();
291 CPU = llvm::sys::getHostCPUName();
292 StringRef MArch = llvm::RISCV::getMArchFromMcpu(CPU);
303 if (
const Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
304 StringRef MABI = A->getValue();
306 if (MABI.equals_insensitive(
"ilp32e"))
308 else if (MABI.starts_with_insensitive(
"ilp32"))
310 else if (MABI.starts_with_insensitive(
"lp64")) {
311 if (Triple.isAndroid())
312 return "rv64imafdc_zba_zbb_zbs";
323 if (Triple.isRISCV32()) {
324 if (Triple.getOS() == llvm::Triple::UnknownOS)
329 if (Triple.getOS() == llvm::Triple::UnknownOS)
331 else if (Triple.isAndroid())
332 return "rv64imafdc_zba_zbb_zbs";
339 const llvm::Triple &Triple) {
342 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
347 CPU = llvm::sys::getHostCPUName();
352 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