19 using namespace clang;
23 #define BUILTIN(ID, TYPE, ATTRS) \ 24 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 25 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 26 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, 27 #include "clang/Basic/BuiltinsPPC.def" 34 for (
const auto &Feature : Features) {
35 if (Feature ==
"+altivec") {
37 }
else if (Feature ==
"+vsx") {
39 }
else if (Feature ==
"+bpermd") {
41 }
else if (Feature ==
"+extdiv") {
43 }
else if (Feature ==
"+power8-vector") {
45 }
else if (Feature ==
"+crypto") {
47 }
else if (Feature ==
"+direct-move") {
49 }
else if (Feature ==
"+qpx") {
51 }
else if (Feature ==
"+htm") {
53 }
else if (Feature ==
"+float128") {
55 }
else if (Feature ==
"+power9-vector") {
83 if (
getTriple().getArch() == llvm::Triple::ppc64le) {
86 if (
getTriple().getOS() != llvm::Triple::NetBSD &&
87 getTriple().getOS() != llvm::Triple::OpenBSD)
92 if (
ABI ==
"elfv1" ||
ABI ==
"elfv1-qpx")
114 if (
ABI ==
"elfv2" ||
116 Builder.
defineMacro(
"__STRUCT_PARM_ALIGN__",
"16");
118 if (ArchDefs & ArchDefineName)
119 Builder.
defineMacro(Twine(
"_ARCH_", StringRef(CPU).upper()));
120 if (ArchDefs & ArchDefinePpcgr)
122 if (ArchDefs & ArchDefinePpcsq)
124 if (ArchDefs & ArchDefine440)
126 if (ArchDefs & ArchDefine603)
128 if (ArchDefs & ArchDefine604)
130 if (ArchDefs & ArchDefinePwr4)
132 if (ArchDefs & ArchDefinePwr5)
134 if (ArchDefs & ArchDefinePwr5x)
136 if (ArchDefs & ArchDefinePwr6)
138 if (ArchDefs & ArchDefinePwr6x)
140 if (ArchDefs & ArchDefinePwr7)
142 if (ArchDefs & ArchDefinePwr8)
144 if (ArchDefs & ArchDefinePwr9)
146 if (ArchDefs & ArchDefineA2)
148 if (ArchDefs & ArchDefineA2q) {
153 if (
getTriple().getVendor() == llvm::Triple::BGQ) {
177 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
178 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
179 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
181 Builder.
defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
214 const std::vector<std::string> &FeaturesVec) {
216 if (std::find(FeaturesVec.begin(), FeaturesVec.end(),
"-vsx") !=
218 if (std::find(FeaturesVec.begin(), FeaturesVec.end(),
"+power8-vector") !=
220 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mpower8-vector" 225 if (std::find(FeaturesVec.begin(), FeaturesVec.end(),
"+direct-move") !=
227 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mdirect-move" 232 if (std::find(FeaturesVec.begin(), FeaturesVec.end(),
"+float128") !=
234 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfloat128" 239 if (std::find(FeaturesVec.begin(), FeaturesVec.end(),
"+power9-vector") !=
241 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mpower9-vector" 252 const std::vector<std::string> &FeaturesVec)
const {
253 Features[
"altivec"] = llvm::StringSwitch<bool>(CPU)
265 .Case(
"ppc64le",
true)
268 Features[
"qpx"] = (CPU ==
"a2q");
269 Features[
"power9-vector"] = (CPU ==
"pwr9");
270 Features[
"crypto"] = llvm::StringSwitch<bool>(CPU)
271 .Case(
"ppc64le",
true)
275 Features[
"power8-vector"] = llvm::StringSwitch<bool>(CPU)
276 .Case(
"ppc64le",
true)
280 Features[
"bpermd"] = llvm::StringSwitch<bool>(CPU)
281 .Case(
"ppc64le",
true)
286 Features[
"extdiv"] = llvm::StringSwitch<bool>(CPU)
287 .Case(
"ppc64le",
true)
292 Features[
"direct-move"] = llvm::StringSwitch<bool>(CPU)
293 .Case(
"ppc64le",
true)
297 Features[
"vsx"] = llvm::StringSwitch<bool>(CPU)
298 .Case(
"ppc64le",
true)
303 Features[
"htm"] = llvm::StringSwitch<bool>(CPU)
304 .Case(
"ppc64le",
true)
312 if (!(ArchDefs & ArchDefinePwr9) && (ArchDefs & ArchDefinePpcgr) &&
313 std::find(FeaturesVec.begin(), FeaturesVec.end(),
"+float128") !=
316 Diags.
Report(diag::err_opt_not_valid_with_opt) <<
"-mfloat128" << CPU;
324 return llvm::StringSwitch<bool>(Feature)
325 .Case(
"powerpc",
true)
326 .Case(
"altivec", HasAltivec)
328 .Case(
"power8-vector", HasP8Vector)
329 .Case(
"crypto", HasP8Crypto)
330 .Case(
"direct-move", HasDirectMove)
333 .Case(
"bpermd", HasBPERMD)
334 .Case(
"extdiv", HasExtDiv)
336 .Case(
"power9-vector", HasP9Vector)
341 StringRef Name,
bool Enabled)
const {
345 bool FeatureHasVSX = llvm::StringSwitch<bool>(Name)
347 .Case(
"direct-move",
true)
348 .Case(
"power8-vector",
true)
349 .Case(
"power9-vector",
true)
350 .Case(
"float128",
true)
353 Features[
"vsx"] = Features[
"altivec"] =
true;
354 if (Name ==
"power9-vector")
355 Features[
"power8-vector"] =
true;
356 Features[Name] =
true;
360 if ((Name ==
"altivec") || (Name ==
"vsx"))
361 Features[
"vsx"] = Features[
"direct-move"] = Features[
"power8-vector"] =
362 Features[
"float128"] = Features[
"power9-vector"] =
false;
363 if (Name ==
"power8-vector")
364 Features[
"power9-vector"] =
false;
365 Features[Name] =
false;
369 const char *
const PPCTargetInfo::GCCRegNames[] = {
370 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
371 "r9",
"r10",
"r11",
"r12",
"r13",
"r14",
"r15",
"r16",
"r17",
372 "r18",
"r19",
"r20",
"r21",
"r22",
"r23",
"r24",
"r25",
"r26",
373 "r27",
"r28",
"r29",
"r30",
"r31",
"f0",
"f1",
"f2",
"f3",
374 "f4",
"f5",
"f6",
"f7",
"f8",
"f9",
"f10",
"f11",
"f12",
375 "f13",
"f14",
"f15",
"f16",
"f17",
"f18",
"f19",
"f20",
"f21",
376 "f22",
"f23",
"f24",
"f25",
"f26",
"f27",
"f28",
"f29",
"f30",
377 "f31",
"mq",
"lr",
"ctr",
"ap",
"cr0",
"cr1",
"cr2",
"cr3",
378 "cr4",
"cr5",
"cr6",
"cr7",
"xer",
"v0",
"v1",
"v2",
"v3",
379 "v4",
"v5",
"v6",
"v7",
"v8",
"v9",
"v10",
"v11",
"v12",
380 "v13",
"v14",
"v15",
"v16",
"v17",
"v18",
"v19",
"v20",
"v21",
381 "v22",
"v23",
"v24",
"v25",
"v26",
"v27",
"v28",
"v29",
"v30",
382 "v31",
"vrsave",
"vscr",
"spe_acc",
"spefscr",
"sfp" 386 return llvm::makeArrayRef(GCCRegNames);
392 {{
"0"},
"r0"}, {{
"1"},
"r1"}, {{
"2"},
"r2"}, {{
"3"},
"r3"},
393 {{
"4"},
"r4"}, {{
"5"},
"r5"}, {{
"6"},
"r6"}, {{
"7"},
"r7"},
394 {{
"8"},
"r8"}, {{
"9"},
"r9"}, {{
"10"},
"r10"}, {{
"11"},
"r11"},
395 {{
"12"},
"r12"}, {{
"13"},
"r13"}, {{
"14"},
"r14"}, {{
"15"},
"r15"},
396 {{
"16"},
"r16"}, {{
"17"},
"r17"}, {{
"18"},
"r18"}, {{
"19"},
"r19"},
397 {{
"20"},
"r20"}, {{
"21"},
"r21"}, {{
"22"},
"r22"}, {{
"23"},
"r23"},
398 {{
"24"},
"r24"}, {{
"25"},
"r25"}, {{
"26"},
"r26"}, {{
"27"},
"r27"},
399 {{
"28"},
"r28"}, {{
"29"},
"r29"}, {{
"30"},
"r30"}, {{
"31"},
"r31"},
400 {{
"fr0"},
"f0"}, {{
"fr1"},
"f1"}, {{
"fr2"},
"f2"}, {{
"fr3"},
"f3"},
401 {{
"fr4"},
"f4"}, {{
"fr5"},
"f5"}, {{
"fr6"},
"f6"}, {{
"fr7"},
"f7"},
402 {{
"fr8"},
"f8"}, {{
"fr9"},
"f9"}, {{
"fr10"},
"f10"}, {{
"fr11"},
"f11"},
403 {{
"fr12"},
"f12"}, {{
"fr13"},
"f13"}, {{
"fr14"},
"f14"}, {{
"fr15"},
"f15"},
404 {{
"fr16"},
"f16"}, {{
"fr17"},
"f17"}, {{
"fr18"},
"f18"}, {{
"fr19"},
"f19"},
405 {{
"fr20"},
"f20"}, {{
"fr21"},
"f21"}, {{
"fr22"},
"f22"}, {{
"fr23"},
"f23"},
406 {{
"fr24"},
"f24"}, {{
"fr25"},
"f25"}, {{
"fr26"},
"f26"}, {{
"fr27"},
"f27"},
407 {{
"fr28"},
"f28"}, {{
"fr29"},
"f29"}, {{
"fr30"},
"f30"}, {{
"fr31"},
"f31"},
412 return llvm::makeArrayRef(GCCRegAliases);
416 {
"generic"}, {
"440"}, {
"450"}, {
"601"}, {
"602"},
417 {
"603"}, {
"603e"}, {
"603ev"}, {
"604"}, {
"604e"},
418 {
"620"}, {
"630"}, {
"g3"}, {
"7400"}, {
"g4"},
419 {
"7450"}, {
"g4+"}, {
"750"}, {
"970"}, {
"g5"},
420 {
"a2"}, {
"a2q"}, {
"e500mc"}, {
"e5500"}, {
"power3"},
421 {
"pwr3"}, {
"power4"}, {
"pwr4"}, {
"power5"}, {
"pwr5"},
422 {
"power5x"}, {
"pwr5x"}, {
"power6"}, {
"pwr6"}, {
"power6x"},
423 {
"pwr6x"}, {
"power7"}, {
"pwr7"}, {
"power8"}, {
"pwr8"},
424 {
"power9"}, {
"pwr9"}, {
"powerpc"}, {
"ppc"}, {
"powerpc64"},
425 {
"ppc64"}, {
"powerpc64le"}, {
"ppc64le"},
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
Defines the clang::MacroBuilder utility class.
virtual void adjust(LangOptions &Opts)
Set forced language options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
void setFeatureEnabled(llvm::StringMap< bool > &Features, StringRef Name, bool Enabled) const override
Enable or disable a specific target feature; the feature name must be valid.
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
unsigned char LongDoubleWidth
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
unsigned char PointerWidth
Concrete class used by the front-end to report problems and issues.
Defines the Diagnostic-related interfaces.
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
ArrayRef< const char * > getGCCRegNames() const override
Enumerates target-specific builtins in their own namespaces within namespace clang.
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
handleTargetFeatures - Perform initialization based on the user configured set of features...
bool isValidCPUName(StringRef Name) const override
brief Determine whether this TargetInfo supports the given CPU name.
Dataflow Directional Tag Classes.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific #defines that are not tied to ...
void adjust(LangOptions &Opts) override
Set forced language options.
static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags, const std::vector< std::string > &FeaturesVec)
void defineMacro(const Twine &Name, const Twine &Value="1")
Append a #define line for macro of the form "\#define Name Value\n".
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
static constexpr llvm::StringLiteral ValidCPUNames[]