13#include "llvm/ADT/StringSwitch.h"
14#include "llvm/Option/ArgList.h"
24 StringRef &CPUName, StringRef &ABIName) {
25 const char *DefMips32CPU =
"mips32r2";
26 const char *DefMips64CPU =
"mips64r2";
30 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
31 Triple.isGNUEnvironment()) {
32 DefMips32CPU =
"mips32r6";
33 DefMips64CPU =
"mips64r6";
36 if (Triple.getSubArch() == llvm::Triple::MipsSubArch_r6) {
37 DefMips32CPU =
"mips32r6";
38 DefMips64CPU =
"mips64r6";
42 if (Triple.isOSOpenBSD())
43 DefMips64CPU =
"mips3";
47 if (Triple.isOSFreeBSD()) {
48 DefMips32CPU =
"mips2";
49 DefMips64CPU =
"mips3";
52 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
53 CPUName = A->getValue();
55 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
56 ABIName = A->getValue();
59 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
66 if (CPUName.empty() && ABIName.empty()) {
67 switch (Triple.getArch()) {
69 llvm_unreachable(
"Unexpected triple arch name");
70 case llvm::Triple::mips:
71 case llvm::Triple::mipsel:
72 CPUName = DefMips32CPU;
74 case llvm::Triple::mips64:
75 case llvm::Triple::mips64el:
76 CPUName = DefMips64CPU;
81 if (ABIName.empty() && Triple.isABIN32())
84 if (ABIName.empty() &&
85 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
86 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
87 ABIName = llvm::StringSwitch<const char *>(CPUName)
93 .Case(
"mips32",
"o32")
94 .Case(
"mips32r2",
"o32")
95 .Case(
"mips32r3",
"o32")
96 .Case(
"mips32r5",
"o32")
97 .Case(
"mips32r6",
"o32")
98 .Case(
"mips64",
"n64")
99 .Case(
"mips64r2",
"n64")
100 .Case(
"mips64r3",
"n64")
101 .Case(
"mips64r5",
"n64")
102 .Case(
"mips64r6",
"n64")
103 .Case(
"octeon",
"n64")
104 .Case(
"p5600",
"o32")
105 .Case(
"i6400",
"n64")
106 .Case(
"i6500",
"n64")
110 if (ABIName.empty()) {
112 ABIName = Triple.isMIPS32() ?
"o32" :
"n64";
115 if (CPUName.empty()) {
117 CPUName = llvm::StringSwitch<const char *>(ABIName)
118 .Case(
"o32", DefMips32CPU)
119 .Cases({
"n32",
"n64"}, DefMips64CPU)
127 const llvm::Triple &Triple) {
128 StringRef CPUName, ABIName;
130 return llvm::StringSwitch<std::string>(ABIName)
138 return llvm::StringSwitch<llvm::StringRef>(ABI)
147 const llvm::Triple &Triple) {
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);
170 if (Triple.isOSFreeBSD()) {
187 std::vector<StringRef> &Features) {
195#define RESERVE_GPR(REG) \
196 if (Args.hasArg(options::OPT_ffixed_##REG)) \
197 Features.push_back("+reserve-gpr" #REG);
259 bool IsN64 = ABIName ==
"64";
262 bool HasNaN2008Opt =
false;
264 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
265 options::OPT_fpic, options::OPT_fno_pic,
266 options::OPT_fPIE, options::OPT_fno_PIE,
267 options::OPT_fpie, options::OPT_fno_pie);
269 Option O = LastPICArg->getOption();
271 (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) ||
272 O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
274 (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
275 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie));
278 bool UseAbiCalls =
false;
281 Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
283 !ABICallsArg || ABICallsArg->getOption().
matches(options::OPT_mabicalls);
285 if (IsN64 && NonPIC && (!ABICallsArg || UseAbiCalls)) {
286 D.
Diag(diag::warn_drv_unsupported_pic_with_mabicalls)
287 << LastPICArg->getAsString(Args) << (!ABICallsArg ? 0 : 1);
290 if (ABICallsArg && !UseAbiCalls && IsPIC) {
291 D.
Diag(diag::err_drv_unsupported_noabicalls_pic);
294 if (CPUName ==
"i6500" || CPUName ==
"i6400") {
297 Features.push_back(
"+msa");
301 Features.push_back(
"+noabicalls");
303 Features.push_back(
"-noabicalls");
305 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
306 options::OPT_mno_long_calls)) {
307 if (A->getOption().matches(options::OPT_mno_long_calls))
308 Features.push_back(
"-long-calls");
309 else if (!UseAbiCalls)
310 Features.push_back(
"+long-calls");
312 D.Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1);
315 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
316 if (A->getOption().matches(options::OPT_mxgot))
317 Features.push_back(
"+xgot");
319 Features.push_back(
"-xgot");
327 Features.push_back(
"+soft-float");
330 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
331 StringRef Val = StringRef(A->getValue());
333 if (mips::getIEEE754Standard(CPUName) & mips::Std2008) {
334 Features.push_back(
"+nan2008");
335 HasNaN2008Opt = true;
337 Features.push_back(
"-nan2008");
338 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
340 }
else if (Val ==
"legacy") {
342 Features.push_back(
"-nan2008");
344 Features.push_back(
"+nan2008");
345 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
348 D.
Diag(diag::err_drv_unsupported_option_argument)
349 << A->getSpelling() << Val;
352 if (Arg *A = Args.getLastArg(options::OPT_mabs_EQ)) {
353 StringRef Val = StringRef(A->getValue());
355 if (mips::getIEEE754Standard(CPUName) & mips::Std2008) {
356 Features.push_back(
"+abs2008");
358 Features.push_back(
"-abs2008");
359 D.Diag(diag::warn_target_unsupported_abs2008) << CPUName;
361 }
else if (Val ==
"legacy") {
363 Features.push_back(
"-abs2008");
365 Features.push_back(
"+abs2008");
366 D.
Diag(diag::warn_target_unsupported_abslegacy) << CPUName;
369 D.
Diag(diag::err_drv_unsupported_option_argument)
370 << A->getSpelling() << Val;
372 }
else if (HasNaN2008Opt) {
373 Features.push_back(
"+abs2008");
377 options::OPT_mdouble_float,
"single-float");
378 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
381 options::OPT_mno_micromips,
"micromips");
384 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
388 if (Arg *A = Args.getLastArg(
389 options::OPT_mstrict_align, options::OPT_mno_strict_align,
390 options::OPT_mno_unaligned_access, options::OPT_munaligned_access)) {
391 if (A->getOption().matches(options::OPT_mstrict_align) ||
392 A->getOption().matches(options::OPT_mno_unaligned_access))
393 Features.push_back(Args.MakeArgString(
"+strict-align"));
395 Features.push_back(Args.MakeArgString(
"-strict-align"));
401 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
402 options::OPT_mfp64)) {
403 if (A->getOption().matches(options::OPT_mfp32))
404 Features.push_back(
"-fp64");
405 else if (A->getOption().matches(options::OPT_mfpxx)) {
406 Features.push_back(
"+fpxx");
407 Features.push_back(
"+nooddspreg");
409 Features.push_back(
"+fp64");
411 Features.push_back(
"+fpxx");
412 Features.push_back(
"+nooddspreg");
413 }
else if (Arg *A = Args.getLastArg(options::OPT_mmsa)) {
414 if (A->getOption().matches(options::OPT_mmsa))
415 Features.push_back(
"+fp64");
419 options::OPT_modd_spreg,
"nooddspreg");
420 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
422 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
430 options::OPT_mno_fix_r5900,
"fix-r5900");
432 if (Arg *A = Args.getLastArg(options::OPT_mindirect_jump_EQ)) {
433 StringRef Val = StringRef(A->getValue());
434 if (Val ==
"hazard") {
436 Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
437 Arg *
C = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
439 if (B && B->getOption().matches(options::OPT_mmicromips))
440 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
441 <<
"hazard" <<
"micromips";
442 else if (
C &&
C->getOption().matches(options::OPT_mips16))
443 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
444 <<
"hazard" <<
"mips16";
446 Features.push_back(
"+use-indirect-jump-hazard");
448 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
449 <<
"hazard" << CPUName;
451 D.
Diag(diag::err_drv_unknown_indirect_jump_opt) << Val;
481 return llvm::StringSwitch<bool>(CPU)
482 .Case(
"mips32r6",
true)
483 .Case(
"mips64r6",
true)
490 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
491 return A && (A->getValue() == StringRef(
Value));
495 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
496 return A && A->getOption().matches(options::OPT_muclibc);
500 const llvm::Triple &Triple) {
501 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
502 return llvm::StringSwitch<bool>(NaNArg->getValue())
504 .Case(
"legacy",
false)
508 return llvm::StringSwitch<bool>(
getCPUName(D, Args, Triple))
509 .Cases({
"mips32r6",
"mips64r6"},
true)
523 return llvm::StringSwitch<bool>(CPUName)
524 .Cases({
"mips2",
"mips3",
"mips4",
"mips5"},
true)
525 .Cases({
"mips32",
"mips32r2",
"mips32r3",
"mips32r5"},
true)
526 .Cases({
"mips64",
"mips64r2",
"mips64r3",
"mips64r5"},
true)
531 StringRef CPUName, StringRef ABIName,
533 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
536 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
537 options::OPT_mdouble_float))
538 if (A->getOption().matches(options::OPT_msingle_float))
541 if (Arg *A = Args.getLastArg(options::OPT_mmsa))
542 if (A->getOption().matches(options::OPT_mmsa))
543 UseFPXX = llvm::StringSwitch<bool>(CPUName)
544 .Cases({
"mips32r2",
"mips32r3",
"mips32r5"},
false)
545 .Cases({
"mips64r2",
"mips64r3",
"mips64r5"},
false)
554 return llvm::StringSwitch<bool>(CPU)
555 .Case(
"mips32r2",
true)
556 .Case(
"mips32r3",
true)
557 .Case(
"mips32r5",
true)
558 .Case(
"mips32r6",
true)
559 .Case(
"mips64r2",
true)
560 .Case(
"mips64r3",
true)
561 .Case(
"mips64r5",
true)
562 .Case(
"mips64r6",
true)
563 .Case(
"octeon",
true)
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticBuilder Diag(unsigned DiagID) const
bool matches(const til::SExpr *E1, const til::SExpr *E2)
Top level wrappers for InstallAPI frontend operations.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ Default
Set to the current date and time.