14#include "llvm/Option/ArgList.h"
15#include "llvm/Support/Error.h"
16#include "llvm/TargetParser/Host.h"
17#include "llvm/TargetParser/RISCVISAInfo.h"
18#include "llvm/TargetParser/RISCVTargetParser.h"
27 std::vector<StringRef> &Features,
28 const ArgList &Args) {
29 bool EnableExperimentalExtensions =
30 Args.hasArg(options::OPT_menable_experimental_extensions);
32 llvm::RISCVISAInfo::parseArchString(
Arch, EnableExperimentalExtensions);
34 handleAllErrors(ISAInfo.takeError(), [&](llvm::StringError &ErrMsg) {
35 D.Diag(diag::err_drv_invalid_riscv_arch_name)
36 << Arch << ErrMsg.getMessage();
42 for (
const std::string &Str : (*ISAInfo)->toFeatures(
true,
44 Features.push_back(Args.MakeArgString(Str));
46 if (EnableExperimentalExtensions)
47 Features.push_back(Args.MakeArgString(
"+experimental"));
53 const llvm::Triple &Triple, StringRef Mcpu) {
54 bool Is64Bit = Triple.isRISCV64();
55 if (!llvm::RISCV::parseCPU(Mcpu, Is64Bit)) {
57 if (llvm::RISCV::parseCPU(Mcpu, !Is64Bit))
58 D.
Diag(clang::diag::err_drv_invalid_riscv_cpu_name_for_target)
61 D.
Diag(clang::diag::err_drv_unsupported_option_argument)
62 << A->getSpelling() << Mcpu;
70 std::vector<StringRef> &Features) {
76 bool CPUFastScalarUnaligned =
false;
77 bool CPUFastVectorUnaligned =
false;
81 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
82 StringRef
CPU = A->getValue();
84 CPU = llvm::sys::getHostCPUName();
89 if (llvm::RISCV::hasFastScalarUnalignedAccess(CPU))
90 CPUFastScalarUnaligned =
true;
91 if (llvm::RISCV::hasFastVectorUnalignedAccess(CPU))
92 CPUFastVectorUnaligned =
true;
96#define RESERVE_REG(REG) \
97 if (Args.hasArg(options::OPT_ffixed_##REG)) \
98 Features.push_back("+reserve-" #REG);
133 if (Args.hasFlag(options::OPT_mrelax, options::OPT_mno_relax,
true))
134 Features.push_back(
"+relax");
136 Features.push_back(
"-relax");
142 if (
const Arg *A = Args.getLastArg(
143 options::OPT_mno_strict_align, options::OPT_mscalar_strict_align,
144 options::OPT_mstrict_align, options::OPT_mno_scalar_strict_align)) {
145 if (A->getOption().matches(options::OPT_mno_strict_align) ||
146 A->getOption().matches(options::OPT_mno_scalar_strict_align)) {
147 Features.push_back(
"+unaligned-scalar-mem");
149 Features.push_back(
"-unaligned-scalar-mem");
151 }
else if (CPUFastScalarUnaligned || Triple.isAndroid()) {
152 Features.push_back(
"+unaligned-scalar-mem");
159 if (
const Arg *A = Args.getLastArg(
160 options::OPT_mno_strict_align, options::OPT_mvector_strict_align,
161 options::OPT_mstrict_align, options::OPT_mno_vector_strict_align)) {
162 if (A->getOption().matches(options::OPT_mno_strict_align) ||
163 A->getOption().matches(options::OPT_mno_vector_strict_align)) {
164 Features.push_back(
"+unaligned-vector-mem");
166 Features.push_back(
"-unaligned-vector-mem");
168 }
else if (CPUFastVectorUnaligned || Triple.isAndroid()) {
169 Features.push_back(
"+unaligned-vector-mem");
175 options::OPT_m_riscv_Features_Group);
179 assert(Triple.isRISCV() &&
"Unexpected triple");
202 if (
const Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
203 return A->getValue();
215 auto ParseResult = llvm::RISCVISAInfo::parseArchString(
218 if (!llvm::errorToBool(ParseResult.takeError()))
219 return (*ParseResult)->computeDefaultABI();
226 if (Triple.isRISCV32()) {
227 if (Triple.getOS() == llvm::Triple::UnknownOS)
232 if (Triple.getOS() == llvm::Triple::UnknownOS)
240 const llvm::Triple &Triple) {
241 assert(Triple.isRISCV() &&
"Unexpected triple");
270 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
271 StringRef MArch = A->getValue();
272 if (MArch !=
"unset")
277 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
278 StringRef CPU = A->getValue();
279 if (CPU ==
"native") {
280 CPU = llvm::sys::getHostCPUName();
282 if (CPU.starts_with(
"generic")) {
283 auto FeatureMap = llvm::sys::getHostCPUFeatures();
285 if (!FeatureMap.empty()) {
286 std::vector<std::string> Features;
287 for (
auto &F : FeatureMap)
288 Features.push_back(((F.second ?
"+" :
"-") + F.first()).str());
289 auto ParseResult = llvm::RISCVISAInfo::parseFeatures(
290 Triple.isRISCV32() ? 32 : 64, Features);
292 return (*ParseResult)->toString();
297 StringRef MArch = llvm::RISCV::getMArchFromMcpu(CPU);
309 if (
const Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
310 StringRef MABI = A->getValue();
312 if (MABI.equals_insensitive(
"ilp32e"))
314 if (MABI.equals_insensitive(
"lp64e"))
316 if (MABI.starts_with_insensitive(
"ilp32"))
318 if (MABI.starts_with_insensitive(
"lp64")) {
319 if (Triple.isAndroid())
320 return "rv64imafdcv_zba_zbb_zbs";
321 if (Triple.isOSFuchsia())
332 if (Triple.isRISCV32()) {
333 if (Triple.getOS() == llvm::Triple::UnknownOS)
338 if (Triple.getOS() == llvm::Triple::UnknownOS)
340 if (Triple.isAndroid())
341 return "rv64imafdcv_zba_zbb_zbs";
342 if (Triple.isOSFuchsia())
348 const llvm::Triple &Triple) {
351 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
356 CPU = llvm::sys::getHostCPUName();
361 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.