clang 23.0.0git
PPC.cpp
Go to the documentation of this file.
1//===--- PPC.cpp - Implement PPC target feature support -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements PPC TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#include "PPC.h"
17#include "llvm/TargetParser/PPCTargetParser.h"
18#include <optional>
19
20using namespace clang;
21using namespace clang::targets;
22
23static constexpr int NumBuiltins =
25
26static constexpr llvm::StringTable BuiltinStrings =
28#define BUILTIN CLANG_BUILTIN_STR_TABLE
29#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
30#include "clang/Basic/BuiltinsPPC.def"
31 ;
32
34#define BUILTIN CLANG_BUILTIN_ENTRY
35#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
36#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
37#include "clang/Basic/BuiltinsPPC.def"
38});
39
40/// handleTargetFeatures - Perform initialization based on the user
41/// configured set of features.
42bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
43 DiagnosticsEngine &Diags) {
44 FloatABI = HardFloat;
45 for (const auto &Feature : Features) {
46 if (Feature == "+altivec") {
47 HasAltivec = true;
48 } else if (Feature == "+vsx") {
49 HasVSX = true;
50 } else if (Feature == "+power8-vector") {
51 HasP8Vector = true;
52 } else if (Feature == "+crypto") {
53 HasP8Crypto = true;
54 } else if (Feature == "+htm") {
55 HasHTM = true;
56 } else if (Feature == "+float128") {
57 HasFloat128 = !getTriple().isOSAIX();
58 } else if (Feature == "+power9-vector") {
59 HasP9Vector = true;
60 } else if (Feature == "+power10-vector") {
61 HasP10Vector = true;
62 } else if (Feature == "+future-vector") {
63 HasFutureVector = true;
64 } else if (Feature == "+pcrelative-memops") {
65 HasPCRelativeMemops = true;
66 } else if (Feature == "+spe" || Feature == "+efpu2") {
67 HasStrictFP = false;
68 HasSPE = true;
70 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
71 } else if (Feature == "+frsqrte") {
72 HasFrsqrte = true;
73 } else if (Feature == "+frsqrtes") {
74 HasFrsqrtes = true;
75 } else if (Feature == "-hard-float") {
76 FloatABI = SoftFloat;
77 } else if (Feature == "+mma") {
78 HasMMA = true;
79 } else if (Feature == "+rop-protect") {
80 HasROPProtect = true;
81 } else if (Feature == "+quadword-atomics") {
82 HasQuadwordAtomics = true;
83 } else if (Feature == "+longcall") {
84 UseLongCalls = true;
85 }
86 // TODO: Finish this list and add an assert that we've handled them
87 // all.
88 }
89
90 return true;
91}
92
93static void defineXLCompatMacros(MacroBuilder &Builder) {
94 Builder.defineMacro("__builtin_bcdcopysign", "__builtin_ppc_bcdcopysign");
95 Builder.defineMacro("__builtin_bcdsetsign", "__builtin_ppc_bcdsetsign");
96 Builder.defineMacro("__builtin_bcdshift", "__builtin_ppc_bcdshift");
97 Builder.defineMacro("__builtin_bcdshiftround", "__builtin_ppc_bcdshiftround");
98 Builder.defineMacro("__builtin_bcdtruncate", "__builtin_ppc_bcdtruncate");
99 Builder.defineMacro("__builtin_bcdunsignedtruncate",
100 "__builtin_ppc_bcdunsignedtruncate");
101 Builder.defineMacro("__builtin_bcdunsignedshift",
102 "__builtin_ppc_bcdunsignedshift");
103 Builder.defineMacro("__builtin_national2packed",
104 "__builtin_ppc_national2packed");
105 Builder.defineMacro("__builtin_packed2national",
106 "__builtin_ppc_packed2national");
107 Builder.defineMacro("__builtin_packed2zoned", "__builtin_ppc_packed2zoned");
108 Builder.defineMacro("__builtin_zoned2packed", "__builtin_ppc_zoned2packed");
109 Builder.defineMacro("__cdtbcd", "__builtin_ppc_cdtbcd");
110 Builder.defineMacro("__cbcdtd", "__builtin_ppc_cbcdtd");
111 Builder.defineMacro("__addg6s", "__builtin_ppc_addg6s");
112 Builder.defineMacro("__popcntb", "__builtin_ppc_popcntb");
113 Builder.defineMacro("__poppar4", "__builtin_ppc_poppar4");
114 Builder.defineMacro("__poppar8", "__builtin_ppc_poppar8");
115 Builder.defineMacro("__eieio", "__builtin_ppc_eieio");
116 Builder.defineMacro("__iospace_eieio", "__builtin_ppc_iospace_eieio");
117 Builder.defineMacro("__isync", "__builtin_ppc_isync");
118 Builder.defineMacro("__lwsync", "__builtin_ppc_lwsync");
119 Builder.defineMacro("__iospace_lwsync", "__builtin_ppc_iospace_lwsync");
120 Builder.defineMacro("__sync", "__builtin_ppc_sync");
121 Builder.defineMacro("__iospace_sync", "__builtin_ppc_iospace_sync");
122 Builder.defineMacro("__dcbfl", "__builtin_ppc_dcbfl");
123 Builder.defineMacro("__dcbflp", "__builtin_ppc_dcbflp");
124 Builder.defineMacro("__dcbst", "__builtin_ppc_dcbst");
125 Builder.defineMacro("__dcbt", "__builtin_ppc_dcbt");
126 Builder.defineMacro("__dcbtst", "__builtin_ppc_dcbtst");
127 Builder.defineMacro("__dcbz", "__builtin_ppc_dcbz");
128 Builder.defineMacro("__icbt", "__builtin_ppc_icbt");
129 Builder.defineMacro("__compare_and_swap", "__builtin_ppc_compare_and_swap");
130 Builder.defineMacro("__compare_and_swaplp",
131 "__builtin_ppc_compare_and_swaplp");
132 Builder.defineMacro("__fetch_and_add", "__builtin_ppc_fetch_and_add");
133 Builder.defineMacro("__fetch_and_addlp", "__builtin_ppc_fetch_and_addlp");
134 Builder.defineMacro("__fetch_and_and", "__builtin_ppc_fetch_and_and");
135 Builder.defineMacro("__fetch_and_andlp", "__builtin_ppc_fetch_and_andlp");
136 Builder.defineMacro("__fetch_and_or", "__builtin_ppc_fetch_and_or");
137 Builder.defineMacro("__fetch_and_orlp", "__builtin_ppc_fetch_and_orlp");
138 Builder.defineMacro("__fetch_and_swap", "__builtin_ppc_fetch_and_swap");
139 Builder.defineMacro("__fetch_and_swaplp", "__builtin_ppc_fetch_and_swaplp");
140 Builder.defineMacro("__ldarx", "__builtin_ppc_ldarx");
141 Builder.defineMacro("__lwarx", "__builtin_ppc_lwarx");
142 Builder.defineMacro("__lharx", "__builtin_ppc_lharx");
143 Builder.defineMacro("__lbarx", "__builtin_ppc_lbarx");
144 Builder.defineMacro("__stfiw", "__builtin_ppc_stfiw");
145 Builder.defineMacro("__stdcx", "__builtin_ppc_stdcx");
146 Builder.defineMacro("__stwcx", "__builtin_ppc_stwcx");
147 Builder.defineMacro("__sthcx", "__builtin_ppc_sthcx");
148 Builder.defineMacro("__stbcx", "__builtin_ppc_stbcx");
149 Builder.defineMacro("__tdw", "__builtin_ppc_tdw");
150 Builder.defineMacro("__tw", "__builtin_ppc_tw");
151 Builder.defineMacro("__trap", "__builtin_ppc_trap");
152 Builder.defineMacro("__trapd", "__builtin_ppc_trapd");
153 Builder.defineMacro("__fcfid", "__builtin_ppc_fcfid");
154 Builder.defineMacro("__fcfud", "__builtin_ppc_fcfud");
155 Builder.defineMacro("__fctid", "__builtin_ppc_fctid");
156 Builder.defineMacro("__fctidz", "__builtin_ppc_fctidz");
157 Builder.defineMacro("__fctiw", "__builtin_ppc_fctiw");
158 Builder.defineMacro("__fctiwz", "__builtin_ppc_fctiwz");
159 Builder.defineMacro("__fctudz", "__builtin_ppc_fctudz");
160 Builder.defineMacro("__fctuwz", "__builtin_ppc_fctuwz");
161 Builder.defineMacro("__cmpeqb", "__builtin_ppc_cmpeqb");
162 Builder.defineMacro("__cmprb", "__builtin_ppc_cmprb");
163 Builder.defineMacro("__setb", "__builtin_ppc_setb");
164 Builder.defineMacro("__cmpb", "__builtin_ppc_cmpb");
165 Builder.defineMacro("__mulhd", "__builtin_ppc_mulhd");
166 Builder.defineMacro("__mulhdu", "__builtin_ppc_mulhdu");
167 Builder.defineMacro("__mulhw", "__builtin_ppc_mulhw");
168 Builder.defineMacro("__mulhwu", "__builtin_ppc_mulhwu");
169 Builder.defineMacro("__maddhd", "__builtin_ppc_maddhd");
170 Builder.defineMacro("__maddhdu", "__builtin_ppc_maddhdu");
171 Builder.defineMacro("__maddld", "__builtin_ppc_maddld");
172 Builder.defineMacro("__rlwnm", "__builtin_ppc_rlwnm");
173 Builder.defineMacro("__rlwimi", "__builtin_ppc_rlwimi");
174 Builder.defineMacro("__rldimi", "__builtin_ppc_rldimi");
175 Builder.defineMacro("__load2r", "__builtin_ppc_load2r");
176 Builder.defineMacro("__load4r", "__builtin_ppc_load4r");
177 Builder.defineMacro("__load8r", "__builtin_ppc_load8r");
178 Builder.defineMacro("__store2r", "__builtin_ppc_store2r");
179 Builder.defineMacro("__store4r", "__builtin_ppc_store4r");
180 Builder.defineMacro("__store8r", "__builtin_ppc_store8r");
181 Builder.defineMacro("__extract_exp", "__builtin_ppc_extract_exp");
182 Builder.defineMacro("__extract_sig", "__builtin_ppc_extract_sig");
183 Builder.defineMacro("__mtfsb0", "__builtin_ppc_mtfsb0");
184 Builder.defineMacro("__mtfsb1", "__builtin_ppc_mtfsb1");
185 Builder.defineMacro("__mtfsf", "__builtin_ppc_mtfsf");
186 Builder.defineMacro("__mtfsfi", "__builtin_ppc_mtfsfi");
187 Builder.defineMacro("__insert_exp", "__builtin_ppc_insert_exp");
188 Builder.defineMacro("__fmsub", "__builtin_ppc_fmsub");
189 Builder.defineMacro("__fmsubs", "__builtin_ppc_fmsubs");
190 Builder.defineMacro("__fnmadd", "__builtin_ppc_fnmadd");
191 Builder.defineMacro("__fnmadds", "__builtin_ppc_fnmadds");
192 Builder.defineMacro("__fnmsub", "__builtin_ppc_fnmsub");
193 Builder.defineMacro("__fnmsubs", "__builtin_ppc_fnmsubs");
194 Builder.defineMacro("__fre", "__builtin_ppc_fre");
195 Builder.defineMacro("__fres", "__builtin_ppc_fres");
196 Builder.defineMacro("__swdiv_nochk", "__builtin_ppc_swdiv_nochk");
197 Builder.defineMacro("__swdivs_nochk", "__builtin_ppc_swdivs_nochk");
198 Builder.defineMacro("__alloca", "__builtin_alloca");
199 Builder.defineMacro("__vcipher", "__builtin_altivec_crypto_vcipher");
200 Builder.defineMacro("__vcipherlast", "__builtin_altivec_crypto_vcipherlast");
201 Builder.defineMacro("__vncipher", "__builtin_altivec_crypto_vncipher");
202 Builder.defineMacro("__vncipherlast",
203 "__builtin_altivec_crypto_vncipherlast");
204 Builder.defineMacro("__vpermxor", "__builtin_altivec_crypto_vpermxor");
205 Builder.defineMacro("__vpmsumb", "__builtin_altivec_crypto_vpmsumb");
206 Builder.defineMacro("__vpmsumd", "__builtin_altivec_crypto_vpmsumd");
207 Builder.defineMacro("__vpmsumh", "__builtin_altivec_crypto_vpmsumh");
208 Builder.defineMacro("__vpmsumw", "__builtin_altivec_crypto_vpmsumw");
209 Builder.defineMacro("__divde", "__builtin_divde");
210 Builder.defineMacro("__divwe", "__builtin_divwe");
211 Builder.defineMacro("__divdeu", "__builtin_divdeu");
212 Builder.defineMacro("__divweu", "__builtin_divweu");
213 Builder.defineMacro("__alignx", "__builtin_ppc_alignx");
214 Builder.defineMacro("__bcopy", "bcopy");
215 Builder.defineMacro("__bpermd", "__builtin_bpermd");
216 Builder.defineMacro("__cntlz4", "__builtin_clz");
217 Builder.defineMacro("__cntlz8", "__builtin_clzll");
218 Builder.defineMacro("__cmplx", "__builtin_complex");
219 Builder.defineMacro("__cmplxf", "__builtin_complex");
220 Builder.defineMacro("__cnttz4", "__builtin_ctz");
221 Builder.defineMacro("__cnttz8", "__builtin_ctzll");
222 Builder.defineMacro("__darn", "__builtin_darn");
223 Builder.defineMacro("__darn_32", "__builtin_darn_32");
224 Builder.defineMacro("__darn_raw", "__builtin_darn_raw");
225 Builder.defineMacro("__dcbf", "__builtin_dcbf");
226 Builder.defineMacro("__fence", "__builtin_ppc_fence");
227 Builder.defineMacro("__fmadd", "__builtin_fma");
228 Builder.defineMacro("__fmadds", "__builtin_fmaf");
229 Builder.defineMacro("__abs", "__builtin_abs");
230 Builder.defineMacro("__labs", "__builtin_labs");
231 Builder.defineMacro("__llabs", "__builtin_llabs");
232 Builder.defineMacro("__popcnt4", "__builtin_popcount");
233 Builder.defineMacro("__popcnt8", "__builtin_popcountll");
234 Builder.defineMacro("__readflm", "__builtin_readflm");
235 Builder.defineMacro("__rotatel4", "__builtin_rotateleft32");
236 Builder.defineMacro("__rotatel8", "__builtin_rotateleft64");
237 Builder.defineMacro("__rdlam", "__builtin_ppc_rdlam");
238 Builder.defineMacro("__setflm", "__builtin_setflm");
239 Builder.defineMacro("__setrnd", "__builtin_setrnd");
240 Builder.defineMacro("__dcbtstt", "__builtin_ppc_dcbtstt");
241 Builder.defineMacro("__dcbtt", "__builtin_ppc_dcbtt");
242 Builder.defineMacro("__mftbu", "__builtin_ppc_mftbu");
243 Builder.defineMacro("__mfmsr", "__builtin_ppc_mfmsr");
244 Builder.defineMacro("__mtmsr", "__builtin_ppc_mtmsr");
245 Builder.defineMacro("__mfspr", "__builtin_ppc_mfspr");
246 Builder.defineMacro("__mtspr", "__builtin_ppc_mtspr");
247 Builder.defineMacro("__fric", "__builtin_ppc_fric");
248 Builder.defineMacro("__frim", "__builtin_ppc_frim");
249 Builder.defineMacro("__frims", "__builtin_ppc_frims");
250 Builder.defineMacro("__frin", "__builtin_ppc_frin");
251 Builder.defineMacro("__frins", "__builtin_ppc_frins");
252 Builder.defineMacro("__frip", "__builtin_ppc_frip");
253 Builder.defineMacro("__frips", "__builtin_ppc_frips");
254 Builder.defineMacro("__friz", "__builtin_ppc_friz");
255 Builder.defineMacro("__frizs", "__builtin_ppc_frizs");
256 Builder.defineMacro("__fsel", "__builtin_ppc_fsel");
257 Builder.defineMacro("__fsels", "__builtin_ppc_fsels");
258 Builder.defineMacro("__frsqrte", "__builtin_ppc_frsqrte");
259 Builder.defineMacro("__frsqrtes", "__builtin_ppc_frsqrtes");
260 Builder.defineMacro("__fsqrt", "__builtin_ppc_fsqrt");
261 Builder.defineMacro("__fsqrts", "__builtin_ppc_fsqrts");
262 Builder.defineMacro("__addex", "__builtin_ppc_addex");
263 Builder.defineMacro("__cmplxl", "__builtin_complex");
264 Builder.defineMacro("__compare_exp_uo", "__builtin_ppc_compare_exp_uo");
265 Builder.defineMacro("__compare_exp_lt", "__builtin_ppc_compare_exp_lt");
266 Builder.defineMacro("__compare_exp_gt", "__builtin_ppc_compare_exp_gt");
267 Builder.defineMacro("__compare_exp_eq", "__builtin_ppc_compare_exp_eq");
268 Builder.defineMacro("__test_data_class", "__builtin_ppc_test_data_class");
269 Builder.defineMacro("__swdiv", "__builtin_ppc_swdiv");
270 Builder.defineMacro("__swdivs", "__builtin_ppc_swdivs");
271 Builder.defineMacro("__fnabs", "__builtin_ppc_fnabs");
272 Builder.defineMacro("__fnabss", "__builtin_ppc_fnabss");
273 Builder.defineMacro("__builtin_maxfe", "__builtin_ppc_maxfe");
274 Builder.defineMacro("__builtin_maxfl", "__builtin_ppc_maxfl");
275 Builder.defineMacro("__builtin_maxfs", "__builtin_ppc_maxfs");
276 Builder.defineMacro("__builtin_minfe", "__builtin_ppc_minfe");
277 Builder.defineMacro("__builtin_minfl", "__builtin_ppc_minfl");
278 Builder.defineMacro("__builtin_minfs", "__builtin_ppc_minfs");
279 Builder.defineMacro("__builtin_mffs", "__builtin_ppc_mffs");
280 Builder.defineMacro("__builtin_mffsl", "__builtin_ppc_mffsl");
281 Builder.defineMacro("__builtin_mtfsf", "__builtin_ppc_mtfsf");
282 Builder.defineMacro("__builtin_set_fpscr_rn", "__builtin_ppc_set_fpscr_rn");
283}
284
285/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
286/// #defines that are not tied to a specific subtarget.
288 MacroBuilder &Builder) const {
289
290 // We define the XLC compatibility macros only on AIX and Linux since XLC
291 // was never available on any other platforms.
292 if (getTriple().isOSAIX() || getTriple().isOSLinux())
293 defineXLCompatMacros(Builder);
294
295 // Target identification.
296 Builder.defineMacro("__ppc__");
297 Builder.defineMacro("__PPC__");
298 Builder.defineMacro("_ARCH_PPC");
299 Builder.defineMacro("__powerpc__");
300 Builder.defineMacro("__POWERPC__");
301 if (PointerWidth == 64) {
302 Builder.defineMacro("_ARCH_PPC64");
303 Builder.defineMacro("__powerpc64__");
304 Builder.defineMacro("__PPC64__");
305 } else if (getTriple().isOSAIX()) {
306 // The XL compilers on AIX define _ARCH_PPC64 for both 32 and 64-bit modes.
307 Builder.defineMacro("_ARCH_PPC64");
308 }
309 if (getTriple().isOSAIX()) {
310 Builder.defineMacro("__THW_PPC__");
311 // Define __PPC and __powerpc for AIX XL C/C++ compatibility
312 Builder.defineMacro("__PPC");
313 Builder.defineMacro("__powerpc");
314 }
315
316 // Target properties.
317 if (getTriple().getArch() == llvm::Triple::ppc64le ||
318 getTriple().getArch() == llvm::Triple::ppcle) {
319 Builder.defineMacro("_LITTLE_ENDIAN");
320 } else {
321 if (!getTriple().isOSNetBSD() &&
322 !getTriple().isOSOpenBSD())
323 Builder.defineMacro("_BIG_ENDIAN");
324 }
325
326 // ABI options.
327 if (ABI == "elfv1")
328 Builder.defineMacro("_CALL_ELF", "1");
329 if (ABI == "elfv2")
330 Builder.defineMacro("_CALL_ELF", "2");
331
332 // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but
333 // our support post-dates this and it should work on all 64-bit ppc linux
334 // platforms. It is guaranteed to work on all elfv2 platforms.
335 if (getTriple().getOS() == llvm::Triple::Linux && PointerWidth == 64)
336 Builder.defineMacro("_CALL_LINUX", "1");
337
338 // Subtarget options.
339 if (!getTriple().isOSAIX()){
340 Builder.defineMacro("__NATURAL_ALIGNMENT__");
341 }
342 Builder.defineMacro("__REGISTER_PREFIX__", "");
343
344 // FIXME: Should be controlled by command line option.
345 if (LongDoubleWidth == 128) {
346 Builder.defineMacro("__LONG_DOUBLE_128__");
347 Builder.defineMacro("__LONGDOUBLE128");
348 if (Opts.PPCIEEELongDouble)
349 Builder.defineMacro("__LONG_DOUBLE_IEEE128__");
350 else
351 Builder.defineMacro("__LONG_DOUBLE_IBM128__");
352 }
353
354 if (getTriple().isOSAIX() && Opts.LongDoubleSize == 64) {
355 assert(LongDoubleWidth == 64);
356 Builder.defineMacro("__LONGDOUBLE64");
357 }
358
359 // Define this for elfv2 (64-bit only).
360 if (ABI == "elfv2")
361 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
362
363 if (ArchDefs & ArchDefineName)
364 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
365 if (ArchDefs & ArchDefinePpcgr)
366 Builder.defineMacro("_ARCH_PPCGR");
367 if (ArchDefs & ArchDefinePpcsq)
368 Builder.defineMacro("_ARCH_PPCSQ");
369 if (ArchDefs & ArchDefine440)
370 Builder.defineMacro("_ARCH_440");
371 if (ArchDefs & ArchDefine603)
372 Builder.defineMacro("_ARCH_603");
373 if (ArchDefs & ArchDefine604)
374 Builder.defineMacro("_ARCH_604");
375 if (ArchDefs & ArchDefinePwr4)
376 Builder.defineMacro("_ARCH_PWR4");
377 if (ArchDefs & ArchDefinePwr5)
378 Builder.defineMacro("_ARCH_PWR5");
379 if (ArchDefs & ArchDefinePwr5x)
380 Builder.defineMacro("_ARCH_PWR5X");
381 if (ArchDefs & ArchDefinePwr6)
382 Builder.defineMacro("_ARCH_PWR6");
383 if (ArchDefs & ArchDefinePwr6x)
384 Builder.defineMacro("_ARCH_PWR6X");
385 if (ArchDefs & ArchDefinePwr7)
386 Builder.defineMacro("_ARCH_PWR7");
387 if (ArchDefs & ArchDefinePwr8)
388 Builder.defineMacro("_ARCH_PWR8");
389 if (ArchDefs & ArchDefinePwr9)
390 Builder.defineMacro("_ARCH_PWR9");
391 if (ArchDefs & ArchDefinePwr10)
392 Builder.defineMacro("_ARCH_PWR10");
393 if (ArchDefs & ArchDefinePwr11)
394 Builder.defineMacro("_ARCH_PWR11");
395 if (ArchDefs & ArchDefineA2)
396 Builder.defineMacro("_ARCH_A2");
397 if (ArchDefs & ArchDefineE500)
398 Builder.defineMacro("__NO_LWSYNC__");
399 if (ArchDefs & ArchDefineFuture)
400 Builder.defineMacro("_ARCH_PWR_FUTURE");
401
402 if (HasAltivec) {
403 Builder.defineMacro("__VEC__", "10206");
404 Builder.defineMacro("__ALTIVEC__");
405 }
406 if (HasSPE)
407 Builder.defineMacro("__SPE__");
408 if (HasSPE || FloatABI == SoftFloat)
409 Builder.defineMacro("__NO_FPRS__");
410 if (FloatABI == SoftFloat) {
411 Builder.defineMacro("_SOFT_FLOAT");
412 Builder.defineMacro("_SOFT_DOUBLE");
413 } else {
414 if (HasFrsqrte)
415 Builder.defineMacro("__RSQRTE__");
416 if (HasFrsqrtes)
417 Builder.defineMacro("__RSQRTEF__");
418 }
419 if (HasVSX)
420 Builder.defineMacro("__VSX__");
421 if (HasP8Vector)
422 Builder.defineMacro("__POWER8_VECTOR__");
423 if (HasP8Crypto)
424 Builder.defineMacro("__CRYPTO__");
425 if (HasHTM)
426 Builder.defineMacro("__HTM__");
427 if (HasFloat128)
428 Builder.defineMacro("__FLOAT128__");
429 if (HasP9Vector)
430 Builder.defineMacro("__POWER9_VECTOR__");
431 if (HasMMA)
432 Builder.defineMacro("__MMA__");
433 if (HasROPProtect)
434 Builder.defineMacro("__ROP_PROTECT__");
435 if (HasP10Vector)
436 Builder.defineMacro("__POWER10_VECTOR__");
437 if (HasPCRelativeMemops)
438 Builder.defineMacro("__PCREL__");
439 if (HasFutureVector)
440 Builder.defineMacro("__FUTURE_VECTOR__");
441
442 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
443 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
444 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
445 if (PointerWidth == 64)
446 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
447
448 // We have support for the bswap intrinsics so we can define this.
449 Builder.defineMacro("__HAVE_BSWAP__", "1");
450
451 // FIXME: The following are not yet generated here by Clang, but are
452 // generated by GCC:
453 //
454 // __RECIP_PRECISION__
455 // __APPLE_ALTIVEC__
456 // __RECIP__
457 // __RECIPF__
458 // __NO_LWSYNC__
459 // __CMODEL_MEDIUM__
460 // __CMODEL_LARGE__
461 // _CALL_SYSV
462 // _CALL_DARWIN
463}
464
465// Handle explicit options being passed to the compiler here:
466// - if we've explicitly turned off vsx and turned on any of:
467// - power8-vector
468// - direct-move
469// - float128
470// - power9-vector
471// - paired-vector-memops
472// - mma
473// - power10-vector
474// - if we've explicitly turned on vsx and turned off altivec.
475// - if we've explicitly turned off hard-float and turned on altivec.
476// then go ahead and error since the customer has expressed an incompatible
477// set of options.
479 const std::vector<std::string> &FeaturesVec) {
480 auto FindVSXSubfeature = [&](StringRef Feature, StringRef SubOption,
481 StringRef Option) {
482 if (llvm::is_contained(FeaturesVec, Feature)) {
483 Diags.Report(diag::err_opt_not_valid_with_opt) << SubOption << Option;
484 return true;
485 }
486 return false;
487 };
488
489 // Cannot allow soft-float with VSX, Altivec, or any
490 // VSX subfeatures.
491 bool Found = false;
492 if (llvm::is_contained(FeaturesVec, "-hard-float")) {
493 Found |= FindVSXSubfeature("+vsx", "-mvsx", "-msoft-float");
494 Found |= FindVSXSubfeature("+altivec", "-maltivec", "-msoft-float");
495 Found |=
496 FindVSXSubfeature("+power8-vector", "-mpower8-vector", "-msoft-float");
497 Found |= FindVSXSubfeature("+direct-move", "-mdirect-move", "-msoft-float");
498 Found |= FindVSXSubfeature("+float128", "-mfloat128", "-msoft-float");
499 Found |=
500 FindVSXSubfeature("+power9-vector", "-mpower9-vector", "-msoft-float");
501 Found |= FindVSXSubfeature("+paired-vector-memops",
502 "-mpaired-vector-memops", "-msoft-float");
503 Found |= FindVSXSubfeature("+mma", "-mmma", "-msoft-float");
504 Found |= FindVSXSubfeature("+crypto", "-mcrypto", "-msoft-float");
505 Found |= FindVSXSubfeature("+power10-vector", "-mpower10-vector",
506 "-msoft-float");
507 }
508 if (Found)
509 return false;
510
511 // Cannot allow VSX with no Altivec.
512 if (llvm::is_contained(FeaturesVec, "+vsx") &&
513 llvm::is_contained(FeaturesVec, "-altivec")) {
514 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mvsx"
515 << "-mno-altivec";
516 return false;
517 }
518
519 // vsx was not explicitly turned off.
520 if (!llvm::is_contained(FeaturesVec, "-vsx"))
521 return true;
522
523 Found = FindVSXSubfeature("+power8-vector", "-mpower8-vector", "-mno-vsx");
524 Found |= FindVSXSubfeature("+direct-move", "-mdirect-move", "-mno-vsx");
525 Found |= FindVSXSubfeature("+float128", "-mfloat128", "-mno-vsx");
526 Found |= FindVSXSubfeature("+power9-vector", "-mpower9-vector", "-mno-vsx");
527 Found |= FindVSXSubfeature("+paired-vector-memops", "-mpaired-vector-memops",
528 "-mno-vsx");
529 Found |= FindVSXSubfeature("+mma", "-mmma", "-mno-vsx");
530 Found |= FindVSXSubfeature("+power10-vector", "-mpower10-vector", "-mno-vsx");
531
532 // Return false if any vsx subfeatures was found.
533 return !Found;
534}
535
537 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
538 const std::vector<std::string> &FeaturesVec) const {
539
540 const llvm::Triple &TheTriple = getTriple();
541
542 std::optional<llvm::StringMap<bool>> FeaturesOpt =
543 llvm::PPC::getPPCDefaultTargetFeatures(TheTriple,
544 llvm::PPC::normalizeCPUName(CPU));
545 if (FeaturesOpt)
546 Features = FeaturesOpt.value();
547
548 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
549 return false;
550
551 if (!(ArchDefs & ArchDefinePwr7) && (ArchDefs & ArchDefinePpcgr) &&
552 llvm::is_contained(FeaturesVec, "+float128")) {
553 // We have __float128 on PPC but not pre-VSX targets.
554 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128" << CPU;
555 return false;
556 }
557
558 if (!(ArchDefs & ArchDefinePwr10)) {
559 if (llvm::is_contained(FeaturesVec, "+mma")) {
560 // MMA operations are not available pre-Power10.
561 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mmma" << CPU;
562 return false;
563 }
564 if (llvm::is_contained(FeaturesVec, "+pcrel")) {
565 // PC-Relative instructions are not available pre-Power10,
566 // and these instructions also require prefixed instructions support.
567 Diags.Report(diag::err_opt_not_valid_without_opt)
568 << "-mpcrel"
569 << "-mcpu=pwr10 -mprefixed";
570 return false;
571 }
572 if (llvm::is_contained(FeaturesVec, "+prefixed")) {
573 // Prefixed instructions are not available pre-Power10.
574 Diags.Report(diag::err_opt_not_valid_without_opt) << "-mprefixed"
575 << "-mcpu=pwr10";
576 return false;
577 }
578 if (llvm::is_contained(FeaturesVec, "+paired-vector-memops")) {
579 // Paired vector memops are not available pre-Power10.
580 Diags.Report(diag::err_opt_not_valid_without_opt)
581 << "-mpaired-vector-memops"
582 << "-mcpu=pwr10";
583 return false;
584 }
585 }
586
587 if (llvm::is_contained(FeaturesVec, "+rop-protect")) {
588 if (PointerWidth == 32) {
589 Diags.Report(diag::err_opt_not_valid_on_target) << "-mrop-protect";
590 return false;
591 }
592
593 if (!(ArchDefs & ArchDefinePwr8)) {
594 // We can turn on ROP Protect on Power 8 and above.
595 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mrop-protect" << CPU;
596 return false;
597 }
598 }
599
600 if (!(ArchDefs & ArchDefinePwr8) &&
601 llvm::is_contained(FeaturesVec, "+privileged")) {
602 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mprivileged" << CPU;
603 return false;
604 }
605 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
606}
607
608bool PPCTargetInfo::hasFeature(StringRef Feature) const {
609 return llvm::StringSwitch<bool>(Feature)
610 .Case("powerpc", true)
611 .Case("altivec", HasAltivec)
612 .Case("vsx", HasVSX)
613 .Case("power8-vector", HasP8Vector)
614 .Case("crypto", HasP8Crypto)
615 .Case("htm", HasHTM)
616 .Case("float128", HasFloat128)
617 .Case("power9-vector", HasP9Vector)
618 .Case("power10-vector", HasP10Vector)
619 .Case("pcrelative-memops", HasPCRelativeMemops)
620 .Case("spe", HasSPE)
621 .Case("mma", HasMMA)
622 .Case("rop-protect", HasROPProtect)
623 .Case("quadword-atomics", HasQuadwordAtomics)
624 .Case("longcall", UseLongCalls)
625 .Default(false);
626}
627
628void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
629 StringRef Name, bool Enabled) const {
630 if (Enabled) {
631 if (Name == "efpu2")
632 Features["spe"] = true;
633 // If we're enabling any of the vsx based features then enable vsx and
634 // altivec. We'll diagnose any problems later.
635 bool FeatureHasVSX = llvm::StringSwitch<bool>(Name)
636 .Case("vsx", true)
637 .Case("direct-move", true)
638 .Case("power8-vector", true)
639 .Case("power9-vector", true)
640 .Case("paired-vector-memops", true)
641 .Case("power10-vector", true)
642 .Case("float128", true)
643 .Case("mma", true)
644 .Default(false);
645 if (FeatureHasVSX)
646 Features["vsx"] = Features["altivec"] = true;
647 if (Name == "power9-vector")
648 Features["power8-vector"] = true;
649 else if (Name == "power10-vector")
650 Features["power8-vector"] = Features["power9-vector"] = true;
651 if (Name == "pcrel")
652 Features["pcrelative-memops"] = true;
653 else if (Name == "prefixed")
654 Features["prefix-instrs"] = true;
655 else
656 Features[Name] = true;
657 } else {
658 if (Name == "spe")
659 Features["efpu2"] = false;
660 // If we're disabling altivec, hard-float, or vsx go ahead and disable all
661 // of the vsx features.
662 if ((Name == "altivec") || (Name == "vsx") || (Name == "hard-float")) {
663 if (Name != "vsx")
664 Features["altivec"] = Features["crypto"] = false;
665 Features["vsx"] = Features["direct-move"] = Features["power8-vector"] =
666 Features["float128"] = Features["power9-vector"] =
667 Features["paired-vector-memops"] = Features["mma"] =
668 Features["power10-vector"] = false;
669 }
670 if (Name == "power8-vector")
671 Features["power9-vector"] = Features["paired-vector-memops"] =
672 Features["mma"] = Features["power10-vector"] = false;
673 else if (Name == "power9-vector")
674 Features["paired-vector-memops"] = Features["mma"] =
675 Features["power10-vector"] = false;
676 if (Name == "pcrel")
677 Features["pcrelative-memops"] = false;
678 else if (Name == "prefixed")
679 Features["prefix-instrs"] = false;
680 else
681 Features[Name] = false;
682 }
683}
684
687 if (Features == "default")
688 return Ret;
689 SmallVector<StringRef, 1> AttrFeatures;
690 Features.split(AttrFeatures, ",");
691
692 // Grab the various features and prepend a "+" to turn on the feature to
693 // the backend and add them to our existing set of features.
694 for (auto &Feature : AttrFeatures) {
695 // Go ahead and trim whitespace rather than either erroring or
696 // accepting it weirdly.
697 Feature = Feature.trim();
698
699 if (Feature.starts_with("cpu=")) {
700 if (!Ret.CPU.empty())
701 Ret.Duplicate = "cpu=";
702 else
703 Ret.CPU = Feature.split("=").second.trim();
704 } else if (Feature.starts_with("tune=")) {
705 if (!Ret.Tune.empty())
706 Ret.Duplicate = "tune=";
707 else
708 Ret.Tune = Feature.split("=").second.trim();
709 } else if (Feature.starts_with("no-"))
710 Ret.Features.push_back("-" + Feature.split("-").second.str());
711 else
712 Ret.Features.push_back("+" + Feature.str());
713 }
714 return Ret;
715}
716
718 if (Features.empty())
719 return llvm::APInt(32, 0);
720 assert(Features.size() == 1 && "one feature/cpu per clone on PowerPC");
722 if (!ParsedAttr.CPU.empty()) {
723 int Priority = llvm::StringSwitch<int>(ParsedAttr.CPU)
724 .Case("pwr7", 1)
725 .Case("pwr8", 2)
726 .Case("pwr9", 3)
727 .Case("pwr10", 4)
728 .Case("pwr11", 5)
729 .Default(0);
730 return llvm::APInt(32, Priority);
731 }
732 assert(false && "unimplemented");
733 return llvm::APInt(32, 0);
734}
735
736// Make sure that registers are added in the correct array index which should be
737// the DWARF number for PPC registers.
738const char *const PPCTargetInfo::GCCRegNames[] = {
739 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",
740 "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17",
741 "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26",
742 "r27", "r28", "r29", "r30", "r31", "f0", "f1", "f2", "f3",
743 "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12",
744 "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
745 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30",
746 "f31", "mq", "lr", "ctr", "ap", "cr0", "cr1", "cr2", "cr3",
747 "cr4", "cr5", "cr6", "cr7", "xer", "v0", "v1", "v2", "v3",
748 "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12",
749 "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
750 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30",
751 "v31", "vrsave", "vscr", "spe_acc", "spefscr", "sfp"
752};
753
757
758const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
759 // While some of these aliases do map to different registers
760 // they still share the same register name.
761 {{"0"}, "r0"}, {{"1", "sp"}, "r1"}, {{"2"}, "r2"},
762 {{"3"}, "r3"}, {{"4"}, "r4"}, {{"5"}, "r5"},
763 {{"6"}, "r6"}, {{"7"}, "r7"}, {{"8"}, "r8"},
764 {{"9"}, "r9"}, {{"10"}, "r10"}, {{"11"}, "r11"},
765 {{"12"}, "r12"}, {{"13"}, "r13"}, {{"14"}, "r14"},
766 {{"15"}, "r15"}, {{"16"}, "r16"}, {{"17"}, "r17"},
767 {{"18"}, "r18"}, {{"19"}, "r19"}, {{"20"}, "r20"},
768 {{"21"}, "r21"}, {{"22"}, "r22"}, {{"23"}, "r23"},
769 {{"24"}, "r24"}, {{"25"}, "r25"}, {{"26"}, "r26"},
770 {{"27"}, "r27"}, {{"28"}, "r28"}, {{"29"}, "r29"},
771 {{"30"}, "r30"}, {{"31"}, "r31"}, {{"fr0"}, "f0"},
772 {{"fr1"}, "f1"}, {{"fr2"}, "f2"}, {{"fr3"}, "f3"},
773 {{"fr4"}, "f4"}, {{"fr5"}, "f5"}, {{"fr6"}, "f6"},
774 {{"fr7"}, "f7"}, {{"fr8"}, "f8"}, {{"fr9"}, "f9"},
775 {{"fr10"}, "f10"}, {{"fr11"}, "f11"}, {{"fr12"}, "f12"},
776 {{"fr13"}, "f13"}, {{"fr14"}, "f14"}, {{"fr15"}, "f15"},
777 {{"fr16"}, "f16"}, {{"fr17"}, "f17"}, {{"fr18"}, "f18"},
778 {{"fr19"}, "f19"}, {{"fr20"}, "f20"}, {{"fr21"}, "f21"},
779 {{"fr22"}, "f22"}, {{"fr23"}, "f23"}, {{"fr24"}, "f24"},
780 {{"fr25"}, "f25"}, {{"fr26"}, "f26"}, {{"fr27"}, "f27"},
781 {{"fr28"}, "f28"}, {{"fr29"}, "f29"}, {{"fr30"}, "f30"},
782 {{"fr31"}, "f31"}, {{"cc"}, "cr0"},
783};
784
788
789// PPC ELFABIv2 DWARF Definition "Table 2.26. Mappings of Common Registers".
790// vs0 ~ vs31 is mapping to 32 - 63,
791// vs32 ~ vs63 is mapping to 77 - 108.
792// And this mapping applies to all OSes which run on powerpc.
794 // Table of additional register names to use in user input.
795 {{"vs0"}, 32}, {{"vs1"}, 33}, {{"vs2"}, 34}, {{"vs3"}, 35},
796 {{"vs4"}, 36}, {{"vs5"}, 37}, {{"vs6"}, 38}, {{"vs7"}, 39},
797 {{"vs8"}, 40}, {{"vs9"}, 41}, {{"vs10"}, 42}, {{"vs11"}, 43},
798 {{"vs12"}, 44}, {{"vs13"}, 45}, {{"vs14"}, 46}, {{"vs15"}, 47},
799 {{"vs16"}, 48}, {{"vs17"}, 49}, {{"vs18"}, 50}, {{"vs19"}, 51},
800 {{"vs20"}, 52}, {{"vs21"}, 53}, {{"vs22"}, 54}, {{"vs23"}, 55},
801 {{"vs24"}, 56}, {{"vs25"}, 57}, {{"vs26"}, 58}, {{"vs27"}, 59},
802 {{"vs28"}, 60}, {{"vs29"}, 61}, {{"vs30"}, 62}, {{"vs31"}, 63},
803 {{"vs32"}, 77}, {{"vs33"}, 78}, {{"vs34"}, 79}, {{"vs35"}, 80},
804 {{"vs36"}, 81}, {{"vs37"}, 82}, {{"vs38"}, 83}, {{"vs39"}, 84},
805 {{"vs40"}, 85}, {{"vs41"}, 86}, {{"vs42"}, 87}, {{"vs43"}, 88},
806 {{"vs44"}, 89}, {{"vs45"}, 90}, {{"vs46"}, 91}, {{"vs47"}, 92},
807 {{"vs48"}, 93}, {{"vs49"}, 94}, {{"vs50"}, 95}, {{"vs51"}, 96},
808 {{"vs52"}, 97}, {{"vs53"}, 98}, {{"vs54"}, 99}, {{"vs55"}, 100},
809 {{"vs56"}, 101}, {{"vs57"}, 102}, {{"vs58"}, 103}, {{"vs59"}, 104},
810 {{"vs60"}, 105}, {{"vs61"}, 106}, {{"vs62"}, 107}, {{"vs63"}, 108},
811};
812
816
817bool PPCTargetInfo::isValidCPUName(StringRef Name) const {
818 return llvm::PPC::isValidCPU(Name);
819}
820
822 llvm::PPC::fillValidCPUList(Values);
823}
824
826 const TargetInfo *Aux) {
827 if (HasAltivec)
828 Opts.AltiVec = 1;
829 TargetInfo::adjust(Diags, Opts, Aux);
830 if (LongDoubleFormat != &llvm::APFloat::IEEEdouble())
831 LongDoubleFormat = Opts.PPCIEEELongDouble
832 ? &llvm::APFloat::IEEEquad()
833 : &llvm::APFloat::PPCDoubleDouble();
834 Opts.IEEE128 = 1;
835 if (getTriple().isOSAIX() && Opts.EnableAIXQuadwordAtomicsABI &&
836 HasQuadwordAtomics)
838}
839
844
845bool PPCTargetInfo::validateCpuSupports(StringRef FeatureStr) const {
846 llvm::Triple Triple = getTriple();
847 if (Triple.isOSAIX()) {
848#define PPC_AIX_FEATURE(NAME, DESC, SUPPORT_METHOD, INDEX, MASK, COMP_OP, \
849 VALUE) \
850 .Case(NAME, true)
851 return llvm::StringSwitch<bool>(FeatureStr)
852#include "llvm/TargetParser/PPCTargetParser.def"
853 .Default(false);
854 }
855
856 assert(Triple.isOSLinux() &&
857 "__builtin_cpu_supports() is only supported for AIX and Linux.");
858
859#define PPC_LNX_FEATURE(NAME, DESC, ENUMNAME, ENUMVAL, HWCAPN) .Case(NAME, true)
860 return llvm::StringSwitch<bool>(FeatureStr)
861#include "llvm/TargetParser/PPCTargetParser.def"
862 .Default(false);
863}
864
865bool PPCTargetInfo::validateCpuIs(StringRef CPUName) const {
866 llvm::Triple Triple = getTriple();
867 assert((Triple.isOSAIX() || Triple.isOSLinux()) &&
868 "__builtin_cpu_is() is only supported for AIX and Linux.");
869
870#define PPC_CPU(NAME, Linux_SUPPORT_METHOD, LinuxID, AIX_SUPPORT_METHOD, \
871 AIXID) \
872 .Case(NAME, {Linux_SUPPORT_METHOD, AIX_SUPPORT_METHOD})
873
874 std::pair<unsigned, unsigned> SuppportMethod =
875 llvm::StringSwitch<std::pair<unsigned, unsigned>>(CPUName)
876#include "llvm/TargetParser/PPCTargetParser.def"
877 .Default({BUILTIN_PPC_UNSUPPORTED, BUILTIN_PPC_UNSUPPORTED});
878 return Triple.isOSLinux()
879 ? (SuppportMethod.first != BUILTIN_PPC_UNSUPPORTED)
880 : (SuppportMethod.second != BUILTIN_PPC_UNSUPPORTED);
881}
Defines the Diagnostic-related interfaces.
static constexpr llvm::StringTable BuiltinStrings
Definition ARM.cpp:1115
const TargetInfo::AddlRegName GCCAddlRegNames[]
Definition PPC.cpp:793
static void defineXLCompatMacros(MacroBuilder &Builder)
Definition PPC.cpp:93
static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags, const std::vector< std::string > &FeaturesVec)
Definition PPC.cpp:478
static constexpr Builtin::Info BuiltinInfos[]
Definition Builtins.cpp:38
static constexpr unsigned NumBuiltins
Definition Builtins.cpp:32
#define CLANG_BUILTIN_STR_TABLE_START
Definition Builtins.h:165
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.
Definition Diagnostic.h:233
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...
ParsedAttr - Represents a syntactic attribute.
Definition ParsedAttr.h:119
TargetInfo(const llvm::Triple &T)
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux)
Set forced language options.
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 ...
unsigned char MaxAtomicInlineWidth
Definition TargetInfo.h:253
ParsedTargetAttr parseTargetAttr(StringRef Str) const override
Definition PPC.cpp:685
ArrayRef< const char * > getGCCRegNames() const override
Definition PPC.cpp:754
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux) override
Set forced language options.
Definition PPC.cpp:825
bool validateCpuIs(StringRef Name) const override
Definition PPC.cpp:865
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
Definition PPC.cpp:817
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
handleTargetFeatures - Perform initialization based on the user configured set of features.
Definition PPC.cpp:42
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
Definition PPC.cpp:608
llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const override
Definition PPC.cpp:717
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition PPC.cpp:785
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.
Definition PPC.cpp:628
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific defines that are not tied to a...
Definition PPC.cpp:287
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
Definition PPC.cpp:841
ArrayRef< TargetInfo::AddlRegName > getGCCAddlRegNames() const override
Definition PPC.cpp:813
bool validateCpuSupports(StringRef Feature) const override
Definition PPC.cpp:845
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 ...
Definition PPC.cpp:536
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition PPC.cpp:821
static constexpr std::array< Info, N > MakeInfos(std::array< Info, N > Infos)
A constexpr function to construct an infos array from X-macros.
Definition Builtins.h:114
The JSON file list parser is used to communicate input to InstallAPI.
Contains information gathered from parsing the contents of TargetAttr.
Definition TargetInfo.h:60
const llvm::fltSemantics * LongDoubleFormat
Definition TargetInfo.h:144