14 #include "llvm/ADT/StringSwitch.h"
15 #include "llvm/Option/ArgList.h"
16 #include "llvm/Support/Host.h"
20 using namespace clang;
29 else if (T.getArch() == llvm::Triple::ppc64le)
31 else if (T.getArch() == llvm::Triple::ppc64)
39 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) {
40 StringRef CPUName = A->getValue();
47 if (CPUName ==
"generic" || CPUName ==
"405")
50 if (CPUName ==
"native") {
52 if (!CPU.empty() && CPU !=
"generic")
58 return llvm::StringSwitch<const char *>(CPUName)
59 .Case(
"common",
"generic")
67 .Case(
"power3",
"pwr3")
68 .Case(
"power4",
"pwr4")
69 .Case(
"power5",
"pwr5")
70 .Case(
"power5x",
"pwr5x")
71 .Case(
"power6",
"pwr6")
72 .Case(
"power6x",
"pwr6x")
73 .Case(
"power7",
"pwr7")
74 .Case(
"power8",
"pwr8")
75 .Case(
"power9",
"pwr9")
76 .Case(
"power10",
"pwr10")
77 .Case(
"future",
"future")
78 .Case(
"powerpc",
"ppc")
79 .Case(
"powerpc64",
"ppc64")
80 .Case(
"powerpc64le",
"ppc64le")
81 .Default(CPUName.data());
88 return llvm::StringSwitch<const char *>(Name)
89 .Case(
"pwr7",
"-mpower7")
90 .Case(
"power7",
"-mpower7")
91 .Case(
"pwr8",
"-mpower8")
92 .Case(
"power8",
"-mpower8")
93 .Case(
"ppc64le",
"-mpower8")
94 .Case(
"pwr9",
"-mpower9")
95 .Case(
"power9",
"-mpower9")
96 .Case(
"pwr10",
"-mpower10")
97 .Case(
"power10",
"-mpower10")
103 std::vector<StringRef> &Features) {
104 if (Triple.getSubArch() == llvm::Triple::PPCSubArch_spe)
105 Features.push_back(
"+spe");
111 Features.push_back(
"-hard-float");
115 Features.push_back(
"+secure-plt");
119 const ArgList &Args) {
120 if (Args.getLastArg(options::OPT_msecure_plt))
122 if ((Triple.isOSFreeBSD() && Triple.getOSMajorVersion() >= 13) ||
123 Triple.isOSNetBSD() || Triple.isOSOpenBSD() || Triple.isMusl())
132 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
133 options::OPT_mfloat_abi_EQ)) {
134 if (A->getOption().matches(options::OPT_msoft_float))
136 else if (A->getOption().matches(options::OPT_mhard_float))
139 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
144 D.
Diag(clang::diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
159 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
160 return A && (A->getValue() == StringRef(
Value));