15 #include "llvm/ADT/StringSwitch.h" 16 #include "llvm/Option/ArgList.h" 20 using namespace clang;
26 StringRef &CPUName, StringRef &ABIName) {
27 const char *DefMips32CPU =
"mips32r2";
28 const char *DefMips64CPU =
"mips64r2";
32 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
33 Triple.isGNUEnvironment()) {
34 DefMips32CPU =
"mips32r6";
35 DefMips64CPU =
"mips64r6";
39 if (Triple.isAndroid()) {
40 DefMips32CPU =
"mips32";
41 DefMips64CPU =
"mips64r6";
45 if (Triple.getOS() == llvm::Triple::OpenBSD)
46 DefMips64CPU =
"mips3";
50 if (Triple.getOS() == llvm::Triple::FreeBSD) {
51 DefMips32CPU =
"mips2";
52 DefMips64CPU =
"mips3";
55 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ,
56 options::OPT_mcpu_EQ))
57 CPUName = A->getValue();
59 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
60 ABIName = A->getValue();
63 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
70 if (CPUName.empty() && ABIName.empty()) {
71 switch (Triple.getArch()) {
73 llvm_unreachable(
"Unexpected triple arch name");
74 case llvm::Triple::mips:
75 case llvm::Triple::mipsel:
76 CPUName = DefMips32CPU;
78 case llvm::Triple::mips64:
79 case llvm::Triple::mips64el:
80 CPUName = DefMips64CPU;
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")
109 if (ABIName.empty()) {
111 ABIName = Triple.isMIPS32() ?
"o32" :
"n64";
114 if (CPUName.empty()) {
116 CPUName = llvm::StringSwitch<const char *>(ABIName)
117 .Case(
"o32", DefMips32CPU)
118 .Cases(
"n32",
"n64", DefMips64CPU)
126 const llvm::Triple &Triple) {
127 StringRef CPUName, ABIName;
129 return llvm::StringSwitch<std::string>(ABIName)
137 return llvm::StringSwitch<llvm::StringRef>(ABI)
148 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
149 options::OPT_mfloat_abi_EQ)) {
150 if (A->getOption().matches(options::OPT_msoft_float))
152 else if (A->getOption().matches(options::OPT_mhard_float))
155 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
160 D.
Diag(clang::diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
180 std::vector<StringRef> &Features) {
214 bool IsN64 = ABIName ==
"64";
218 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
219 options::OPT_fpic, options::OPT_fno_pic,
220 options::OPT_fPIE, options::OPT_fno_PIE,
221 options::OPT_fpie, options::OPT_fno_pie);
223 Option O = LastPICArg->getOption();
225 (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) ||
226 O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
228 (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
229 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie));
232 bool UseAbiCalls =
false;
235 Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
237 !ABICallsArg || ABICallsArg->getOption().matches(options::OPT_mabicalls);
239 if (IsN64 && NonPIC && (!ABICallsArg || UseAbiCalls)) {
240 D.
Diag(diag::warn_drv_unsupported_pic_with_mabicalls)
241 << LastPICArg->getAsString(Args) << (!ABICallsArg ? 0 : 1);
245 if (ABICallsArg && !UseAbiCalls && IsPIC) {
246 D.
Diag(diag::err_drv_unsupported_noabicalls_pic);
250 Features.push_back(
"+noabicalls");
252 Features.push_back(
"-noabicalls");
254 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
255 options::OPT_mno_long_calls)) {
256 if (A->getOption().matches(options::OPT_mno_long_calls))
257 Features.push_back(
"-long-calls");
258 else if (!UseAbiCalls)
259 Features.push_back(
"+long-calls");
261 D.
Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1);
269 Features.push_back(
"+soft-float");
272 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
273 StringRef Val = StringRef(A->getValue());
276 Features.push_back(
"+nan2008");
278 Features.push_back(
"-nan2008");
279 D.
Diag(diag::warn_target_unsupported_nan2008) << CPUName;
281 }
else if (Val ==
"legacy") {
283 Features.push_back(
"-nan2008");
285 Features.push_back(
"+nan2008");
286 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
289 D.
Diag(diag::err_drv_unsupported_option_argument)
290 << A->getOption().getName() << Val;
293 if (Arg *A = Args.getLastArg(options::OPT_mabs_EQ)) {
294 StringRef Val = StringRef(A->getValue());
297 Features.push_back(
"+abs2008");
299 Features.push_back(
"-abs2008");
300 D.
Diag(diag::warn_target_unsupported_abs2008) << CPUName;
302 }
else if (Val ==
"legacy") {
304 Features.push_back(
"-abs2008");
306 Features.push_back(
"+abs2008");
307 D.
Diag(diag::warn_target_unsupported_abslegacy) << CPUName;
310 D.
Diag(diag::err_drv_unsupported_option_argument)
311 << A->getOption().getName() << Val;
316 options::OPT_mdouble_float,
"single-float");
317 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
320 options::OPT_mno_micromips,
"micromips");
323 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
331 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
332 options::OPT_mfp64)) {
333 if (A->getOption().matches(options::OPT_mfp32))
334 Features.push_back(
"-fp64");
335 else if (A->getOption().matches(options::OPT_mfpxx)) {
336 Features.push_back(
"+fpxx");
337 Features.push_back(
"+nooddspreg");
339 Features.push_back(
"+fp64");
341 Features.push_back(
"+fpxx");
342 Features.push_back(
"+nooddspreg");
344 Features.push_back(
"+fp64");
345 Features.push_back(
"+nooddspreg");
349 options::OPT_modd_spreg,
"nooddspreg");
350 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
352 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
360 if (Arg *A = Args.getLastArg(options::OPT_mindirect_jump_EQ)) {
361 StringRef Val = StringRef(A->getValue());
362 if (Val ==
"hazard") {
364 Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
365 Arg *C = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
367 if (B && B->getOption().matches(options::OPT_mmicromips))
368 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
369 <<
"hazard" <<
"micromips";
370 else if (C && C->getOption().matches(options::OPT_mips16))
371 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
372 <<
"hazard" <<
"mips16";
374 Features.push_back(
"+use-indirect-jump-hazard");
376 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
377 <<
"hazard" << CPUName;
379 D.
Diag(diag::err_drv_unknown_indirect_jump_opt) << Val;
409 return llvm::StringSwitch<bool>(CPU)
410 .Case(
"mips32r6",
true)
411 .Case(
"mips64r6",
true)
416 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
417 return A && (A->getValue() == StringRef(Value));
421 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
422 return A && A->getOption().matches(options::OPT_muclibc);
425 bool mips::isNaN2008(
const ArgList &Args,
const llvm::Triple &Triple) {
426 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
427 return llvm::StringSwitch<bool>(NaNArg->getValue())
429 .Case(
"legacy",
false)
433 return llvm::StringSwitch<bool>(
getCPUName(Args, Triple))
434 .Cases(
"mips32r6",
"mips64r6",
true)
441 if (!Triple.isAndroid())
445 return llvm::StringSwitch<bool>(CPUName)
446 .Case(
"mips32r6",
true)
452 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
453 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
465 return llvm::StringSwitch<bool>(CPUName)
466 .Cases(
"mips2",
"mips3",
"mips4",
"mips5",
true)
467 .Cases(
"mips32",
"mips32r2",
"mips32r3",
"mips32r5",
true)
468 .Cases(
"mips64",
"mips64r2",
"mips64r3",
"mips64r5",
true)
473 StringRef CPUName, StringRef ABIName,
475 bool UseFPXX =
isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
478 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
479 options::OPT_mdouble_float))
480 if (A->getOption().matches(options::OPT_msingle_float))
489 return llvm::StringSwitch<bool>(CPU)
490 .Case(
"mips32r2",
true)
491 .Case(
"mips32r3",
true)
492 .Case(
"mips32r5",
true)
493 .Case(
"mips32r6",
true)
494 .Case(
"mips64r2",
true)
495 .Case(
"mips64r3",
true)
496 .Case(
"mips64r5",
true)
497 .Case(
"mips64r6",
true)
498 .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.