15 #include "llvm/ADT/StringSwitch.h"
16 #include "llvm/Option/ArgList.h"
18 using namespace clang::driver;
19 using namespace clang::driver::tools;
20 using namespace clang;
21 using namespace llvm::opt;
24 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
25 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
31 StringRef &CPUName, StringRef &ABIName) {
32 const char *DefMips32CPU =
"mips32r2";
33 const char *DefMips64CPU =
"mips64r2";
37 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
38 Triple.getEnvironment() == llvm::Triple::GNU) {
39 DefMips32CPU =
"mips32r6";
40 DefMips64CPU =
"mips64r6";
44 if (Triple.isAndroid()) {
45 DefMips32CPU =
"mips32";
46 DefMips64CPU =
"mips64r6";
50 if (Triple.getOS() == llvm::Triple::OpenBSD)
51 DefMips64CPU =
"mips3";
53 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ,
54 options::OPT_mcpu_EQ))
55 CPUName = A->getValue();
57 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
58 ABIName = A->getValue();
61 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
68 if (CPUName.empty() && ABIName.empty()) {
69 switch (Triple.getArch()) {
71 llvm_unreachable(
"Unexpected triple arch name");
72 case llvm::Triple::mips:
73 case llvm::Triple::mipsel:
74 CPUName = DefMips32CPU;
76 case llvm::Triple::mips64:
77 case llvm::Triple::mips64el:
78 CPUName = DefMips64CPU;
83 if (ABIName.empty() &&
84 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
85 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
86 ABIName = llvm::StringSwitch<const char *>(CPUName)
92 .Case(
"mips32",
"o32")
93 .Case(
"mips32r2",
"o32")
94 .Case(
"mips32r3",
"o32")
95 .Case(
"mips32r5",
"o32")
96 .Case(
"mips32r6",
"o32")
97 .Case(
"mips64",
"n64")
98 .Case(
"mips64r2",
"n64")
99 .Case(
"mips64r3",
"n64")
100 .Case(
"mips64r5",
"n64")
101 .Case(
"mips64r6",
"n64")
102 .Case(
"octeon",
"n64")
103 .Case(
"p5600",
"o32")
107 if (ABIName.empty()) {
109 if (Triple.getArch() == llvm::Triple::mips ||
110 Triple.getArch() == llvm::Triple::mipsel)
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)
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);
182 std::vector<StringRef> &Features) {
216 bool IsN64 = ABIName ==
"64";
219 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
220 options::OPT_fpic, options::OPT_fno_pic,
221 options::OPT_fPIE, options::OPT_fno_PIE,
222 options::OPT_fpie, options::OPT_fno_pie);
224 Option O = LastPICArg->getOption();
226 (O.matches(options::OPT_fno_PIC) || O.matches(options::OPT_fno_pic) ||
227 O.matches(options::OPT_fno_PIE) || O.matches(options::OPT_fno_pie));
231 Features.push_back(
"+noabicalls");
234 options::OPT_mabicalls,
"noabicalls");
241 Features.push_back(
"+soft-float");
244 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
245 StringRef Val = StringRef(A->getValue());
248 Features.push_back(
"+nan2008");
250 Features.push_back(
"-nan2008");
251 D.
Diag(diag::warn_target_unsupported_nan2008) << CPUName;
253 }
else if (Val ==
"legacy") {
255 Features.push_back(
"-nan2008");
257 Features.push_back(
"+nan2008");
258 D.
Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
261 D.
Diag(diag::err_drv_unsupported_option_argument)
262 << A->getOption().getName() << Val;
266 options::OPT_mdouble_float,
"single-float");
267 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
270 options::OPT_mno_micromips,
"micromips");
273 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
281 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
282 options::OPT_mfp64)) {
283 if (A->getOption().matches(options::OPT_mfp32))
284 Features.push_back(
"-fp64");
285 else if (A->getOption().matches(options::OPT_mfpxx)) {
286 Features.push_back(
"+fpxx");
287 Features.push_back(
"+nooddspreg");
289 Features.push_back(
"+fp64");
291 Features.push_back(
"+fpxx");
292 Features.push_back(
"+nooddspreg");
294 Features.push_back(
"+fp64");
295 Features.push_back(
"+nooddspreg");
299 options::OPT_modd_spreg,
"nooddspreg");
300 AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
303 options::OPT_mno_long_calls,
"long-calls");
304 AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,
"mt");
332 return llvm::StringSwitch<bool>(CPU)
333 .Case(
"mips32r6",
true)
334 .Case(
"mips64r6",
true)
339 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
340 return A && (A->getValue() == StringRef(Value));
344 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
345 return A && A->getOption().matches(options::OPT_muclibc);
348 bool mips::isNaN2008(
const ArgList &Args,
const llvm::Triple &Triple) {
349 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
350 return llvm::StringSwitch<bool>(NaNArg->getValue())
352 .Case(
"legacy",
false)
356 return llvm::StringSwitch<bool>(
getCPUName(Args, Triple))
357 .Cases(
"mips32r6",
"mips64r6",
true)
364 if (!Triple.isAndroid())
368 return llvm::StringSwitch<bool>(CPUName)
369 .Case(
"mips32r6",
true)
375 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
376 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
388 return llvm::StringSwitch<bool>(CPUName)
389 .Cases(
"mips2",
"mips3",
"mips4",
"mips5",
true)
390 .Cases(
"mips32",
"mips32r2",
"mips32r3",
"mips32r5",
true)
391 .Cases(
"mips64",
"mips64r2",
"mips64r3",
"mips64r5",
true)
396 StringRef CPUName, StringRef ABIName,
398 bool UseFPXX =
isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
401 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
402 options::OPT_mdouble_float))
403 if (A->getOption().matches(options::OPT_msingle_float))
DiagnosticBuilder Diag(unsigned DiagID) const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...