14 #include "llvm/ADT/StringSwitch.h" 15 #include "llvm/Option/ArgList.h" 19 using namespace clang;
25 StringRef &CPUName, StringRef &ABIName) {
26 const char *DefMips32CPU =
"mips32r2";
27 const char *DefMips64CPU =
"mips64r2";
31 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
32 Triple.isGNUEnvironment()) {
33 DefMips32CPU =
"mips32r6";
34 DefMips64CPU =
"mips64r6";
37 if (Triple.getSubArch() == llvm::Triple::MipsSubArch_r6) {
38 DefMips32CPU =
"mips32r6";
39 DefMips64CPU =
"mips64r6";
43 if (Triple.isAndroid()) {
44 DefMips32CPU =
"mips32";
45 DefMips64CPU =
"mips64r6";
49 if (Triple.isOSOpenBSD())
50 DefMips64CPU =
"mips3";
54 if (Triple.isOSFreeBSD()) {
55 DefMips32CPU =
"mips2";
56 DefMips64CPU =
"mips3";
59 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ,
60 options::OPT_mcpu_EQ))
61 CPUName = A->getValue();
63 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
64 ABIName = A->getValue();
67 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
74 if (CPUName.empty() && ABIName.empty()) {
75 switch (Triple.getArch()) {
77 llvm_unreachable(
"Unexpected triple arch name");
78 case llvm::Triple::mips:
79 case llvm::Triple::mipsel:
80 CPUName = DefMips32CPU;
82 case llvm::Triple::mips64:
83 case llvm::Triple::mips64el:
84 CPUName = DefMips64CPU;
89 if (ABIName.empty() && (Triple.getEnvironment() == llvm::Triple::GNUABIN32))
92 if (ABIName.empty() &&
93 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
94 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
95 ABIName = llvm::StringSwitch<const char *>(CPUName)
100 .Case(
"mips5",
"n64")
101 .Case(
"mips32",
"o32")
102 .Case(
"mips32r2",
"o32")
103 .Case(
"mips32r3",
"o32")
104 .Case(
"mips32r5",
"o32")
105 .Case(
"mips32r6",
"o32")
106 .Case(
"mips64",
"n64")
107 .Case(
"mips64r2",
"n64")
108 .Case(
"mips64r3",
"n64")
109 .Case(
"mips64r5",
"n64")
110 .Case(
"mips64r6",
"n64")
111 .Case(
"octeon",
"n64")
112 .Case(
"p5600",
"o32")
116 if (ABIName.empty()) {
118 ABIName = Triple.isMIPS32() ?
"o32" :
"n64";
121 if (CPUName.empty()) {
123 CPUName = llvm::StringSwitch<const char *>(ABIName)
124 .Case(
"o32", DefMips32CPU)
125 .Cases(
"n32",
"n64", DefMips64CPU)
133 const llvm::Triple &Triple) {
134 StringRef CPUName, ABIName;
136 return llvm::StringSwitch<std::string>(ABIName)
144 return llvm::StringSwitch<llvm::StringRef>(ABI)
155 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
156 options::OPT_mfloat_abi_EQ)) {
157 if (A->getOption().matches(options::OPT_msoft_float))
159 else if (A->getOption().matches(options::OPT_mhard_float))
162 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
167 D.
Diag(clang::diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
187 std::vector<StringRef> &Features) {
221 bool IsN64 = ABIName ==
"64";
225 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
226 options::OPT_fpic, options::OPT_fno_pic,
227 options::OPT_fPIE, options::OPT_fno_PIE,
228 options::OPT_fpie, options::OPT_fno_pie);
230 Option O = LastPICArg->getOption();
232 (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) ||
233 O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
235 (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
236 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie));
239 bool UseAbiCalls =
false;
242 Args.getLastArg(options::OPT_mabicalls, options::OPT_mno_abicalls);
244 !ABICallsArg || ABICallsArg->getOption().matches(options::OPT_mabicalls);
246 if (IsN64 && NonPIC && (!ABICallsArg || UseAbiCalls)) {
247 D.
Diag(diag::warn_drv_unsupported_pic_with_mabicalls)
248 << LastPICArg->getAsString(Args) << (!ABICallsArg ? 0 : 1);
251 if (ABICallsArg && !UseAbiCalls && IsPIC) {
252 D.
Diag(diag::err_drv_unsupported_noabicalls_pic);
256 Features.push_back(
"+noabicalls");
258 Features.push_back(
"-noabicalls");
260 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
261 options::OPT_mno_long_calls)) {
262 if (A->getOption().matches(options::OPT_mno_long_calls))
263 Features.push_back(
"-long-calls");
264 else if (!UseAbiCalls)
265 Features.push_back(
"+long-calls");
267 D.
Diag(diag::warn_drv_unsupported_longcalls) << (ABICallsArg ? 0 : 1);
275 Features.push_back(
"+soft-float");
278 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
279 StringRef Val = StringRef(A->getValue());
282 Features.push_back(
"+nan2008");
284 Features.push_back(
"-nan2008");
285 D.
Diag(diag::warn_target_unsupported_nan2008) << CPUName;
287 }
else if (Val ==
"legacy") {
289 Features.push_back(
"-nan2008");
291 Features.push_back(
"+nan2008");
292 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
295 D.
Diag(diag::err_drv_unsupported_option_argument)
296 << A->getOption().getName() << Val;
299 if (Arg *A = Args.getLastArg(options::OPT_mabs_EQ)) {
300 StringRef Val = StringRef(A->getValue());
303 Features.push_back(
"+abs2008");
305 Features.push_back(
"-abs2008");
306 D.
Diag(diag::warn_target_unsupported_abs2008) << CPUName;
308 }
else if (Val ==
"legacy") {
310 Features.push_back(
"-abs2008");
312 Features.push_back(
"+abs2008");
313 D.
Diag(diag::warn_target_unsupported_abslegacy) << CPUName;
316 D.
Diag(diag::err_drv_unsupported_option_argument)
317 << A->getOption().getName() << Val;
322 options::OPT_mdouble_float,
"single-float");
323 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
326 options::OPT_mno_micromips,
"micromips");
329 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
337 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
338 options::OPT_mfp64)) {
339 if (A->getOption().matches(options::OPT_mfp32))
340 Features.push_back(
"-fp64");
341 else if (A->getOption().matches(options::OPT_mfpxx)) {
342 Features.push_back(
"+fpxx");
343 Features.push_back(
"+nooddspreg");
345 Features.push_back(
"+fp64");
347 Features.push_back(
"+fpxx");
348 Features.push_back(
"+nooddspreg");
350 Features.push_back(
"+fp64");
351 Features.push_back(
"+nooddspreg");
355 options::OPT_modd_spreg,
"nooddspreg");
356 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
358 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
366 if (Arg *A = Args.getLastArg(options::OPT_mindirect_jump_EQ)) {
367 StringRef Val = StringRef(A->getValue());
368 if (Val ==
"hazard") {
370 Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
371 Arg *C = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
373 if (B && B->getOption().matches(options::OPT_mmicromips))
374 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
375 <<
"hazard" <<
"micromips";
376 else if (C && C->getOption().matches(options::OPT_mips16))
377 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
378 <<
"hazard" <<
"mips16";
380 Features.push_back(
"+use-indirect-jump-hazard");
382 D.
Diag(diag::err_drv_unsupported_indirect_jump_opt)
383 <<
"hazard" << CPUName;
385 D.
Diag(diag::err_drv_unknown_indirect_jump_opt) << Val;
415 return llvm::StringSwitch<bool>(CPU)
416 .Case(
"mips32r6",
true)
417 .Case(
"mips64r6",
true)
422 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
423 return A && (A->getValue() == StringRef(Value));
427 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
428 return A && A->getOption().matches(options::OPT_muclibc);
431 bool mips::isNaN2008(
const ArgList &Args,
const llvm::Triple &Triple) {
432 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
433 return llvm::StringSwitch<bool>(NaNArg->getValue())
435 .Case(
"legacy",
false)
439 return llvm::StringSwitch<bool>(
getCPUName(Args, Triple))
440 .Cases(
"mips32r6",
"mips64r6",
true)
447 if (!Triple.isAndroid())
451 return llvm::StringSwitch<bool>(CPUName)
452 .Case(
"mips32r6",
true)
458 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
459 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
471 return llvm::StringSwitch<bool>(CPUName)
472 .Cases(
"mips2",
"mips3",
"mips4",
"mips5",
true)
473 .Cases(
"mips32",
"mips32r2",
"mips32r3",
"mips32r5",
true)
474 .Cases(
"mips64",
"mips64r2",
"mips64r3",
"mips64r5",
true)
479 StringRef CPUName, StringRef ABIName,
481 bool UseFPXX =
isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
484 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
485 options::OPT_mdouble_float))
486 if (A->getOption().matches(options::OPT_msingle_float))
495 return llvm::StringSwitch<bool>(CPU)
496 .Case(
"mips32r2",
true)
497 .Case(
"mips32r3",
true)
498 .Case(
"mips32r5",
true)
499 .Case(
"mips32r6",
true)
500 .Case(
"mips64r2",
true)
501 .Case(
"mips64r3",
true)
502 .Case(
"mips64r5",
true)
503 .Case(
"mips64r6",
true)
504 .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.