14 #include "llvm/Option/ArgList.h"
15 #include "llvm/Support/TargetParser.h"
17 using namespace clang::driver;
18 using namespace clang::driver::tools;
19 using namespace clang;
20 using namespace llvm::opt;
28 if ((A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ))) {
29 CPU = StringRef(A->getValue()).lower();
30 }
else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
31 StringRef Mcpu = A->getValue();
32 CPU = Mcpu.split(
"+").first.lower();
37 return llvm::sys::getHostCPUName();
43 if (Args.getLastArg(options::OPT_arch))
51 std::vector<StringRef> &Features) {
53 text.split(Split, StringRef(
"+"), -1,
false);
55 for (StringRef Feature : Split) {
56 StringRef FeatureName = llvm::AArch64::getArchExtFeature(Feature);
57 if (!FeatureName.empty())
58 Features.push_back(FeatureName);
59 else if (Feature ==
"neon" || Feature ==
"noneon")
60 D.
Diag(clang::diag::err_drv_no_neon_modifier);
70 std::vector<StringRef> &Features) {
71 std::pair<StringRef, StringRef> Split = Mcpu.split(
"+");
74 if (CPU ==
"generic") {
75 Features.push_back(
"+neon");
77 unsigned ArchKind = llvm::AArch64::parseCPUArch(CPU);
78 if (!llvm::AArch64::getArchFeatures(ArchKind, Features))
81 unsigned Extension = llvm::AArch64::getDefaultExtensions(CPU, ArchKind);
82 if (!llvm::AArch64::getExtensionFeatures(Extension, Features))
95 std::vector<StringRef> &Features) {
96 std::string MarchLowerCase = March.lower();
97 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split(
"+");
99 unsigned ArchKind = llvm::AArch64::parseArch(Split.first);
100 if (ArchKind == static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID) ||
101 !llvm::AArch64::getArchFeatures(ArchKind, Features) ||
111 std::vector<StringRef> &Features) {
113 std::string McpuLowerCase = Mcpu.lower();
123 std::vector<StringRef> &Features) {
124 std::string MtuneLowerCase = Mtune.lower();
126 if (MtuneLowerCase ==
"native")
127 MtuneLowerCase = llvm::sys::getHostCPUName();
128 if (MtuneLowerCase ==
"cyclone") {
129 Features.push_back(
"+zcm");
130 Features.push_back(
"+zcz");
138 std::vector<StringRef> &Features) {
140 std::vector<StringRef> DecodedFeature;
141 std::string McpuLowerCase = Mcpu.lower();
149 std::vector<StringRef> &Features) {
153 Features.push_back(
"+neon");
154 if ((A = Args.getLastArg(options::OPT_march_EQ)))
156 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
158 else if (Args.hasArg(options::OPT_arch))
162 if (success && (A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)))
165 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
168 else if (success && Args.hasArg(options::OPT_arch))
173 D.
Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
175 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
176 Features.push_back(
"-fp-armv8");
177 Features.push_back(
"-crypto");
178 Features.push_back(
"-neon");
182 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
183 if (A->getOption().matches(options::OPT_mcrc))
184 Features.push_back(
"+crc");
186 Features.push_back(
"-crc");
189 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
190 options::OPT_munaligned_access))
191 if (A->getOption().matches(options::OPT_mno_unaligned_access))
192 Features.push_back(
"+strict-align");
194 if (Args.hasArg(options::OPT_ffixed_x18))
195 Features.push_back(
"+reserve-x18");
197 if (Args.hasArg(options::OPT_mno_neg_immediates))
198 Features.push_back(
"+no-neg-immediates");
static bool getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March, const ArgList &Args, std::vector< StringRef > &Features)
DiagnosticBuilder Diag(unsigned DiagID) const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
static bool DecodeAArch64Features(const Driver &D, StringRef text, std::vector< StringRef > &Features)
static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU, std::vector< StringRef > &Features)
static bool getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, const ArgList &Args, std::vector< StringRef > &Features)
static bool getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, const ArgList &Args, std::vector< StringRef > &Features)
static bool getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune, const ArgList &Args, std::vector< StringRef > &Features)