15 #include "llvm/ADT/StringSwitch.h" 16 #include "llvm/Option/ArgList.h" 20 using namespace clang;
24 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
25 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
31 StringRef &CPUName, StringRef &ABIName) {
32 const char *DefMips32CPU =
"mips32r2";
33 const char *DefMips64CPU =
"mips64r2";
37 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
38 Triple.isGNUEnvironment()) {
39 DefMips32CPU =
"mips32r6";
40 DefMips64CPU =
"mips64r6";
44 if (Triple.isAndroid()) {
45 DefMips32CPU =
"mips32";
46 DefMips64CPU =
"mips64r6";
50 if (Triple.getOS() == llvm::Triple::OpenBSD)
51 DefMips64CPU =
"mips3";
53 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ,
54 options::OPT_mcpu_EQ))
55 CPUName = A->getValue();
57 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
58 ABIName = A->getValue();
61 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
68 if (CPUName.empty() && ABIName.empty()) {
69 switch (Triple.getArch()) {
71 llvm_unreachable(
"Unexpected triple arch name");
72 case llvm::Triple::mips:
73 case llvm::Triple::mipsel:
74 CPUName = DefMips32CPU;
76 case llvm::Triple::mips64:
77 case llvm::Triple::mips64el:
78 CPUName = DefMips64CPU;
83 if (ABIName.empty() &&
84 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
85 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
86 ABIName = llvm::StringSwitch<const char *>(CPUName)
92 .Case(
"mips32",
"o32")
93 .Case(
"mips32r2",
"o32")
94 .Case(
"mips32r3",
"o32")
95 .Case(
"mips32r5",
"o32")
96 .Case(
"mips32r6",
"o32")
97 .Case(
"mips64",
"n64")
98 .Case(
"mips64r2",
"n64")
99 .Case(
"mips64r3",
"n64")
100 .Case(
"mips64r5",
"n64")
101 .Case(
"mips64r6",
"n64")
102 .Case(
"octeon",
"n64")
103 .Case(
"p5600",
"o32")
107 if (ABIName.empty()) {
109 if (Triple.getArch() == llvm::Triple::mips ||
110 Triple.getArch() == llvm::Triple::mipsel)
116 if (CPUName.empty()) {
118 CPUName = llvm::StringSwitch<const char *>(ABIName)
119 .Case(
"o32", DefMips32CPU)
120 .Cases(
"n32",
"n64", DefMips64CPU)
128 const llvm::Triple &Triple) {
129 StringRef CPUName, ABIName;
131 return llvm::StringSwitch<std::string>(ABIName)
139 return llvm::StringSwitch<llvm::StringRef>(ABI)
150 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
151 options::OPT_mfloat_abi_EQ)) {
152 if (A->getOption().matches(options::OPT_msoft_float))
154 else if (A->getOption().matches(options::OPT_mhard_float))
157 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
162 D.
Diag(clang::diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
182 std::vector<StringRef> &Features) {
216 bool IsN64 = ABIName ==
"64";
219 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
220 options::OPT_fpic, options::OPT_fno_pic,
221 options::OPT_fPIE, options::OPT_fno_PIE,
222 options::OPT_fpie, options::OPT_fno_pie);
224 Option O = LastPICArg->getOption();
226 (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) ||
227 O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
230 bool UseAbiCalls =
false;
233 Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
235 !ABICallsArg || ABICallsArg->getOption().matches(options::OPT_mabicalls);
237 if (UseAbiCalls && IsN64 && NonPIC) {
238 D.
Diag(diag::warn_drv_unsupported_abicalls);
243 Features.push_back(
"+noabicalls");
245 Features.push_back(
"-noabicalls");
247 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
248 options::OPT_mno_long_calls)) {
249 if (A->getOption().matches(options::OPT_mno_long_calls))
250 Features.push_back(
"-long-calls");
251 else if (!UseAbiCalls)
252 Features.push_back(
"+long-calls");
254 D.
Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1);
262 Features.push_back(
"+soft-float");
265 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
266 StringRef Val = StringRef(A->getValue());
269 Features.push_back(
"+nan2008");
271 Features.push_back(
"-nan2008");
272 D.
Diag(diag::warn_target_unsupported_nan2008) << CPUName;
274 }
else if (Val ==
"legacy") {
276 Features.push_back(
"-nan2008");
278 Features.push_back(
"+nan2008");
279 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
282 D.
Diag(diag::err_drv_unsupported_option_argument)
283 << A->getOption().getName() << Val;
286 if (Arg *A = Args.getLastArg(options::OPT_mabs_EQ)) {
287 StringRef Val = StringRef(A->getValue());
290 Features.push_back(
"+abs2008");
292 Features.push_back(
"-abs2008");
293 D.
Diag(diag::warn_target_unsupported_abs2008) << CPUName;
295 }
else if (Val ==
"legacy") {
297 Features.push_back(
"-abs2008");
299 Features.push_back(
"+abs2008");
300 D.
Diag(diag::warn_target_unsupported_abslegacy) << CPUName;
303 D.
Diag(diag::err_drv_unsupported_option_argument)
304 << A->getOption().getName() << Val;
309 options::OPT_mdouble_float,
"single-float");
310 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
313 options::OPT_mno_micromips,
"micromips");
316 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
324 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
325 options::OPT_mfp64)) {
326 if (A->getOption().matches(options::OPT_mfp32))
327 Features.push_back(
"-fp64");
328 else if (A->getOption().matches(options::OPT_mfpxx)) {
329 Features.push_back(
"+fpxx");
330 Features.push_back(
"+nooddspreg");
332 Features.push_back(
"+fp64");
334 Features.push_back(
"+fpxx");
335 Features.push_back(
"+nooddspreg");
337 Features.push_back(
"+fp64");
338 Features.push_back(
"+nooddspreg");
342 options::OPT_modd_spreg,
"nooddspreg");
343 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
345 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
374 return llvm::StringSwitch<bool>(CPU)
375 .Case(
"mips32r6",
true)
376 .Case(
"mips64r6",
true)
381 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
382 return A && (A->getValue() == StringRef(Value));
386 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
387 return A && A->getOption().matches(options::OPT_muclibc);
390 bool mips::isNaN2008(
const ArgList &Args,
const llvm::Triple &Triple) {
391 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
392 return llvm::StringSwitch<bool>(NaNArg->getValue())
394 .Case(
"legacy",
false)
398 return llvm::StringSwitch<bool>(
getCPUName(Args, Triple))
399 .Cases(
"mips32r6",
"mips64r6",
true)
406 if (!Triple.isAndroid())
410 return llvm::StringSwitch<bool>(CPUName)
411 .Case(
"mips32r6",
true)
417 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
418 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
430 return llvm::StringSwitch<bool>(CPUName)
431 .Cases(
"mips2",
"mips3",
"mips4",
"mips5",
true)
432 .Cases(
"mips32",
"mips32r2",
"mips32r3",
"mips32r5",
true)
433 .Cases(
"mips64",
"mips64r2",
"mips64r3",
"mips64r5",
true)
438 StringRef CPUName, StringRef ABIName,
440 bool UseFPXX =
isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
443 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
444 options::OPT_mdouble_float))
445 if (A->getOption().matches(options::OPT_msingle_float))
DiagnosticBuilder Diag(unsigned DiagID) const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Dataflow Directional Tag Classes.