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)
451 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
452 return A && (A->getValue() == StringRef(
Value));
456 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
457 return A && A->getOption().matches(options::OPT_muclibc);
461 const llvm::Triple &Triple) {
462 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
463 return llvm::StringSwitch<bool>(NaNArg->getValue())
465 .Case(
"legacy",
false)
469 return llvm::StringSwitch<bool>(
getCPUName(D, Args, Triple))
470 .Cases(
"mips32r6",
"mips64r6",
true)
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))
502 if (Arg *A = Args.getLastArg(options::OPT_mmsa))
503 if (A->getOption().matches(options::OPT_mmsa))
504 UseFPXX = llvm::StringSwitch<bool>(CPUName)
505 .Cases(
"mips32r2",
"mips32r3",
"mips32r5",
false)
506 .Cases(
"mips64r2",
"mips64r3",
"mips64r5",
false)
515 return llvm::StringSwitch<bool>(CPU)
516 .Case(
"mips32r2",
true)
517 .Case(
"mips32r3",
true)
518 .Case(
"mips32r5",
true)
519 .Case(
"mips32r6",
true)
520 .Case(
"mips64r2",
true)
521 .Case(
"mips64r3",
true)
522 .Case(
"mips64r5",
true)
523 .Case(
"mips64r6",
true)
524 .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.