27#include "llvm/ADT/APFloat.h"
28#include "llvm/IR/DataLayout.h"
29#include "llvm/IR/DerivedTypes.h"
33 while (!MacroBody.empty() &&
isWhitespace(MacroBody.back()))
34 MacroBody = MacroBody.drop_back();
35 return !MacroBody.empty() && MacroBody.back() ==
'\\';
43 std::pair<StringRef, StringRef> MacroPair = Macro.split(
'=');
44 StringRef MacroName = MacroPair.first;
45 StringRef MacroBody = MacroPair.second;
46 if (MacroName.size() != Macro.size()) {
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)
52 MacroBody = MacroBody.substr(0, End);
57 Builder.defineMacro(MacroName, Twine(MacroBody) +
"\\\n");
59 Builder.defineMacro(MacroName, MacroBody);
62 Builder.defineMacro(Macro);
71 Builder.append(Twine(
"#include \"") +
File +
"\"");
75 Builder.append(Twine(
"#__include_macros \"") +
File +
"\"");
84 StringRef ImplicitIncludePCH) {
86 std::string(ImplicitIncludePCH), PP.
getFileManager(), PCHContainerRdr,
88 if (OriginalFile.empty())
97static T PickFP(
const llvm::fltSemantics *Sem,
T IEEEHalfVal,
T IEEESingleVal,
98 T IEEEDoubleVal,
T X87DoubleExtendedVal,
T PPCDoubleDoubleVal,
100 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf())
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());
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");
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));
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);
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);
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);
194 Builder.defineMacro(Prefix +
"_FMT" + Twine(Fmt) +
"__",
195 Twine(
"\"") + FmtModifier + Twine(Fmt) +
"\"");
198 llvm::for_each(StringRef(IsSigned ?
"di" :
"ouxX"),
Emitter);
202 if (LangOpts.C23 && !IsSigned)
203 llvm::for_each(StringRef(
"bB"),
Emitter);
213 Builder.defineMacro(MacroName, Twine(TI.
getTypeWidth(Ty)));
218 Builder.defineMacro(MacroName,
249 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
251 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
252 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
255 Builder.defineMacro(Prefix + Twine(TypeWidth) +
"_C_SUFFIX__", ConstSuffix);
271 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
272 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
276 unsigned TypeWidth,
bool IsSigned,
280 if (Ty == TargetInfo::NoInt)
283 const char *Prefix = IsSigned ?
"__INT_LEAST" :
"__UINT_LEAST";
284 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
290 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
291 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
300 if (Ty == TargetInfo::NoInt)
303 const char *Prefix = IsSigned ?
"__INT_FAST" :
"__UINT_FAST";
304 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
310 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
311 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
333 Builder.defineMacro(
"_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
342 llvm::raw_string_ostream Out(Result);
344 Out <<
"namespace std {\n"
346 <<
"struct __true_type;\n"
347 <<
"struct __false_type;\n"
350 Out <<
"template<typename _Tp> struct __is_scalar;\n"
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"
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"
371 if (LangOpts.ObjCAutoRefCount) {
372 Out <<
"template<typename _Tp>\n"
373 <<
"struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
375 <<
" enum { __value = 0 };\n"
376 <<
" typedef __false_type __type;\n"
383 Builder.append(Result);
391 Builder.defineMacro(
"__hlsl_clang");
393 Builder.defineMacro(
"__HLSL_VERSION",
394 Twine((
unsigned)LangOpts.getHLSLVersion()));
396 if (LangOpts.NativeHalfType)
397 Builder.defineMacro(
"__HLSL_ENABLE_16_BIT",
"1");
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));
420 uint32_t StageInteger =
static_cast<uint32_t
>(
421 hlsl::getStageFromEnvironment(TI.
getTriple().getEnvironment()));
423 Builder.defineMacro(
"__SHADER_TARGET_STAGE", Twine(StageInteger));
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));
440 if ((!LangOpts.MSVCCompat || LangOpts.MSVCEnableStdcMacro) &&
441 !LangOpts.TraditionalCPP)
442 Builder.defineMacro(
"__STDC__");
446 if (LangOpts.Freestanding)
447 Builder.defineMacro(
"__STDC_HOSTED__",
"0");
449 Builder.defineMacro(
"__STDC_HOSTED__");
455 if (!LangOpts.CPlusPlus) {
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");
470 if (LangOpts.CPlusPlus26)
472 Builder.defineMacro(
"__cplusplus",
"202400L");
473 else if (LangOpts.CPlusPlus23)
474 Builder.defineMacro(
"__cplusplus",
"202302L");
476 else if (LangOpts.CPlusPlus20)
477 Builder.defineMacro(
"__cplusplus",
"202002L");
479 else if (LangOpts.CPlusPlus17)
480 Builder.defineMacro(
"__cplusplus",
"201703L");
483 else if (LangOpts.CPlusPlus14)
484 Builder.defineMacro(
"__cplusplus",
"201402L");
487 else if (LangOpts.CPlusPlus11)
488 Builder.defineMacro(
"__cplusplus",
"201103L");
492 Builder.defineMacro(
"__cplusplus",
"199711L");
499 Builder.defineMacro(
"__STDCPP_DEFAULT_NEW_ALIGNMENT__",
506 if (LangOpts.getThreadModel() == LangOptions::ThreadModelKind::POSIX)
507 Builder.defineMacro(
"__STDCPP_THREADS__",
"1");
515 Builder.defineMacro(
"__STDC_UTF_16__",
"1");
516 Builder.defineMacro(
"__STDC_UTF_32__",
"1");
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)));
527 Builder.defineMacro(
"__OBJC__");
530 if (LangOpts.OpenCL) {
531 if (LangOpts.CPlusPlus) {
532 switch (LangOpts.OpenCLCPlusPlusVersion) {
534 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"100");
537 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"202100");
540 llvm_unreachable(
"Unsupported C++ version for OpenCL");
542 Builder.defineMacro(
"__CL_CPP_VERSION_1_0__",
"100");
543 Builder.defineMacro(
"__CL_CPP_VERSION_2021__",
"202100");
552 switch (LangOpts.OpenCLVersion) {
554 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"100");
557 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"110");
560 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"120");
563 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"200");
566 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"300");
569 llvm_unreachable(
"Unsupported OpenCL version");
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");
579 Builder.defineMacro(
"__ENDIAN_LITTLE__");
581 if (LangOpts.FastRelaxedMath)
582 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
585 if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) {
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",
"202001");
594 if (LangOpts.AsmPreprocessor)
595 Builder.defineMacro(
"__ASSEMBLER__");
597 if (LangOpts.GPURelocatableDeviceCode)
598 Builder.defineMacro(
"__CLANG_RDC__");
600 Builder.defineMacro(
"__CUDA__");
602 LangOptions::GPUDefaultStreamKind::PerThread)
603 Builder.defineMacro(
"CUDA_API_PER_THREAD_DEFAULT_STREAM");
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__");
618 if (LangOpts.CUDAIsDevice) {
619 Builder.defineMacro(
"__HIP_DEVICE_COMPILE__");
621 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT__",
"1");
623 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT",
"1");
627 LangOptions::GPUDefaultStreamKind::PerThread) {
628 Builder.defineMacro(
"__HIP_API_PER_THREAD_DEFAULT_STREAM__");
630 Builder.defineMacro(
"HIP_API_PER_THREAD_DEFAULT_STREAM");
634 if (LangOpts.OpenACC) {
642 Builder.defineMacro(
"_OPENACC",
"1");
652 Builder.defineMacro(
"__cpp_rtti",
"199711L");
653 if (LangOpts.CXXExceptions)
654 Builder.defineMacro(
"__cpp_exceptions",
"199711L");
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 ?
"202306L"
664 : LangOpts.CPlusPlus23 ?
"202211L"
665 : LangOpts.CPlusPlus20 ?
"201907L"
666 : LangOpts.CPlusPlus17 ?
"201603L"
667 : LangOpts.CPlusPlus14 ?
"201304L"
669 Builder.defineMacro(
"__cpp_constexpr_in_decltype",
"201711L");
670 Builder.defineMacro(
"__cpp_range_based_for",
671 LangOpts.CPlusPlus23 ?
"202211L"
672 : LangOpts.CPlusPlus17 ?
"201603L"
674 Builder.defineMacro(
"__cpp_static_assert", LangOpts.CPlusPlus26 ?
"202306L"
675 : LangOpts.CPlusPlus17
678 Builder.defineMacro(
"__cpp_decltype",
"200707L");
679 Builder.defineMacro(
"__cpp_attributes",
"200809L");
680 Builder.defineMacro(
"__cpp_rvalue_references",
"200610L");
681 Builder.defineMacro(
"__cpp_variadic_templates",
"200704L");
682 Builder.defineMacro(
"__cpp_initializer_lists",
"200806L");
683 Builder.defineMacro(
"__cpp_delegating_constructors",
"200604L");
684 Builder.defineMacro(
"__cpp_nsdmi",
"200809L");
685 Builder.defineMacro(
"__cpp_inheriting_constructors",
"201511L");
686 Builder.defineMacro(
"__cpp_ref_qualifiers",
"200710L");
687 Builder.defineMacro(
"__cpp_alias_templates",
"200704L");
689 if (LangOpts.ThreadsafeStatics)
690 Builder.defineMacro(
"__cpp_threadsafe_static_init",
"200806L");
693 if (LangOpts.CPlusPlus14) {
694 Builder.defineMacro(
"__cpp_binary_literals",
"201304L");
695 Builder.defineMacro(
"__cpp_digit_separators",
"201309L");
696 Builder.defineMacro(
"__cpp_init_captures",
697 LangOpts.CPlusPlus20 ?
"201803L" :
"201304L");
698 Builder.defineMacro(
"__cpp_generic_lambdas",
699 LangOpts.CPlusPlus20 ?
"201707L" :
"201304L");
700 Builder.defineMacro(
"__cpp_decltype_auto",
"201304L");
701 Builder.defineMacro(
"__cpp_return_type_deduction",
"201304L");
702 Builder.defineMacro(
"__cpp_aggregate_nsdmi",
"201304L");
703 Builder.defineMacro(
"__cpp_variable_templates",
"201304L");
705 if (LangOpts.SizedDeallocation)
706 Builder.defineMacro(
"__cpp_sized_deallocation",
"201309L");
709 if (LangOpts.CPlusPlus17) {
710 Builder.defineMacro(
"__cpp_hex_float",
"201603L");
711 Builder.defineMacro(
"__cpp_inline_variables",
"201606L");
712 Builder.defineMacro(
"__cpp_noexcept_function_type",
"201510L");
713 Builder.defineMacro(
"__cpp_capture_star_this",
"201603L");
714 Builder.defineMacro(
"__cpp_if_constexpr",
"201606L");
715 Builder.defineMacro(
"__cpp_deduction_guides",
"201703L");
716 Builder.defineMacro(
"__cpp_template_auto",
"201606L");
717 Builder.defineMacro(
"__cpp_namespace_attributes",
"201411L");
718 Builder.defineMacro(
"__cpp_enumerator_attributes",
"201411L");
719 Builder.defineMacro(
"__cpp_nested_namespace_definitions",
"201411L");
720 Builder.defineMacro(
"__cpp_variadic_using",
"201611L");
721 Builder.defineMacro(
"__cpp_aggregate_bases",
"201603L");
722 Builder.defineMacro(
"__cpp_structured_bindings",
"202403L");
723 Builder.defineMacro(
"__cpp_nontype_template_args",
725 Builder.defineMacro(
"__cpp_fold_expressions",
"201603L");
726 Builder.defineMacro(
"__cpp_guaranteed_copy_elision",
"201606L");
727 Builder.defineMacro(
"__cpp_nontype_template_parameter_auto",
"201606L");
729 if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)
730 Builder.defineMacro(
"__cpp_aligned_new",
"201606L");
731 if (LangOpts.RelaxedTemplateTemplateArgs)
732 Builder.defineMacro(
"__cpp_template_template_args",
"201611L");
735 if (LangOpts.CPlusPlus20) {
736 Builder.defineMacro(
"__cpp_aggregate_paren_init",
"201902L");
738 Builder.defineMacro(
"__cpp_concepts",
"202002");
739 Builder.defineMacro(
"__cpp_conditional_explicit",
"201806L");
740 Builder.defineMacro(
"__cpp_consteval",
"202211L");
741 Builder.defineMacro(
"__cpp_constexpr_dynamic_alloc",
"201907L");
742 Builder.defineMacro(
"__cpp_constinit",
"201907L");
743 Builder.defineMacro(
"__cpp_impl_coroutine",
"201902L");
744 Builder.defineMacro(
"__cpp_designated_initializers",
"201707L");
745 Builder.defineMacro(
"__cpp_impl_three_way_comparison",
"201907L");
747 Builder.defineMacro(
"__cpp_using_enum",
"201907L");
750 if (LangOpts.CPlusPlus23) {
751 Builder.defineMacro(
"__cpp_implicit_move",
"202207L");
752 Builder.defineMacro(
"__cpp_size_t_suffix",
"202011L");
753 Builder.defineMacro(
"__cpp_if_consteval",
"202106L");
754 Builder.defineMacro(
"__cpp_multidimensional_subscript",
"202211L");
755 Builder.defineMacro(
"__cpp_auto_cast",
"202110L");
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");
766 Builder.defineMacro(
"__cpp_pack_indexing",
"202311L");
767 Builder.defineMacro(
"__cpp_deleted_function",
"202403L");
770 Builder.defineMacro(
"__cpp_char8_t",
"202207L");
771 Builder.defineMacro(
"__cpp_impl_destroying_delete",
"201806L");
782 auto defineOpenCLExtMacro = [&](llvm::StringRef Name,
auto... OptArgs) {
787 Builder.defineMacro(Name);
789#define OPENCL_GENERIC_EXTENSION(Ext, ...) \
790 defineOpenCLExtMacro(#Ext, __VA_ARGS__);
791#include "clang/Basic/OpenCLExtensions.def"
794 Builder.defineMacro(
"__opencl_c_int64");
798 llvm::StringRef Suffix) {
799 if (Val.isSigned() && Val == llvm::APFixedPoint::getMin(Val.getSemantics())) {
811 Literal.push_back(
'(');
816 Literal.push_back(
')');
826 llvm::StringRef TypeName, llvm::StringRef Suffix,
827 unsigned Width,
unsigned Scale,
bool Signed) {
830 llvm::FixedPointSemantics FXSema(
831 Width, Scale,
Signed,
false,
835 Builder.defineMacro(MacroPrefix +
"_EPSILON__",
837 llvm::APFixedPoint::getEpsilon(FXSema), Suffix));
838 Builder.defineMacro(MacroPrefix +
"_FBIT__", Twine(Scale));
840 MacroPrefix +
"_MAX__",
847 MacroPrefix +
"_MIN__",
857 Builder.defineMacro(
"__llvm__");
858 Builder.defineMacro(
"__clang__");
860#define TOSTR(X) TOSTR2(X)
861 Builder.defineMacro(
"__clang_major__",
TOSTR(CLANG_VERSION_MAJOR));
862 Builder.defineMacro(
"__clang_minor__",
TOSTR(CLANG_VERSION_MINOR));
863 Builder.defineMacro(
"__clang_patchlevel__",
TOSTR(CLANG_VERSION_PATCHLEVEL));
866 Builder.defineMacro(
"__clang_version__",
867 "\"" CLANG_VERSION_STRING
" "
870 if (LangOpts.GNUCVersion != 0) {
873 unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100;
874 unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100;
875 unsigned GNUCPatch = LangOpts.GNUCVersion % 100;
876 Builder.defineMacro(
"__GNUC__", Twine(GNUCMajor));
877 Builder.defineMacro(
"__GNUC_MINOR__", Twine(GNUCMinor));
878 Builder.defineMacro(
"__GNUC_PATCHLEVEL__", Twine(GNUCPatch));
879 Builder.defineMacro(
"__GXX_ABI_VERSION",
"1002");
881 if (LangOpts.CPlusPlus) {
882 Builder.defineMacro(
"__GNUG__", Twine(GNUCMajor));
883 Builder.defineMacro(
"__GXX_WEAK__");
888 Builder.defineMacro(
"__ATOMIC_RELAXED",
"0");
889 Builder.defineMacro(
"__ATOMIC_CONSUME",
"1");
890 Builder.defineMacro(
"__ATOMIC_ACQUIRE",
"2");
891 Builder.defineMacro(
"__ATOMIC_RELEASE",
"3");
892 Builder.defineMacro(
"__ATOMIC_ACQ_REL",
"4");
893 Builder.defineMacro(
"__ATOMIC_SEQ_CST",
"5");
896 Builder.defineMacro(
"__MEMORY_SCOPE_SYSTEM",
"0");
897 Builder.defineMacro(
"__MEMORY_SCOPE_DEVICE",
"1");
898 Builder.defineMacro(
"__MEMORY_SCOPE_WRKGRP",
"2");
899 Builder.defineMacro(
"__MEMORY_SCOPE_WVFRNT",
"3");
900 Builder.defineMacro(
"__MEMORY_SCOPE_SINGLE",
"4");
909 "Invalid OpenCL memory scope enum definition");
910 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_ITEM",
"0");
911 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_GROUP",
"1");
912 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_DEVICE",
"2");
913 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES",
"3");
914 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_SUB_GROUP",
"4");
917 Builder.defineMacro(
"__FPCLASS_SNAN",
"0x0001");
918 Builder.defineMacro(
"__FPCLASS_QNAN",
"0x0002");
919 Builder.defineMacro(
"__FPCLASS_NEGINF",
"0x0004");
920 Builder.defineMacro(
"__FPCLASS_NEGNORMAL",
"0x0008");
921 Builder.defineMacro(
"__FPCLASS_NEGSUBNORMAL",
"0x0010");
922 Builder.defineMacro(
"__FPCLASS_NEGZERO",
"0x0020");
923 Builder.defineMacro(
"__FPCLASS_POSZERO",
"0x0040");
924 Builder.defineMacro(
"__FPCLASS_POSSUBNORMAL",
"0x0080");
925 Builder.defineMacro(
"__FPCLASS_POSNORMAL",
"0x0100");
926 Builder.defineMacro(
"__FPCLASS_POSINF",
"0x0200");
929 Builder.defineMacro(
"__PRAGMA_REDEFINE_EXTNAME",
"1");
933 Builder.defineMacro(
"__VERSION__",
"\"" +
939 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
940 Builder.defineMacro(
"__STRICT_ANSI__");
942 if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11)
943 Builder.defineMacro(
"__GXX_EXPERIMENTAL_CXX0X__");
945 if (TI.
getTriple().isWindowsGNUEnvironment()) {
948 Builder.defineMacro(
"__GXX_TYPEINFO_EQUALITY_INLINE",
"0");
953 Builder.defineMacro(
"__OBJC2__");
955 if (LangOpts.ObjCExceptions)
956 Builder.defineMacro(
"OBJC_ZEROCOST_EXCEPTIONS");
959 if (LangOpts.getGC() != LangOptions::NonGC)
960 Builder.defineMacro(
"__OBJC_GC__");
963 Builder.defineMacro(
"__NEXT_RUNTIME__");
967 std::string versionString =
"1";
971 if (version >= VersionTuple(2, 0))
972 Builder.defineMacro(
"__OBJC_GNUSTEP_RUNTIME_ABI__",
"20");
975 "__OBJC_GNUSTEP_RUNTIME_ABI__",
976 "1" + Twine(std::min(8U, version.getMinor().value_or(0))));
981 unsigned minor = tuple.getMinor().value_or(0);
982 unsigned subminor = tuple.getSubminor().value_or(0);
983 Builder.defineMacro(
"__OBJFW_RUNTIME_ABI__",
984 Twine(tuple.getMajor() * 10000 + minor * 100 +
988 Builder.defineMacro(
"IBOutlet",
"__attribute__((iboutlet))");
989 Builder.defineMacro(
"IBOutletCollection(ClassName)",
990 "__attribute__((iboutletcollection(ClassName)))");
991 Builder.defineMacro(
"IBAction",
"void)__attribute__((ibaction)");
992 Builder.defineMacro(
"IBInspectable",
"");
993 Builder.defineMacro(
"IB_DESIGNABLE",
"");
998 Builder.defineMacro(
"__OBJC_BOOL_IS_BOOL",
1001 if (LangOpts.CPlusPlus)
1006 if (!LangOpts.NoConstantCFStrings)
1007 Builder.defineMacro(
"__CONSTANT_CFSTRINGS__");
1010 Builder.defineMacro(
"OBJC_NEW_PROPERTIES");
1012 if (LangOpts.PascalStrings)
1013 Builder.defineMacro(
"__PASCAL_STRINGS__");
1015 if (LangOpts.Blocks) {
1016 Builder.defineMacro(
"__block",
"__attribute__((__blocks__(byref)))");
1017 Builder.defineMacro(
"__BLOCKS__");
1020 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
1021 Builder.defineMacro(
"__EXCEPTIONS");
1022 if (LangOpts.GNUCVersion && LangOpts.RTTI)
1023 Builder.defineMacro(
"__GXX_RTTI");
1026 Builder.defineMacro(
"__USING_SJLJ_EXCEPTIONS__");
1028 Builder.defineMacro(
"__SEH__");
1031 Builder.defineMacro(
"__ARM_DWARF_EH__");
1033 Builder.defineMacro(
"__WASM_EXCEPTIONS__");
1035 if (LangOpts.Deprecated)
1036 Builder.defineMacro(
"__DEPRECATED");
1038 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus)
1039 Builder.defineMacro(
"__private_extern__",
"extern");
1041 if (LangOpts.MicrosoftExt) {
1042 if (LangOpts.WChar) {
1044 Builder.defineMacro(
"_WCHAR_T_DEFINED");
1045 Builder.defineMacro(
"_NATIVE_WCHAR_T_DEFINED");
1052 Builder.defineMacro(
"__clang_literal_encoding__",
"\"UTF-8\"");
1056 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-32\"");
1061 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-16\"");
1064 if (LangOpts.Optimize)
1065 Builder.defineMacro(
"__OPTIMIZE__");
1066 if (LangOpts.OptimizeSize)
1067 Builder.defineMacro(
"__OPTIMIZE_SIZE__");
1069 if (LangOpts.FastMath)
1070 Builder.defineMacro(
"__FAST_MATH__");
1079 Builder.defineMacro(
"__ORDER_LITTLE_ENDIAN__",
"1234");
1080 Builder.defineMacro(
"__ORDER_BIG_ENDIAN__",
"4321");
1081 Builder.defineMacro(
"__ORDER_PDP_ENDIAN__",
"3412");
1083 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_BIG_ENDIAN__");
1084 Builder.defineMacro(
"__BIG_ENDIAN__");
1086 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_LITTLE_ENDIAN__");
1087 Builder.defineMacro(
"__LITTLE_ENDIAN__");
1092 Builder.defineMacro(
"_LP64");
1093 Builder.defineMacro(
"__LP64__");
1098 Builder.defineMacro(
"_ILP32");
1099 Builder.defineMacro(
"__ILP32__");
1103 assert(TI.
getCharWidth() == 8 &&
"Only support 8-bit char so far");
1104 Builder.defineMacro(
"__CHAR_BIT__", Twine(TI.
getCharWidth()));
1106 Builder.defineMacro(
"__BOOL_WIDTH__", Twine(TI.
getBoolWidth()));
1107 Builder.defineMacro(
"__SHRT_WIDTH__", Twine(TI.
getShortWidth()));
1108 Builder.defineMacro(
"__INT_WIDTH__", Twine(TI.
getIntWidth()));
1109 Builder.defineMacro(
"__LONG_WIDTH__", Twine(TI.
getLongWidth()));
1113 assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&
1114 "Target defined a max bit width larger than LLVM can support!");
1116 "Target defined a max bit width smaller than the C standard allows!");
1117 Builder.defineMacro(
"__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));
1119 DefineTypeSize(
"__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder);
1120 DefineTypeSize(
"__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder);
1121 DefineTypeSize(
"__INT_MAX__", TargetInfo::SignedInt, TI, Builder);
1122 DefineTypeSize(
"__LONG_MAX__", TargetInfo::SignedLong, TI, Builder);
1123 DefineTypeSize(
"__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder);
1158 Builder.defineMacro(
"__INTMAX_C_SUFFIX__",
1162 Builder.defineMacro(
"__UINTMAX_C_SUFFIX__",
1186 "uintptr_t and intptr_t have different widths?");
1189 "uintmax_t and intmax_t have different widths?");
1191 if (LangOpts.FixedPoint) {
1223 Builder.defineMacro(
"__USACCUM_IBIT__",
1225 Builder.defineMacro(
"__ACCUM_IBIT__", Twine(TI.
getAccumIBits()));
1228 Builder.defineMacro(
"__ULACCUM_IBIT__",
1239 Builder.defineMacro(
"__POINTER_WIDTH__",
1243 Builder.defineMacro(
"__BIGGEST_ALIGNMENT__",
1246 if (!LangOpts.CharIsSigned)
1247 Builder.defineMacro(
"__CHAR_UNSIGNED__");
1250 Builder.defineMacro(
"__WCHAR_UNSIGNED__");
1253 Builder.defineMacro(
"__WINT_UNSIGNED__");
1319 if (!LangOpts.MathErrno)
1320 Builder.defineMacro(
"__NO_MATH_ERRNO__");
1322 if (LangOpts.FastMath || (LangOpts.NoHonorInfs && LangOpts.NoHonorNaNs))
1323 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"1");
1325 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"0");
1327 if (LangOpts.GNUCVersion) {
1328 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
1329 Builder.defineMacro(
"__GNUC_GNU_INLINE__");
1331 Builder.defineMacro(
"__GNUC_STDC_INLINE__");
1335 Builder.defineMacro(
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
"1");
1341 Builder.defineMacro(
"__GCC_DESTRUCTIVE_SIZE", Twine(Destructive));
1342 Builder.defineMacro(
"__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive));
1345 Builder.append(
"#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")");
1346 Builder.append(
"#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")");
1348 auto addLockFreeMacros = [&](
const llvm::Twine &Prefix) {
1350#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
1351 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \
1352 getLockFreeValue(TI.get##Type##Width(), TI));
1357 if (LangOpts.Char8 || LangOpts.C23)
1366 Builder.defineMacro(
1367 Prefix +
"POINTER_LOCK_FREE",
1369#undef DEFINE_LOCK_FREE_MACRO
1371 addLockFreeMacros(
"__CLANG_ATOMIC_");
1372 if (LangOpts.GNUCVersion)
1373 addLockFreeMacros(
"__GCC_ATOMIC_");
1375 if (LangOpts.NoInlineDefine)
1376 Builder.defineMacro(
"__NO_INLINE__");
1378 if (
unsigned PICLevel = LangOpts.PICLevel) {
1379 Builder.defineMacro(
"__PIC__", Twine(PICLevel));
1380 Builder.defineMacro(
"__pic__", Twine(PICLevel));
1382 Builder.defineMacro(
"__PIE__", Twine(PICLevel));
1383 Builder.defineMacro(
"__pie__", Twine(PICLevel));
1388 Builder.defineMacro(
"__FLT_RADIX__",
"2");
1389 Builder.defineMacro(
"__DECIMAL_DIG__",
"__LDBL_DECIMAL_DIG__");
1391 if (LangOpts.getStackProtector() == LangOptions::SSPOn)
1392 Builder.defineMacro(
"__SSP__");
1393 else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
1394 Builder.defineMacro(
"__SSP_STRONG__",
"2");
1395 else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
1396 Builder.defineMacro(
"__SSP_ALL__",
"3");
1399 Builder.defineMacro(
"__clang_analyzer__");
1401 if (LangOpts.FastRelaxedMath)
1402 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
1405 LangOpts.getGC() != LangOptions::NonGC) {
1406 Builder.defineMacro(
"__weak",
"__attribute__((objc_gc(weak)))");
1407 Builder.defineMacro(
"__strong",
"__attribute__((objc_gc(strong)))");
1408 Builder.defineMacro(
"__autoreleasing",
"");
1409 Builder.defineMacro(
"__unsafe_unretained",
"");
1410 }
else if (LangOpts.ObjC) {
1411 Builder.defineMacro(
"__weak",
"__attribute__((objc_ownership(weak)))");
1412 Builder.defineMacro(
"__strong",
"__attribute__((objc_ownership(strong)))");
1413 Builder.defineMacro(
"__autoreleasing",
1414 "__attribute__((objc_ownership(autoreleasing)))");
1415 Builder.defineMacro(
"__unsafe_unretained",
1416 "__attribute__((objc_ownership(none)))");
1422 Builder.defineMacro(
"__nonnull",
"_Nonnull");
1423 Builder.defineMacro(
"__null_unspecified",
"_Null_unspecified");
1424 Builder.defineMacro(
"__nullable",
"_Nullable");
1430 Builder.defineMacro(
"__APPLE_EMBEDDED_SIMULATOR__",
"1");
1438 if (!LangOpts.OpenMPSimd) {
1439 switch (LangOpts.OpenMP) {
1443 Builder.defineMacro(
"_OPENMP",
"201107");
1446 Builder.defineMacro(
"_OPENMP",
"201307");
1449 Builder.defineMacro(
"_OPENMP",
"201511");
1452 Builder.defineMacro(
"_OPENMP",
"201811");
1455 Builder.defineMacro(
"_OPENMP",
"202111");
1459 Builder.defineMacro(
"_OPENMP",
"202011");
1465 if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {
1468 Builder.defineMacro(
"__CUDA_ARCH__");
1473 if (LangOpts.GPUDeviceApproxTranscendentals)
1474 Builder.defineMacro(
"__CLANG_GPU_APPROX_TRANSCENDENTALS__");
1478 if (LangOpts.SYCLIsDevice) {
1479 Builder.defineMacro(
"__SYCL_DEVICE_ONLY__",
"1");
1483 if (LangOpts.OpenCL) {
1487 Builder.defineMacro(
"__IMAGE_SUPPORT__");
1490 if (TI.
hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1494 Builder.defineMacro(
"__GLIBCXX_TYPE_INT_N_0",
"__int128");
1495 Builder.defineMacro(
"__GLIBCXX_BITSIZE_INT_N_0",
"128");
1500 Builder.defineMacro(
"__ELF__");
1504 const llvm::Triple &Triple = TI.
getTriple();
1505#define TARGET_OS(Name, Predicate) \
1506 Builder.defineMacro(#Name, (Predicate) ? "1" : "0");
1507#include "clang/Basic/TargetOSMacros.def"
1518 Builder.defineMacro(
"__LLVM_INSTR_PROFILE_GENERATE");
1521 Builder.defineMacro(
"__LLVM_INSTR_PROFILE_USE");
1532 std::string PredefineBuffer;
1533 PredefineBuffer.reserve(4080);
1534 llvm::raw_string_ostream Predefines(PredefineBuffer);
1540 Builder.append(
"# 1 \"<built-in>\" 3");
1546 if ((LangOpts.CUDA || LangOpts.OpenMPIsTargetDevice ||
1547 LangOpts.SYCLIsDevice) &&
1557 if (LangOpts.ObjC && LangOpts.CPlusPlus &&
1558 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1584 Builder.append(
"# 1 \"<command line>\" 1");
1587 for (
unsigned i = 0, e = InitOpts.
Macros.size(); i != e; ++i) {
1588 if (InitOpts.
Macros[i].second)
1589 Builder.undefineMacro(InitOpts.
Macros[i].first);
1596 Builder.append(
"# 1 \"<built-in>\" 2");
1600 for (
unsigned i = 0, e = InitOpts.
MacroIncludes.size(); i != e; ++i)
1609 for (
unsigned i = 0, e = InitOpts.
Includes.size(); i != e; ++i) {
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
Return the size of 'signed short' and 'unsigned short' for this target, in bits.
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 getBoolWidth() const
Return the size of '_Bool' and C++ 'bool' for this target, in bits.
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 ----------------------------—===//