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) {
221 bool IsN64 = ABIName ==
"64";
224 bool HasNaN2008Opt =
false;
226 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
227 options::OPT_fpic, options::OPT_fno_pic,
228 options::OPT_fPIE, options::OPT_fno_PIE,
229 options::OPT_fpie, options::OPT_fno_pie);
231 Option O = LastPICArg->getOption();
233 (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) ||
234 O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
236 (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
237 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie));
240 bool UseAbiCalls =
false;
243 Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
245 !ABICallsArg || ABICallsArg->getOption().matches(options::OPT_mabicalls);
247 if (IsN64 && NonPIC && (!ABICallsArg || UseAbiCalls)) {
248 D.
Diag(diag::warn_drv_unsupported_pic_with_mabicalls)
249 << LastPICArg->getAsString(Args) << (!ABICallsArg ? 0 : 1);
252 if (ABICallsArg && !UseAbiCalls && IsPIC) {
253 D.
Diag(diag::err_drv_unsupported_noabicalls_pic);
256 if (CPUName ==
"i6500" || CPUName ==
"i6400") {
259 Features.push_back(
"+msa");
263 Features.push_back(
"+noabicalls");
265 Features.push_back(
"-noabicalls");
267 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
268 options::OPT_mno_long_calls)) {
269 if (A->getOption().matches(options::OPT_mno_long_calls))
270 Features.push_back(
"-long-calls");
271 else if (!UseAbiCalls)
272 Features.push_back(
"+long-calls");
274 D.
Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1);
277 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
278 if (A->getOption().matches(options::OPT_mxgot))
279 Features.push_back(
"+xgot");
281 Features.push_back(
"-xgot");
289 Features.push_back(
"+soft-float");
292 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
293 StringRef Val = StringRef(A->getValue());
296 Features.push_back(
"+nan2008");
297 HasNaN2008Opt =
true;
299 Features.push_back(
"-nan2008");
300 D.
Diag(diag::warn_target_unsupported_nan2008) << CPUName;
302 }
else if (Val ==
"legacy") {
304 Features.push_back(
"-nan2008");
306 Features.push_back(
"+nan2008");
307 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
310 D.
Diag(diag::err_drv_unsupported_option_argument)
311 << A->getSpelling() << Val;
314 if (Arg *A = Args.getLastArg(options::OPT_mabs_EQ)) {
315 StringRef Val = StringRef(A->getValue());
318 Features.push_back(
"+abs2008");
320 Features.push_back(
"-abs2008");
321 D.
Diag(diag::warn_target_unsupported_abs2008) << CPUName;
323 }
else if (Val ==
"legacy") {
325 Features.push_back(
"-abs2008");
327 Features.push_back(
"+abs2008");
328 D.
Diag(diag::warn_target_unsupported_abslegacy) << CPUName;
331 D.
Diag(diag::err_drv_unsupported_option_argument)
332 << A->getSpelling() << Val;
334 }
else if (HasNaN2008Opt) {
335 Features.push_back(
"+abs2008");
339 options::OPT_mdouble_float,
"single-float");
340 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
343 options::OPT_mno_micromips,
"micromips");
346 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
350 if (Arg *A = Args.getLastArg(
351 options::OPT_mstrict_align, options::OPT_mno_strict_align,
352 options::OPT_mno_unaligned_access, options::OPT_munaligned_access)) {
353 if (A->getOption().matches(options::OPT_mstrict_align) ||
354 A->getOption().matches(options::OPT_mno_unaligned_access))
355 Features.push_back(Args.MakeArgString(
"+strict-align"));
357 Features.push_back(Args.MakeArgString(
"-strict-align"));
363 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
364 options::OPT_mfp64)) {
365 if (A->getOption().matches(options::OPT_mfp32))
366 Features.push_back(
"-fp64");
367 else if (A->getOption().matches(options::OPT_mfpxx)) {
368 Features.push_back(
"+fpxx");
369 Features.push_back(
"+nooddspreg");
371 Features.push_back(
"+fp64");
373 Features.push_back(
"+fpxx");
374 Features.push_back(
"+nooddspreg");
375 }
else if (Arg *A = Args.getLastArg(options::OPT_mmsa)) {
376 if (A->getOption().matches(options::OPT_mmsa))
377 Features.push_back(
"+fp64");
381 options::OPT_modd_spreg,
"nooddspreg");
382 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
384 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
392 if (Arg *A = Args.getLastArg(options::OPT_mindirect_jump_EQ)) {
393 StringRef Val = StringRef(A->getValue());
394 if (Val ==
"hazard") {
396 Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
397 Arg *
C = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
399 if (B && B->getOption().matches(options::OPT_mmicromips))
400 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
401 <<
"hazard" <<
"micromips";
402 else if (
C &&
C->getOption().matches(options::OPT_mips16))
403 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
404 <<
"hazard" <<
"mips16";
406 Features.push_back(
"+use-indirect-jump-hazard");
408 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
409 <<
"hazard" << CPUName;
411 D.
Diag(diag::err_drv_unknown_indirect_jump_opt) << Val;
441 return llvm::StringSwitch<bool>(CPU)
442 .Case(
"mips32r6",
true)
443 .Case(
"mips64r6",
true)
450 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
451 return A && (A->getValue() == StringRef(
Value));
455 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
456 return A && A->getOption().matches(options::OPT_muclibc);
460 const llvm::Triple &Triple) {
461 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
462 return llvm::StringSwitch<bool>(NaNArg->getValue())
464 .Case(
"legacy",
false)
468 return llvm::StringSwitch<bool>(
getCPUName(D, Args, Triple))
469 .Cases({
"mips32r6",
"mips64r6"},
true)
483 return llvm::StringSwitch<bool>(CPUName)
484 .Cases({
"mips2",
"mips3",
"mips4",
"mips5"},
true)
485 .Cases({
"mips32",
"mips32r2",
"mips32r3",
"mips32r5"},
true)
486 .Cases({
"mips64",
"mips64r2",
"mips64r3",
"mips64r5"},
true)
491 StringRef CPUName, StringRef ABIName,
493 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
496 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
497 options::OPT_mdouble_float))
498 if (A->getOption().matches(options::OPT_msingle_float))
501 if (Arg *A = Args.getLastArg(options::OPT_mmsa))
502 if (A->getOption().matches(options::OPT_mmsa))
503 UseFPXX = llvm::StringSwitch<bool>(CPUName)
504 .Cases({
"mips32r2",
"mips32r3",
"mips32r5"},
false)
505 .Cases({
"mips64r2",
"mips64r3",
"mips64r5"},
false)
514 return llvm::StringSwitch<bool>(CPU)
515 .Case(
"mips32r2",
true)
516 .Case(
"mips32r3",
true)
517 .Case(
"mips32r5",
true)
518 .Case(
"mips32r6",
true)
519 .Case(
"mips64r2",
true)
520 .Case(
"mips64r3",
true)
521 .Case(
"mips64r5",
true)
522 .Case(
"mips64r6",
true)
523 .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.