14 #include "llvm/ADT/StringSwitch.h" 15 #include "llvm/Option/ArgList.h" 19 using namespace clang;
25 StringRef &CPUName, StringRef &ABIName) {
26 const char *DefMips32CPU =
"mips32r2";
27 const char *DefMips64CPU =
"mips64r2";
31 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
32 Triple.isGNUEnvironment()) {
33 DefMips32CPU =
"mips32r6";
34 DefMips64CPU =
"mips64r6";
37 if (Triple.getSubArch() == llvm::Triple::MipsSubArch_r6) {
38 DefMips32CPU =
"mips32r6";
39 DefMips64CPU =
"mips64r6";
43 if (Triple.isAndroid()) {
44 DefMips32CPU =
"mips32";
45 DefMips64CPU =
"mips64r6";
49 if (Triple.isOSOpenBSD())
50 DefMips64CPU =
"mips3";
54 if (Triple.isOSFreeBSD()) {
55 DefMips32CPU =
"mips2";
56 DefMips64CPU =
"mips3";
59 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ,
60 options::OPT_mcpu_EQ))
61 CPUName = A->getValue();
63 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
64 ABIName = A->getValue();
67 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
74 if (CPUName.empty() && ABIName.empty()) {
75 switch (Triple.getArch()) {
77 llvm_unreachable(
"Unexpected triple arch name");
78 case llvm::Triple::mips:
79 case llvm::Triple::mipsel:
80 CPUName = DefMips32CPU;
82 case llvm::Triple::mips64:
83 case llvm::Triple::mips64el:
84 CPUName = DefMips64CPU;
89 if (ABIName.empty() && (Triple.getEnvironment() == llvm::Triple::GNUABIN32))
92 if (ABIName.empty() &&
93 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
94 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
95 ABIName = llvm::StringSwitch<const char *>(CPUName)
100 .Case(
"mips5",
"n64")
101 .Case(
"mips32",
"o32")
102 .Case(
"mips32r2",
"o32")
103 .Case(
"mips32r3",
"o32")
104 .Case(
"mips32r5",
"o32")
105 .Case(
"mips32r6",
"o32")
106 .Case(
"mips64",
"n64")
107 .Case(
"mips64r2",
"n64")
108 .Case(
"mips64r3",
"n64")
109 .Case(
"mips64r5",
"n64")
110 .Case(
"mips64r6",
"n64")
111 .Case(
"octeon",
"n64")
112 .Case(
"p5600",
"o32")
116 if (ABIName.empty()) {
118 ABIName = Triple.isMIPS32() ?
"o32" :
"n64";
121 if (CPUName.empty()) {
123 CPUName = llvm::StringSwitch<const char *>(ABIName)
124 .Case(
"o32", DefMips32CPU)
125 .Cases(
"n32",
"n64", DefMips64CPU)
133 const llvm::Triple &Triple) {
134 StringRef CPUName, ABIName;
136 return llvm::StringSwitch<std::string>(ABIName)
144 return llvm::StringSwitch<llvm::StringRef>(ABI)
153 const llvm::Triple &Triple) {
156 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
157 options::OPT_mfloat_abi_EQ)) {
158 if (A->getOption().matches(options::OPT_msoft_float))
160 else if (A->getOption().matches(options::OPT_mhard_float))
163 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
168 D.
Diag(clang::diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
176 if (Triple.isOSFreeBSD()) {
193 std::vector<StringRef> &Features) {
227 bool IsN64 = ABIName ==
"64";
231 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
232 options::OPT_fpic, options::OPT_fno_pic,
233 options::OPT_fPIE, options::OPT_fno_PIE,
234 options::OPT_fpie, options::OPT_fno_pie);
236 Option O = LastPICArg->getOption();
238 (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) ||
239 O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
241 (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
242 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie));
245 bool UseAbiCalls =
false;
248 Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
250 !ABICallsArg || ABICallsArg->getOption().matches(options::OPT_mabicalls);
252 if (IsN64 && NonPIC && (!ABICallsArg || UseAbiCalls)) {
253 D.
Diag(diag::warn_drv_unsupported_pic_with_mabicalls)
254 << LastPICArg->getAsString(Args) << (!ABICallsArg ? 0 : 1);
257 if (ABICallsArg && !UseAbiCalls && IsPIC) {
258 D.
Diag(diag::err_drv_unsupported_noabicalls_pic);
262 Features.push_back(
"+noabicalls");
264 Features.push_back(
"-noabicalls");
266 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
267 options::OPT_mno_long_calls)) {
268 if (A->getOption().matches(options::OPT_mno_long_calls))
269 Features.push_back(
"-long-calls");
270 else if (!UseAbiCalls)
271 Features.push_back(
"+long-calls");
273 D.
Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1);
276 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
277 if (A->getOption().matches(options::OPT_mxgot))
278 Features.push_back(
"+xgot");
280 Features.push_back(
"-xgot");
288 Features.push_back(
"+soft-float");
291 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
292 StringRef Val = StringRef(A->getValue());
295 Features.push_back(
"+nan2008");
297 Features.push_back(
"-nan2008");
298 D.
Diag(diag::warn_target_unsupported_nan2008) << CPUName;
300 }
else if (Val ==
"legacy") {
302 Features.push_back(
"-nan2008");
304 Features.push_back(
"+nan2008");
305 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
308 D.
Diag(diag::err_drv_unsupported_option_argument)
309 << A->getOption().getName() << Val;
312 if (Arg *A = Args.getLastArg(options::OPT_mabs_EQ)) {
313 StringRef Val = StringRef(A->getValue());
316 Features.push_back(
"+abs2008");
318 Features.push_back(
"-abs2008");
319 D.
Diag(diag::warn_target_unsupported_abs2008) << CPUName;
321 }
else if (Val ==
"legacy") {
323 Features.push_back(
"-abs2008");
325 Features.push_back(
"+abs2008");
326 D.
Diag(diag::warn_target_unsupported_abslegacy) << CPUName;
329 D.
Diag(diag::err_drv_unsupported_option_argument)
330 << A->getOption().getName() << Val;
335 options::OPT_mdouble_float,
"single-float");
336 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
339 options::OPT_mno_micromips,
"micromips");
342 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
350 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
351 options::OPT_mfp64)) {
352 if (A->getOption().matches(options::OPT_mfp32))
353 Features.push_back(
"-fp64");
354 else if (A->getOption().matches(options::OPT_mfpxx)) {
355 Features.push_back(
"+fpxx");
356 Features.push_back(
"+nooddspreg");
358 Features.push_back(
"+fp64");
360 Features.push_back(
"+fpxx");
361 Features.push_back(
"+nooddspreg");
363 Features.push_back(
"+fp64");
364 Features.push_back(
"+nooddspreg");
368 options::OPT_modd_spreg,
"nooddspreg");
369 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
371 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
379 if (Arg *A = Args.getLastArg(options::OPT_mindirect_jump_EQ)) {
380 StringRef Val = StringRef(A->getValue());
381 if (Val ==
"hazard") {
383 Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
384 Arg *C = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
386 if (B && B->getOption().matches(options::OPT_mmicromips))
387 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
388 <<
"hazard" <<
"micromips";
389 else if (C && C->getOption().matches(options::OPT_mips16))
390 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
391 <<
"hazard" <<
"mips16";
393 Features.push_back(
"+use-indirect-jump-hazard");
395 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
396 <<
"hazard" << CPUName;
398 D.
Diag(diag::err_drv_unknown_indirect_jump_opt) << Val;
428 return llvm::StringSwitch<bool>(CPU)
429 .Case(
"mips32r6",
true)
430 .Case(
"mips64r6",
true)
435 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
436 return A && (A->getValue() == StringRef(Value));
440 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
441 return A && A->getOption().matches(options::OPT_muclibc);
444 bool mips::isNaN2008(
const ArgList &Args,
const llvm::Triple &Triple) {
445 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
446 return llvm::StringSwitch<bool>(NaNArg->getValue())
448 .Case(
"legacy",
false)
452 return llvm::StringSwitch<bool>(
getCPUName(Args, Triple))
453 .Cases(
"mips32r6",
"mips64r6",
true)
460 if (!Triple.isAndroid())
464 return llvm::StringSwitch<bool>(CPUName)
465 .Case(
"mips32r6",
true)
471 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
472 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
484 return llvm::StringSwitch<bool>(CPUName)
485 .Cases(
"mips2",
"mips3",
"mips4",
"mips5",
true)
486 .Cases(
"mips32",
"mips32r2",
"mips32r3",
"mips32r5",
true)
487 .Cases(
"mips64",
"mips64r2",
"mips64r3",
"mips64r5",
true)
492 StringRef CPUName, StringRef ABIName,
494 bool UseFPXX =
isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
497 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
498 options::OPT_mdouble_float))
499 if (A->getOption().matches(options::OPT_msingle_float))
508 return llvm::StringSwitch<bool>(CPU)
509 .Case(
"mips32r2",
true)
510 .Case(
"mips32r3",
true)
511 .Case(
"mips32r5",
true)
512 .Case(
"mips32r6",
true)
513 .Case(
"mips64r2",
true)
514 .Case(
"mips64r3",
true)
515 .Case(
"mips64r5",
true)
516 .Case(
"mips64r6",
true)
517 .Case(
"octeon",
true)
DiagnosticBuilder Diag(unsigned DiagID) const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Dataflow Directional Tag Classes.