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(clang::driver::options::OPT_march_EQ,
53 options::OPT_mcpu_EQ))
54 CPUName = A->getValue();
56 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
57 ABIName = A->getValue();
60 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
67 if (CPUName.empty() && ABIName.empty()) {
68 switch (Triple.getArch()) {
70 llvm_unreachable(
"Unexpected triple arch name");
71 case llvm::Triple::mips:
72 case llvm::Triple::mipsel:
73 CPUName = DefMips32CPU;
75 case llvm::Triple::mips64:
76 case llvm::Triple::mips64el:
77 CPUName = DefMips64CPU;
82 if (ABIName.empty() && Triple.isABIN32())
85 if (ABIName.empty() &&
86 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
87 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
88 ABIName = llvm::StringSwitch<const char *>(CPUName)
94 .Case(
"mips32",
"o32")
95 .Case(
"mips32r2",
"o32")
96 .Case(
"mips32r3",
"o32")
97 .Case(
"mips32r5",
"o32")
98 .Case(
"mips32r6",
"o32")
99 .Case(
"mips64",
"n64")
100 .Case(
"mips64r2",
"n64")
101 .Case(
"mips64r3",
"n64")
102 .Case(
"mips64r5",
"n64")
103 .Case(
"mips64r6",
"n64")
104 .Case(
"octeon",
"n64")
105 .Case(
"p5600",
"o32")
106 .Case(
"i6400",
"n64")
107 .Case(
"i6500",
"n64")
111 if (ABIName.empty()) {
113 ABIName = Triple.isMIPS32() ?
"o32" :
"n64";
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)
148 const llvm::Triple &Triple) {
151 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
152 options::OPT_mfloat_abi_EQ)) {
153 if (A->getOption().matches(options::OPT_msoft_float))
155 else if (A->getOption().matches(options::OPT_mhard_float))
158 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
163 D.
Diag(clang::diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
171 if (Triple.isOSFreeBSD()) {
188 std::vector<StringRef> &Features) {
222 bool IsN64 = ABIName ==
"64";
225 bool HasNaN2008Opt =
false;
227 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
228 options::OPT_fpic, options::OPT_fno_pic,
229 options::OPT_fPIE, options::OPT_fno_PIE,
230 options::OPT_fpie, options::OPT_fno_pie);
232 Option O = LastPICArg->getOption();
234 (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) ||
235 O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
237 (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
238 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie));
241 bool UseAbiCalls =
false;
244 Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
246 !ABICallsArg || ABICallsArg->getOption().matches(options::OPT_mabicalls);
248 if (IsN64 && NonPIC && (!ABICallsArg || UseAbiCalls)) {
249 D.
Diag(diag::warn_drv_unsupported_pic_with_mabicalls)
250 << LastPICArg->getAsString(Args) << (!ABICallsArg ? 0 : 1);
253 if (ABICallsArg && !UseAbiCalls && IsPIC) {
254 D.
Diag(diag::err_drv_unsupported_noabicalls_pic);
257 if (CPUName ==
"i6500" || CPUName ==
"i6400") {
260 Features.push_back(
"+msa");
264 Features.push_back(
"+noabicalls");
266 Features.push_back(
"-noabicalls");
268 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
269 options::OPT_mno_long_calls)) {
270 if (A->getOption().matches(options::OPT_mno_long_calls))
271 Features.push_back(
"-long-calls");
272 else if (!UseAbiCalls)
273 Features.push_back(
"+long-calls");
275 D.
Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1);
278 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
279 if (A->getOption().matches(options::OPT_mxgot))
280 Features.push_back(
"+xgot");
282 Features.push_back(
"-xgot");
290 Features.push_back(
"+soft-float");
293 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
294 StringRef Val = StringRef(A->getValue());
297 Features.push_back(
"+nan2008");
298 HasNaN2008Opt =
true;
300 Features.push_back(
"-nan2008");
301 D.
Diag(diag::warn_target_unsupported_nan2008) << CPUName;
303 }
else if (Val ==
"legacy") {
305 Features.push_back(
"-nan2008");
307 Features.push_back(
"+nan2008");
308 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
311 D.
Diag(diag::err_drv_unsupported_option_argument)
312 << A->getSpelling() << Val;
315 if (Arg *A = Args.getLastArg(options::OPT_mabs_EQ)) {
316 StringRef Val = StringRef(A->getValue());
319 Features.push_back(
"+abs2008");
321 Features.push_back(
"-abs2008");
322 D.
Diag(diag::warn_target_unsupported_abs2008) << CPUName;
324 }
else if (Val ==
"legacy") {
326 Features.push_back(
"-abs2008");
328 Features.push_back(
"+abs2008");
329 D.
Diag(diag::warn_target_unsupported_abslegacy) << CPUName;
332 D.
Diag(diag::err_drv_unsupported_option_argument)
333 << A->getSpelling() << Val;
335 }
else if (HasNaN2008Opt) {
336 Features.push_back(
"+abs2008");
340 options::OPT_mdouble_float,
"single-float");
341 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
344 options::OPT_mno_micromips,
"micromips");
347 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
351 if (Arg *A = Args.getLastArg(
352 options::OPT_mstrict_align, options::OPT_mno_strict_align,
353 options::OPT_mno_unaligned_access, options::OPT_munaligned_access)) {
354 if (A->getOption().matches(options::OPT_mstrict_align) ||
355 A->getOption().matches(options::OPT_mno_unaligned_access))
356 Features.push_back(Args.MakeArgString(
"+strict-align"));
358 Features.push_back(Args.MakeArgString(
"-strict-align"));
364 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
365 options::OPT_mfp64)) {
366 if (A->getOption().matches(options::OPT_mfp32))
367 Features.push_back(
"-fp64");
368 else if (A->getOption().matches(options::OPT_mfpxx)) {
369 Features.push_back(
"+fpxx");
370 Features.push_back(
"+nooddspreg");
372 Features.push_back(
"+fp64");
374 Features.push_back(
"+fpxx");
375 Features.push_back(
"+nooddspreg");
376 }
else if (Arg *A = Args.getLastArg(options::OPT_mmsa)) {
377 if (A->getOption().matches(options::OPT_mmsa))
378 Features.push_back(
"+fp64");
382 options::OPT_modd_spreg,
"nooddspreg");
383 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
385 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
393 if (Arg *A = Args.getLastArg(options::OPT_mindirect_jump_EQ)) {
394 StringRef Val = StringRef(A->getValue());
395 if (Val ==
"hazard") {
397 Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
398 Arg *
C = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
400 if (B && B->getOption().matches(options::OPT_mmicromips))
401 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
402 <<
"hazard" <<
"micromips";
403 else if (
C &&
C->getOption().matches(options::OPT_mips16))
404 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
405 <<
"hazard" <<
"mips16";
407 Features.push_back(
"+use-indirect-jump-hazard");
409 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
410 <<
"hazard" << CPUName;
412 D.
Diag(diag::err_drv_unknown_indirect_jump_opt) << Val;
442 return llvm::StringSwitch<bool>(CPU)
443 .Case(
"mips32r6",
true)
444 .Case(
"mips64r6",
true)
449 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
450 return A && (A->getValue() == StringRef(
Value));
454 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
455 return A && A->getOption().matches(options::OPT_muclibc);
459 const llvm::Triple &Triple) {
460 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
461 return llvm::StringSwitch<bool>(NaNArg->getValue())
463 .Case(
"legacy",
false)
467 return llvm::StringSwitch<bool>(
getCPUName(D, Args, Triple))
468 .Cases(
"mips32r6",
"mips64r6",
true)
482 return llvm::StringSwitch<bool>(CPUName)
483 .Cases(
"mips2",
"mips3",
"mips4",
"mips5",
true)
484 .Cases(
"mips32",
"mips32r2",
"mips32r3",
"mips32r5",
true)
485 .Cases(
"mips64",
"mips64r2",
"mips64r3",
"mips64r5",
true)
490 StringRef CPUName, StringRef ABIName,
492 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
495 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
496 options::OPT_mdouble_float))
497 if (A->getOption().matches(options::OPT_msingle_float))
500 if (Arg *A = Args.getLastArg(options::OPT_mmsa))
501 if (A->getOption().matches(options::OPT_mmsa))
502 UseFPXX = llvm::StringSwitch<bool>(CPUName)
503 .Cases(
"mips32r2",
"mips32r3",
"mips32r5",
false)
504 .Cases(
"mips64r2",
"mips64r3",
"mips64r5",
false)
513 return llvm::StringSwitch<bool>(CPU)
514 .Case(
"mips32r2",
true)
515 .Case(
"mips32r3",
true)
516 .Case(
"mips32r5",
true)
517 .Case(
"mips32r6",
true)
518 .Case(
"mips64r2",
true)
519 .Case(
"mips64r3",
true)
520 .Case(
"mips64r5",
true)
521 .Case(
"mips64r6",
true)
522 .Case(
"octeon",
true)
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.