18#include "llvm/ADT/StringSwitch.h"
24#define BUILTIN(ID, TYPE, ATTRS) \
25 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
26#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
27 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::HEADER, ALL_LANGUAGES},
28#include "clang/Basic/BuiltinsMips.def"
32 return llvm::StringSwitch<bool>(CPU)
37 .Case(
"mips64r2",
true)
38 .Case(
"mips64r3",
true)
39 .Case(
"mips64r5",
true)
40 .Case(
"mips64r6",
true)
42 .Case(
"octeon+",
true)
47 {
"mips1"}, {
"mips2"}, {
"mips3"}, {
"mips4"}, {
"mips5"},
48 {
"mips32"}, {
"mips32r2"}, {
"mips32r3"}, {
"mips32r5"}, {
"mips32r6"},
49 {
"mips64"}, {
"mips64r2"}, {
"mips64r3"}, {
"mips64r5"}, {
"mips64r6"},
50 {
"octeon"}, {
"octeon+"}, {
"p5600"}};
62 return llvm::StringSwitch<unsigned>(
getCPU())
63 .Cases(
"mips32",
"mips64", 1)
64 .Cases(
"mips32r2",
"mips64r2",
"octeon",
"octeon+", 2)
65 .Cases(
"mips32r3",
"mips64r3", 3)
66 .Cases(
"mips32r5",
"mips64r5", 5)
67 .Cases(
"mips32r6",
"mips64r6", 6)
75 Builder.defineMacro(
"_MIPSEB");
78 Builder.defineMacro(
"_MIPSEL");
81 Builder.defineMacro(
"__mips__");
82 Builder.defineMacro(
"_mips");
84 Builder.defineMacro(
"mips");
87 Builder.defineMacro(
"__mips",
"32");
88 Builder.defineMacro(
"_MIPS_ISA",
"_MIPS_ISA_MIPS32");
90 Builder.defineMacro(
"__mips",
"64");
91 Builder.defineMacro(
"__mips64");
92 Builder.defineMacro(
"__mips64__");
93 Builder.defineMacro(
"_MIPS_ISA",
"_MIPS_ISA_MIPS64");
96 const std::string ISARev = std::to_string(
getISARev());
99 Builder.defineMacro(
"__mips_isa_rev", ISARev);
102 Builder.defineMacro(
"__mips_o32");
103 Builder.defineMacro(
"_ABIO32",
"1");
104 Builder.defineMacro(
"_MIPS_SIM",
"_ABIO32");
105 }
else if (
ABI ==
"n32") {
106 Builder.defineMacro(
"__mips_n32");
107 Builder.defineMacro(
"_ABIN32",
"2");
108 Builder.defineMacro(
"_MIPS_SIM",
"_ABIN32");
109 }
else if (
ABI ==
"n64") {
110 Builder.defineMacro(
"__mips_n64");
111 Builder.defineMacro(
"_ABI64",
"3");
112 Builder.defineMacro(
"_MIPS_SIM",
"_ABI64");
114 llvm_unreachable(
"Invalid ABI.");
117 Builder.defineMacro(
"__mips_abicalls");
118 if (CanUseBSDABICalls)
119 Builder.defineMacro(
"__ABICALLS__");
122 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
126 Builder.defineMacro(
"__mips_hard_float", Twine(1));
129 Builder.defineMacro(
"__mips_soft_float", Twine(1));
134 Builder.defineMacro(
"__mips_single_float", Twine(1));
138 Builder.defineMacro(
"__mips_fpr", Twine(0));
141 Builder.defineMacro(
"__mips_fpr", Twine(32));
144 Builder.defineMacro(
"__mips_fpr", Twine(64));
149 Builder.defineMacro(
"_MIPS_FPSET", Twine(32));
151 Builder.defineMacro(
"_MIPS_FPSET", Twine(16));
154 Builder.defineMacro(
"__mips16", Twine(1));
157 Builder.defineMacro(
"__mips_micromips", Twine(1));
160 Builder.defineMacro(
"__mips_nan2008", Twine(1));
163 Builder.defineMacro(
"__mips_abs2008", Twine(1));
169 Builder.defineMacro(
"__mips_dsp_rev", Twine(1));
170 Builder.defineMacro(
"__mips_dsp", Twine(1));
173 Builder.defineMacro(
"__mips_dsp_rev", Twine(2));
174 Builder.defineMacro(
"__mips_dspr2", Twine(1));
175 Builder.defineMacro(
"__mips_dsp", Twine(1));
180 Builder.defineMacro(
"__mips_msa", Twine(1));
183 Builder.defineMacro(
"__mips_no_madd4", Twine(1));
186 Builder.defineMacro(
"_MIPS_SZINT", Twine(
getIntWidth()));
187 Builder.defineMacro(
"_MIPS_SZLONG", Twine(
getLongWidth()));
189 Builder.defineMacro(
"_MIPS_ARCH",
"\"" + CPU +
"\"");
190 if (CPU ==
"octeon+")
191 Builder.defineMacro(
"_MIPS_ARCH_OCTEONP");
193 Builder.defineMacro(
"_MIPS_ARCH_" + StringRef(CPU).upper());
195 if (StringRef(CPU).startswith(
"octeon"))
196 Builder.defineMacro(
"__OCTEON__");
198 if (CPU !=
"mips1") {
199 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
200 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
201 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
208 if (
ABI ==
"n32" ||
ABI ==
"n64")
209 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
213 return llvm::StringSwitch<bool>(Feature)
215 .Case(
"dsp", DspRev >= DSP1)
216 .Case(
"dspr2", DspRev >= DSP2)
228 return llvm::StringSwitch<unsigned>(
ABI)
237 if (
getTriple().isMIPS64() && IsMicromips && (
ABI ==
"n32" ||
ABI ==
"n64")) {
238 Diags.
Report(diag::err_target_unsupported_cpu_for_micromips) << CPU;
244 Diags.
Report(diag::err_target_unsupported_abi) <<
ABI << CPU;
250 Diags.
Report(diag::err_unsupported_abi_for_opt) <<
"-mfpxx" <<
"o32";
256 (
ABI ==
"n32" ||
ABI ==
"n64")) {
257 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfpxx" << CPU;
262 CPU ==
"mips64r6")) {
263 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfp32" << CPU;
267 if (
FPMode ==
FP64 && (CPU ==
"mips1" || CPU ==
"mips2" ||
269 Diags.
Report(diag::err_mips_fp64_req) <<
"-mfp64";
static constexpr llvm::StringLiteral ValidCPUNames[]
Defines the Diagnostic-related interfaces.
static constexpr Builtin::Info BuiltinInfo[]
static constexpr Builtin::Info BuiltinInfo[]
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.
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,...
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
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
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
bool isValidCPUName(StringRef Name) const override
brief 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.
bool validateTarget(DiagnosticsEngine &Diags) const override
Check the target is valid after it is fully initialized.
const std::string & getCPU() const
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.