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