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)
55 {
"mips1"}, {
"mips2"}, {
"mips3"}, {
"mips4"}, {
"mips5"},
56 {
"mips32"}, {
"mips32r2"}, {
"mips32r3"}, {
"mips32r5"}, {
"mips32r6"},
57 {
"mips64"}, {
"mips64r2"}, {
"mips64r3"}, {
"mips64r5"}, {
"mips64r6"},
58 {
"octeon"}, {
"octeon+"}, {
"p5600"}, {
"i6400"}, {
"i6500"}};
70 return llvm::StringSwitch<unsigned>(
getCPU())
71 .Cases(
"mips32",
"mips64", 1)
72 .Cases(
"mips32r2",
"mips64r2",
"octeon",
"octeon+", 2)
73 .Cases(
"mips32r3",
"mips64r3", 3)
74 .Cases(
"mips32r5",
"mips64r5",
"p5600", 5)
75 .Cases(
"mips32r6",
"mips64r6", 6)
83 Builder.defineMacro(
"_MIPSEB");
86 Builder.defineMacro(
"_MIPSEL");
89 Builder.defineMacro(
"__mips__");
90 Builder.defineMacro(
"_mips");
92 Builder.defineMacro(
"mips");
95 Builder.defineMacro(
"__mips",
"32");
96 Builder.defineMacro(
"_MIPS_ISA",
"_MIPS_ISA_MIPS32");
98 Builder.defineMacro(
"__mips",
"64");
99 Builder.defineMacro(
"__mips64");
100 Builder.defineMacro(
"__mips64__");
101 Builder.defineMacro(
"_MIPS_ISA",
"_MIPS_ISA_MIPS64");
104 const std::string ISARev = std::to_string(
getISARev());
107 Builder.defineMacro(
"__mips_isa_rev", ISARev);
110 Builder.defineMacro(
"__mips_o32");
111 Builder.defineMacro(
"_ABIO32",
"1");
112 Builder.defineMacro(
"_MIPS_SIM",
"_ABIO32");
113 }
else if (
ABI ==
"n32") {
114 Builder.defineMacro(
"__mips_n32");
115 Builder.defineMacro(
"_ABIN32",
"2");
116 Builder.defineMacro(
"_MIPS_SIM",
"_ABIN32");
117 }
else if (
ABI ==
"n64") {
118 Builder.defineMacro(
"__mips_n64");
119 Builder.defineMacro(
"_ABI64",
"3");
120 Builder.defineMacro(
"_MIPS_SIM",
"_ABI64");
122 llvm_unreachable(
"Invalid ABI.");
125 Builder.defineMacro(
"__mips_abicalls");
126 if (CanUseBSDABICalls)
127 Builder.defineMacro(
"__ABICALLS__");
130 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
134 Builder.defineMacro(
"__mips_hard_float", Twine(1));
137 Builder.defineMacro(
"__mips_soft_float", Twine(1));
142 Builder.defineMacro(
"__mips_single_float", Twine(1));
146 Builder.defineMacro(
"__mips_fpr", Twine(0));
149 Builder.defineMacro(
"__mips_fpr", Twine(32));
152 Builder.defineMacro(
"__mips_fpr", Twine(64));
157 Builder.defineMacro(
"_MIPS_FPSET", Twine(32));
159 Builder.defineMacro(
"_MIPS_FPSET", Twine(16));
161 Builder.defineMacro(
"_MIPS_SPFPSET", Twine(16));
163 Builder.defineMacro(
"_MIPS_SPFPSET", Twine(32));
166 Builder.defineMacro(
"__mips16", Twine(1));
169 Builder.defineMacro(
"__mips_micromips", Twine(1));
172 Builder.defineMacro(
"__mips_nan2008", Twine(1));
175 Builder.defineMacro(
"__mips_abs2008", Twine(1));
181 Builder.defineMacro(
"__mips_dsp_rev", Twine(1));
182 Builder.defineMacro(
"__mips_dsp", Twine(1));
185 Builder.defineMacro(
"__mips_dsp_rev", Twine(2));
186 Builder.defineMacro(
"__mips_dspr2", Twine(1));
187 Builder.defineMacro(
"__mips_dsp", Twine(1));
192 Builder.defineMacro(
"__mips_msa", Twine(1));
195 Builder.defineMacro(
"__mips_no_madd4", Twine(1));
198 Builder.defineMacro(
"_MIPS_SZINT", Twine(
getIntWidth()));
199 Builder.defineMacro(
"_MIPS_SZLONG", Twine(
getLongWidth()));
201 Builder.defineMacro(
"_MIPS_ARCH",
"\"" + CPU +
"\"");
202 if (CPU ==
"octeon+")
203 Builder.defineMacro(
"_MIPS_ARCH_OCTEONP");
205 Builder.defineMacro(
"_MIPS_ARCH_" + StringRef(CPU).upper());
207 if (StringRef(CPU).starts_with(
"octeon"))
208 Builder.defineMacro(
"__OCTEON__");
210 if (CPU !=
"mips1") {
211 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
212 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
213 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
220 if (
ABI ==
"n32" ||
ABI ==
"n64")
221 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
225 return llvm::StringSwitch<bool>(
Feature)
227 .Case(
"dsp", DspRev >= DSP1)
228 .Case(
"dspr2", DspRev >= DSP2)
240 return llvm::StringSwitch<unsigned>(
ABI)
249 if (
getTriple().isMIPS64() && IsMicromips && (
ABI ==
"n32" ||
ABI ==
"n64")) {
250 Diags.
Report(diag::err_target_unsupported_cpu_for_micromips) << CPU;
256 Diags.
Report(diag::err_target_unsupported_abi) <<
ABI << CPU;
262 Diags.
Report(diag::err_unsupported_abi_for_opt) <<
"-mfpxx" <<
"o32";
268 (
ABI ==
"n32" ||
ABI ==
"n64")) {
269 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfpxx" << CPU;
274 CPU ==
"mips64r6")) {
275 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfp32" << CPU;
279 if (
FPMode ==
FP64 && (CPU ==
"mips1" || CPU ==
"mips2" ||
281 Diags.
Report(diag::err_mips_fp64_req) <<
"-mfp64";
286 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfpxx" << CPU;
290 if (FloatABI == SoftFloat && HasMSA) {
291 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-msoft-float"
296 if (HasMSA && (CPU ==
"mips1" || CPU ==
"mips2" ||
getISARev() < 2) &&
298 Diags.
Report(diag::err_mips_fp64_req) <<
"-mmsa";
303 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfpxx"
308 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfp32"
322 Builder.defineMacro(
"_M_MRX000",
"4000");
366 TheCXXABI.set(TargetCXXABI::GenericMIPS);
372 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.