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";
38 if (Triple.getSubArch() == llvm::Triple::MipsSubArch_r6) {
39 DefMips32CPU =
"mips32r6";
40 DefMips64CPU =
"mips64r6";
44 if (Triple.isAndroid()) {
45 DefMips32CPU =
"mips32";
46 DefMips64CPU =
"mips64r6";
50 if (Triple.isOSOpenBSD())
51 DefMips64CPU =
"mips3";
55 if (Triple.isOSFreeBSD()) {
56 DefMips32CPU =
"mips2";
57 DefMips64CPU =
"mips3";
60 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ,
61 options::OPT_mcpu_EQ))
62 CPUName = A->getValue();
64 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
65 ABIName = A->getValue();
68 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
75 if (CPUName.empty() && ABIName.empty()) {
76 switch (Triple.getArch()) {
78 llvm_unreachable(
"Unexpected triple arch name");
79 case llvm::Triple::mips:
80 case llvm::Triple::mipsel:
81 CPUName = DefMips32CPU;
83 case llvm::Triple::mips64:
84 case llvm::Triple::mips64el:
85 CPUName = DefMips64CPU;
90 if (ABIName.empty() && (Triple.getEnvironment() == llvm::Triple::GNUABIN32))
93 if (ABIName.empty() &&
94 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
95 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
96 ABIName = llvm::StringSwitch<const char *>(CPUName)
100 .Case(
"mips4",
"n64")
101 .Case(
"mips5",
"n64")
102 .Case(
"mips32",
"o32")
103 .Case(
"mips32r2",
"o32")
104 .Case(
"mips32r3",
"o32")
105 .Case(
"mips32r5",
"o32")
106 .Case(
"mips32r6",
"o32")
107 .Case(
"mips64",
"n64")
108 .Case(
"mips64r2",
"n64")
109 .Case(
"mips64r3",
"n64")
110 .Case(
"mips64r5",
"n64")
111 .Case(
"mips64r6",
"n64")
112 .Case(
"octeon",
"n64")
113 .Case(
"p5600",
"o32")
117 if (ABIName.empty()) {
119 ABIName = Triple.isMIPS32() ?
"o32" :
"n64";
122 if (CPUName.empty()) {
124 CPUName = llvm::StringSwitch<const char *>(ABIName)
125 .Case(
"o32", DefMips32CPU)
126 .Cases(
"n32",
"n64", DefMips64CPU)
134 const llvm::Triple &Triple) {
135 StringRef CPUName, ABIName;
137 return llvm::StringSwitch<std::string>(ABIName)
145 return llvm::StringSwitch<llvm::StringRef>(ABI)
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);
188 std::vector<StringRef> &Features) {
222 bool IsN64 = ABIName ==
"64";
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);
253 if (ABICallsArg && !UseAbiCalls && IsPIC) {
254 D.
Diag(diag::err_drv_unsupported_noabicalls_pic);
258 Features.push_back(
"+noabicalls");
260 Features.push_back(
"-noabicalls");
262 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
263 options::OPT_mno_long_calls)) {
264 if (A->getOption().matches(options::OPT_mno_long_calls))
265 Features.push_back(
"-long-calls");
266 else if (!UseAbiCalls)
267 Features.push_back(
"+long-calls");
269 D.
Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1);
277 Features.push_back(
"+soft-float");
280 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
281 StringRef Val = StringRef(A->getValue());
284 Features.push_back(
"+nan2008");
286 Features.push_back(
"-nan2008");
287 D.
Diag(diag::warn_target_unsupported_nan2008) << CPUName;
289 }
else if (Val ==
"legacy") {
291 Features.push_back(
"-nan2008");
293 Features.push_back(
"+nan2008");
294 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
297 D.
Diag(diag::err_drv_unsupported_option_argument)
298 << A->getOption().getName() << Val;
301 if (Arg *A = Args.getLastArg(options::OPT_mabs_EQ)) {
302 StringRef Val = StringRef(A->getValue());
305 Features.push_back(
"+abs2008");
307 Features.push_back(
"-abs2008");
308 D.
Diag(diag::warn_target_unsupported_abs2008) << CPUName;
310 }
else if (Val ==
"legacy") {
312 Features.push_back(
"-abs2008");
314 Features.push_back(
"+abs2008");
315 D.
Diag(diag::warn_target_unsupported_abslegacy) << CPUName;
318 D.
Diag(diag::err_drv_unsupported_option_argument)
319 << A->getOption().getName() << Val;
324 options::OPT_mdouble_float,
"single-float");
325 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
328 options::OPT_mno_micromips,
"micromips");
331 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
339 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
340 options::OPT_mfp64)) {
341 if (A->getOption().matches(options::OPT_mfp32))
342 Features.push_back(
"-fp64");
343 else if (A->getOption().matches(options::OPT_mfpxx)) {
344 Features.push_back(
"+fpxx");
345 Features.push_back(
"+nooddspreg");
347 Features.push_back(
"+fp64");
349 Features.push_back(
"+fpxx");
350 Features.push_back(
"+nooddspreg");
352 Features.push_back(
"+fp64");
353 Features.push_back(
"+nooddspreg");
357 options::OPT_modd_spreg,
"nooddspreg");
358 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
360 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
368 if (Arg *A = Args.getLastArg(options::OPT_mindirect_jump_EQ)) {
369 StringRef Val = StringRef(A->getValue());
370 if (Val ==
"hazard") {
372 Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
373 Arg *C = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
375 if (B && B->getOption().matches(options::OPT_mmicromips))
376 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
377 <<
"hazard" <<
"micromips";
378 else if (C && C->getOption().matches(options::OPT_mips16))
379 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
380 <<
"hazard" <<
"mips16";
382 Features.push_back(
"+use-indirect-jump-hazard");
384 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
385 <<
"hazard" << CPUName;
387 D.
Diag(diag::err_drv_unknown_indirect_jump_opt) << Val;
417 return llvm::StringSwitch<bool>(CPU)
418 .Case(
"mips32r6",
true)
419 .Case(
"mips64r6",
true)
424 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
425 return A && (A->getValue() == StringRef(Value));
429 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
430 return A && A->getOption().matches(options::OPT_muclibc);
433 bool mips::isNaN2008(
const ArgList &Args,
const llvm::Triple &Triple) {
434 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
435 return llvm::StringSwitch<bool>(NaNArg->getValue())
437 .Case(
"legacy",
false)
441 return llvm::StringSwitch<bool>(
getCPUName(Args, Triple))
442 .Cases(
"mips32r6",
"mips64r6",
true)
449 if (!Triple.isAndroid())
453 return llvm::StringSwitch<bool>(CPUName)
454 .Case(
"mips32r6",
true)
460 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
461 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
473 return llvm::StringSwitch<bool>(CPUName)
474 .Cases(
"mips2",
"mips3",
"mips4",
"mips5",
true)
475 .Cases(
"mips32",
"mips32r2",
"mips32r3",
"mips32r5",
true)
476 .Cases(
"mips64",
"mips64r2",
"mips64r3",
"mips64r5",
true)
481 StringRef CPUName, StringRef ABIName,
483 bool UseFPXX =
isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
486 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
487 options::OPT_mdouble_float))
488 if (A->getOption().matches(options::OPT_msingle_float))
497 return llvm::StringSwitch<bool>(CPU)
498 .Case(
"mips32r2",
true)
499 .Case(
"mips32r3",
true)
500 .Case(
"mips32r5",
true)
501 .Case(
"mips32r6",
true)
502 .Case(
"mips64r2",
true)
503 .Case(
"mips64r3",
true)
504 .Case(
"mips64r5",
true)
505 .Case(
"mips64r6",
true)
506 .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.