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