clang: lib/Frontend/InitPreprocessor.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
27#include "llvm/ADT/APFloat.h"
28#include "llvm/IR/DataLayout.h"
29#include "llvm/IR/DerivedTypes.h"
30using namespace clang;
31
33 while (!MacroBody.empty() && isWhitespace(MacroBody.back()))
34 MacroBody = MacroBody.drop_back();
35 return !MacroBody.empty() && MacroBody.back() == '\\';
36}
37
38
39
40
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
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
54
55
57 Builder.defineMacro(MacroName, Twine(MacroBody) + "\\\n");
58 else
59 Builder.defineMacro(MacroName, MacroBody);
60 } else {
61
62 Builder.defineMacro(Macro);
63 }
64}
65
66
67
68
69
71 Builder.append(Twine("#include \"") + File + "\"");
72}
73
75 Builder.append(Twine("#__include_macros \"") + File + "\"");
76
77 Builder.append("##");
78}
79
80
81
84 StringRef ImplicitIncludePCH) {
86 std::string(ImplicitIncludePCH), PP.getFileManager(), PCHContainerRdr,
88 if (OriginalFile.empty())
89 return;
90
92}
93
94
95
96template
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
115 const llvm::fltSemantics *Sem, StringRef Ext) {
116 const char *DenormMin, *NormMax, *Epsilon, *Max, *Min;
117 NormMax = PickFP(Sem, "6.5504e+4", "3.40282347e+38",
118 "1.7976931348623157e+308", "1.18973149535723176502e+4932",
119 "8.98846567431157953864652595394501e+307",
120 "1.18973149535723176508575932662800702e+4932");
121 DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45",
122 "4.9406564584124654e-324", "3.64519953188247460253e-4951",
123 "4.94065645841246544176568792868221e-324",
124 "6.47517511943802511092443895822764655e-4966");
125 int Digits = PickFP(Sem, 3, 6, 15, 18, 31, 33);
126 int DecimalDigits = PickFP(Sem, 5, 9, 17, 21, 33, 36);
127 Epsilon = PickFP(Sem, "9.765625e-4", "1.19209290e-7",
128 "2.2204460492503131e-16", "1.08420217248550443401e-19",
129 "4.94065645841246544176568792868221e-324",
130 "1.92592994438723585305597794258492732e-34");
131 int MantissaDigits = PickFP(Sem, 11, 24, 53, 64, 106, 113);
132 int Min10Exp = PickFP(Sem, -4, -37, -307, -4931, -291, -4931);
133 int Max10Exp = PickFP(Sem, 4, 38, 308, 4932, 308, 4932);
134 int MinExp = PickFP(Sem, -13, -125, -1021, -16381, -968, -16381);
135 int MaxExp = PickFP(Sem, 16, 128, 1024, 16384, 1024, 16384);
136 Min = PickFP(Sem, "6.103515625e-5", "1.17549435e-38", "2.2250738585072014e-308",
137 "3.36210314311209350626e-4932",
138 "2.00416836000897277799610805135016e-292",
139 "3.36210314311209350626267781732175260e-4932");
140 Max = PickFP(Sem, "6.5504e+4", "3.40282347e+38", "1.7976931348623157e+308",
141 "1.18973149535723176502e+4932",
142 "1.79769313486231580793728971405301e+308",
143 "1.18973149535723176508575932662800702e+4932");
144
146 DefPrefix = "__";
147 DefPrefix += Prefix;
148 DefPrefix += "_";
149
150 Builder.defineMacro(DefPrefix + "DENORM_MIN__", Twine(DenormMin)+Ext);
151 Builder.defineMacro(DefPrefix + "NORM_MAX__", Twine(NormMax)+Ext);
152 Builder.defineMacro(DefPrefix + "HAS_DENORM__");
153 Builder.defineMacro(DefPrefix + "DIG__", Twine(Digits));
154 Builder.defineMacro(DefPrefix + "DECIMAL_DIG__", Twine(DecimalDigits));
155 Builder.defineMacro(DefPrefix + "EPSILON__", Twine(Epsilon)+Ext);
156 Builder.defineMacro(DefPrefix + "HAS_INFINITY__");
157 Builder.defineMacro(DefPrefix + "HAS_QUIET_NAN__");
158 Builder.defineMacro(DefPrefix + "MANT_DIG__", Twine(MantissaDigits));
159
160 Builder.defineMacro(DefPrefix + "MAX_10_EXP__", Twine(Max10Exp));
161 Builder.defineMacro(DefPrefix + "MAX_EXP__", Twine(MaxExp));
162 Builder.defineMacro(DefPrefix + "MAX__", Twine(Max)+Ext);
163
164 Builder.defineMacro(DefPrefix + "MIN_10_EXP__","("+Twine(Min10Exp)+")");
165 Builder.defineMacro(DefPrefix + "MIN_EXP__", "("+Twine(MinExp)+")");
166 Builder.defineMacro(DefPrefix + "MIN__", Twine(Min)+Ext);
167}
168
169
170
171
172
173static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,
174 StringRef ValSuffix, bool isSigned,
176 llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth)
177 : llvm::APInt::getMaxValue(TypeWidth);
178 Builder.defineMacro(MacroName, toString(MaxVal, 10, isSigned) + ValSuffix);
179}
180
181
182
187}
188
193 auto Emitter = [&](char Fmt) {
194 Builder.defineMacro(Prefix + "_FMT" + Twine(Fmt) + "__",
195 Twine("\"") + FmtModifier + Twine(Fmt) + "\"");
196 };
198 llvm::for_each(StringRef(IsSigned ? "di" : "ouxX"), Emitter);
199
200
201
202 if (LangOpts.C23 && !IsSigned)
203 llvm::for_each(StringRef("bB"), Emitter);
204}
205
209}
210
213 Builder.defineMacro(MacroName, Twine(TI.getTypeWidth(Ty)));
214}
215
218 Builder.defineMacro(MacroName,
220}
221
222
223
224
230}
231
238
239
240
241 if (TypeWidth == 64)
243
244
245
246 if (TypeWidth == 16)
248
249 const char *Prefix = IsSigned ? "__INT" : "__UINT";
250
251 DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
252 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
253
255 Builder.defineMacro(Prefix + Twine(TypeWidth) + "_C_SUFFIX__", ConstSuffix);
256}
257
263
264
265
266 if (TypeWidth == 64)
268
269
270
271 const char *Prefix = IsSigned ? "__INT" : "__UINT";
272 DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
273}
274
276 unsigned TypeWidth, bool IsSigned,
280 if (Ty == TargetInfo::NoInt)
281 return;
282
283 const char *Prefix = IsSigned ? "__INT_LEAST" : "__UINT_LEAST";
284 DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
285
286
287 if (IsSigned)
289 else
290 DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
291 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
292}
293
297
298
300 if (Ty == TargetInfo::NoInt)
301 return;
302
303 const char *Prefix = IsSigned ? "__INT_FAST" : "__UINT_FAST";
304 DefineType(Prefix + Twine(TypeWidth) + "_TYPE__", Ty, Builder);
305
306
307 if (IsSigned)
309 else
310 DefineTypeSize(Prefix + Twine(TypeWidth) + "_MAX__", Ty, TI, Builder);
311 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
312}
313
314
315
316
318
319
320
321
323 return "2";
324
325
326 return "1";
327}
328
329
330
333 Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
334
335 std::string Result;
336 {
337
338
339
340
341
342 llvm::raw_string_ostream Out(Result);
343
344 Out << "namespace std {\n"
345 << "\n"
346 << "struct __true_type;\n"
347 << "struct __false_type;\n"
348 << "\n";
349
350 Out << "template<typename _Tp> struct __is_scalar;\n"
351 << "\n";
352
353 if (LangOpts.ObjCAutoRefCount) {
354 Out << "template<typename _Tp>\n"
355 << "struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"
356 << " enum { __value = 0 };\n"
357 << " typedef __false_type __type;\n"
358 << "};\n"
359 << "\n";
360 }
361
362 if (LangOpts.ObjCWeak) {
363 Out << "template<typename _Tp>\n"
364 << "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"
365 << " enum { __value = 0 };\n"
366 << " typedef __false_type __type;\n"
367 << "};\n"
368 << "\n";
369 }
370
371 if (LangOpts.ObjCAutoRefCount) {
372 Out << "template<typename _Tp>\n"
373 << "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
374 << " _Tp> {\n"
375 << " enum { __value = 0 };\n"
376 << " typedef __false_type __type;\n"
377 << "};\n"
378 << "\n";
379 }
380
381 Out << "}\n";
382 }
383 Builder.append(Result);
384}
385
390 if (LangOpts.HLSL) {
391 Builder.defineMacro("__hlsl_clang");
392
393 Builder.defineMacro("__HLSL_VERSION",
394 Twine((unsigned)LangOpts.getHLSLVersion()));
395
396 if (LangOpts.NativeHalfType)
397 Builder.defineMacro("__HLSL_ENABLE_16_BIT", "1");
398
399
400
401 Builder.defineMacro("__SHADER_STAGE_VERTEX",
402 Twine((uint32_t)ShaderStage::Vertex));
403 Builder.defineMacro("__SHADER_STAGE_PIXEL",
404 Twine((uint32_t)ShaderStage::Pixel));
405 Builder.defineMacro("__SHADER_STAGE_GEOMETRY",
406 Twine((uint32_t)ShaderStage::Geometry));
407 Builder.defineMacro("__SHADER_STAGE_HULL",
408 Twine((uint32_t)ShaderStage::Hull));
409 Builder.defineMacro("__SHADER_STAGE_DOMAIN",
410 Twine((uint32_t)ShaderStage::Domain));
411 Builder.defineMacro("__SHADER_STAGE_COMPUTE",
412 Twine((uint32_t)ShaderStage::Compute));
413 Builder.defineMacro("__SHADER_STAGE_AMPLIFICATION",
414 Twine((uint32_t)ShaderStage::Amplification));
415 Builder.defineMacro("__SHADER_STAGE_MESH",
416 Twine((uint32_t)ShaderStage::Mesh));
417 Builder.defineMacro("__SHADER_STAGE_LIBRARY",
418 Twine((uint32_t)ShaderStage::Library));
419
420 uint32_t StageInteger = static_cast<uint32_t>(
421 hlsl::getStageFromEnvironment(TI.getTriple().getEnvironment()));
422
423 Builder.defineMacro("__SHADER_TARGET_STAGE", Twine(StageInteger));
424
425 if (TI.getTriple().getOS() == llvm::Triple::ShaderModel) {
426 VersionTuple Version = TI.getTriple().getOSVersion();
427 Builder.defineMacro("__SHADER_TARGET_MAJOR", Twine(Version.getMajor()));
428 unsigned Minor = Version.getMinor().value_or(0);
429 Builder.defineMacro("__SHADER_TARGET_MINOR", Twine(Minor));
430 }
431 return;
432 }
433
434
435
436
437
438
439
440 if ((!LangOpts.MSVCCompat || LangOpts.MSVCEnableStdcMacro) &&
441 !LangOpts.TraditionalCPP)
442 Builder.defineMacro("__STDC__");
443
444
445
446 if (LangOpts.Freestanding)
447 Builder.defineMacro("__STDC_HOSTED__", "0");
448 else
449 Builder.defineMacro("__STDC_HOSTED__");
450
451
452
453
454
455 if (!LangOpts.CPlusPlus) {
456 if (LangOpts.C2y)
457 Builder.defineMacro("__STDC_VERSION__", "202400L");
458 else if (LangOpts.C23)
459 Builder.defineMacro("__STDC_VERSION__", "202311L");
460 else if (LangOpts.C17)
461 Builder.defineMacro("__STDC_VERSION__", "201710L");
462 else if (LangOpts.C11)
463 Builder.defineMacro("__STDC_VERSION__", "201112L");
464 else if (LangOpts.C99)
465 Builder.defineMacro("__STDC_VERSION__", "199901L");
466 else if (!LangOpts.GNUMode && LangOpts.Digraphs)
467 Builder.defineMacro("__STDC_VERSION__", "199409L");
468 } else {
469
470 if (LangOpts.CPlusPlus26)
471
472 Builder.defineMacro("__cplusplus", "202400L");
473 else if (LangOpts.CPlusPlus23)
474 Builder.defineMacro("__cplusplus", "202302L");
475
476 else if (LangOpts.CPlusPlus20)
477 Builder.defineMacro("__cplusplus", "202002L");
478
479 else if (LangOpts.CPlusPlus17)
480 Builder.defineMacro("__cplusplus", "201703L");
481
482
483 else if (LangOpts.CPlusPlus14)
484 Builder.defineMacro("__cplusplus", "201402L");
485
486
487 else if (LangOpts.CPlusPlus11)
488 Builder.defineMacro("__cplusplus", "201103L");
489
490
491 else
492 Builder.defineMacro("__cplusplus", "199711L");
493
494
495
496
497
498
499 Builder.defineMacro("__STDCPP_DEFAULT_NEW_ALIGNMENT__",
502
503
504
505
506 if (LangOpts.getThreadModel() == LangOptions::ThreadModelKind::POSIX)
507 Builder.defineMacro("__STDCPP_THREADS__", "1");
508 }
509
510
511
512
513
514
515 Builder.defineMacro("__STDC_UTF_16__", "1");
516 Builder.defineMacro("__STDC_UTF_32__", "1");
517
518
519 Builder.defineMacro("__STDC_EMBED_NOT_FOUND__",
520 llvm::itostr(static_cast<int>(EmbedResult::NotFound)));
521 Builder.defineMacro("__STDC_EMBED_FOUND__",
522 llvm::itostr(static_cast<int>(EmbedResult::Found)));
523 Builder.defineMacro("__STDC_EMBED_EMPTY__",
524 llvm::itostr(static_cast<int>(EmbedResult::Empty)));
525
526 if (LangOpts.ObjC)
527 Builder.defineMacro("__OBJC__");
528
529
530 if (LangOpts.OpenCL) {
531 if (LangOpts.CPlusPlus) {
532 switch (LangOpts.OpenCLCPlusPlusVersion) {
533 case 100:
534 Builder.defineMacro("__OPENCL_CPP_VERSION__", "100");
535 break;
536 case 202100:
537 Builder.defineMacro("__OPENCL_CPP_VERSION__", "202100");
538 break;
539 default:
540 llvm_unreachable("Unsupported C++ version for OpenCL");
541 }
542 Builder.defineMacro("__CL_CPP_VERSION_1_0__", "100");
543 Builder.defineMacro("__CL_CPP_VERSION_2021__", "202100");
544 } else {
545
546
547
548
549
550
551
552 switch (LangOpts.OpenCLVersion) {
553 case 100:
554 Builder.defineMacro("__OPENCL_C_VERSION__", "100");
555 break;
556 case 110:
557 Builder.defineMacro("__OPENCL_C_VERSION__", "110");
558 break;
559 case 120:
560 Builder.defineMacro("__OPENCL_C_VERSION__", "120");
561 break;
562 case 200:
563 Builder.defineMacro("__OPENCL_C_VERSION__", "200");
564 break;
565 case 300:
566 Builder.defineMacro("__OPENCL_C_VERSION__", "300");
567 break;
568 default:
569 llvm_unreachable("Unsupported OpenCL version");
570 }
571 }
572 Builder.defineMacro("CL_VERSION_1_0", "100");
573 Builder.defineMacro("CL_VERSION_1_1", "110");
574 Builder.defineMacro("CL_VERSION_1_2", "120");
575 Builder.defineMacro("CL_VERSION_2_0", "200");
576 Builder.defineMacro("CL_VERSION_3_0", "300");
577
579 Builder.defineMacro("__ENDIAN_LITTLE__");
580
581 if (LangOpts.FastRelaxedMath)
582 Builder.defineMacro("__FAST_RELAXED_MATH__");
583 }
584
585 if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) {
586
587 if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2017)
588 Builder.defineMacro("CL_SYCL_LANGUAGE_VERSION", "121");
589 else if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2020)
590 Builder.defineMacro("SYCL_LANGUAGE_VERSION", "202012L");
591 }
592
593
594 if (LangOpts.AsmPreprocessor)
595 Builder.defineMacro("__ASSEMBLER__");
596 if (LangOpts.CUDA) {
597 if (LangOpts.GPURelocatableDeviceCode)
598 Builder.defineMacro("__CLANG_RDC__");
599 if (!LangOpts.HIP)
600 Builder.defineMacro("__CUDA__");
602 LangOptions::GPUDefaultStreamKind::PerThread)
603 Builder.defineMacro("CUDA_API_PER_THREAD_DEFAULT_STREAM");
604 }
605 if (LangOpts.HIP) {
606 Builder.defineMacro("__HIP__");
607 Builder.defineMacro("__HIPCC__");
608 Builder.defineMacro("__HIP_MEMORY_SCOPE_SINGLETHREAD", "1");
609 Builder.defineMacro("__HIP_MEMORY_SCOPE_WAVEFRONT", "2");
610 Builder.defineMacro("__HIP_MEMORY_SCOPE_WORKGROUP", "3");
611 Builder.defineMacro("__HIP_MEMORY_SCOPE_AGENT", "4");
612 Builder.defineMacro("__HIP_MEMORY_SCOPE_SYSTEM", "5");
613 if (LangOpts.HIPStdPar) {
614 Builder.defineMacro("__HIPSTDPAR__");
615 if (LangOpts.HIPStdParInterposeAlloc)
616 Builder.defineMacro("__HIPSTDPAR_INTERPOSE_ALLOC__");
617 }
618 if (LangOpts.CUDAIsDevice) {
619 Builder.defineMacro("__HIP_DEVICE_COMPILE__");
621 Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT__", "1");
622
623 Builder.defineMacro("__HIP_NO_IMAGE_SUPPORT", "1");
624 }
625 }
627 LangOptions::GPUDefaultStreamKind::PerThread) {
628 Builder.defineMacro("__HIP_API_PER_THREAD_DEFAULT_STREAM__");
629
630 Builder.defineMacro("HIP_API_PER_THREAD_DEFAULT_STREAM");
631 }
632 }
633
634 if (LangOpts.OpenACC) {
635
636
637
638
641 else
642 Builder.defineMacro("_OPENACC", "1");
643 }
644}
645
646
647
650
651 if (LangOpts.RTTI)
652 Builder.defineMacro("__cpp_rtti", "199711L");
653 if (LangOpts.CXXExceptions)
654 Builder.defineMacro("__cpp_exceptions", "199711L");
655
656
657 if (LangOpts.CPlusPlus11) {
658 Builder.defineMacro("__cpp_unicode_characters", "200704L");
659 Builder.defineMacro("__cpp_raw_strings", "200710L");
660 Builder.defineMacro("__cpp_unicode_literals", "200710L");
661 Builder.defineMacro("__cpp_user_defined_literals", "200809L");
662 Builder.defineMacro("__cpp_lambdas", "200907L");
663 Builder.defineMacro("__cpp_constexpr", LangOpts.CPlusPlus26 ? "202406L"
664 : LangOpts.CPlusPlus23 ? "202211L"
665 : LangOpts.CPlusPlus20 ? "201907L"
666 : LangOpts.CPlusPlus17 ? "201603L"
667 : LangOpts.CPlusPlus14 ? "201304L"
668 : "200704");
669 Builder.defineMacro("__cpp_constexpr_in_decltype", "201711L");
670 Builder.defineMacro("__cpp_range_based_for",
671 LangOpts.CPlusPlus23 ? "202211L"
672 : LangOpts.CPlusPlus17 ? "201603L"
673 : "200907");
674
675
676 Builder.defineMacro("__cpp_static_assert", "202306L");
677 Builder.defineMacro("__cpp_decltype", "200707L");
678 Builder.defineMacro("__cpp_attributes", "200809L");
679 Builder.defineMacro("__cpp_rvalue_references", "200610L");
680 Builder.defineMacro("__cpp_variadic_templates", "200704L");
681 Builder.defineMacro("__cpp_initializer_lists", "200806L");
682 Builder.defineMacro("__cpp_delegating_constructors", "200604L");
683 Builder.defineMacro("__cpp_nsdmi", "200809L");
684 Builder.defineMacro("__cpp_inheriting_constructors", "201511L");
685 Builder.defineMacro("__cpp_ref_qualifiers", "200710L");
686 Builder.defineMacro("__cpp_alias_templates", "200704L");
687 }
688 if (LangOpts.ThreadsafeStatics)
689 Builder.defineMacro("__cpp_threadsafe_static_init", "200806L");
690
691
692 if (LangOpts.CPlusPlus14) {
693 Builder.defineMacro("__cpp_binary_literals", "201304L");
694 Builder.defineMacro("__cpp_digit_separators", "201309L");
695 Builder.defineMacro("__cpp_init_captures",
696 LangOpts.CPlusPlus20 ? "201803L" : "201304L");
697 Builder.defineMacro("__cpp_generic_lambdas",
698 LangOpts.CPlusPlus20 ? "201707L" : "201304L");
699 Builder.defineMacro("__cpp_decltype_auto", "201304L");
700 Builder.defineMacro("__cpp_return_type_deduction", "201304L");
701 Builder.defineMacro("__cpp_aggregate_nsdmi", "201304L");
702 Builder.defineMacro("__cpp_variable_templates", "201304L");
703 }
704 if (LangOpts.SizedDeallocation)
705 Builder.defineMacro("__cpp_sized_deallocation", "201309L");
706
707
708 if (LangOpts.CPlusPlus17) {
709 Builder.defineMacro("__cpp_hex_float", "201603L");
710 Builder.defineMacro("__cpp_inline_variables", "201606L");
711 Builder.defineMacro("__cpp_noexcept_function_type", "201510L");
712 Builder.defineMacro("__cpp_capture_star_this", "201603L");
713 Builder.defineMacro("__cpp_if_constexpr", "201606L");
714 Builder.defineMacro("__cpp_deduction_guides", "201703L");
715 Builder.defineMacro("__cpp_template_auto", "201606L");
716 Builder.defineMacro("__cpp_namespace_attributes", "201411L");
717 Builder.defineMacro("__cpp_enumerator_attributes", "201411L");
718 Builder.defineMacro("__cpp_nested_namespace_definitions", "201411L");
719 Builder.defineMacro("__cpp_variadic_using", "201611L");
720 Builder.defineMacro("__cpp_aggregate_bases", "201603L");
721 Builder.defineMacro("__cpp_structured_bindings", "202403L");
722 Builder.defineMacro("__cpp_nontype_template_args",
723 "201411L");
724 Builder.defineMacro("__cpp_fold_expressions", "201603L");
725 Builder.defineMacro("__cpp_guaranteed_copy_elision", "201606L");
726 Builder.defineMacro("__cpp_nontype_template_parameter_auto", "201606L");
727 }
728 if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)
729 Builder.defineMacro("__cpp_aligned_new", "201606L");
730 if (LangOpts.RelaxedTemplateTemplateArgs)
731 Builder.defineMacro("__cpp_template_template_args", "201611L");
732
733
734 if (LangOpts.CPlusPlus20) {
735 Builder.defineMacro("__cpp_aggregate_paren_init", "201902L");
736
737 Builder.defineMacro("__cpp_concepts", "202002");
738 Builder.defineMacro("__cpp_conditional_explicit", "201806L");
739 Builder.defineMacro("__cpp_consteval", "202211L");
740 Builder.defineMacro("__cpp_constexpr_dynamic_alloc", "201907L");
741 Builder.defineMacro("__cpp_constinit", "201907L");
742 Builder.defineMacro("__cpp_impl_coroutine", "201902L");
743 Builder.defineMacro("__cpp_designated_initializers", "201707L");
744 Builder.defineMacro("__cpp_impl_three_way_comparison", "201907L");
745
746 Builder.defineMacro("__cpp_using_enum", "201907L");
747 }
748
749 if (LangOpts.CPlusPlus23) {
750 Builder.defineMacro("__cpp_implicit_move", "202207L");
751 Builder.defineMacro("__cpp_size_t_suffix", "202011L");
752 Builder.defineMacro("__cpp_if_consteval", "202106L");
753 Builder.defineMacro("__cpp_multidimensional_subscript", "202211L");
754 Builder.defineMacro("__cpp_auto_cast", "202110L");
755 Builder.defineMacro("__cpp_explicit_this_parameter", "202110L");
756 }
757
758
759
760 if (LangOpts.CPlusPlus11)
761 Builder.defineMacro("__cpp_static_call_operator", "202207L");
762 Builder.defineMacro("__cpp_named_character_escapes", "202207L");
763 Builder.defineMacro("__cpp_placeholder_variables", "202306L");
764
765
766 Builder.defineMacro("__cpp_pack_indexing", "202311L");
767 Builder.defineMacro("__cpp_deleted_function", "202403L");
768 Builder.defineMacro("__cpp_variadic_friend", "202403L");
769
770 if (LangOpts.Char8)
771 Builder.defineMacro("__cpp_char8_t", "202207L");
772 Builder.defineMacro("__cpp_impl_destroying_delete", "201806L");
773}
774
775
776
781
782
783 auto defineOpenCLExtMacro = [&](llvm::StringRef Name, auto... OptArgs) {
784
785
788 Builder.defineMacro(Name);
789 };
790#define OPENCL_GENERIC_EXTENSION(Ext, ...) \
791 defineOpenCLExtMacro(#Ext, __VA_ARGS__);
792#include "clang/Basic/OpenCLExtensions.def"
793
794
795 Builder.defineMacro("__opencl_c_int64");
796}
797
799 llvm::StringRef Suffix) {
800 if (Val.isSigned() && Val == llvm::APFixedPoint::getMin(Val.getSemantics())) {
801
802
803
804
805
806
807
808
809
810
812 Literal.push_back('(');
815 Literal += HalfStr;
816 Literal += HalfStr;
817 Literal.push_back(')');
818 return Literal;
819 }
820
822 Str += Suffix;
823 return Str;
824}
825
827 llvm::StringRef TypeName, llvm::StringRef Suffix,
828 unsigned Width, unsigned Scale, bool Signed) {
829
830
831 llvm::FixedPointSemantics FXSema(
832 Width, Scale, Signed, false,
836 Builder.defineMacro(MacroPrefix + "_EPSILON__",
838 llvm::APFixedPoint::getEpsilon(FXSema), Suffix));
839 Builder.defineMacro(MacroPrefix + "_FBIT__", Twine(Scale));
840 Builder.defineMacro(
841 MacroPrefix + "_MAX__",
843
844
845
847 Builder.defineMacro(
848 MacroPrefix + "_MIN__",
850}
851
857
858 Builder.defineMacro("__llvm__");
859 Builder.defineMacro("__clang__");
860#define TOSTR2(X) #X
861#define TOSTR(X) TOSTR2(X)
862 Builder.defineMacro("__clang_major__", TOSTR(CLANG_VERSION_MAJOR));
863 Builder.defineMacro("__clang_minor__", TOSTR(CLANG_VERSION_MINOR));
864 Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL));
865#undef TOSTR
866#undef TOSTR2
867 Builder.defineMacro("__clang_version__",
868 "\"" CLANG_VERSION_STRING " "
870
871 if (LangOpts.GNUCVersion != 0) {
872
873
874 unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100;
875 unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100;
876 unsigned GNUCPatch = LangOpts.GNUCVersion % 100;
877 Builder.defineMacro("__GNUC__", Twine(GNUCMajor));
878 Builder.defineMacro("__GNUC_MINOR__", Twine(GNUCMinor));
879 Builder.defineMacro("__GNUC_PATCHLEVEL__", Twine(GNUCPatch));
880 Builder.defineMacro("__GXX_ABI_VERSION", "1002");
881
882 if (LangOpts.CPlusPlus) {
883 Builder.defineMacro("__GNUG__", Twine(GNUCMajor));
884 Builder.defineMacro("__GXX_WEAK__");
885 }
886 }
887
888
889 Builder.defineMacro("__ATOMIC_RELAXED", "0");
890 Builder.defineMacro("__ATOMIC_CONSUME", "1");
891 Builder.defineMacro("__ATOMIC_ACQUIRE", "2");
892 Builder.defineMacro("__ATOMIC_RELEASE", "3");
893 Builder.defineMacro("__ATOMIC_ACQ_REL", "4");
894 Builder.defineMacro("__ATOMIC_SEQ_CST", "5");
895
896
897 Builder.defineMacro("__MEMORY_SCOPE_SYSTEM", "0");
898 Builder.defineMacro("__MEMORY_SCOPE_DEVICE", "1");
899 Builder.defineMacro("__MEMORY_SCOPE_WRKGRP", "2");
900 Builder.defineMacro("__MEMORY_SCOPE_WVFRNT", "3");
901 Builder.defineMacro("__MEMORY_SCOPE_SINGLE", "4");
902
903
904
905 static_assert(
910 "Invalid OpenCL memory scope enum definition");
911 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_ITEM", "0");
912 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_GROUP", "1");
913 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_DEVICE", "2");
914 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES", "3");
915 Builder.defineMacro("__OPENCL_MEMORY_SCOPE_SUB_GROUP", "4");
916
917
918 Builder.defineMacro("__FPCLASS_SNAN", "0x0001");
919 Builder.defineMacro("__FPCLASS_QNAN", "0x0002");
920 Builder.defineMacro("__FPCLASS_NEGINF", "0x0004");
921 Builder.defineMacro("__FPCLASS_NEGNORMAL", "0x0008");
922 Builder.defineMacro("__FPCLASS_NEGSUBNORMAL", "0x0010");
923 Builder.defineMacro("__FPCLASS_NEGZERO", "0x0020");
924 Builder.defineMacro("__FPCLASS_POSZERO", "0x0040");
925 Builder.defineMacro("__FPCLASS_POSSUBNORMAL", "0x0080");
926 Builder.defineMacro("__FPCLASS_POSNORMAL", "0x0100");
927 Builder.defineMacro("__FPCLASS_POSINF", "0x0200");
928
929
930 Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1");
931
932
933
934 Builder.defineMacro("__VERSION__", "\"" +
936
937
938
939
940 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
941 Builder.defineMacro("__STRICT_ANSI__");
942
943 if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11)
944 Builder.defineMacro("__GXX_EXPERIMENTAL_CXX0X__");
945
946 if (TI.getTriple().isWindowsGNUEnvironment()) {
947
948
949 Builder.defineMacro("__GXX_TYPEINFO_EQUALITY_INLINE", "0");
950 }
951
952 if (LangOpts.ObjC) {
954 Builder.defineMacro("__OBJC2__");
955
956 if (LangOpts.ObjCExceptions)
957 Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS");
958 }
959
960 if (LangOpts.getGC() != LangOptions::NonGC)
961 Builder.defineMacro("__OBJC_GC__");
962
964 Builder.defineMacro("__NEXT_RUNTIME__");
965
968 std::string versionString = "1";
969
970
971
972 if (version >= VersionTuple(2, 0))
973 Builder.defineMacro("__OBJC_GNUSTEP_RUNTIME_ABI__", "20");
974 else
975 Builder.defineMacro(
976 "__OBJC_GNUSTEP_RUNTIME_ABI__",
977 "1" + Twine(std::min(8U, version.getMinor().value_or(0))));
978 }
979
982 unsigned minor = tuple.getMinor().value_or(0);
983 unsigned subminor = tuple.getSubminor().value_or(0);
984 Builder.defineMacro("__OBJFW_RUNTIME_ABI__",
985 Twine(tuple.getMajor() * 10000 + minor * 100 +
986 subminor));
987 }
988
989 Builder.defineMacro("IBOutlet", "__attribute__((iboutlet))");
990 Builder.defineMacro("IBOutletCollection(ClassName)",
991 "__attribute__((iboutletcollection(ClassName)))");
992 Builder.defineMacro("IBAction", "void)__attribute__((ibaction)");
993 Builder.defineMacro("IBInspectable", "");
994 Builder.defineMacro("IB_DESIGNABLE", "");
995 }
996
997
998
999 Builder.defineMacro("__OBJC_BOOL_IS_BOOL",
1001
1002 if (LangOpts.CPlusPlus)
1004
1005
1006
1007 if (!LangOpts.NoConstantCFStrings)
1008 Builder.defineMacro("__CONSTANT_CFSTRINGS__");
1009
1010 if (LangOpts.ObjC)
1011 Builder.defineMacro("OBJC_NEW_PROPERTIES");
1012
1013 if (LangOpts.PascalStrings)
1014 Builder.defineMacro("__PASCAL_STRINGS__");
1015
1016 if (LangOpts.Blocks) {
1017 Builder.defineMacro("__block", "__attribute__((__blocks__(byref)))");
1018 Builder.defineMacro("__BLOCKS__");
1019 }
1020
1021 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
1022 Builder.defineMacro("__EXCEPTIONS");
1023 if (LangOpts.GNUCVersion && LangOpts.RTTI)
1024 Builder.defineMacro("__GXX_RTTI");
1025
1027 Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__");
1029 Builder.defineMacro("__SEH__");
1032 Builder.defineMacro("__ARM_DWARF_EH__");
1034 Builder.defineMacro("__WASM_EXCEPTIONS__");
1035
1036 if (LangOpts.Deprecated)
1037 Builder.defineMacro("__DEPRECATED");
1038
1039 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus)
1040 Builder.defineMacro("__private_extern__", "extern");
1041
1042 if (LangOpts.MicrosoftExt) {
1043 if (LangOpts.WChar) {
1044
1045 Builder.defineMacro("_WCHAR_T_DEFINED");
1046 Builder.defineMacro("_NATIVE_WCHAR_T_DEFINED");
1047 }
1048 }
1049
1050
1051
1052
1053 Builder.defineMacro("__clang_literal_encoding__", "\"UTF-8\"");
1055
1056
1057 Builder.defineMacro("__clang_wide_literal_encoding__", "\"UTF-32\"");
1058 } else {
1059
1060
1061
1062 Builder.defineMacro("__clang_wide_literal_encoding__", "\"UTF-16\"");
1063 }
1064
1065 if (LangOpts.Optimize)
1066 Builder.defineMacro("__OPTIMIZE__");
1067 if (LangOpts.OptimizeSize)
1068 Builder.defineMacro("__OPTIMIZE_SIZE__");
1069
1070 if (LangOpts.FastMath)
1071 Builder.defineMacro("__FAST_MATH__");
1072
1073
1074
1075
1076
1077
1078
1079
1080 Builder.defineMacro("__ORDER_LITTLE_ENDIAN__", "1234");
1081 Builder.defineMacro("__ORDER_BIG_ENDIAN__", "4321");
1082 Builder.defineMacro("__ORDER_PDP_ENDIAN__", "3412");
1084 Builder.defineMacro("__BYTE_ORDER__", "__ORDER_BIG_ENDIAN__");
1085 Builder.defineMacro("__BIG_ENDIAN__");
1086 } else {
1087 Builder.defineMacro("__BYTE_ORDER__", "__ORDER_LITTLE_ENDIAN__");
1088 Builder.defineMacro("__LITTLE_ENDIAN__");
1089 }
1090
1093 Builder.defineMacro("_LP64");
1094 Builder.defineMacro("__LP64__");
1095 }
1096
1099 Builder.defineMacro("_ILP32");
1100 Builder.defineMacro("__ILP32__");
1101 }
1102
1103
1104 assert(TI.getCharWidth() == 8 && "Only support 8-bit char so far");
1105 Builder.defineMacro("__CHAR_BIT__", Twine(TI.getCharWidth()));
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115 Builder.defineMacro("__BOOL_WIDTH__", "1");
1116 Builder.defineMacro("__SHRT_WIDTH__", Twine(TI.getShortWidth()));
1117 Builder.defineMacro("__INT_WIDTH__", Twine(TI.getIntWidth()));
1118 Builder.defineMacro("__LONG_WIDTH__", Twine(TI.getLongWidth()));
1119 Builder.defineMacro("__LLONG_WIDTH__", Twine(TI.getLongLongWidth()));
1120
1122 assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&
1123 "Target defined a max bit width larger than LLVM can support!");
1125 "Target defined a max bit width smaller than the C standard allows!");
1126 Builder.defineMacro("__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));
1127
1128 DefineTypeSize("__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder);
1129 DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder);
1130 DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Builder);
1131 DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Builder);
1132 DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder);
1137
1140 Builder);
1143
1151 TI, Builder);
1155 Builder);
1164
1167 Builder.defineMacro("__INTMAX_C_SUFFIX__",
1171 Builder.defineMacro("__UINTMAX_C_SUFFIX__",
1175 Builder);
1183 if (LangOpts.C23)
1187
1190
1191
1192
1195 "uintptr_t and intptr_t have different widths?");
1198 "uintmax_t and intmax_t have different widths?");
1199
1200 if (LangOpts.FixedPoint) {
1201
1230
1231 Builder.defineMacro("__SACCUM_IBIT__", Twine(TI.getShortAccumIBits()));
1232 Builder.defineMacro("__USACCUM_IBIT__",
1234 Builder.defineMacro("__ACCUM_IBIT__", Twine(TI.getAccumIBits()));
1236 Builder.defineMacro("__LACCUM_IBIT__", Twine(TI.getLongAccumIBits()));
1237 Builder.defineMacro("__ULACCUM_IBIT__",
1239 }
1240
1246
1247
1248 Builder.defineMacro("__POINTER_WIDTH__",
1250
1251
1252 Builder.defineMacro("__BIGGEST_ALIGNMENT__",
1254
1255 if (!LangOpts.CharIsSigned)
1256 Builder.defineMacro("__CHAR_UNSIGNED__");
1257
1259 Builder.defineMacro("__WCHAR_UNSIGNED__");
1260
1262 Builder.defineMacro("__WINT_UNSIGNED__");
1263
1264
1266
1269
1272
1275
1278
1282
1287 }
1288
1293 }
1294
1299 }
1300
1303 Builder);
1306 }
1307
1316
1325
1326 Builder.defineMacro("__USER_LABEL_PREFIX__", TI.getUserLabelPrefix());
1327
1328 if (!LangOpts.MathErrno)
1329 Builder.defineMacro("__NO_MATH_ERRNO__");
1330
1331 if (LangOpts.FastMath || (LangOpts.NoHonorInfs && LangOpts.NoHonorNaNs))
1332 Builder.defineMacro("__FINITE_MATH_ONLY__", "1");
1333 else
1334 Builder.defineMacro("__FINITE_MATH_ONLY__", "0");
1335
1336 if (LangOpts.GNUCVersion) {
1337 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
1338 Builder.defineMacro("__GNUC_GNU_INLINE__");
1339 else
1340 Builder.defineMacro("__GNUC_STDC_INLINE__");
1341
1342
1343
1344 Builder.defineMacro("__GCC_ATOMIC_TEST_AND_SET_TRUEVAL", "1");
1345 }
1346
1347
1348
1350 Builder.defineMacro("__GCC_DESTRUCTIVE_SIZE", Twine(Destructive));
1351 Builder.defineMacro("__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive));
1352
1353
1354 Builder.append("#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")");
1355 Builder.append("#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")");
1356
1357 auto addLockFreeMacros = [&](const llvm::Twine &Prefix) {
1358
1359#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
1360 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \
1361 getLockFreeValue(TI.get##Type##Width(), TI));
1364
1365
1366 if (LangOpts.Char8 || LangOpts.C23)
1375 Builder.defineMacro(
1376 Prefix + "POINTER_LOCK_FREE",
1378#undef DEFINE_LOCK_FREE_MACRO
1379 };
1380 addLockFreeMacros("__CLANG_ATOMIC_");
1381 if (LangOpts.GNUCVersion)
1382 addLockFreeMacros("__GCC_ATOMIC_");
1383
1384 if (LangOpts.NoInlineDefine)
1385 Builder.defineMacro("__NO_INLINE__");
1386
1387 if (unsigned PICLevel = LangOpts.PICLevel) {
1388 Builder.defineMacro("__PIC__", Twine(PICLevel));
1389 Builder.defineMacro("__pic__", Twine(PICLevel));
1390 if (LangOpts.PIE) {
1391 Builder.defineMacro("__PIE__", Twine(PICLevel));
1392 Builder.defineMacro("__pie__", Twine(PICLevel));
1393 }
1394 }
1395
1396
1397 Builder.defineMacro("__FLT_RADIX__", "2");
1398 Builder.defineMacro("__DECIMAL_DIG__", "__LDBL_DECIMAL_DIG__");
1399
1400 if (LangOpts.getStackProtector() == LangOptions::SSPOn)
1401 Builder.defineMacro("__SSP__");
1402 else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
1403 Builder.defineMacro("__SSP_STRONG__", "2");
1404 else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
1405 Builder.defineMacro("__SSP_ALL__", "3");
1406
1408 Builder.defineMacro("__clang_analyzer__");
1409
1410 if (LangOpts.FastRelaxedMath)
1411 Builder.defineMacro("__FAST_RELAXED_MATH__");
1412
1414 LangOpts.getGC() != LangOptions::NonGC) {
1415 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
1416 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
1417 Builder.defineMacro("__autoreleasing", "");
1418 Builder.defineMacro("__unsafe_unretained", "");
1419 } else if (LangOpts.ObjC) {
1420 Builder.defineMacro("__weak", "__attribute__((objc_ownership(weak)))");
1421 Builder.defineMacro("__strong", "__attribute__((objc_ownership(strong)))");
1422 Builder.defineMacro("__autoreleasing",
1423 "__attribute__((objc_ownership(autoreleasing)))");
1424 Builder.defineMacro("__unsafe_unretained",
1425 "__attribute__((objc_ownership(none)))");
1426 }
1427
1428
1429
1430 if (TI.getTriple().isOSDarwin()) {
1431 Builder.defineMacro("__nonnull", "_Nonnull");
1432 Builder.defineMacro("__null_unspecified", "_Null_unspecified");
1433 Builder.defineMacro("__nullable", "_Nullable");
1434 }
1435
1436
1437
1438 if (TI.getTriple().isOSDarwin() && TI.getTriple().isSimulatorEnvironment())
1439 Builder.defineMacro("__APPLE_EMBEDDED_SIMULATOR__", "1");
1440
1441
1442
1443
1444
1445
1446
1447 if (!LangOpts.OpenMPSimd) {
1448 switch (LangOpts.OpenMP) {
1449 case 0:
1450 break;
1451 case 31:
1452 Builder.defineMacro("_OPENMP", "201107");
1453 break;
1454 case 40:
1455 Builder.defineMacro("_OPENMP", "201307");
1456 break;
1457 case 45:
1458 Builder.defineMacro("_OPENMP", "201511");
1459 break;
1460 case 50:
1461 Builder.defineMacro("_OPENMP", "201811");
1462 break;
1463 case 52:
1464 Builder.defineMacro("_OPENMP", "202111");
1465 break;
1466 default:
1467
1468 Builder.defineMacro("_OPENMP", "202011");
1469 break;
1470 }
1471 }
1472
1473
1474 if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {
1475
1476
1477 Builder.defineMacro("__CUDA_ARCH__");
1478 }
1479
1480
1481
1482 if (LangOpts.GPUDeviceApproxTranscendentals)
1483 Builder.defineMacro("__CLANG_GPU_APPROX_TRANSCENDENTALS__");
1484
1485
1486
1487 if (LangOpts.SYCLIsDevice) {
1488 Builder.defineMacro("__SYCL_DEVICE_ONLY__", "1");
1489 }
1490
1491
1492 if (LangOpts.OpenCL) {
1494
1496 Builder.defineMacro("__IMAGE_SUPPORT__");
1497 }
1498
1499 if (TI.hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1500
1501
1502
1503 Builder.defineMacro("__GLIBCXX_TYPE_INT_N_0", "__int128");
1504 Builder.defineMacro("__GLIBCXX_BITSIZE_INT_N_0", "128");
1505 }
1506
1507
1508 if (TI.getTriple().isOSBinFormatELF())
1509 Builder.defineMacro("__ELF__");
1510
1511
1513 const llvm::Triple &Triple = TI.getTriple();
1514#define TARGET_OS(Name, Predicate) \
1515 Builder.defineMacro(#Name, (Predicate) ? "1" : "0");
1516#include "clang/Basic/TargetOSMacros.def"
1517#undef TARGET_OS
1518 }
1519
1520
1522}
1523
1527 Builder.defineMacro("__LLVM_INSTR_PROFILE_GENERATE");
1528
1530 Builder.defineMacro("__LLVM_INSTR_PROFILE_USE");
1531}
1532
1533
1534
1541 std::string PredefineBuffer;
1542 PredefineBuffer.reserve(4080);
1543 llvm::raw_string_ostream Predefines(PredefineBuffer);
1545
1546
1547
1548
1549 Builder.append("# 1 \"\" 3");
1550
1551
1553
1554
1555 if ((LangOpts.CUDA || LangOpts.OpenMPIsTargetDevice ||
1556 LangOpts.SYCLIsDevice) &&
1560
1563
1564
1565
1566 if (LangOpts.ObjC && LangOpts.CPlusPlus &&
1567 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1571 break;
1572
1575 break;
1576 }
1577 }
1578 }
1579
1580
1581
1582
1584 FEOpts, Builder);
1585
1586
1587
1588
1590
1591
1592
1593 Builder.append("# 1 \"\" 1");
1594
1595
1596 for (unsigned i = 0, e = InitOpts.Macros.size(); i != e; ++i) {
1597 if (InitOpts.Macros[i].second)
1598 Builder.undefineMacro(InitOpts.Macros[i].first);
1599 else
1602 }
1603
1604
1605 Builder.append("# 1 \"\" 2");
1606
1607
1608
1609 for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i)
1611
1612
1616
1617
1618 for (unsigned i = 0, e = InitOpts.Includes.size(); i != e; ++i) {
1619 const std::string &Path = InitOpts.Includes[i];
1621 }
1622
1623
1626
1627
1629}
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)
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.
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.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
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...
bool hasWasmExceptions() const
clang::ObjCRuntime ObjCRuntime
bool hasSjLjExceptions() const
bool hasDWARFExceptions() const
bool hasSEHExceptions() const
std::string OpenACCMacroOverride
GPUDefaultStreamKind GPUDefaultStream
The default stream kind used for HIP kernel launching.
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
const VersionTuple & getVersion() const
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
@ GNUstep
'gnustep' is the modern non-fragile GNUstep runtime.
@ ObjFW
'objfw' is the Objective-C runtime included in ObjFW
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.
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.
unsigned getNewAlign() const
Return the largest alignment for which a suitably-sized allocation with '::operator new(size_t)' is g...
unsigned getUnsignedLongFractScale() const
getUnsignedLongFractScale - Return the number of fractional bits in a 'unsigned long _Fract' type.
unsigned getShortWidth() const
getShortWidth/Align - Return the size of 'signed short' and 'unsigned short' for this target,...
unsigned getUnsignedAccumScale() const
getUnsignedAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned _Accum' ty...
unsigned getUnsignedAccumIBits() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getAccumWidth() const
getAccumWidth/Align - Return the size of 'signed _Accum' and 'unsigned _Accum' for this target,...
IntType getUIntPtrType() const
IntType getInt64Type() const
unsigned getUnsignedFractScale() const
getUnsignedFractScale - Return the number of fractional bits in a 'unsigned _Fract' type.
virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return the smallest integer type with at least the specified width.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
virtual size_t getMaxBitIntWidth() const
unsigned getTypeWidth(IntType T) const
Return the width (in bits) of the specified integer type enum.
unsigned getLongAccumScale() const
getLongAccumScale/IBits - Return the number of fractional/integral bits in a 'signed long _Accum' typ...
unsigned getLongFractScale() const
getLongFractScale - Return the number of fractional bits in a 'signed long _Fract' type.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
virtual std::pair< unsigned, unsigned > hardwareInterferenceSizes() const
The first value in the pair is the minimum offset between two objects to avoid false sharing (destruc...
bool useSignedCharForObjCBool() const
Check if the Objective-C built-in boolean type should be signed char.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
unsigned getAccumIBits() const
IntType getSigAtomicType() const
unsigned getAccumScale() const
getAccumScale/IBits - Return the number of fractional/integral bits in a 'signed _Accum' type.
virtual bool hasFloat16Type() const
Determine whether the _Float16 type is supported on this target.
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
IntType getPtrDiffType(LangAS AddrSpace) const
bool isLittleEndian() const
unsigned getShortAccumIBits() const
unsigned getFloatWidth() const
getFloatWidth/Align/Format - Return the size/align/format of 'float'.
unsigned getLongAccumIBits() const
IntType getSizeType() const
IntType getWIntType() const
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...
unsigned getShortAccumScale() const
getShortAccumScale/IBits - Return the number of fractional/integral bits in a 'signed short _Accum' t...
const llvm::fltSemantics & getDoubleFormat() const
static const char * getTypeName(IntType T)
Return the user string for the specified integer type enum.
unsigned getLongLongWidth() const
getLongLongWidth/Align - Return the size of 'signed long long' and 'unsigned long long' for this targ...
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...
IntType getIntPtrType() const
IntType getInt16Type() const
const llvm::fltSemantics & getHalfFormat() const
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
IntType getWCharType() const
IntType getUInt16Type() const
const char * getUserLabelPrefix() const
Returns the default value of the USER_LABEL_PREFIX macro, which is the prefix given to user symbols b...
IntType getChar16Type() const
unsigned getUnsignedShortAccumIBits() const
IntType getChar32Type() const
IntType getUInt64Type() const
unsigned getUnsignedLongAccumScale() const
getUnsignedLongAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned long _...
unsigned getUnsignedLongAccumIBits() const
unsigned getUnsignedShortFractScale() const
getUnsignedShortFractScale - Return the number of fractional bits in a 'unsigned short _Fract' type.
const llvm::fltSemantics & getLongDoubleFormat() const
const llvm::fltSemantics & getFloatFormat() const
const char * getTypeConstantSuffix(IntType T) const
Return the constant suffix for the specified integer type enum.
unsigned getDoubleWidth() const
getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
unsigned getShortAccumWidth() const
getShortAccumWidth/Align - Return the size of 'signed short _Accum' and 'unsigned short _Accum' for t...
unsigned getSuitableAlign() const
Return the alignment that is the largest alignment ever used for any scalar/SIMD data type on the tar...
unsigned getCharWidth() const
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
unsigned getLongFractWidth() const
getLongFractWidth/Align - Return the size of 'signed long _Fract' and 'unsigned long _Fract' for this...
IntType getIntMaxType() const
unsigned getFractScale() const
getFractScale - Return the number of fractional bits in a 'signed _Fract' type.
unsigned getFractWidth() const
getFractWidth/Align - Return the size of 'signed _Fract' and 'unsigned _Fract' for this target,...
unsigned getShortFractScale() const
getShortFractScale - Return the number of fractional bits in a 'signed short _Fract' type.
unsigned getShortFractWidth() const
getShortFractWidth/Align - Return the size of 'signed short _Fract' and 'unsigned short _Fract' for t...
virtual bool hasHIPImageSupport() const
Whether to support HIP image/texture API's.
static const char * getTypeFormatModifier(IntType T)
Return the printf format modifier for the specified integer type enum.
unsigned getUnsignedShortAccumScale() const
getUnsignedShortAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned short...
bool doUnsignedFixedPointTypesHavePadding() const
In the event this target uses the same number of fractional bits for its unsigned types as it does wi...
IntType getUIntMaxType() const
unsigned getLongDoubleWidth() const
getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.
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_libstdcxx
libstdc++
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
const FunctionProtoType * T
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
std::string getClangFullCPPVersion()
Retrieves a string representing the complete clang version suitable for use in the CPP VERSION macro,...
IntType
===-— Target Data Type Query Methods ----------------------------—===//