clang 23.0.0git
InitPreprocessor.cpp
Go to the documentation of this file.
1//===--- InitPreprocessor.cpp - PP initialization code. ---------*- C++ -*-===//
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 the clang::InitializePreprocessor function.
10//
11//===----------------------------------------------------------------------===//
12
20#include "clang/Basic/Version.h"
27#include "llvm/ADT/APFloat.h"
28#include "llvm/IR/DataLayout.h"
29#include "llvm/IR/DerivedTypes.h"
30using namespace clang;
31
32static bool MacroBodyEndsInBackslash(StringRef MacroBody) {
33 while (!MacroBody.empty() && isWhitespace(MacroBody.back()))
34 MacroBody = MacroBody.drop_back();
35 return MacroBody.ends_with('\\');
36}
37
38// Append a #define line to Buf for Macro. Macro should be of the form XXX,
39// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
40// "#define XXX Y z W". To get a #define with no value, use "XXX=".
41static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro,
42 DiagnosticsEngine &Diags) {
43 std::pair<StringRef, StringRef> MacroPair = Macro.split('=');
44 StringRef MacroName = MacroPair.first;
45 StringRef MacroBody = MacroPair.second;
46 if (MacroName.size() != Macro.size()) {
47 // Per GCC -D semantics, the macro ends at \n if it exists.
48 StringRef::size_type End = MacroBody.find_first_of("\n\r");
49 if (End != StringRef::npos)
50 Diags.Report(diag::warn_fe_macro_contains_embedded_newline)
51 << MacroName;
52 MacroBody = MacroBody.substr(0, End);
53 // We handle macro bodies which end in a backslash by appending an extra
54 // backslash+newline. This makes sure we don't accidentally treat the
55 // backslash as a line continuation marker.
56 if (MacroBodyEndsInBackslash(MacroBody))
57 Builder.defineMacro(MacroName, Twine(MacroBody) + "\\\n");
58 else
59 Builder.defineMacro(MacroName, MacroBody);
60 } else {
61 // Push "macroname 1".
62 Builder.defineMacro(Macro);
63 }
64}
65
66/// AddImplicitInclude - Add an implicit \#include of the specified file to the
67/// predefines buffer.
68/// As these includes are generated by -include arguments the header search
69/// logic is going to search relatively to the current working directory.
70static void AddImplicitInclude(MacroBuilder &Builder, StringRef File) {
71 Builder.append(Twine("#include \"") + File + "\"");
72}
73
74static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File) {
75 Builder.append(Twine("#__include_macros \"") + File + "\"");
76 // Marker token to stop the __include_macros fetch loop.
77 Builder.append("##"); // ##?
78}
79
80/// Add an implicit \#include using the original file used to generate
81/// a PCH file.
83 const PCHContainerReader &PCHContainerRdr,
84 StringRef ImplicitIncludePCH) {
85 std::string OriginalFile = ASTReader::getOriginalSourceFile(
86 std::string(ImplicitIncludePCH), PP.getFileManager(), PCHContainerRdr,
87 PP.getDiagnostics());
88 if (OriginalFile.empty())
89 return;
90
91 AddImplicitInclude(Builder, OriginalFile);
92}
93
94/// PickFP - This is used to pick a value based on the FP semantics of the
95/// specified FP model.
96template <typename T>
97static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal,
98 T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal,
99 T IEEEQuadVal) {
100 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf())
101 return IEEEHalfVal;
102 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle())
103 return IEEESingleVal;
104 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble())
105 return IEEEDoubleVal;
106 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended())
107 return X87DoubleExtendedVal;
108 if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble())
109 return PPCDoubleDoubleVal;
110 assert(Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEquad());
111 return IEEEQuadVal;
112}
113
114static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
115 const llvm::fltSemantics *Sem, StringRef Ext) {
116 const char *DenormMin, *NormMax, *Epsilon, *Max, *Min;
117 NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38",
118 "1.7976931348623157e+308", "1.18973149535723176502e+4932",
119 "8.98846567431157953864652595394501e+307",
120 "1.18973149535723176508575932662800702e+4932");
121 DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45",
122 "4.9406564584124654e-324", "3.64519953188247460253e-4951",
123 "4.94065645841246544176568792868221e-324",
124 "6.47517511943802511092443895822764655e-4966");
125 int Digits = PickFP(Sem, 3, 6, 15, 18, 31, 33);
126 int DecimalDigits = PickFP(Sem, 5, 9, 17, 21, 33, 36);
127 Epsilon = PickFP(Sem, "9.765625e-4", "1.19209290e-7",
128 "2.2204460492503131e-16", "1.08420217248550443401e-19",
129 "4.94065645841246544176568792868221e-324",
130 "1.92592994438723585305597794258492732e-34");
131 int MantissaDigits = PickFP(Sem, 11, 24, 53, 64, 106, 113);
132 int Min10Exp = PickFP(Sem, -4, -37, -307, -4931, -291, -4931);
133 int Max10Exp = PickFP(Sem, 4, 38, 308, 4932, 308, 4932);
134 int MinExp = PickFP(Sem, -13, -125, -1021, -16381, -968, -16381);
135 int MaxExp = PickFP(Sem, 16, 128, 1024, 16384, 1024, 16384);
136 Min = PickFP(Sem, "6.103515625e-5", "1.17549435e-38", "2.2250738585072014e-308",
137 "3.36210314311209350626e-4932",
138 "2.00416836000897277799610805135016e-292",
139 "3.36210314311209350626267781732175260e-4932");
140 Max = PickFP(Sem, "6.5504e+4", "3.40282347e+38", "1.7976931348623157e+308",
141 "1.18973149535723176502e+4932",
142 "1.79769313486231580793728971405301e+308",
143 "1.18973149535723176508575932662800702e+4932");
144
145 SmallString<32> DefPrefix;
146 DefPrefix = "__";
147 DefPrefix += Prefix;
148 DefPrefix += "_";
149
150 Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext);
151 Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext);
152 Builder.defineMacro(DefPrefix + "HAS_DENORM__");
153 Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits));
154 Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits));
155 Builder.defineMacro(DefPrefix + "EPSILON__", Twine(Epsilon)+Ext);
156 Builder.defineMacro(DefPrefix + "HAS_INFINITY__");
157 Builder.defineMacro(DefPrefix + "HAS_QUIET_NAN__");
158 Builder.defineMacro(DefPrefix + "MANT_DIG__", Twine(MantissaDigits));
159
160 Builder.defineMacro(DefPrefix + "MAX_10_EXP__", Twine(Max10Exp));
161 Builder.defineMacro(DefPrefix + "MAX_EXP__", Twine(MaxExp));
162 Builder.defineMacro(DefPrefix + "MAX__", Twine(Max)+Ext);
163
164 Builder.defineMacro(DefPrefix + "MIN_10_EXP__","("+Twine(Min10Exp)+")");
165 Builder.defineMacro(DefPrefix + "MIN_EXP__", "("+Twine(MinExp)+")");
166 Builder.defineMacro(DefPrefix + "MIN__", Twine(Min)+Ext);
167}
168
169
170/// DefineTypeSize - Emit a macro to the predefines buffer that declares a macro
171/// named MacroName with the max value for a type with width 'TypeWidth' a
172/// signedness of 'isSigned' and with a value suffix of 'ValSuffix' (e.g. LL).
173static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,
174 StringRef ValSuffix, bool isSigned,
175 MacroBuilder &Builder) {
176 llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth)
177 : llvm::APInt::getMaxValue(TypeWidth);
178 Builder.defineMacro(MacroName, toString(MaxVal, 10, isSigned) + ValSuffix);
179}
180
181/// DefineTypeSize - An overloaded helper that uses TargetInfo to determine
182/// the width, suffix, and signedness of the given type
183static void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty,
184 const TargetInfo &TI, MacroBuilder &Builder) {
185 DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty),
186 TI.isTypeSigned(Ty), Builder);
187}
188
189static void DefineFmt(const LangOptions &LangOpts, const Twine &Prefix,
190 TargetInfo::IntType Ty, const TargetInfo &TI,
191 MacroBuilder &Builder) {
192 StringRef FmtModifier = TI.getTypeFormatModifier(Ty);
193 auto Emitter = [&](char Fmt) {
194 Builder.defineMacro(Prefix + "_FMT" + Twine(Fmt) + "__",
195 Twine("\"") + FmtModifier + Twine(Fmt) + "\"");
196 };
197 bool IsSigned = TI.isTypeSigned(Ty);
198 llvm::for_each(StringRef(IsSigned ? "di" : "ouxX"), Emitter);
199
200 // C23 added the b and B modifiers for printing binary output of unsigned
201 // integers. Conditionally define those if compiling in C23 mode.
202 if (LangOpts.C23 && !IsSigned)
203 llvm::for_each(StringRef("bB"), Emitter);
204}
205
206static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty,
207 MacroBuilder &Builder) {
208 Builder.defineMacro(MacroName, TargetInfo::getTypeName(Ty));
209}
210
211static void DefineTypeWidth(const Twine &MacroName, TargetInfo::IntType Ty,
212 const TargetInfo &TI, MacroBuilder &Builder) {
213 Builder.defineMacro(MacroName, Twine(TI.getTypeWidth(Ty)));
214}
215
216static void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth,
217 const TargetInfo &TI, MacroBuilder &Builder) {
218 Builder.defineMacro(MacroName,
219 Twine(BitWidth / TI.getCharWidth()));
220}
221
222// This will generate a macro based on the prefix with `_MAX__` as the suffix
223// for the max value representable for the type, and a macro with a `_WIDTH__`
224// suffix for the width of the type.
225static void DefineTypeSizeAndWidth(const Twine &Prefix, TargetInfo::IntType Ty,
226 const TargetInfo &TI,
227 MacroBuilder &Builder) {
228 DefineTypeSize(Prefix + "_MAX__", Ty, TI, Builder);
229 DefineTypeWidth(Prefix + "_WIDTH__", Ty, TI, Builder);
230}
231
232static void DefineExactWidthIntType(const LangOptions &LangOpts,
234 const TargetInfo &TI,
235 MacroBuilder &Builder) {
236 int TypeWidth = TI.getTypeWidth(Ty);
237 bool IsSigned = TI.isTypeSigned(Ty);
238
239 // Use the target specified int64 type, when appropriate, so that [u]int64_t
240 // ends up being defined in terms of the correct type.
241 if (TypeWidth == 64)
242 Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type();
243
244 // Use the target specified int16 type when appropriate. Some MCU targets
245 // (such as AVR) have definition of [u]int16_t to [un]signed int.
246 if (TypeWidth == 16)
247 Ty = IsSigned ? TI.getInt16Type() : TI.getUInt16Type();
248
249 const char *Prefix = IsSigned ? "__INT" : "__UINT";
250
251 DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
252 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
253
254 StringRef ConstSuffix(TI.getTypeConstantSuffix(Ty));
255 Builder.defineMacro(Prefix + Twine(TypeWidth) + "_C_SUFFIX__", ConstSuffix);
256 Builder.defineMacro(Prefix + Twine(TypeWidth) + "_C(c)",
257 ConstSuffix.size() ? Twine("c##") + ConstSuffix : "c");
258}
259
261 const TargetInfo &TI,
262 MacroBuilder &Builder) {
263 int TypeWidth = TI.getTypeWidth(Ty);
264 bool IsSigned = TI.isTypeSigned(Ty);
265
266 // Use the target specified int64 type, when appropriate, so that [u]int64_t
267 // ends up being defined in terms of the correct type.
268 if (TypeWidth == 64)
269 Ty = IsSigned ? TI.getInt64Type() : TI.getUInt64Type();
270
271 // We don't need to define a _WIDTH macro for the exact-width types because
272 // we already know the width.
273 const char *Prefix = IsSigned ? "__INT" : "__UINT";
274 DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
275}
276
277static void DefineLeastWidthIntType(const LangOptions &LangOpts,
278 unsigned TypeWidth, bool IsSigned,
279 const TargetInfo &TI,
280 MacroBuilder &Builder) {
281 TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned);
282 if (Ty == TargetInfo::NoInt)
283 return;
284
285 const char *Prefix = IsSigned ? "__INT_LEAST" : "__UINT_LEAST";
286 DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
287 // We only want the *_WIDTH macro for the signed types to avoid too many
288 // predefined macros (the unsigned width and the signed width are identical.)
289 if (IsSigned)
290 DefineTypeSizeAndWidth(Prefix + Twine(TypeWidth), Ty, TI, Builder);
291 else
292 DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
293 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
294}
295
296static void DefineFastIntType(const LangOptions &LangOpts, unsigned TypeWidth,
297 bool IsSigned, const TargetInfo &TI,
298 MacroBuilder &Builder) {
299 // stdint.h currently defines the fast int types as equivalent to the least
300 // types.
301 TargetInfo::IntType Ty = TI.getLeastIntTypeByWidth(TypeWidth, IsSigned);
302 if (Ty == TargetInfo::NoInt)
303 return;
304
305 const char *Prefix = IsSigned ? "__INT_FAST" : "__UINT_FAST";
306 DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
307 // We only want the *_WIDTH macro for the signed types to avoid too many
308 // predefined macros (the unsigned width and the signed width are identical.)
309 if (IsSigned)
310 DefineTypeSizeAndWidth(Prefix + Twine(TypeWidth), Ty, TI, Builder);
311 else
312 DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
313 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
314}
315
316
317/// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with
318/// the specified properties.
319static const char *getLockFreeValue(unsigned TypeWidth, const TargetInfo &TI) {
320 // Fully-aligned, power-of-2 sizes no larger than the inline
321 // width will be inlined as lock-free operations.
322 // Note: we do not need to check alignment since _Atomic(T) is always
323 // appropriately-aligned in clang.
324 if (TI.hasBuiltinAtomic(TypeWidth, TypeWidth))
325 return "2"; // "always lock free"
326 // We cannot be certain what operations the lib calls might be
327 // able to implement as lock-free on future processors.
328 return "1"; // "sometimes lock free"
329}
330
331/// Add definitions required for a smooth interaction between
332/// Objective-C++ automated reference counting and libstdc++ (4.2).
333static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,
334 MacroBuilder &Builder) {
335 Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
336
337 std::string Result;
338 {
339 // Provide specializations for the __is_scalar type trait so that
340 // lifetime-qualified objects are not considered "scalar" types, which
341 // libstdc++ uses as an indicator of the presence of trivial copy, assign,
342 // default-construct, and destruct semantics (none of which hold for
343 // lifetime-qualified objects in ARC).
344 llvm::raw_string_ostream Out(Result);
345
346 Out << "namespace std {\n"
347 << "\n"
348 << "struct __true_type;\n"
349 << "struct __false_type;\n"
350 << "\n";
351
352 Out << "template<typename _Tp> struct __is_scalar;\n"
353 << "\n";
354
355 if (LangOpts.ObjCAutoRefCount) {
356 Out << "template<typename _Tp>\n"
357 << "struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"
358 << " enum { __value = 0 };\n"
359 << " typedef __false_type __type;\n"
360 << "};\n"
361 << "\n";
362 }
363
364 if (LangOpts.ObjCWeak) {
365 Out << "template<typename _Tp>\n"
366 << "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"
367 << " enum { __value = 0 };\n"
368 << " typedef __false_type __type;\n"
369 << "};\n"
370 << "\n";
371 }
372
373 if (LangOpts.ObjCAutoRefCount) {
374 Out << "template<typename _Tp>\n"
375 << "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
376 << " _Tp> {\n"
377 << " enum { __value = 0 };\n"
378 << " typedef __false_type __type;\n"
379 << "};\n"
380 << "\n";
381 }
382
383 Out << "}\n";
384 }
385 Builder.append(Result);
386}
387
389 const LangOptions &LangOpts,
390 const FrontendOptions &FEOpts,
391 MacroBuilder &Builder) {
392 if (LangOpts.HLSL) {
393 Builder.defineMacro("__hlsl_clang");
394 // HLSL Version
395 Builder.defineMacro("__HLSL_VERSION",
396 Twine((unsigned)LangOpts.getHLSLVersion()));
397 Builder.defineMacro("__HLSL_202x",
398 Twine((unsigned)LangOptions::HLSLLangStd::HLSL_202x));
399 Builder.defineMacro("__HLSL_202y",
400 Twine((unsigned)LangOptions::HLSLLangStd::HLSL_202y));
401
402 if (LangOpts.NativeHalfType && LangOpts.NativeInt16Type)
403 Builder.defineMacro("__HLSL_ENABLE_16_BIT", "1");
404
405 // Shader target information
406 // "enums" for shader stages
407 Builder.defineMacro("__SHADER_STAGE_VERTEX",
409 Builder.defineMacro("__SHADER_STAGE_PIXEL",
411 Builder.defineMacro("__SHADER_STAGE_GEOMETRY",
413 Builder.defineMacro("__SHADER_STAGE_HULL",
415 Builder.defineMacro("__SHADER_STAGE_DOMAIN",
417 Builder.defineMacro("__SHADER_STAGE_COMPUTE",
419 Builder.defineMacro("__SHADER_STAGE_AMPLIFICATION",
421 Builder.defineMacro("__SHADER_STAGE_MESH",
423 Builder.defineMacro("__SHADER_STAGE_LIBRARY",
425 // The current shader stage itself
426 uint32_t StageInteger = static_cast<uint32_t>(
427 hlsl::getStageFromEnvironment(TI.getTriple().getEnvironment()));
428
429 Builder.defineMacro("__SHADER_TARGET_STAGE", Twine(StageInteger));
430 // Add target versions
431 if (TI.getTriple().getOS() == llvm::Triple::ShaderModel) {
432 VersionTuple Version = TI.getTriple().getOSVersion();
433 Builder.defineMacro("__SHADER_TARGET_MAJOR", Twine(Version.getMajor()));
434 unsigned Minor = Version.getMinor().value_or(0);
435 Builder.defineMacro("__SHADER_TARGET_MINOR", Twine(Minor));
436 }
437 return;
438 }
439 // C++ [cpp.predefined]p1:
440 // The following macro names shall be defined by the implementation:
441
442 // -- __STDC__
443 // [C++] Whether __STDC__ is predefined and if so, what its value is,
444 // are implementation-defined.
445 // (Removed in C++20.)
446 if ((!LangOpts.MSVCCompat || LangOpts.MSVCEnableStdcMacro) &&
447 !LangOpts.TraditionalCPP)
448 Builder.defineMacro("__STDC__");
449 // -- __STDC_HOSTED__
450 // The integer literal 1 if the implementation is a hosted
451 // implementation or the integer literal 0 if it is not.
452 if (LangOpts.Freestanding)
453 Builder.defineMacro("__STDC_HOSTED__", "0");
454 else
455 Builder.defineMacro("__STDC_HOSTED__");
456
457 // -- __STDC_VERSION__
458 // [C++] Whether __STDC_VERSION__ is predefined and if so, what its
459 // value is, are implementation-defined.
460 // (Removed in C++20.)
461 if (!LangOpts.CPlusPlus) {
462 if (std::optional<uint32_t> Lang = LangOpts.getCLangStd())
463 Builder.defineMacro("__STDC_VERSION__", Twine(*Lang) + "L");
464 } else {
465 // -- __cplusplus
466 Builder.defineMacro("__cplusplus",
467 Twine(*LangOpts.getCPlusPlusLangStd()) + "L");
468
469 // -- __STDCPP_DEFAULT_NEW_ALIGNMENT__
470 // [C++17] An integer literal of type std::size_t whose value is the
471 // alignment guaranteed by a call to operator new(std::size_t)
472 //
473 // We provide this in all language modes, since it seems generally useful.
474 Builder.defineMacro("__STDCPP_DEFAULT_NEW_ALIGNMENT__",
475 Twine(TI.getNewAlign() / TI.getCharWidth()) +
477
478 // -- __STDCPP_­THREADS__
479 // Defined, and has the value integer literal 1, if and only if a
480 // program can have more than one thread of execution.
481 if (LangOpts.getThreadModel() == LangOptions::ThreadModelKind::POSIX)
482 Builder.defineMacro("__STDCPP_THREADS__", "1");
483 }
484
485 // In C11 these are environment macros. In C++11 they are only defined
486 // as part of <cuchar>. To prevent breakage when mixing C and C++
487 // code, define these macros unconditionally. We can define them
488 // unconditionally, as Clang always uses UTF-16 and UTF-32 for 16-bit
489 // and 32-bit character literals.
490 Builder.defineMacro("__STDC_UTF_16__", "1");
491 Builder.defineMacro("__STDC_UTF_32__", "1");
492
493 // __has_embed definitions
494 Builder.defineMacro("__STDC_EMBED_NOT_FOUND__",
495 llvm::itostr(static_cast<int>(EmbedResult::NotFound)));
496 Builder.defineMacro("__STDC_EMBED_FOUND__",
497 llvm::itostr(static_cast<int>(EmbedResult::Found)));
498 Builder.defineMacro("__STDC_EMBED_EMPTY__",
499 llvm::itostr(static_cast<int>(EmbedResult::Empty)));
500
501 // We define this to '1' here to indicate that we only support '_Defer'
502 // as a keyword.
503 if (LangOpts.DeferTS)
504 Builder.defineMacro("__STDC_DEFER_TS25755__", "1");
505
506 if (LangOpts.ObjC)
507 Builder.defineMacro("__OBJC__");
508
509 // OpenCL v1.0/1.1 s6.9, v1.2/2.0 s6.10: Preprocessor Directives and Macros.
510 if (LangOpts.OpenCL) {
511 if (LangOpts.CPlusPlus) {
512 switch (LangOpts.OpenCLCPlusPlusVersion) {
513 case 100:
514 Builder.defineMacro("__OPENCL_CPP_VERSION__", "100");
515 break;
516 case 202100:
517 Builder.defineMacro("__OPENCL_CPP_VERSION__", "202100");
518 break;
519 default:
520 llvm_unreachable("Unsupported C++ version for OpenCL");
521 }
522 Builder.defineMacro("__CL_CPP_VERSION_1_0__", "100");
523 Builder.defineMacro("__CL_CPP_VERSION_2021__", "202100");
524 } else {
525 // OpenCL v1.0 and v1.1 do not have a predefined macro to indicate the
526 // language standard with which the program is compiled. __OPENCL_VERSION__
527 // is for the OpenCL version supported by the OpenCL device, which is not
528 // necessarily the language standard with which the program is compiled.
529 // A shared OpenCL header file requires a macro to indicate the language
530 // standard. As a workaround, __OPENCL_C_VERSION__ is defined for
531 // OpenCL v1.0 and v1.1.
532 switch (LangOpts.OpenCLVersion) {
533 case 100:
534 Builder.defineMacro("__OPENCL_C_VERSION__", "100");
535 break;
536 case 110:
537 Builder.defineMacro("__OPENCL_C_VERSION__", "110");
538 break;
539 case 120:
540 Builder.defineMacro("__OPENCL_C_VERSION__", "120");
541 break;
542 case 200:
543 Builder.defineMacro("__OPENCL_C_VERSION__", "200");
544 break;
545 case 300:
546 Builder.defineMacro("__OPENCL_C_VERSION__", "300");
547 break;
548 case 310:
549 Builder.defineMacro("__OPENCL_C_VERSION__", "310");
550 break;
551 default:
552 llvm_unreachable("Unsupported OpenCL version");
553 }
554 }
555 Builder.defineMacro("CL_VERSION_1_0", "100");
556 Builder.defineMacro("CL_VERSION_1_1", "110");
557 Builder.defineMacro("CL_VERSION_1_2", "120");
558 Builder.defineMacro("CL_VERSION_2_0", "200");
559 Builder.defineMacro("CL_VERSION_3_0", "300");
560 Builder.defineMacro("CL_VERSION_3_1", "310");
561
562 if (TI.isLittleEndian())
563 Builder.defineMacro("__ENDIAN_LITTLE__");
564
565 if (LangOpts.FastRelaxedMath)
566 Builder.defineMacro("__FAST_RELAXED_MATH__");
567 }
568
569 if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) {
570 // SYCL Version is set to a value when building SYCL applications
571 if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2017)
572 Builder.defineMacro("CL_SYCL_LANGUAGE_VERSION", "121");
573 else if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2020)
574 Builder.defineMacro("SYCL_LANGUAGE_VERSION", "202012L");
575 }
576
577 // Not "standard" per se, but available even with the -undef flag.
578 if (LangOpts.AsmPreprocessor)
579 Builder.defineMacro("__ASSEMBLER__");
580 if (LangOpts.CUDA) {
581 if (LangOpts.GPURelocatableDeviceCode)
582 Builder.defineMacro("__CLANG_RDC__");
583 if (!LangOpts.HIP)
584 Builder.defineMacro("__CUDA__");
585 if (LangOpts.GPUDefaultStream ==
587 Builder.defineMacro("CUDA_API_PER_THREAD_DEFAULT_STREAM");
588 }
589 if (LangOpts.HIP) {
590 Builder.defineMacro("__HIP__");
591 Builder.defineMacro("__HIPCC__");
592 Builder.defineMacro("__HIP_MEMORY_SCOPE_SINGLETHREAD", "1");
593 Builder.defineMacro("__HIP_MEMORY_SCOPE_WAVEFRONT", "2");
594 Builder.defineMacro("__HIP_MEMORY_SCOPE_WORKGROUP", "3");
595 Builder.defineMacro("__HIP_MEMORY_SCOPE_AGENT", "4");
596 Builder.defineMacro("__HIP_MEMORY_SCOPE_SYSTEM", "5");
597 Builder.defineMacro("__HIP_MEMORY_SCOPE_CLUSTER", "6");
598 if (LangOpts.HIPStdPar) {
599 Builder.defineMacro("__HIPSTDPAR__");
600 if (LangOpts.HIPStdParInterposeAlloc) {
601 Builder.defineMacro("__HIPSTDPAR_INTERPOSE_ALLOC__");
602 Builder.defineMacro("__HIPSTDPAR_INTERPOSE_ALLOC_V1__");
603 }
604 }
605 if (LangOpts.CUDAIsDevice) {
606 Builder.defineMacro("__HIP_DEVICE_COMPILE__");
607 if (TI.getTriple().getEnvironment() == llvm::Triple::LLVM)
608 Builder.defineMacro("__HIP_LLVM__");
609 if (!TI.hasHIPImageSupport()) {
610 Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT__", "1");
611 // Deprecated.
612 Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT", "1");
613 }
614 }
615 if (LangOpts.GPUDefaultStream ==
617 Builder.defineMacro("__HIP_API_PER_THREAD_DEFAULT_STREAM__");
618 // Deprecated.
619 Builder.defineMacro("HIP_API_PER_THREAD_DEFAULT_STREAM");
620 }
621 }
622
623 if (LangOpts.OpenACC)
624 Builder.defineMacro("_OPENACC", "202506");
625}
626
627/// Initialize the predefined C++ language feature test macros defined in
628/// ISO/IEC JTC1/SC22/WG21 (C++) SD-6: "SG10 Feature Test Recommendations".
630 MacroBuilder &Builder,
631 const TargetInfo &TI) {
632 // C++98 features.
633 if (LangOpts.RTTI)
634 Builder.defineMacro("__cpp_rtti", "199711L");
635 if (LangOpts.CXXExceptions)
636 Builder.defineMacro("__cpp_exceptions", "199711L");
637
638 // C++11 features.
639 if (LangOpts.CPlusPlus11) {
640 Builder.defineMacro("__cpp_unicode_characters", "200704L");
641 Builder.defineMacro("__cpp_raw_strings", "200710L");
642 Builder.defineMacro("__cpp_unicode_literals", "200710L");
643 Builder.defineMacro("__cpp_user_defined_literals", "200809L");
644 Builder.defineMacro("__cpp_lambdas", "200907L");
645 Builder.defineMacro("__cpp_constexpr", LangOpts.CPlusPlus26 ? "202406L"
646 : LangOpts.CPlusPlus23 ? "202211L"
647 : LangOpts.CPlusPlus20 ? "202002L"
648 : LangOpts.CPlusPlus17 ? "201603L"
649 : LangOpts.CPlusPlus14 ? "201304L"
650 : "200704");
651 Builder.defineMacro("__cpp_constexpr_in_decltype", "201711L");
652 Builder.defineMacro("__cpp_range_based_for",
653 LangOpts.CPlusPlus23 ? "202211L"
654 : LangOpts.CPlusPlus17 ? "201603L"
655 : "200907");
656 // C++17 / C++26 static_assert supported as an extension in earlier language
657 // modes, so we use the C++26 value.
658 Builder.defineMacro("__cpp_static_assert", "202306L");
659 Builder.defineMacro("__cpp_decltype", "200707L");
660 Builder.defineMacro("__cpp_attributes", "200809L");
661 Builder.defineMacro("__cpp_rvalue_references", "200610L");
662 Builder.defineMacro("__cpp_variadic_templates", "200704L");
663 Builder.defineMacro("__cpp_initializer_lists", "200806L");
664 Builder.defineMacro("__cpp_delegating_constructors", "200604L");
665 Builder.defineMacro("__cpp_nsdmi", "200809L");
666 Builder.defineMacro("__cpp_inheriting_constructors", "201511L");
667 Builder.defineMacro("__cpp_ref_qualifiers", "200710L");
668 Builder.defineMacro("__cpp_alias_templates", "200704L");
669 }
670 if (LangOpts.ThreadsafeStatics)
671 Builder.defineMacro("__cpp_threadsafe_static_init", "200806L");
672
673 // C++14 features.
674 if (LangOpts.CPlusPlus14) {
675 Builder.defineMacro("__cpp_binary_literals", "201304L");
676 Builder.defineMacro("__cpp_digit_separators", "201309L");
677 Builder.defineMacro("__cpp_init_captures",
678 LangOpts.CPlusPlus20 ? "201803L" : "201304L");
679 Builder.defineMacro("__cpp_generic_lambdas",
680 LangOpts.CPlusPlus20 ? "201707L" : "201304L");
681 Builder.defineMacro("__cpp_decltype_auto", "201304L");
682 Builder.defineMacro("__cpp_return_type_deduction", "201304L");
683 Builder.defineMacro("__cpp_aggregate_nsdmi", "201304L");
684 Builder.defineMacro("__cpp_variable_templates", "201304L");
685 }
686 if (LangOpts.SizedDeallocation)
687 Builder.defineMacro("__cpp_sized_deallocation", "201309L");
688
689 // C++17 features.
690 if (LangOpts.CPlusPlus17) {
691 Builder.defineMacro("__cpp_hex_float", "201603L");
692 Builder.defineMacro("__cpp_inline_variables", "201606L");
693 Builder.defineMacro("__cpp_noexcept_function_type", "201510L");
694 Builder.defineMacro("__cpp_capture_star_this", "201603L");
695 Builder.defineMacro("__cpp_if_constexpr", "201606L");
696 Builder.defineMacro("__cpp_deduction_guides", "201703L"); // (not latest)
697 Builder.defineMacro("__cpp_template_auto", "201606L"); // (old name)
698 Builder.defineMacro("__cpp_namespace_attributes", "201411L");
699 Builder.defineMacro("__cpp_enumerator_attributes", "201411L");
700 Builder.defineMacro("__cpp_nested_namespace_definitions", "201411L");
701 Builder.defineMacro("__cpp_variadic_using", "201611L");
702 Builder.defineMacro("__cpp_aggregate_bases", "201603L");
703 Builder.defineMacro("__cpp_structured_bindings", "202411L");
704 Builder.defineMacro("__cpp_nontype_template_args",
705 "201411L"); // (not latest)
706 Builder.defineMacro("__cpp_fold_expressions", "201603L");
707 Builder.defineMacro("__cpp_guaranteed_copy_elision", "201606L");
708 Builder.defineMacro("__cpp_nontype_template_parameter_auto", "201606L");
709 }
710 if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)
711 Builder.defineMacro("__cpp_aligned_new", "201606L");
712
713 Builder.defineMacro("__cpp_template_template_args", "201611L");
714
715 // C++20 features.
716 if (LangOpts.CPlusPlus20) {
717 Builder.defineMacro("__cpp_aggregate_paren_init", "201902L");
718
719 Builder.defineMacro("__cpp_concepts", "202002");
720 Builder.defineMacro("__cpp_conditional_explicit", "201806L");
721 Builder.defineMacro("__cpp_consteval", "202211L");
722 Builder.defineMacro("__cpp_constexpr_dynamic_alloc", "201907L");
723 Builder.defineMacro("__cpp_constinit", "201907L");
724
725 // Support for coroutines on 32-bit x86 Microsoft platforms is
726 // incomplete, do not advertise it.
727 if (!(TI.getCXXABI().isMicrosoft() && TI.getTriple().isX86_32()))
728 Builder.defineMacro("__cpp_impl_coroutine", "201902L");
729
730 Builder.defineMacro("__cpp_designated_initializers", "201707L");
731 Builder.defineMacro("__cpp_impl_three_way_comparison", "201907L");
732 // Intentionally to set __cpp_modules to 1.
733 // See https://github.com/llvm/llvm-project/issues/71364 for details.
734 // Builder.defineMacro("__cpp_modules", "201907L");
735 Builder.defineMacro("__cpp_modules", "1");
736 Builder.defineMacro("__cpp_using_enum", "201907L");
737 }
738 // C++23 features.
739 if (LangOpts.CPlusPlus23) {
740 Builder.defineMacro("__cpp_implicit_move", "202207L");
741 Builder.defineMacro("__cpp_size_t_suffix", "202011L");
742 Builder.defineMacro("__cpp_if_consteval", "202106L");
743 Builder.defineMacro("__cpp_multidimensional_subscript", "202211L");
744 Builder.defineMacro("__cpp_auto_cast", "202110L");
745 Builder.defineMacro("__cpp_explicit_this_parameter", "202110L");
746 }
747
748 // We provide those C++23 features as extensions in earlier language modes, so
749 // we also define their feature test macros.
750 if (LangOpts.CPlusPlus11)
751 Builder.defineMacro("__cpp_static_call_operator", "202207L");
752 Builder.defineMacro("__cpp_named_character_escapes", "202606L");
753 Builder.defineMacro("__cpp_placeholder_variables", "202306L");
754
755 // C++26 features supported in earlier language modes.
756 Builder.defineMacro("__cpp_pack_indexing", "202311L");
757 Builder.defineMacro("__cpp_deleted_function", "202403L");
758 Builder.defineMacro("__cpp_variadic_friend", "202403L");
759 Builder.defineMacro("__cpp_trivial_relocatability", "202502L");
760
761 if (LangOpts.Char8)
762 Builder.defineMacro("__cpp_char8_t", "202207L");
763 Builder.defineMacro("__cpp_impl_destroying_delete", "201806L");
764}
765
766/// InitializeOpenCLFeatureTestMacros - Define OpenCL macros based on target
767/// settings and language version
769 const LangOptions &Opts,
770 MacroBuilder &Builder) {
771 const llvm::StringMap<bool> &OpenCLFeaturesMap = TI.getSupportedOpenCLOpts();
772 // FIXME: OpenCL options which affect language semantics/syntax
773 // should be moved into LangOptions.
774 auto defineOpenCLExtMacro = [&](llvm::StringRef Name, auto... OptArgs) {
775 // Check if extension is supported by target and is available in this
776 // OpenCL version
777 if (TI.hasFeatureEnabled(OpenCLFeaturesMap, Name) &&
779 Builder.defineMacro(Name);
780 };
781#define OPENCL_GENERIC_EXTENSION(Ext, ...) \
782 defineOpenCLExtMacro(#Ext, __VA_ARGS__);
783#include "clang/Basic/OpenCLExtensions.def"
784
785 // Assume compiling for FULL profile
786 Builder.defineMacro("__opencl_c_int64");
787}
788
790 llvm::StringRef Suffix) {
791 if (Val.isSigned() && Val == llvm::APFixedPoint::getMin(Val.getSemantics())) {
792 // When representing the min value of a signed fixed point type in source
793 // code, we cannot simply write `-<lowest value>`. For example, the min
794 // value of a `short _Fract` cannot be written as `-1.0hr`. This is because
795 // the parser will read this (and really any negative numerical literal) as
796 // a UnaryOperator that owns a FixedPointLiteral with a positive value
797 // rather than just a FixedPointLiteral with a negative value. Compiling
798 // `-1.0hr` results in an overflow to the maximal value of that fixed point
799 // type. The correct way to represent a signed min value is to instead split
800 // it into two halves, like `(-0.5hr-0.5hr)` which is what the standard
801 // defines SFRACT_MIN as.
802 llvm::SmallString<32> Literal;
803 Literal.push_back('(');
804 llvm::SmallString<32> HalfStr =
805 ConstructFixedPointLiteral(Val.shr(1), Suffix);
806 Literal += HalfStr;
807 Literal += HalfStr;
808 Literal.push_back(')');
809 return Literal;
810 }
811
812 llvm::SmallString<32> Str(Val.toString());
813 Str += Suffix;
814 return Str;
815}
816
818 llvm::StringRef TypeName, llvm::StringRef Suffix,
819 unsigned Width, unsigned Scale, bool Signed) {
820 // Saturation doesn't affect the size or scale of a fixed point type, so we
821 // don't need it here.
822 llvm::FixedPointSemantics FXSema(
823 Width, Scale, Signed, /*IsSaturated=*/false,
825 llvm::SmallString<32> MacroPrefix("__");
826 MacroPrefix += TypeName;
827 Builder.defineMacro(MacroPrefix + "_EPSILON__",
829 llvm::APFixedPoint::getEpsilon(FXSema), Suffix));
830 Builder.defineMacro(MacroPrefix + "_FBIT__", Twine(Scale));
831 Builder.defineMacro(
832 MacroPrefix + "_MAX__",
833 ConstructFixedPointLiteral(llvm::APFixedPoint::getMax(FXSema), Suffix));
834
835 // ISO/IEC TR 18037:2008 doesn't specify MIN macros for unsigned types since
836 // they're all just zero.
837 if (Signed)
838 Builder.defineMacro(
839 MacroPrefix + "_MIN__",
840 ConstructFixedPointLiteral(llvm::APFixedPoint::getMin(FXSema), Suffix));
841}
842
844 const LangOptions &LangOpts,
845 const FrontendOptions &FEOpts,
846 const PreprocessorOptions &PPOpts,
847 const CodeGenOptions &CGOpts,
848 MacroBuilder &Builder) {
849 // Compiler version introspection macros.
850 Builder.defineMacro("__llvm__"); // LLVM Backend
851 Builder.defineMacro("__clang__"); // Clang Frontend
852#define TOSTR2(X) #X
853#define TOSTR(X) TOSTR2(X)
854 Builder.defineMacro("__clang_major__", TOSTR(CLANG_VERSION_MAJOR));
855 Builder.defineMacro("__clang_minor__", TOSTR(CLANG_VERSION_MINOR));
856 Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL));
857#undef TOSTR
858#undef TOSTR2
859 Builder.defineMacro("__clang_version__",
860 "\"" CLANG_VERSION_STRING " "
862
863 if (LangOpts.GNUCVersion != 0) {
864 // Major, minor, patch, are given two decimal places each, so 4.2.1 becomes
865 // 40201.
866 unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100;
867 unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100;
868 unsigned GNUCPatch = LangOpts.GNUCVersion % 100;
869 Builder.defineMacro("__GNUC__", Twine(GNUCMajor));
870 Builder.defineMacro("__GNUC_MINOR__", Twine(GNUCMinor));
871 Builder.defineMacro("__GNUC_PATCHLEVEL__", Twine(GNUCPatch));
872 Builder.defineMacro("__GXX_ABI_VERSION", "1002");
873
874 if (LangOpts.CPlusPlus) {
875 Builder.defineMacro("__GNUG__", Twine(GNUCMajor));
876 Builder.defineMacro("__GXX_WEAK__");
877 }
878 }
879
880 // Define macros for the C11 / C++11 memory orderings
881 Builder.defineMacro("__ATOMIC_RELAXED", "0");
882 Builder.defineMacro("__ATOMIC_CONSUME", "1");
883 Builder.defineMacro("__ATOMIC_ACQUIRE", "2");
884 Builder.defineMacro("__ATOMIC_RELEASE", "3");
885 Builder.defineMacro("__ATOMIC_ACQ_REL", "4");
886 Builder.defineMacro("__ATOMIC_SEQ_CST", "5");
887
888 // Define macros for the clang atomic scopes.
889 Builder.defineMacro("__MEMORY_SCOPE_SYSTEM", "0");
890 Builder.defineMacro("__MEMORY_SCOPE_DEVICE", "1");
891 Builder.defineMacro("__MEMORY_SCOPE_WRKGRP", "2");
892 Builder.defineMacro("__MEMORY_SCOPE_WVFRNT", "3");
893 Builder.defineMacro("__MEMORY_SCOPE_SINGLE", "4");
894 Builder.defineMacro("__MEMORY_SCOPE_CLUSTR", "5");
895
896 // Define macros for the OpenCL memory scope.
897 // The values should match AtomicScopeOpenCLModel::ID enum.
898 static_assert(
899 static_cast<unsigned>(AtomicScopeOpenCLModel::WorkGroup) == 1 &&
900 static_cast<unsigned>(AtomicScopeOpenCLModel::Device) == 2 &&
901 static_cast<unsigned>(AtomicScopeOpenCLModel::AllSVMDevices) == 3 &&
902 static_cast<unsigned>(AtomicScopeOpenCLModel::SubGroup) == 4,
903 "Invalid OpenCL memory scope enum definition");
904 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_ITEM", "0");
905 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_GROUP", "1");
906 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_DEVICE", "2");
907 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES", "3");
908 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_SUB_GROUP", "4");
909
910 // Define macros for floating-point data classes, used in __builtin_isfpclass.
911 Builder.defineMacro("__FPCLASS_SNAN", "0x0001");
912 Builder.defineMacro("__FPCLASS_QNAN", "0x0002");
913 Builder.defineMacro("__FPCLASS_NEGINF", "0x0004");
914 Builder.defineMacro("__FPCLASS_NEGNORMAL", "0x0008");
915 Builder.defineMacro("__FPCLASS_NEGSUBNORMAL", "0x0010");
916 Builder.defineMacro("__FPCLASS_NEGZERO", "0x0020");
917 Builder.defineMacro("__FPCLASS_POSZERO", "0x0040");
918 Builder.defineMacro("__FPCLASS_POSSUBNORMAL", "0x0080");
919 Builder.defineMacro("__FPCLASS_POSNORMAL", "0x0100");
920 Builder.defineMacro("__FPCLASS_POSINF", "0x0200");
921
922 // Support for #pragma redefine_extname (Sun compatibility)
923 Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1");
924
925 // Previously this macro was set to a string aiming to achieve compatibility
926 // with GCC 4.2.1. Now, just return the full Clang version
927 Builder.defineMacro("__VERSION__", "\"" +
928 Twine(getClangFullCPPVersion()) + "\"");
929
930 // Initialize language-specific preprocessor defines.
931
932 // Standard conforming mode?
933 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
934 Builder.defineMacro("__STRICT_ANSI__");
935
936 if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11)
937 Builder.defineMacro("__GXX_EXPERIMENTAL_CXX0X__");
938
939 if (TI.getTriple().isOSCygMing()) {
940 // Set ABI defining macros for libstdc++ for MinGW and Cygwin, where the
941 // default in libstdc++ differs from the defaults for this target.
942 Builder.defineMacro("__GXX_TYPEINFO_EQUALITY_INLINE", "0");
943 }
944
945 if (LangOpts.ObjC) {
946 if (LangOpts.ObjCRuntime.isNonFragile()) {
947 Builder.defineMacro("__OBJC2__");
948
949 if (LangOpts.ObjCExceptions)
950 Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS");
951 }
952
953 if (LangOpts.getGC() != LangOptions::NonGC)
954 Builder.defineMacro("__OBJC_GC__");
955
956 if (LangOpts.ObjCRuntime.isNeXTFamily())
957 Builder.defineMacro("__NEXT_RUNTIME__");
958
959 if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::GNUstep) {
960 auto version = LangOpts.ObjCRuntime.getVersion();
961 // Don't rely on the tuple argument, because we can be asked to target
962 // later ABIs than we actually support, so clamp these values to those
963 // currently supported
964 if (version >= VersionTuple(2, 0))
965 Builder.defineMacro("__OBJC_GNUSTEP_RUNTIME_ABI__", "20");
966 else
967 Builder.defineMacro(
968 "__OBJC_GNUSTEP_RUNTIME_ABI__",
969 "1" + Twine(std::min(8U, version.getMinor().value_or(0))));
970 }
971
972 if (LangOpts.ObjCRuntime.getKind() == ObjCRuntime::ObjFW) {
973 VersionTuple tuple = LangOpts.ObjCRuntime.getVersion();
974 unsigned minor = tuple.getMinor().value_or(0);
975 unsigned subminor = tuple.getSubminor().value_or(0);
976 Builder.defineMacro("__OBJFW_RUNTIME_ABI__",
977 Twine(tuple.getMajor() * 10000 + minor * 100 +
978 subminor));
979 }
980
981 Builder.defineMacro("IBOutlet", "__attribute__((iboutlet))");
982 Builder.defineMacro("IBOutletCollection(ClassName)",
983 "__attribute__((iboutletcollection(ClassName)))");
984 Builder.defineMacro("IBAction", "void)__attribute__((ibaction)");
985 Builder.defineMacro("IBInspectable", "");
986 Builder.defineMacro("IB_DESIGNABLE", "");
987 }
988
989 // Define a macro that describes the Objective-C boolean type even for C
990 // and C++ since BOOL can be used from non Objective-C code.
991 Builder.defineMacro("__OBJC_BOOL_IS_BOOL",
992 Twine(TI.useSignedCharForObjCBool() ? "0" : "1"));
993
994 if (LangOpts.CPlusPlus)
995 InitializeCPlusPlusFeatureTestMacros(LangOpts, Builder, TI);
996
997 // darwin_constant_cfstrings controls this. This is also dependent
998 // on other things like the runtime I believe. This is set even for C code.
999 if (!LangOpts.NoConstantCFStrings)
1000 Builder.defineMacro("__CONSTANT_CFSTRINGS__");
1001
1002 if (LangOpts.ObjC)
1003 Builder.defineMacro("OBJC_NEW_PROPERTIES");
1004
1005 if (LangOpts.PascalStrings)
1006 Builder.defineMacro("__PASCAL_STRINGS__");
1007
1008 if (LangOpts.Blocks) {
1009 Builder.defineMacro("__block", "__attribute__((__blocks__(byref)))");
1010 Builder.defineMacro("__BLOCKS__");
1011 }
1012
1013 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
1014 Builder.defineMacro("__EXCEPTIONS");
1015 if (LangOpts.GNUCVersion && LangOpts.RTTI)
1016 Builder.defineMacro("__GXX_RTTI");
1017
1018 if (CGOpts.hasSjLjExceptions())
1019 Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__");
1020 else if (CGOpts.hasSEHExceptions())
1021 Builder.defineMacro("__SEH__");
1022 else if (CGOpts.hasDWARFExceptions() &&
1023 (TI.getTriple().isThumb() || TI.getTriple().isARM()))
1024 Builder.defineMacro("__ARM_DWARF_EH__");
1025 else if (CGOpts.hasWasmExceptions() && TI.getTriple().isWasm())
1026 Builder.defineMacro("__WASM_EXCEPTIONS__");
1027
1028 if (LangOpts.Deprecated)
1029 Builder.defineMacro("__DEPRECATED");
1030
1031 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus)
1032 Builder.defineMacro("__private_extern__", "extern");
1033
1034 if (LangOpts.MicrosoftExt) {
1035 if (LangOpts.WChar) {
1036 // wchar_t supported as a keyword.
1037 Builder.defineMacro("_WCHAR_T_DEFINED");
1038 Builder.defineMacro("_NATIVE_WCHAR_T_DEFINED");
1039 }
1040 }
1041
1042 // Macros to help identify the narrow and wide character sets. This is set
1043 // to fexec-charset. If fexec-charset is not specified, the default is the
1044 // system charset.
1045 Builder.defineMacro("__clang_literal_encoding__",
1046 Twine("\"" +
1047 (LangOpts.LiteralEncoding.empty()
1049 : LangOpts.LiteralEncoding) +
1050 "\""));
1051
1052 if (TI.getTypeWidth(TI.getWCharType()) >= 32) {
1053 // FIXME: 32-bit wchar_t signals UTF-32. This may change
1054 // if -fwide-exec-charset= is ever supported.
1055 Builder.defineMacro("__clang_wide_literal_encoding__", "\"UTF-32\"");
1056 } else {
1057 // FIXME: Less-than 32-bit wchar_t generally means UTF-16
1058 // (e.g., Windows, 32-bit IBM). This may need to be
1059 // updated if -fwide-exec-charset= is ever supported.
1060 Builder.defineMacro("__clang_wide_literal_encoding__", "\"UTF-16\"");
1061 }
1062
1063 if (CGOpts.OptimizationLevel != 0)
1064 Builder.defineMacro("__OPTIMIZE__");
1065 if (CGOpts.OptimizeSize != 0)
1066 Builder.defineMacro("__OPTIMIZE_SIZE__");
1067
1068 if (LangOpts.FastMath)
1069 Builder.defineMacro("__FAST_MATH__");
1070
1071 // Initialize target-specific preprocessor defines.
1072
1073 // __BYTE_ORDER__ was added in GCC 4.6. It's analogous
1074 // to the macro __BYTE_ORDER (no trailing underscores)
1075 // from glibc's <endian.h> header.
1076 // We don't support the PDP-11 as a target, but include
1077 // the define so it can still be compared against.
1078 Builder.defineMacro("__ORDER_LITTLE_ENDIAN__", "1234");
1079 Builder.defineMacro("__ORDER_BIG_ENDIAN__", "4321");
1080 Builder.defineMacro("__ORDER_PDP_ENDIAN__", "3412");
1081 if (TI.isBigEndian()) {
1082 Builder.defineMacro("__BYTE_ORDER__", "__ORDER_BIG_ENDIAN__");
1083 Builder.defineMacro("__BIG_ENDIAN__");
1084 } else {
1085 Builder.defineMacro("__BYTE_ORDER__", "__ORDER_LITTLE_ENDIAN__");
1086 Builder.defineMacro("__LITTLE_ENDIAN__");
1087 }
1088
1089 if (TI.getPointerWidth(LangAS::Default) == 64 && TI.getLongWidth() == 64 &&
1090 TI.getIntWidth() == 32) {
1091 Builder.defineMacro("_LP64");
1092 Builder.defineMacro("__LP64__");
1093 }
1094
1095 if (TI.getPointerWidth(LangAS::Default) == 32 && TI.getLongWidth() == 32 &&
1096 TI.getIntWidth() == 32) {
1097 Builder.defineMacro("_ILP32");
1098 Builder.defineMacro("__ILP32__");
1099 }
1100
1101 // Define type sizing macros based on the target properties.
1102 assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far");
1103 Builder.defineMacro("__CHAR_BIT__", Twine(TI.getCharWidth()));
1104
1105 // The macro is specifying the number of bits in the width, not the number of
1106 // bits the object requires for its in-memory representation, which is what
1107 // getBoolWidth() will return. The bool/_Bool data type is only ever one bit
1108 // wide. See C23 6.2.6.2p2 for the rules in C. Note that
1109 // C++23 [basic.fundamental]p10 allows an implementation-defined value
1110 // representation for bool; when lowering to LLVM, Clang represents bool as an
1111 // i8 in memory but as an i1 when the value is needed, so '1' is also correct
1112 // for C++.
1113 Builder.defineMacro("__BOOL_WIDTH__", "1");
1114 Builder.defineMacro("__SHRT_WIDTH__", Twine(TI.getShortWidth()));
1115 Builder.defineMacro("__INT_WIDTH__", Twine(TI.getIntWidth()));
1116 Builder.defineMacro("__LONG_WIDTH__", Twine(TI.getLongWidth()));
1117 Builder.defineMacro("__LLONG_WIDTH__", Twine(TI.getLongLongWidth()));
1118
1119 size_t BitIntMaxWidth = TI.getMaxBitIntWidth();
1120 assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&
1121 "Target defined a max bit width larger than LLVM can support!");
1122 assert(BitIntMaxWidth >= TI.getLongLongWidth() &&
1123 "Target defined a max bit width smaller than the C standard allows!");
1124 Builder.defineMacro("__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));
1125
1126 DefineTypeSize("__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder);
1127 DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder);
1128 DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Builder);
1129 DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Builder);
1130 DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder);
1131 DefineTypeSizeAndWidth("__WCHAR", TI.getWCharType(), TI, Builder);
1132 DefineTypeSizeAndWidth("__WINT", TI.getWIntType(), TI, Builder);
1133 DefineTypeSizeAndWidth("__INTMAX", TI.getIntMaxType(), TI, Builder);
1134 DefineTypeSizeAndWidth("__SIZE", TI.getSizeType(), TI, Builder);
1135
1136 DefineTypeSizeAndWidth("__UINTMAX", TI.getUIntMaxType(), TI, Builder);
1138 Builder);
1139 DefineTypeSizeAndWidth("__INTPTR", TI.getIntPtrType(), TI, Builder);
1140 DefineTypeSizeAndWidth("__UINTPTR", TI.getUIntPtrType(), TI, Builder);
1141
1142 DefineTypeSizeof("__SIZEOF_DOUBLE__", TI.getDoubleWidth(), TI, Builder);
1143 DefineTypeSizeof("__SIZEOF_FLOAT__", TI.getFloatWidth(), TI, Builder);
1144 DefineTypeSizeof("__SIZEOF_INT__", TI.getIntWidth(), TI, Builder);
1145 DefineTypeSizeof("__SIZEOF_LONG__", TI.getLongWidth(), TI, Builder);
1146 DefineTypeSizeof("__SIZEOF_LONG_DOUBLE__",TI.getLongDoubleWidth(),TI,Builder);
1147 DefineTypeSizeof("__SIZEOF_LONG_LONG__", TI.getLongLongWidth(), TI, Builder);
1148 DefineTypeSizeof("__SIZEOF_POINTER__", TI.getPointerWidth(LangAS::Default),
1149 TI, Builder);
1150 DefineTypeSizeof("__SIZEOF_SHORT__", TI.getShortWidth(), TI, Builder);
1151 DefineTypeSizeof("__SIZEOF_PTRDIFF_T__",
1153 Builder);
1154 DefineTypeSizeof("__SIZEOF_SIZE_T__",
1155 TI.getTypeWidth(TI.getSizeType()), TI, Builder);
1156 DefineTypeSizeof("__SIZEOF_WCHAR_T__",
1157 TI.getTypeWidth(TI.getWCharType()), TI, Builder);
1158 DefineTypeSizeof("__SIZEOF_WINT_T__",
1159 TI.getTypeWidth(TI.getWIntType()), TI, Builder);
1160 if (TI.hasInt128Type())
1161 DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder);
1162
1163 DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder);
1164 DefineFmt(LangOpts, "__INTMAX", TI.getIntMaxType(), TI, Builder);
1165 StringRef ConstSuffix(TI.getTypeConstantSuffix(TI.getIntMaxType()));
1166 Builder.defineMacro("__INTMAX_C_SUFFIX__", ConstSuffix);
1167 Builder.defineMacro("__INTMAX_C(c)",
1168 ConstSuffix.size() ? Twine("c##") + ConstSuffix : "c");
1169 DefineType("__UINTMAX_TYPE__", TI.getUIntMaxType(), Builder);
1170 DefineFmt(LangOpts, "__UINTMAX", TI.getUIntMaxType(), TI, Builder);
1171 ConstSuffix = TI.getTypeConstantSuffix(TI.getUIntMaxType());
1172 Builder.defineMacro("__UINTMAX_C_SUFFIX__", ConstSuffix);
1173 Builder.defineMacro("__UINTMAX_C(c)",
1174 ConstSuffix.size() ? Twine("c##") + ConstSuffix : "c");
1175 DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(LangAS::Default), Builder);
1176 DefineFmt(LangOpts, "__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI,
1177 Builder);
1178 DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder);
1179 DefineFmt(LangOpts, "__INTPTR", TI.getIntPtrType(), TI, Builder);
1180 DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder);
1181 DefineFmt(LangOpts, "__SIZE", TI.getSizeType(), TI, Builder);
1182 DefineType("__WCHAR_TYPE__", TI.getWCharType(), Builder);
1183 DefineType("__WINT_TYPE__", TI.getWIntType(), Builder);
1184 DefineTypeSizeAndWidth("__SIG_ATOMIC", TI.getSigAtomicType(), TI, Builder);
1185 if (LangOpts.C23)
1186 DefineType("__CHAR8_TYPE__", TI.UnsignedChar, Builder);
1187 DefineType("__CHAR16_TYPE__", TI.getChar16Type(), Builder);
1188 DefineType("__CHAR32_TYPE__", TI.getChar32Type(), Builder);
1189
1190 DefineType("__UINTPTR_TYPE__", TI.getUIntPtrType(), Builder);
1191 DefineFmt(LangOpts, "__UINTPTR", TI.getUIntPtrType(), TI, Builder);
1192
1193 // The C standard requires the width of uintptr_t and intptr_t to be the same,
1194 // per 7.20.2.4p1. Same for intmax_t and uintmax_t, per 7.20.2.5p1.
1195 assert(TI.getTypeWidth(TI.getUIntPtrType()) ==
1196 TI.getTypeWidth(TI.getIntPtrType()) &&
1197 "uintptr_t and intptr_t have different widths?");
1198 assert(TI.getTypeWidth(TI.getUIntMaxType()) ==
1199 TI.getTypeWidth(TI.getIntMaxType()) &&
1200 "uintmax_t and intmax_t have different widths?");
1201
1202 if (LangOpts.FixedPoint) {
1203 // Each unsigned type has the same width as their signed type.
1204 DefineFixedPointMacros(TI, Builder, "SFRACT", "HR", TI.getShortFractWidth(),
1205 TI.getShortFractScale(), /*Signed=*/true);
1206 DefineFixedPointMacros(TI, Builder, "USFRACT", "UHR",
1207 TI.getShortFractWidth(),
1208 TI.getUnsignedShortFractScale(), /*Signed=*/false);
1209 DefineFixedPointMacros(TI, Builder, "FRACT", "R", TI.getFractWidth(),
1210 TI.getFractScale(), /*Signed=*/true);
1211 DefineFixedPointMacros(TI, Builder, "UFRACT", "UR", TI.getFractWidth(),
1212 TI.getUnsignedFractScale(), /*Signed=*/false);
1213 DefineFixedPointMacros(TI, Builder, "LFRACT", "LR", TI.getLongFractWidth(),
1214 TI.getLongFractScale(), /*Signed=*/true);
1215 DefineFixedPointMacros(TI, Builder, "ULFRACT", "ULR",
1216 TI.getLongFractWidth(),
1217 TI.getUnsignedLongFractScale(), /*Signed=*/false);
1218 DefineFixedPointMacros(TI, Builder, "SACCUM", "HK", TI.getShortAccumWidth(),
1219 TI.getShortAccumScale(), /*Signed=*/true);
1220 DefineFixedPointMacros(TI, Builder, "USACCUM", "UHK",
1221 TI.getShortAccumWidth(),
1222 TI.getUnsignedShortAccumScale(), /*Signed=*/false);
1223 DefineFixedPointMacros(TI, Builder, "ACCUM", "K", TI.getAccumWidth(),
1224 TI.getAccumScale(), /*Signed=*/true);
1225 DefineFixedPointMacros(TI, Builder, "UACCUM", "UK", TI.getAccumWidth(),
1226 TI.getUnsignedAccumScale(), /*Signed=*/false);
1227 DefineFixedPointMacros(TI, Builder, "LACCUM", "LK", TI.getLongAccumWidth(),
1228 TI.getLongAccumScale(), /*Signed=*/true);
1229 DefineFixedPointMacros(TI, Builder, "ULACCUM", "ULK",
1230 TI.getLongAccumWidth(),
1231 TI.getUnsignedLongAccumScale(), /*Signed=*/false);
1232
1233 Builder.defineMacro("__SACCUM_IBIT__", Twine(TI.getShortAccumIBits()));
1234 Builder.defineMacro("__USACCUM_IBIT__",
1235 Twine(TI.getUnsignedShortAccumIBits()));
1236 Builder.defineMacro("__ACCUM_IBIT__", Twine(TI.getAccumIBits()));
1237 Builder.defineMacro("__UACCUM_IBIT__", Twine(TI.getUnsignedAccumIBits()));
1238 Builder.defineMacro("__LACCUM_IBIT__", Twine(TI.getLongAccumIBits()));
1239 Builder.defineMacro("__ULACCUM_IBIT__",
1240 Twine(TI.getUnsignedLongAccumIBits()));
1241 }
1242
1243 if (TI.hasFloat16Type())
1244 DefineFloatMacros(Builder, "FLT16", &TI.getHalfFormat(), "F16");
1245 DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F");
1246 DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), "");
1247 DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L");
1248
1249 // Define a __POINTER_WIDTH__ macro for stdint.h.
1250 Builder.defineMacro("__POINTER_WIDTH__",
1251 Twine((int)TI.getPointerWidth(LangAS::Default)));
1252
1253 // Define __BIGGEST_ALIGNMENT__ to be compatible with gcc.
1254 Builder.defineMacro("__BIGGEST_ALIGNMENT__",
1255 Twine(TI.getSuitableAlign() / TI.getCharWidth()) );
1256
1257 if (!LangOpts.CharIsSigned)
1258 Builder.defineMacro("__CHAR_UNSIGNED__");
1259
1261 Builder.defineMacro("__WCHAR_UNSIGNED__");
1262
1264 Builder.defineMacro("__WINT_UNSIGNED__");
1265
1266 // Define exact-width integer types for stdint.h
1267 DefineExactWidthIntType(LangOpts, TargetInfo::SignedChar, TI, Builder);
1268
1269 if (TI.getShortWidth() > TI.getCharWidth())
1270 DefineExactWidthIntType(LangOpts, TargetInfo::SignedShort, TI, Builder);
1271
1272 if (TI.getIntWidth() > TI.getShortWidth())
1273 DefineExactWidthIntType(LangOpts, TargetInfo::SignedInt, TI, Builder);
1274
1275 if (TI.getLongWidth() > TI.getIntWidth())
1276 DefineExactWidthIntType(LangOpts, TargetInfo::SignedLong, TI, Builder);
1277
1278 if (TI.getLongLongWidth() > TI.getLongWidth())
1280
1281 DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedChar, TI, Builder);
1284
1285 if (TI.getShortWidth() > TI.getCharWidth()) {
1286 DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedShort, TI, Builder);
1289 }
1290
1291 if (TI.getIntWidth() > TI.getShortWidth()) {
1292 DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedInt, TI, Builder);
1295 }
1296
1297 if (TI.getLongWidth() > TI.getIntWidth()) {
1298 DefineExactWidthIntType(LangOpts, TargetInfo::UnsignedLong, TI, Builder);
1301 }
1302
1303 if (TI.getLongLongWidth() > TI.getLongWidth()) {
1305 Builder);
1308 }
1309
1310 DefineLeastWidthIntType(LangOpts, 8, true, TI, Builder);
1311 DefineLeastWidthIntType(LangOpts, 8, false, TI, Builder);
1312 DefineLeastWidthIntType(LangOpts, 16, true, TI, Builder);
1313 DefineLeastWidthIntType(LangOpts, 16, false, TI, Builder);
1314 DefineLeastWidthIntType(LangOpts, 32, true, TI, Builder);
1315 DefineLeastWidthIntType(LangOpts, 32, false, TI, Builder);
1316 DefineLeastWidthIntType(LangOpts, 64, true, TI, Builder);
1317 DefineLeastWidthIntType(LangOpts, 64, false, TI, Builder);
1318
1319 DefineFastIntType(LangOpts, 8, true, TI, Builder);
1320 DefineFastIntType(LangOpts, 8, false, TI, Builder);
1321 DefineFastIntType(LangOpts, 16, true, TI, Builder);
1322 DefineFastIntType(LangOpts, 16, false, TI, Builder);
1323 DefineFastIntType(LangOpts, 32, true, TI, Builder);
1324 DefineFastIntType(LangOpts, 32, false, TI, Builder);
1325 DefineFastIntType(LangOpts, 64, true, TI, Builder);
1326 DefineFastIntType(LangOpts, 64, false, TI, Builder);
1327
1328 Builder.defineMacro("__USER_LABEL_PREFIX__", TI.getUserLabelPrefix());
1329
1330 if (!LangOpts.MathErrno)
1331 Builder.defineMacro("__NO_MATH_ERRNO__");
1332
1333 if (LangOpts.FastMath || (LangOpts.NoHonorInfs && LangOpts.NoHonorNaNs))
1334 Builder.defineMacro("__FINITE_MATH_ONLY__", "1");
1335 else
1336 Builder.defineMacro("__FINITE_MATH_ONLY__", "0");
1337
1338 if (LangOpts.GNUCVersion) {
1339 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
1340 Builder.defineMacro("__GNUC_GNU_INLINE__");
1341 else
1342 Builder.defineMacro("__GNUC_STDC_INLINE__");
1343
1344 // The value written by __atomic_test_and_set.
1345 // FIXME: This is target-dependent.
1346 Builder.defineMacro("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL", "1");
1347 }
1348
1349 // GCC defines these macros in both C and C++ modes despite them being needed
1350 // mostly for STL implementations in C++.
1351 auto [Destructive, Constructive] = TI.hardwareInterferenceSizes();
1352 Builder.defineMacro("__GCC_DESTRUCTIVE_SIZE", Twine(Destructive));
1353 Builder.defineMacro("__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive));
1354 // We need to use push_macro to allow users to redefine these macros from the
1355 // command line with -D and not issue a -Wmacro-redefined warning.
1356 Builder.append("#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")");
1357 Builder.append("#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")");
1358
1359 auto addLockFreeMacros = [&](const llvm::Twine &Prefix) {
1360 // Used by libc++ and libstdc++ to implement ATOMIC_<foo>_LOCK_FREE.
1361#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
1362 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \
1363 getLockFreeValue(TI.get##Type##Width(), TI));
1365 DEFINE_LOCK_FREE_MACRO(CHAR, Char);
1366 // char8_t has the same representation / width as unsigned
1367 // char in C++ and is a typedef for unsigned char in C23
1368 if (LangOpts.Char8 || LangOpts.C23)
1369 DEFINE_LOCK_FREE_MACRO(CHAR8_T, Char);
1370 DEFINE_LOCK_FREE_MACRO(CHAR16_T, Char16);
1371 DEFINE_LOCK_FREE_MACRO(CHAR32_T, Char32);
1372 DEFINE_LOCK_FREE_MACRO(WCHAR_T, WChar);
1374 DEFINE_LOCK_FREE_MACRO(INT, Int);
1377 Builder.defineMacro(
1378 Prefix + "POINTER_LOCK_FREE",
1380#undef DEFINE_LOCK_FREE_MACRO
1381 };
1382 addLockFreeMacros("__CLANG_ATOMIC_");
1383 if (LangOpts.GNUCVersion)
1384 addLockFreeMacros("__GCC_ATOMIC_");
1385
1386 if (CGOpts.getInlining() == CodeGenOptions::OnlyAlwaysInlining)
1387 Builder.defineMacro("__NO_INLINE__");
1388
1389 if (unsigned PICLevel = LangOpts.PICLevel) {
1390 Builder.defineMacro("__PIC__", Twine(PICLevel));
1391 Builder.defineMacro("__pic__", Twine(PICLevel));
1392 if (LangOpts.PIE) {
1393 Builder.defineMacro("__PIE__", Twine(PICLevel));
1394 Builder.defineMacro("__pie__", Twine(PICLevel));
1395 }
1396 }
1397
1398 // Macros to control C99 numerics and <float.h>
1399 Builder.defineMacro("__FLT_RADIX__", "2");
1400 Builder.defineMacro("__DECIMAL_DIG__", "__LDBL_DECIMAL_DIG__");
1401
1402 if (LangOpts.getStackProtector() == LangOptions::SSPOn)
1403 Builder.defineMacro("__SSP__");
1404 else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
1405 Builder.defineMacro("__SSP_STRONG__", "2");
1406 else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
1407 Builder.defineMacro("__SSP_ALL__", "3");
1408
1409 if (PPOpts.SetUpStaticAnalyzer)
1410 Builder.defineMacro("__clang_analyzer__");
1411
1412 if (LangOpts.FastRelaxedMath)
1413 Builder.defineMacro("__FAST_RELAXED_MATH__");
1414
1415 if (FEOpts.ProgramAction == frontend::RewriteObjC ||
1416 LangOpts.getGC() != LangOptions::NonGC) {
1417 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
1418 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
1419 Builder.defineMacro("__autoreleasing", "");
1420 Builder.defineMacro("__unsafe_unretained", "");
1421 } else if (LangOpts.ObjC) {
1422 Builder.defineMacro("__weak", "__attribute__((objc_ownership(weak)))");
1423 Builder.defineMacro("__strong", "__attribute__((objc_ownership(strong)))");
1424 Builder.defineMacro("__autoreleasing",
1425 "__attribute__((objc_ownership(autoreleasing)))");
1426 Builder.defineMacro("__unsafe_unretained",
1427 "__attribute__((objc_ownership(none)))");
1428 }
1429
1430 // On Darwin, there are __double_underscored variants of the type
1431 // nullability qualifiers.
1432 if (TI.getTriple().isOSDarwin()) {
1433 Builder.defineMacro("__nonnull", "_Nonnull");
1434 Builder.defineMacro("__null_unspecified", "_Null_unspecified");
1435 Builder.defineMacro("__nullable", "_Nullable");
1436 }
1437
1438 // Add a macro to differentiate between regular iOS/tvOS/watchOS targets and
1439 // the corresponding simulator targets.
1440 if (TI.getTriple().isOSDarwin() && TI.getTriple().isSimulatorEnvironment())
1441 Builder.defineMacro("__APPLE_EMBEDDED_SIMULATOR__", "1");
1442
1443 // OpenMP definition
1444 // OpenMP 2.2:
1445 // In implementations that support a preprocessor, the _OPENMP
1446 // macro name is defined to have the decimal value yyyymm where
1447 // yyyy and mm are the year and the month designations of the
1448 // version of the OpenMP API that the implementation support.
1449 if (!LangOpts.OpenMPSimd) {
1450 switch (LangOpts.OpenMP) {
1451 case 0:
1452 break;
1453 case 31:
1454 Builder.defineMacro("_OPENMP", "201107");
1455 break;
1456 case 40:
1457 Builder.defineMacro("_OPENMP", "201307");
1458 break;
1459 case 45:
1460 Builder.defineMacro("_OPENMP", "201511");
1461 break;
1462 case 50:
1463 Builder.defineMacro("_OPENMP", "201811");
1464 break;
1465 case 51:
1466 Builder.defineMacro("_OPENMP", "202011");
1467 break;
1468 case 52:
1469 Builder.defineMacro("_OPENMP", "202111");
1470 break;
1471 case 60:
1472 Builder.defineMacro("_OPENMP", "202411");
1473 break;
1474 default: // case 51:
1475 // Default version is OpenMP 5.1
1476 Builder.defineMacro("_OPENMP", "202011");
1477 break;
1478 }
1479 }
1480
1481 // CUDA device path compilaton
1482 if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {
1483 // The CUDA_ARCH value is set for the GPU target specified in the NVPTX
1484 // backend's target defines.
1485 Builder.defineMacro("__CUDA_ARCH__");
1486 }
1487
1488 // We need to communicate this to our CUDA/HIP header wrapper, which in turn
1489 // informs the proper CUDA/HIP headers of this choice.
1490 if (LangOpts.GPUDeviceApproxTranscendentals)
1491 Builder.defineMacro("__CLANG_GPU_APPROX_TRANSCENDENTALS__");
1492
1493 // Define a macro indicating that the source file is being compiled with a
1494 // SYCL device compiler which doesn't produce host binary.
1495 if (LangOpts.SYCLIsDevice) {
1496 Builder.defineMacro("__SYCL_DEVICE_ONLY__", "1");
1497 }
1498
1499 // OpenCL definitions.
1500 if (LangOpts.OpenCL) {
1501 InitializeOpenCLFeatureTestMacros(TI, LangOpts, Builder);
1502
1503 if (TI.getTriple().isSPIR() || TI.getTriple().isSPIRV())
1504 Builder.defineMacro("__IMAGE_SUPPORT__");
1505 }
1506
1507 if (TI.hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1508 // For each extended integer type, g++ defines a macro mapping the
1509 // index of the type (0 in this case) in some list of extended types
1510 // to the type.
1511 Builder.defineMacro("__GLIBCXX_TYPE_INT_N_0", "__int128");
1512 Builder.defineMacro("__GLIBCXX_BITSIZE_INT_N_0", "128");
1513 }
1514
1515 // ELF targets define __ELF__
1516 if (TI.getTriple().isOSBinFormatELF())
1517 Builder.defineMacro("__ELF__");
1518
1519 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Address |
1520 SanitizerKind::KernelAddress))
1521 Builder.defineMacro("__SANITIZE_ADDRESS__");
1522 if (LangOpts.Sanitize.hasOneOf(SanitizerKind::HWAddress |
1523 SanitizerKind::KernelHWAddress))
1524 Builder.defineMacro("__SANITIZE_HWADDRESS__");
1525 if (LangOpts.Sanitize.has(SanitizerKind::Thread))
1526 Builder.defineMacro("__SANITIZE_THREAD__");
1527 if (LangOpts.Sanitize.has(SanitizerKind::AllocToken))
1528 Builder.defineMacro("__SANITIZE_ALLOC_TOKEN__");
1529
1530 if (LangOpts.PointerFieldProtectionABI)
1531 Builder.defineMacro("__POINTER_FIELD_PROTECTION_ABI__");
1532 if (LangOpts.PointerFieldProtectionTagged)
1533 Builder.defineMacro("__POINTER_FIELD_PROTECTION_TAGGED__");
1534
1535 // Target OS macro definitions.
1536 if (PPOpts.DefineTargetOSMacros) {
1537 const llvm::Triple &Triple = TI.getTriple();
1538#define TARGET_OS(Name, Predicate) \
1539 Builder.defineMacro(#Name, (Predicate) ? "1" : "0");
1540#include "clang/Basic/TargetOSMacros.def"
1541#undef TARGET_OS
1542 }
1543
1544 if (LangOpts.PointerAuthIntrinsics)
1545 Builder.defineMacro("__PTRAUTH__");
1546
1547 if (CGOpts.Dwarf2CFIAsm)
1548 Builder.defineMacro("__GCC_HAVE_DWARF2_CFI_ASM");
1549
1550 // Get other target #defines.
1551 TI.getTargetDefines(LangOpts, Builder);
1552}
1553
1554static void InitializePGOProfileMacros(const CodeGenOptions &CodeGenOpts,
1555 MacroBuilder &Builder) {
1556 if (CodeGenOpts.hasProfileInstr())
1557 Builder.defineMacro("__LLVM_INSTR_PROFILE_GENERATE");
1558
1559 if (CodeGenOpts.hasProfileIRUse() || CodeGenOpts.hasProfileClangUse())
1560 Builder.defineMacro("__LLVM_INSTR_PROFILE_USE");
1561}
1562
1563/// InitializePreprocessor - Initialize the preprocessor getting it and the
1564/// environment ready to process a single file.
1566 const PreprocessorOptions &InitOpts,
1567 const PCHContainerReader &PCHContainerRdr,
1568 const FrontendOptions &FEOpts,
1569 const CodeGenOptions &CodeGenOpts) {
1570 const LangOptions &LangOpts = PP.getLangOpts();
1571 std::string PredefineBuffer;
1572 PredefineBuffer.reserve(4080);
1573 llvm::raw_string_ostream Predefines(PredefineBuffer);
1574 MacroBuilder Builder(Predefines);
1575
1576 // Ensure that the initial value of __COUNTER__ is hooked up.
1578
1579 // Emit line markers for various builtin sections of the file. The 3 here
1580 // marks <built-in> as being a system header, which suppresses warnings when
1581 // the same macro is defined multiple times.
1582 Builder.append("# 1 \"<built-in>\" 3");
1583
1584 // Install things like __POWERPC__, __GNUC__, etc into the macro table.
1585 if (InitOpts.UsePredefines) {
1586 // FIXME: This will create multiple definitions for most of the predefined
1587 // macros. This is not the right way to handle this.
1588 if ((LangOpts.CUDA || LangOpts.isTargetDevice()) && PP.getAuxTargetInfo())
1589 InitializePredefinedMacros(*PP.getAuxTargetInfo(), LangOpts, FEOpts,
1590 PP.getPreprocessorOpts(), CodeGenOpts,
1591 Builder);
1592
1593 InitializePredefinedMacros(PP.getTargetInfo(), LangOpts, FEOpts,
1594 PP.getPreprocessorOpts(), CodeGenOpts, Builder);
1595
1596 // Install definitions to make Objective-C++ ARC work well with various
1597 // C++ Standard Library implementations.
1598 if (LangOpts.ObjC && LangOpts.CPlusPlus &&
1599 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1600 switch (InitOpts.ObjCXXARCStandardLibrary) {
1601 case ARCXX_nolib:
1602 case ARCXX_libcxx:
1603 break;
1604
1605 case ARCXX_libstdcxx:
1606 AddObjCXXARCLibstdcxxDefines(LangOpts, Builder);
1607 break;
1608 }
1609 }
1610 }
1611
1612 // Even with predefines off, some macros are still predefined.
1613 // These should all be defined in the preprocessor according to the
1614 // current language configuration.
1616 FEOpts, Builder);
1617
1618 // The PGO instrumentation profile macros are driven by options
1619 // -fprofile[-instr]-generate/-fcs-profile-generate/-fprofile[-instr]-use,
1620 // hence they are not guarded by InitOpts.UsePredefines.
1621 InitializePGOProfileMacros(CodeGenOpts, Builder);
1622
1623 // Add on the predefines from the driver. Wrap in a #line directive to report
1624 // that they come from the command line.
1625 Builder.append("# 1 \"<command line>\" 1");
1626
1627 // Process #define's and #undef's in the order they are given.
1628 for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) {
1629 if (InitOpts.Macros[i].second) // isUndef
1630 Builder.undefineMacro(InitOpts.Macros[i].first);
1631 else
1632 DefineBuiltinMacro(Builder, InitOpts.Macros[i].first,
1633 PP.getDiagnostics());
1634 }
1635
1636 // Exit the command line and go back to <built-in> (2 is LC_LEAVE).
1637 Builder.append("# 1 \"<built-in>\" 2");
1638
1639 // If -imacros are specified, include them now. These are processed before
1640 // any -include directives.
1641 for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i)
1642 AddImplicitIncludeMacros(Builder, InitOpts.MacroIncludes[i]);
1643
1644 // Process -include-pch/-include-pth directives.
1645 if (!InitOpts.ImplicitPCHInclude.empty())
1646 AddImplicitIncludePCH(Builder, PP, PCHContainerRdr,
1647 InitOpts.ImplicitPCHInclude);
1648
1649 // Process -include directives.
1650 for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) {
1651 const std::string &Path = InitOpts.Includes[i];
1652 AddImplicitInclude(Builder, Path);
1653 }
1654
1655 // Instruct the preprocessor to skip the preamble.
1657 InitOpts.PrecompiledPreambleBytes.second);
1658
1659 // Copy PredefinedBuffer into the Preprocessor.
1660 PP.setPredefines(std::move(PredefineBuffer));
1661
1662 // Match gcc behavior regarding gnu-line-directive diagnostics, assuming that
1663 // '-x <*>-cpp-output' is analogous to '-fpreprocessed'.
1664 if (FEOpts.DashX.isPreprocessed()) {
1665 PP.getDiagnostics().setSeverity(diag::ext_pp_gnu_line_directive,
1667
1668 // Compiling with -xc++-cpp-output should suppress module directive
1669 // recognition. __preprocessed_module can either get the directive treatment
1670 // or be accepted directly by phase 7 in a module declaration. In the latter
1671 // case, __preprocessed_module will work even if there are preprocessing
1672 // tokens on the same line that precede it.
1674 }
1675}
Defines helper utilities for supporting the HLSL runtime environment.
static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP, const PCHContainerReader &PCHContainerRdr, StringRef ImplicitIncludePCH)
Add an implicit #include using the original file used to generate a PCH file.
static void AddImplicitInclude(MacroBuilder &Builder, StringRef File)
AddImplicitInclude - Add an implicit #include of the specified file to the predefines buffer.
static void DefineTypeWidth(const Twine &MacroName, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static bool MacroBodyEndsInBackslash(StringRef MacroBody)
static void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth, const TargetInfo &TI, MacroBuilder &Builder)
static void DefineFmt(const LangOptions &LangOpts, const Twine &Prefix, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext)
static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth, StringRef ValSuffix, bool isSigned, MacroBuilder &Builder)
DefineTypeSize - Emit a macro to the predefines buffer that declares a macro named MacroName with the...
static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
void DefineFixedPointMacros(const TargetInfo &TI, MacroBuilder &Builder, llvm::StringRef TypeName, llvm::StringRef Suffix, unsigned Width, unsigned Scale, bool Signed)
static void InitializePGOProfileMacros(const CodeGenOptions &CodeGenOpts, MacroBuilder &Builder)
void InitializeOpenCLFeatureTestMacros(const TargetInfo &TI, const LangOptions &Opts, MacroBuilder &Builder)
InitializeOpenCLFeatureTestMacros - Define OpenCL macros based on target settings and language versio...
static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File)
static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, MacroBuilder &Builder)
Add definitions required for a smooth interaction between Objective-C++ automated reference counting ...
static void DefineExactWidthIntType(const LangOptions &LangOpts, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static void InitializePredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, const PreprocessorOptions &PPOpts, const CodeGenOptions &CGOpts, MacroBuilder &Builder)
llvm::SmallString< 32 > ConstructFixedPointLiteral(llvm::APFixedPoint Val, llvm::StringRef Suffix)
static void DefineLeastWidthIntType(const LangOptions &LangOpts, unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder)
#define TOSTR(X)
static const char * getLockFreeValue(unsigned TypeWidth, const TargetInfo &TI)
Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with the specified properties.
static void DefineTypeSizeAndWidth(const Twine &Prefix, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, MacroBuilder &Builder)
static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, T IEEEQuadVal)
PickFP - This is used to pick a value based on the FP semantics of the specified FP model.
static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts, MacroBuilder &Builder, const TargetInfo &TI)
Initialize the predefined C++ language feature test macros defined in ISO/IEC JTC1/SC22/WG21 (C++) SD...
static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro, DiagnosticsEngine &Diags)
#define DEFINE_LOCK_FREE_MACRO(TYPE, Type)
static void InitializeStandardPredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, MacroBuilder &Builder)
static void DefineFastIntType(const LangOptions &LangOpts, unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder)
Result
Implement __builtin_bit_cast and related operations.
Defines the clang::MacroBuilder utility class.
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the SourceManager interface.
Provides definitions for the atomic synchronization scopes.
Defines version macros and version-related utility functions for Clang.
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
Definition ASTReader.h:1985
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
bool hasDWARFExceptions() const
bool hasProfileInstr() const
Check if any form of instrumentation is on.
bool hasProfileIRUse() const
Check if IR level profile use is on.
bool hasWasmExceptions() const
bool hasSjLjExceptions() const
bool hasSEHExceptions() const
bool hasProfileClangUse() const
Check if Clang profile use is on.
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:234
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void setSeverity(diag::kind Diag, diag::Severity Map, SourceLocation Loc)
This allows the client to specify that certain warnings are ignored.
FrontendOptions - Options for controlling the behavior of the frontend.
InputKind DashX
The input kind, either specified via -x argument or deduced from the input file name.
frontend::ActionKind ProgramAction
The frontend action to perform.
bool isPreprocessed() const
@ PerThread
Per-thread default stream.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
std::string LiteralEncoding
Name of the literal encoding to convert the internal encoding to.
bool isTargetDevice() const
True when compiling for an offloading target device.
std::optional< uint32_t > getCPlusPlusLangStd() const
Returns the most applicable C++ standard-compliant language version code.
std::optional< uint32_t > getCLangStd() const
Returns the most applicable C standard-compliant language version code.
GPUDefaultStreamKind GPUDefaultStream
The default stream kind used for HIP kernel launching.
Kind getKind() const
Definition ObjCRuntime.h:77
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
const VersionTuple & getVersion() const
Definition ObjCRuntime.h:78
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
Definition ObjCRuntime.h:82
@ GNUstep
'gnustep' is the modern non-fragile GNUstep runtime.
Definition ObjCRuntime.h:56
@ ObjFW
'objfw' is the Objective-C runtime included in ObjFW
Definition ObjCRuntime.h:59
static bool isOpenCLOptionAvailableIn(const LangOptions &LO, Args &&... args)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
uint32_t InitialCounterValue
The initial value for COUNTER; typically is zero but can be set via a -cc1 flag for testing purposes.
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
bool DefineTargetOSMacros
Indicates whether to predefine target OS macros.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
bool SetUpStaticAnalyzer
Set up preprocessor for RunAnalysis action.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
const TargetInfo * getAuxTargetInfo() const
const TargetInfo & getTargetInfo() const
FileManager & getFileManager() const
void setPredefines(std::string P)
Set the predefines for this Preprocessor.
void setSkipMainFilePreamble(unsigned Bytes, bool StartOfLine)
Instruct the preprocessor to skip part of the main source file.
const PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
const LangOptions & getLangOpts() const
void setCounterValue(uint32_t V)
DiagnosticsEngine & getDiagnostics() const
void markMainFileAsPreprocessedModuleFile()
Mark the main file as a preprocessed module file, then the 'module' and 'import' directive recognitio...
Encodes a location in the source.
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Exposes information about the current target.
Definition TargetInfo.h:227
unsigned getNewAlign() const
Return the largest alignment for which a suitably-sized allocation with 'operator new(size_t)' is gua...
Definition TargetInfo.h:767
unsigned getUnsignedLongFractScale() const
getUnsignedLongFractScale - Return the number of fractional bits in a 'unsigned long _Fract' type.
Definition TargetInfo.h:671
unsigned getShortWidth() const
getShortWidth/Align - Return the size of 'signed short' and 'unsigned short' for this target,...
Definition TargetInfo.h:526
unsigned getUnsignedAccumScale() const
getUnsignedAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned _Accum' ty...
Definition TargetInfo.h:625
unsigned getUnsignedAccumIBits() const
Definition TargetInfo.h:628
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getAccumWidth() const
getAccumWidth/Align - Return the size of 'signed _Accum' and 'unsigned _Accum' for this target,...
Definition TargetInfo.h:570
IntType getUIntPtrType() const
Definition TargetInfo.h:416
IntType getInt64Type() const
Definition TargetInfo.h:423
unsigned getUnsignedFractScale() const
getUnsignedFractScale - Return the number of fractional bits in a 'unsigned _Fract' type.
Definition TargetInfo.h:665
StringRef getDefaultOrdinaryLiteralEncoding() const
virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return the smallest integer type with at least the specified width.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
virtual size_t getMaxBitIntWidth() const
Definition TargetInfo.h:696
unsigned getTypeWidth(IntType T) const
Return the width (in bits) of the specified integer type enum.
unsigned getLongAccumScale() const
getLongAccumScale/IBits - Return the number of fractional/integral bits in a 'signed long _Accum' typ...
Definition TargetInfo.h:607
unsigned getLongFractScale() const
getLongFractScale - Return the number of fractional bits in a 'signed long _Fract' type.
Definition TargetInfo.h:654
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
Definition TargetInfo.h:490
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
virtual std::pair< unsigned, unsigned > hardwareInterferenceSizes() const
The first value in the pair is the minimum offset between two objects to avoid false sharing (destruc...
bool useSignedCharForObjCBool() const
Check if the Objective-C built-in boolean type should be signed char.
Definition TargetInfo.h:942
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
Definition TargetInfo.h:679
unsigned getAccumIBits() const
Definition TargetInfo.h:603
IntType getSigAtomicType() const
Definition TargetInfo.h:431
unsigned getAccumScale() const
getAccumScale/IBits - Return the number of fractional/integral bits in a 'signed _Accum' type.
Definition TargetInfo.h:602
virtual bool hasFloat16Type() const
Determine whether the _Float16 type is supported on this target.
Definition TargetInfo.h:721
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
Definition TargetInfo.h:531
IntType getPtrDiffType(LangAS AddrSpace) const
Definition TargetInfo.h:408
bool isLittleEndian() const
unsigned getShortAccumIBits() const
Definition TargetInfo.h:596
unsigned getFloatWidth() const
getFloatWidth/Align/Format - Return the size/align/format of 'float'.
Definition TargetInfo.h:792
unsigned getLongAccumIBits() const
Definition TargetInfo.h:608
IntType getSizeType() const
Definition TargetInfo.h:389
IntType getWIntType() const
Definition TargetInfo.h:420
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned getLongAccumWidth() const
getLongAccumWidth/Align - Return the size of 'signed long _Accum' and 'unsigned long _Accum' for this...
Definition TargetInfo.h:575
unsigned getShortAccumScale() const
getShortAccumScale/IBits - Return the number of fractional/integral bits in a 'signed short _Accum' t...
Definition TargetInfo.h:595
const llvm::fltSemantics & getDoubleFormat() const
Definition TargetInfo.h:804
static const char * getTypeName(IntType T)
Return the user string for the specified integer type enum.
unsigned getLongLongWidth() const
getLongLongWidth/Align - Return the size of 'signed long long' and 'unsigned long long' for this targ...
Definition TargetInfo.h:541
virtual bool hasBuiltinAtomic(uint64_t AtomicSizeInBits, uint64_t AlignmentInBits) const
Returns true if the given target supports lock-free atomic operations at the specified width and alig...
Definition TargetInfo.h:865
IntType getIntPtrType() const
Definition TargetInfo.h:415
IntType getInt16Type() const
Definition TargetInfo.h:427
const llvm::fltSemantics & getHalfFormat() const
Definition TargetInfo.h:789
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
IntType getWCharType() const
Definition TargetInfo.h:419
IntType getUInt16Type() const
Definition TargetInfo.h:428
bool isBigEndian() const
const char * getUserLabelPrefix() const
Returns the default value of the USER_LABEL_PREFIX macro, which is the prefix given to user symbols b...
Definition TargetInfo.h:930
IntType getChar16Type() const
Definition TargetInfo.h:421
unsigned getUnsignedShortAccumIBits() const
Definition TargetInfo.h:617
IntType getChar32Type() const
Definition TargetInfo.h:422
IntType getUInt64Type() const
Definition TargetInfo.h:424
unsigned getUnsignedLongAccumScale() const
getUnsignedLongAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned long _...
Definition TargetInfo.h:635
unsigned getUnsignedLongAccumIBits() const
Definition TargetInfo.h:638
unsigned getUnsignedShortFractScale() const
getUnsignedShortFractScale - Return the number of fractional bits in a 'unsigned short _Fract' type.
Definition TargetInfo.h:658
const llvm::fltSemantics & getLongDoubleFormat() const
Definition TargetInfo.h:810
const llvm::fltSemantics & getFloatFormat() const
Definition TargetInfo.h:794
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
const char * getTypeConstantSuffix(IntType T) const
Return the constant suffix for the specified integer type enum.
unsigned getDoubleWidth() const
getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
Definition TargetInfo.h:802
unsigned getShortAccumWidth() const
getShortAccumWidth/Align - Return the size of 'signed short _Accum' and 'unsigned short _Accum' for t...
Definition TargetInfo.h:565
unsigned getSuitableAlign() const
Return the alignment that is the largest alignment ever used for any scalar/SIMD data type on the tar...
Definition TargetInfo.h:748
unsigned getCharWidth() const
Definition TargetInfo.h:521
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
Definition TargetInfo.h:536
unsigned getLongFractWidth() const
getLongFractWidth/Align - Return the size of 'signed long _Fract' and 'unsigned long _Fract' for this...
Definition TargetInfo.h:590
IntType getIntMaxType() const
Definition TargetInfo.h:404
unsigned getFractScale() const
getFractScale - Return the number of fractional bits in a 'signed _Fract' type.
Definition TargetInfo.h:650
unsigned getFractWidth() const
getFractWidth/Align - Return the size of 'signed _Fract' and 'unsigned _Fract' for this target,...
Definition TargetInfo.h:585
unsigned getShortFractScale() const
getShortFractScale - Return the number of fractional bits in a 'signed short _Fract' type.
Definition TargetInfo.h:646
unsigned getShortFractWidth() const
getShortFractWidth/Align - Return the size of 'signed short _Fract' and 'unsigned short _Fract' for t...
Definition TargetInfo.h:580
virtual bool hasHIPImageSupport() const
Whether to support HIP image/texture API's.
static const char * getTypeFormatModifier(IntType T)
Return the printf format modifier for the specified integer type enum.
unsigned getUnsignedShortAccumScale() const
getUnsignedShortAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned short...
Definition TargetInfo.h:614
bool doUnsignedFixedPointTypesHavePadding() const
In the event this target uses the same number of fractional bits for its unsigned types as it does wi...
Definition TargetInfo.h:455
IntType getUIntMaxType() const
Definition TargetInfo.h:405
unsigned getLongDoubleWidth() const
getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.
Definition TargetInfo.h:808
Defines the clang::TargetInfo interface.
@ Ignored
Do not present this diagnostic, ignore it.
@ RewriteObjC
ObjC->C Rewriter.
constexpr ShaderStage getStageFromEnvironment(const llvm::Triple::EnvironmentType &E)
Definition HLSLRuntime.h:25
The JSON file list parser is used to communicate input to InstallAPI.
void InitializePreprocessor(Preprocessor &PP, const PreprocessorOptions &PPOpts, const PCHContainerReader &PCHContainerRdr, const FrontendOptions &FEOpts, const CodeGenOptions &CodeGenOpts)
InitializePreprocessor - Initialize the preprocessor getting it and the environment ready to process ...
@ ARCXX_libcxx
libc++
@ ARCXX_libstdcxx
libstdc++
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
Definition CharInfo.h:108
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
Definition Version.cpp:68
std::string getClangFullCPPVersion()
Retrieves a string representing the complete clang version suitable for use in the CPP VERSION macro,...
Definition Version.cpp:113
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
Definition Sanitizers.h:174
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.
Definition Sanitizers.h:184
IntType
===-— Target Data Type Query Methods ----------------------------—===//
Definition TargetInfo.h:147