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