15#include "llvm/TargetParser/Host.h"
16#include "llvm/TargetParser/LoongArchTargetParser.h"
24 const llvm::Triple &Triple) {
25 assert((Triple.getArch() == llvm::Triple::loongarch32 ||
26 Triple.getArch() == llvm::Triple::loongarch64) &&
28 bool IsLA32 = Triple.getArch() == llvm::Triple::loongarch32;
31 const Arg *MABIArg = Args.getLastArg(options::OPT_mabi_EQ);
34 MABIValue = MABIArg->getValue();
38 const Arg *MFPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
41 StringRef
V = MFPUArg->getValue();
46 else if (
V ==
"0" ||
V ==
"none")
49 D.
Diag(diag::err_drv_loongarch_invalid_mfpu_EQ) <<
V;
53 if (
const Arg *A = Args.getLastArg(options::OPT_mdouble_float,
54 options::OPT_msingle_float,
55 options::OPT_msoft_float)) {
58 if (A->getOption().matches(options::OPT_mdouble_float)) {
59 ImpliedABI = IsLA32 ?
"ilp32d" :
"lp64d";
62 if (A->getOption().matches(options::OPT_msingle_float)) {
63 ImpliedABI = IsLA32 ?
"ilp32f" :
"lp64f";
66 if (A->getOption().matches(options::OPT_msoft_float)) {
67 ImpliedABI = IsLA32 ?
"ilp32s" :
"lp64s";
76 if (!MABIValue.empty() && ImpliedABI != MABIValue)
77 D.
Diag(diag::warn_drv_loongarch_conflicting_implied_val)
78 << MABIArg->getAsString(Args) << A->getAsString(Args) << ImpliedABI;
80 if (FPU != -1 && ImpliedFPU != FPU)
81 D.
Diag(diag::warn_drv_loongarch_conflicting_implied_val)
82 << MFPUArg->getAsString(Args) << A->getAsString(Args) << ImpliedFPU;
88 if (!MABIValue.empty())
94 return IsLA32 ?
"ilp32d" :
"lp64d";
96 return IsLA32 ?
"ilp32f" :
"lp64f";
98 return IsLA32 ?
"ilp32s" :
"lp64s";
104 switch (Triple.getEnvironment()) {
105 case llvm::Triple::GNUSF:
106 return IsLA32 ?
"ilp32s" :
"lp64s";
107 case llvm::Triple::GNUF32:
108 return IsLA32 ?
"ilp32f" :
"lp64f";
109 case llvm::Triple::GNUF64:
120 case llvm::Triple::GNU:
122 return IsLA32 ?
"ilp32d" :
"lp64d";
127 const llvm::Triple &Triple,
129 std::vector<StringRef> &Features) {
130 std::string ArchName;
131 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
132 ArchName = A->getValue();
134 llvm::LoongArch::getArchFeatures(ArchName, Features);
139 if (
const Arg *A = Args.getLastArg(options::OPT_mdouble_float,
140 options::OPT_msingle_float,
141 options::OPT_msoft_float)) {
142 if (A->getOption().matches(options::OPT_mdouble_float)) {
143 Features.push_back(
"+f");
144 Features.push_back(
"+d");
145 }
else if (A->getOption().matches(options::OPT_msingle_float)) {
146 Features.push_back(
"+f");
147 Features.push_back(
"-d");
149 Features.push_back(
"-f");
150 Features.push_back(
"-d");
152 }
else if (
const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) {
153 StringRef FPU = A->getValue();
155 Features.push_back(
"+f");
156 Features.push_back(
"+d");
157 }
else if (FPU ==
"32") {
158 Features.push_back(
"+f");
159 Features.push_back(
"-d");
160 }
else if (FPU ==
"0" || FPU ==
"none") {
161 Features.push_back(
"-f");
162 Features.push_back(
"-d");
164 D.
Diag(diag::err_drv_loongarch_invalid_mfpu_EQ) << FPU;
170 options::OPT_mstrict_align,
"ual");
173 if (Arg *A = Args.getLastArgNoClaim(options::OPT_mabi_EQ))
174 A->ignoreTargetSpecific();
175 if (Arg *A = Args.getLastArgNoClaim(options::OPT_mfpu_EQ))
176 A->ignoreTargetSpecific();
179 if (
const Arg *A = Args.getLastArg(options::OPT_mlsx, options::OPT_mno_lsx)) {
182 if (A->getOption().matches(options::OPT_mlsx)) {
183 if (llvm::find(Features,
"-d") != Features.end())
184 D.
Diag(diag::err_drv_loongarch_wrong_fpu_width_for_lsx);
186 Features.push_back(
"+lsx");
188 Features.push_back(
"-lsx");
194 Args.getLastArg(options::OPT_mlasx, options::OPT_mno_lasx)) {
197 if (A->getOption().matches(options::OPT_mlasx)) {
198 if (llvm::find(Features,
"-d") != Features.end())
199 D.
Diag(diag::err_drv_loongarch_wrong_fpu_width_for_lasx);
200 else if (llvm::find(Features,
"-lsx") != Features.end())
201 D.
Diag(diag::err_drv_loongarch_invalid_simd_option_combination);
203 Features.push_back(
"+lsx");
204 Features.push_back(
"+lasx");
207 Features.push_back(
"-lasx");
212 const llvm::Triple &Triple) {
213 std::string CPUString = CPU;
214 if (CPUString ==
"native") {
215 CPUString = llvm::sys::getHostCPUName();
216 if (CPUString ==
"generic")
217 CPUString = llvm::LoongArch::getDefaultArch(Triple.isLoongArch64());
219 if (CPUString.empty())
220 CPUString = llvm::LoongArch::getDefaultArch(Triple.isLoongArch64());
225 const llvm::Triple &Triple) {
228 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
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.