14#include "llvm/ADT/StringSwitch.h"
15#include "llvm/Option/ArgList.h"
16#include "llvm/TargetParser/Host.h"
29 else if (
T.getArch() == llvm::Triple::ppc64le)
31 else if (
T.getArch() == llvm::Triple::ppc64)
43 if (CPUName ==
"generic" || CPUName ==
"405")
46 if (CPUName ==
"native") {
47 std::string CPU = std::string(llvm::sys::getHostCPUName());
48 if (!CPU.empty() && CPU !=
"generic")
54 return llvm::StringSwitch<const char *>(CPUName)
55 .Case(
"common",
"generic")
63 .Case(
"power3",
"pwr3")
64 .Case(
"power4",
"pwr4")
65 .Case(
"power5",
"pwr5")
66 .Case(
"power5x",
"pwr5x")
67 .Case(
"power6",
"pwr6")
68 .Case(
"power6x",
"pwr6x")
69 .Case(
"power7",
"pwr7")
70 .Case(
"power8",
"pwr8")
71 .Case(
"power9",
"pwr9")
72 .Case(
"power10",
"pwr10")
73 .Case(
"future",
"future")
74 .Case(
"powerpc",
"ppc")
75 .Case(
"powerpc64",
"ppc64")
76 .Case(
"powerpc64le",
"ppc64le")
77 .Default(CPUName.data());
82 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ))
89 const llvm::Triple &
T) {
90 if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
96 return llvm::StringSwitch<const char *>(Name)
97 .Case(
"pwr7",
"-mpower7")
98 .Case(
"power7",
"-mpower7")
99 .Case(
"pwr8",
"-mpower8")
100 .Case(
"power8",
"-mpower8")
101 .Case(
"ppc64le",
"-mpower8")
102 .Case(
"pwr9",
"-mpower9")
103 .Case(
"power9",
"-mpower9")
104 .Case(
"pwr10",
"-mpower10")
105 .Case(
"power10",
"-mpower10")
111 std::vector<StringRef> &Features) {
112 if (Triple.getSubArch() == llvm::Triple::PPCSubArch_spe)
113 Features.push_back(
"+spe");
116 options::OPT_m_ppc_Features_Group);
119 if (FloatABI == ppc::FloatABI::Soft)
120 Features.push_back(
"-hard-float");
123 if (ReadGOT == ppc::ReadGOTPtrMode::SecurePlt)
124 Features.push_back(
"+secure-plt");
127 bool HasDefaultDataSections = Triple.isOSBinFormatXCOFF();
128 if (Args.hasArg(options::OPT_maix_small_local_exec_tls) ||
129 Args.hasArg(options::OPT_maix_small_local_dynamic_tls)) {
130 if (!Triple.isOSAIX() || !Triple.isArch64Bit())
131 D.
Diag(diag::err_opt_not_valid_on_target)
132 <<
"-maix-small-local-[exec|dynamic]-tls";
139 if (!Args.hasFlag(options::OPT_fdata_sections,
140 options::OPT_fno_data_sections,
141 UseSeparateSections || HasDefaultDataSections))
142 D.
Diag(diag::err_drv_argument_only_allowed_with)
143 <<
"-maix-small-local-[exec|dynamic]-tls" <<
"-fdata-sections";
148 const ArgList &Args) {
149 if (Args.getLastArg(options::OPT_msecure_plt))
150 return ppc::ReadGOTPtrMode::SecurePlt;
151 if (Triple.isPPC32SecurePlt())
152 return ppc::ReadGOTPtrMode::SecurePlt;
154 return ppc::ReadGOTPtrMode::Bss;
160 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
161 options::OPT_mfloat_abi_EQ)) {
162 if (A->getOption().matches(options::OPT_msoft_float))
163 ABI = ppc::FloatABI::Soft;
164 else if (A->getOption().matches(options::OPT_mhard_float))
165 ABI = ppc::FloatABI::Hard;
167 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
168 .Case(
"soft", ppc::FloatABI::Soft)
169 .Case(
"hard", ppc::FloatABI::Hard)
170 .Default(ppc::FloatABI::Invalid);
171 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
172 D.
Diag(clang::diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
173 ABI = ppc::FloatABI::Hard;
179 if (ABI == ppc::FloatABI::Invalid) {
180 ABI = ppc::FloatABI::Hard;
187 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
188 return A && (A->getValue() == StringRef(
Value));
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticBuilder Diag(unsigned DiagID) const
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T