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