17#include "llvm/ADT/StringSwitch.h"
27#define BUILTIN CLANG_BUILTIN_STR_TABLE
28#include "clang/Basic/BuiltinsMips.def"
32#define BUILTIN CLANG_BUILTIN_ENTRY
33#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
34#include "clang/Basic/BuiltinsMips.def"
38 return llvm::StringSwitch<bool>(CPU)
43 .Case(
"mips64r2",
true)
44 .Case(
"mips64r3",
true)
45 .Case(
"mips64r5",
true)
46 .Case(
"mips64r6",
true)
48 .Case(
"octeon+",
true)
56 {
"mips1"}, {
"mips2"}, {
"mips3"}, {
"mips4"}, {
"mips5"},
57 {
"mips32"}, {
"mips32r2"}, {
"mips32r3"}, {
"mips32r5"}, {
"mips32r6"},
58 {
"mips64"}, {
"mips64r2"}, {
"mips64r3"}, {
"mips64r5"}, {
"mips64r6"},
59 {
"octeon"}, {
"octeon+"}, {
"p5600"}, {
"r5900"}, {
"i6400"},
72 return llvm::StringSwitch<unsigned>(
getCPU())
73 .Cases({
"mips32",
"mips64"}, 1)
74 .Cases({
"mips32r2",
"mips64r2",
"octeon",
"octeon+"}, 2)
75 .Cases({
"mips32r3",
"mips64r3"}, 3)
76 .Cases({
"mips32r5",
"mips64r5",
"p5600"}, 5)
77 .Cases({
"mips32r6",
"mips64r6",
"i6400",
"i6500"}, 6)
85 Builder.defineMacro(
"_MIPSEB");
88 Builder.defineMacro(
"_MIPSEL");
91 Builder.defineMacro(
"__mips__");
92 Builder.defineMacro(
"_mips");
94 Builder.defineMacro(
"mips");
97 Builder.defineMacro(
"__mips",
"32");
98 Builder.defineMacro(
"_MIPS_ISA",
"_MIPS_ISA_MIPS32");
100 Builder.defineMacro(
"__mips",
"64");
101 Builder.defineMacro(
"__mips64");
102 Builder.defineMacro(
"__mips64__");
103 Builder.defineMacro(
"_MIPS_ISA",
"_MIPS_ISA_MIPS64");
106 const std::string ISARev = std::to_string(
getISARev());
109 Builder.defineMacro(
"__mips_isa_rev", ISARev);
112 Builder.defineMacro(
"__mips_o32");
113 Builder.defineMacro(
"_ABIO32",
"1");
114 Builder.defineMacro(
"_MIPS_SIM",
"_ABIO32");
115 }
else if (
ABI ==
"n32") {
116 Builder.defineMacro(
"__mips_n32");
117 Builder.defineMacro(
"_ABIN32",
"2");
118 Builder.defineMacro(
"_MIPS_SIM",
"_ABIN32");
119 }
else if (
ABI ==
"n64") {
120 Builder.defineMacro(
"__mips_n64");
121 Builder.defineMacro(
"_ABI64",
"3");
122 Builder.defineMacro(
"_MIPS_SIM",
"_ABI64");
124 llvm_unreachable(
"Invalid ABI.");
127 Builder.defineMacro(
"__mips_abicalls");
128 if (CanUseBSDABICalls)
129 Builder.defineMacro(
"__ABICALLS__");
132 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
136 Builder.defineMacro(
"__mips_hard_float", Twine(1));
139 Builder.defineMacro(
"__mips_soft_float", Twine(1));
144 Builder.defineMacro(
"__mips_single_float", Twine(1));
148 Builder.defineMacro(
"__mips_fpr", Twine(0));
151 Builder.defineMacro(
"__mips_fpr", Twine(32));
154 Builder.defineMacro(
"__mips_fpr", Twine(64));
159 Builder.defineMacro(
"_MIPS_FPSET", Twine(32));
161 Builder.defineMacro(
"_MIPS_FPSET", Twine(16));
163 Builder.defineMacro(
"_MIPS_SPFPSET", Twine(16));
165 Builder.defineMacro(
"_MIPS_SPFPSET", Twine(32));
168 Builder.defineMacro(
"__mips16", Twine(1));
171 Builder.defineMacro(
"__mips_micromips", Twine(1));
174 Builder.defineMacro(
"__mips_nan2008", Twine(1));
177 Builder.defineMacro(
"__mips_abs2008", Twine(1));
183 Builder.defineMacro(
"__mips_dsp_rev", Twine(1));
184 Builder.defineMacro(
"__mips_dsp", Twine(1));
187 Builder.defineMacro(
"__mips_dsp_rev", Twine(2));
188 Builder.defineMacro(
"__mips_dspr2", Twine(1));
189 Builder.defineMacro(
"__mips_dsp", Twine(1));
194 Builder.defineMacro(
"__mips_msa", Twine(1));
197 Builder.defineMacro(
"__mips_no_madd4", Twine(1));
200 Builder.defineMacro(
"_MIPS_SZINT", Twine(
getIntWidth()));
201 Builder.defineMacro(
"_MIPS_SZLONG", Twine(
getLongWidth()));
203 Builder.defineMacro(
"_MIPS_ARCH",
"\"" + CPU +
"\"");
204 if (CPU ==
"octeon+")
205 Builder.defineMacro(
"_MIPS_ARCH_OCTEONP");
207 Builder.defineMacro(
"_MIPS_ARCH_" + StringRef(CPU).upper());
209 if (StringRef(CPU).starts_with(
"octeon"))
210 Builder.defineMacro(
"__OCTEON__");
212 if (CPU !=
"mips1") {
213 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
214 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
215 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
222 if (
ABI ==
"n32" ||
ABI ==
"n64")
223 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
227 return llvm::StringSwitch<bool>(
Feature)
229 .Case(
"dsp", DspRev >= DSP1)
230 .Case(
"dspr2", DspRev >= DSP2)
242 return llvm::StringSwitch<unsigned>(
ABI)
251 if (
getTriple().isMIPS64() && IsMicromips && (
ABI ==
"n32" ||
ABI ==
"n64")) {
252 Diags.
Report(diag::err_target_unsupported_cpu_for_micromips) << CPU;
258 Diags.
Report(diag::err_target_unsupported_abi) <<
ABI << CPU;
264 Diags.
Report(diag::err_unsupported_abi_for_opt) <<
"-mfpxx" <<
"o32";
270 (
ABI ==
"n32" ||
ABI ==
"n64")) {
271 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfpxx" << CPU;
276 (CPU ==
"mips32r6" || CPU ==
"mips64r6" || CPU ==
"i6400" ||
278 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfp32" << CPU;
282 if (
FPMode ==
FP64 && (CPU ==
"mips1" || CPU ==
"mips2" ||
284 Diags.
Report(diag::err_mips_fp64_req) <<
"-mfp64";
289 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfpxx" << CPU;
293 if (FloatABI == SoftFloat && HasMSA) {
294 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-msoft-float"
299 if (HasMSA && (CPU ==
"mips1" || CPU ==
"mips2" ||
getISARev() < 2) &&
301 Diags.
Report(diag::err_mips_fp64_req) <<
"-mmsa";
306 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfpxx"
311 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfp32"
325 Builder.defineMacro(
"_M_MRX000",
"4000");
369 TheCXXABI.set(TargetCXXABI::GenericMIPS);
375 Builder.defineMacro(
"_MIPS_");
Defines the Diagnostic-related interfaces.
static constexpr llvm::StringTable BuiltinStrings
static constexpr llvm::StringLiteral ValidCPUNames[]
static constexpr Builtin::Info BuiltinInfos[]
static constexpr unsigned NumBuiltins
#define CLANG_BUILTIN_STR_TABLE_START
Defines the clang::MacroBuilder utility class.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
Options for controlling the target.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
MicrosoftMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
MinGWMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
enum clang::targets::MipsTargetInfo::FPModeEnum FPMode
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
bool processorSupportsGPR64() const
unsigned getUnwindWordWidth() const override
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
unsigned getISARev() const
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
bool validateTarget(DiagnosticsEngine &Diags) const override
Check the target is valid after it is fully initialized.
const std::string & getCPU() const
void getVisualStudioDefines(const LangOptions &Opts, MacroBuilder &Builder) const
WindowsMipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
static constexpr std::array< Info, N > MakeInfos(std::array< Info, N > Infos)
A constexpr function to construct an infos array from X-macros.
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
The JSON file list parser is used to communicate input to InstallAPI.
CallingConv
CallingConv - Specifies the calling convention that a function uses.