15 #include "llvm/ADT/Optional.h"
16 #include "llvm/Option/ArgList.h"
17 #include "llvm/Support/Error.h"
18 #include "llvm/Support/RISCVISAInfo.h"
19 #include "llvm/Support/TargetParser.h"
20 #include "llvm/Support/raw_ostream.h"
24 using namespace clang;
29 std::vector<StringRef> &Features,
30 const ArgList &Args) {
31 bool EnableExperimentalExtensions =
32 Args.hasArg(options::OPT_menable_experimental_extensions);
34 llvm::RISCVISAInfo::parseArchString(Arch, EnableExperimentalExtensions);
36 handleAllErrors(ISAInfo.takeError(), [&](llvm::StringError &ErrMsg) {
37 D.Diag(diag::err_drv_invalid_riscv_arch_name)
38 << Arch << ErrMsg.getMessage();
44 (*ISAInfo)->toFeatures(
45 Features, [&Args](
const Twine &Str) {
return Args.MakeArgString(Str); });
51 const llvm::opt::ArgList &Args,
52 const llvm::opt::Arg *A, StringRef Mcpu,
53 std::vector<StringRef> &Features) {
54 bool Is64Bit = (Triple.getArch() == llvm::Triple::riscv64);
55 llvm::RISCV::CPUKind CPUKind = llvm::RISCV::parseCPUKind(Mcpu);
56 if (!llvm::RISCV::checkCPUKind(CPUKind, Is64Bit) ||
57 !llvm::RISCV::getCPUFeaturesExceptStdExt(CPUKind, Features)) {
58 D.
Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
64 std::vector<StringRef> &Features) {
72 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
76 if (Args.hasArg(options::OPT_ffixed_x1))
77 Features.push_back(
"+reserve-x1");
78 if (Args.hasArg(options::OPT_ffixed_x2))
79 Features.push_back(
"+reserve-x2");
80 if (Args.hasArg(options::OPT_ffixed_x3))
81 Features.push_back(
"+reserve-x3");
82 if (Args.hasArg(options::OPT_ffixed_x4))
83 Features.push_back(
"+reserve-x4");
84 if (Args.hasArg(options::OPT_ffixed_x5))
85 Features.push_back(
"+reserve-x5");
86 if (Args.hasArg(options::OPT_ffixed_x6))
87 Features.push_back(
"+reserve-x6");
88 if (Args.hasArg(options::OPT_ffixed_x7))
89 Features.push_back(
"+reserve-x7");
90 if (Args.hasArg(options::OPT_ffixed_x8))
91 Features.push_back(
"+reserve-x8");
92 if (Args.hasArg(options::OPT_ffixed_x9))
93 Features.push_back(
"+reserve-x9");
94 if (Args.hasArg(options::OPT_ffixed_x10))
95 Features.push_back(
"+reserve-x10");
96 if (Args.hasArg(options::OPT_ffixed_x11))
97 Features.push_back(
"+reserve-x11");
98 if (Args.hasArg(options::OPT_ffixed_x12))
99 Features.push_back(
"+reserve-x12");
100 if (Args.hasArg(options::OPT_ffixed_x13))
101 Features.push_back(
"+reserve-x13");
102 if (Args.hasArg(options::OPT_ffixed_x14))
103 Features.push_back(
"+reserve-x14");
104 if (Args.hasArg(options::OPT_ffixed_x15))
105 Features.push_back(
"+reserve-x15");
106 if (Args.hasArg(options::OPT_ffixed_x16))
107 Features.push_back(
"+reserve-x16");
108 if (Args.hasArg(options::OPT_ffixed_x17))
109 Features.push_back(
"+reserve-x17");
110 if (Args.hasArg(options::OPT_ffixed_x18))
111 Features.push_back(
"+reserve-x18");
112 if (Args.hasArg(options::OPT_ffixed_x19))
113 Features.push_back(
"+reserve-x19");
114 if (Args.hasArg(options::OPT_ffixed_x20))
115 Features.push_back(
"+reserve-x20");
116 if (Args.hasArg(options::OPT_ffixed_x21))
117 Features.push_back(
"+reserve-x21");
118 if (Args.hasArg(options::OPT_ffixed_x22))
119 Features.push_back(
"+reserve-x22");
120 if (Args.hasArg(options::OPT_ffixed_x23))
121 Features.push_back(
"+reserve-x23");
122 if (Args.hasArg(options::OPT_ffixed_x24))
123 Features.push_back(
"+reserve-x24");
124 if (Args.hasArg(options::OPT_ffixed_x25))
125 Features.push_back(
"+reserve-x25");
126 if (Args.hasArg(options::OPT_ffixed_x26))
127 Features.push_back(
"+reserve-x26");
128 if (Args.hasArg(options::OPT_ffixed_x27))
129 Features.push_back(
"+reserve-x27");
130 if (Args.hasArg(options::OPT_ffixed_x28))
131 Features.push_back(
"+reserve-x28");
132 if (Args.hasArg(options::OPT_ffixed_x29))
133 Features.push_back(
"+reserve-x29");
134 if (Args.hasArg(options::OPT_ffixed_x30))
135 Features.push_back(
"+reserve-x30");
136 if (Args.hasArg(options::OPT_ffixed_x31))
137 Features.push_back(
"+reserve-x31");
140 if (Args.hasFlag(options::OPT_mrelax, options::OPT_mno_relax,
true))
141 Features.push_back(
"+relax");
143 Features.push_back(
"-relax");
147 if (Args.hasFlag(options::OPT_msave_restore, options::OPT_mno_save_restore,
false))
148 Features.push_back(
"+save-restore");
150 Features.push_back(
"-save-restore");
158 assert((Triple.getArch() == llvm::Triple::riscv32 ||
159 Triple.getArch() == llvm::Triple::riscv64) &&
160 "Unexpected triple");
183 if (
const Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
184 return A->getValue();
195 auto ParseResult = llvm::RISCVISAInfo::parseArchString(
199 consumeError(ParseResult.takeError());
201 return (*ParseResult)->computeDefaultABI();
208 if (Triple.getArch() == llvm::Triple::riscv32) {
209 if (Triple.getOS() == llvm::Triple::UnknownOS)
214 if (Triple.getOS() == llvm::Triple::UnknownOS)
222 const llvm::Triple &Triple) {
223 assert((Triple.getArch() == llvm::Triple::riscv32 ||
224 Triple.getArch() == llvm::Triple::riscv64) &&
225 "Unexpected triple");
254 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
255 return A->getValue();
258 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
259 StringRef MArch = llvm::RISCV::getMArchFromMcpu(A->getValue());
270 if (
const Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
271 StringRef MABI = A->getValue();
273 if (MABI.equals_insensitive(
"ilp32e"))
275 else if (MABI.startswith_insensitive(
"ilp32"))
277 else if (MABI.startswith_insensitive(
"lp64"))
286 if (Triple.getArch() == llvm::Triple::riscv32) {
287 if (Triple.getOS() == llvm::Triple::UnknownOS)
292 if (Triple.getOS() == llvm::Triple::UnknownOS)