27 #include "llvm/ADT/APFloat.h"
28 #include "llvm/IR/DataLayout.h"
29 #include "llvm/IR/DerivedTypes.h"
30 using namespace clang;
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())
97 static 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, *Epsilon, *
Max, *
Min;
117 DenormMin =
PickFP(Sem,
"5.9604644775390625e-8",
"1.40129846e-45",
118 "4.9406564584124654e-324",
"3.64519953188247460253e-4951",
119 "4.94065645841246544176568792868221e-324",
120 "6.47517511943802511092443895822764655e-4966");
121 int Digits =
PickFP(Sem, 3, 6, 15, 18, 31, 33);
122 int DecimalDigits =
PickFP(Sem, 5, 9, 17, 21, 33, 36);
123 Epsilon =
PickFP(Sem,
"9.765625e-4",
"1.19209290e-7",
124 "2.2204460492503131e-16",
"1.08420217248550443401e-19",
125 "4.94065645841246544176568792868221e-324",
126 "1.92592994438723585305597794258492732e-34");
127 int MantissaDigits =
PickFP(Sem, 11, 24, 53, 64, 106, 113);
128 int Min10Exp =
PickFP(Sem, -4, -37, -307, -4931, -291, -4931);
129 int Max10Exp =
PickFP(Sem, 4, 38, 308, 4932, 308, 4932);
130 int MinExp =
PickFP(Sem, -13, -125, -1021, -16381, -968, -16381);
131 int MaxExp =
PickFP(Sem, 16, 128, 1024, 16384, 1024, 16384);
132 Min =
PickFP(Sem,
"6.103515625e-5",
"1.17549435e-38",
"2.2250738585072014e-308",
133 "3.36210314311209350626e-4932",
134 "2.00416836000897277799610805135016e-292",
135 "3.36210314311209350626267781732175260e-4932");
136 Max =
PickFP(Sem,
"6.5504e+4",
"3.40282347e+38",
"1.7976931348623157e+308",
137 "1.18973149535723176502e+4932",
138 "1.79769313486231580793728971405301e+308",
139 "1.18973149535723176508575932662800702e+4932");
146 Builder.defineMacro(DefPrefix +
"DENORM_MIN__", Twine(DenormMin)+Ext);
147 Builder.defineMacro(DefPrefix +
"HAS_DENORM__");
148 Builder.defineMacro(DefPrefix +
"DIG__", Twine(Digits));
149 Builder.defineMacro(DefPrefix +
"DECIMAL_DIG__", Twine(DecimalDigits));
150 Builder.defineMacro(DefPrefix +
"EPSILON__", Twine(Epsilon)+Ext);
151 Builder.defineMacro(DefPrefix +
"HAS_INFINITY__");
152 Builder.defineMacro(DefPrefix +
"HAS_QUIET_NAN__");
153 Builder.defineMacro(DefPrefix +
"MANT_DIG__", Twine(MantissaDigits));
155 Builder.defineMacro(DefPrefix +
"MAX_10_EXP__", Twine(Max10Exp));
156 Builder.defineMacro(DefPrefix +
"MAX_EXP__", Twine(MaxExp));
157 Builder.defineMacro(DefPrefix +
"MAX__", Twine(
Max)+Ext);
159 Builder.defineMacro(DefPrefix +
"MIN_10_EXP__",
"("+Twine(Min10Exp)+
")");
160 Builder.defineMacro(DefPrefix +
"MIN_EXP__",
"("+Twine(MinExp)+
")");
161 Builder.defineMacro(DefPrefix +
"MIN__", Twine(
Min)+Ext);
169 StringRef ValSuffix,
bool isSigned,
171 llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth)
172 : llvm::APInt::getMaxValue(TypeWidth);
173 Builder.defineMacro(MacroName,
toString(MaxVal, 10, isSigned) + ValSuffix);
189 Builder.defineMacro(Prefix +
"_FMT" + Twine(Fmt) +
"__",
190 Twine(
"\"") + FmtModifier + Twine(Fmt) +
"\"");
193 llvm::for_each(StringRef(IsSigned ?
"di" :
"ouxX"),
Emitter);
197 if (LangOpts.C23 && !IsSigned)
198 llvm::for_each(StringRef(
"bB"),
Emitter);
208 Builder.defineMacro(MacroName, Twine(TI.
getTypeWidth(Ty)));
213 Builder.defineMacro(MacroName,
244 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
246 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
247 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
250 Builder.defineMacro(Prefix + Twine(TypeWidth) +
"_C_SUFFIX__", ConstSuffix);
266 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
267 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
271 unsigned TypeWidth,
bool IsSigned,
278 const char *Prefix = IsSigned ?
"__INT_LEAST" :
"__UINT_LEAST";
279 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
285 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
286 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
298 const char *Prefix = IsSigned ?
"__INT_FAST" :
"__UINT_FAST";
299 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
305 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
306 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
328 Builder.defineMacro(
"_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
337 llvm::raw_string_ostream Out(Result);
339 Out <<
"namespace std {\n"
341 <<
"struct __true_type;\n"
342 <<
"struct __false_type;\n"
345 Out <<
"template<typename _Tp> struct __is_scalar;\n"
348 if (LangOpts.ObjCAutoRefCount) {
349 Out <<
"template<typename _Tp>\n"
350 <<
"struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"
351 <<
" enum { __value = 0 };\n"
352 <<
" typedef __false_type __type;\n"
357 if (LangOpts.ObjCWeak) {
358 Out <<
"template<typename _Tp>\n"
359 <<
"struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"
360 <<
" enum { __value = 0 };\n"
361 <<
" typedef __false_type __type;\n"
366 if (LangOpts.ObjCAutoRefCount) {
367 Out <<
"template<typename _Tp>\n"
368 <<
"struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
370 <<
" enum { __value = 0 };\n"
371 <<
" typedef __false_type __type;\n"
378 Builder.append(Result);
386 Builder.defineMacro(
"__hlsl_clang");
388 Builder.defineMacro(
"__HLSL_VERSION",
389 Twine((
unsigned)LangOpts.getHLSLVersion()));
391 if (LangOpts.NativeHalfType)
392 Builder.defineMacro(
"__HLSL_ENABLE_16_BIT",
"1");
396 Builder.defineMacro(
"__SHADER_STAGE_VERTEX",
398 Builder.defineMacro(
"__SHADER_STAGE_PIXEL",
400 Builder.defineMacro(
"__SHADER_STAGE_GEOMETRY",
402 Builder.defineMacro(
"__SHADER_STAGE_HULL",
404 Builder.defineMacro(
"__SHADER_STAGE_DOMAIN",
406 Builder.defineMacro(
"__SHADER_STAGE_COMPUTE",
408 Builder.defineMacro(
"__SHADER_STAGE_AMPLIFICATION",
410 Builder.defineMacro(
"__SHADER_STAGE_MESH",
412 Builder.defineMacro(
"__SHADER_STAGE_LIBRARY",
415 uint32_t StageInteger =
static_cast<uint32_t
>(
418 Builder.defineMacro(
"__SHADER_TARGET_STAGE", Twine(StageInteger));
420 if (TI.
getTriple().getOS() == llvm::Triple::ShaderModel) {
421 VersionTuple Version = TI.
getTriple().getOSVersion();
422 Builder.defineMacro(
"__SHADER_TARGET_MAJOR", Twine(Version.getMajor()));
423 unsigned Minor = Version.getMinor().value_or(0);
424 Builder.defineMacro(
"__SHADER_TARGET_MINOR", Twine(Minor));
435 if ((!LangOpts.MSVCCompat || LangOpts.MSVCEnableStdcMacro) &&
436 !LangOpts.TraditionalCPP)
437 Builder.defineMacro(
"__STDC__");
441 if (LangOpts.Freestanding)
442 Builder.defineMacro(
"__STDC_HOSTED__",
"0");
444 Builder.defineMacro(
"__STDC_HOSTED__");
450 if (!LangOpts.CPlusPlus) {
452 Builder.defineMacro(
"__STDC_VERSION__",
"202311L");
453 else if (LangOpts.C17)
454 Builder.defineMacro(
"__STDC_VERSION__",
"201710L");
455 else if (LangOpts.C11)
456 Builder.defineMacro(
"__STDC_VERSION__",
"201112L");
457 else if (LangOpts.C99)
458 Builder.defineMacro(
"__STDC_VERSION__",
"199901L");
459 else if (!LangOpts.GNUMode && LangOpts.Digraphs)
460 Builder.defineMacro(
"__STDC_VERSION__",
"199409L");
463 if (LangOpts.CPlusPlus26)
465 Builder.defineMacro(
"__cplusplus",
"202400L");
466 else if (LangOpts.CPlusPlus23)
467 Builder.defineMacro(
"__cplusplus",
"202302L");
469 else if (LangOpts.CPlusPlus20)
470 Builder.defineMacro(
"__cplusplus",
"202002L");
472 else if (LangOpts.CPlusPlus17)
473 Builder.defineMacro(
"__cplusplus",
"201703L");
476 else if (LangOpts.CPlusPlus14)
477 Builder.defineMacro(
"__cplusplus",
"201402L");
480 else if (LangOpts.CPlusPlus11)
481 Builder.defineMacro(
"__cplusplus",
"201103L");
485 Builder.defineMacro(
"__cplusplus",
"199711L");
492 Builder.defineMacro(
"__STDCPP_DEFAULT_NEW_ALIGNMENT__",
500 Builder.defineMacro(
"__STDCPP_THREADS__",
"1");
508 Builder.defineMacro(
"__STDC_UTF_16__",
"1");
509 Builder.defineMacro(
"__STDC_UTF_32__",
"1");
512 Builder.defineMacro(
"__OBJC__");
515 if (LangOpts.OpenCL) {
516 if (LangOpts.CPlusPlus) {
517 switch (LangOpts.OpenCLCPlusPlusVersion) {
519 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"100");
522 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"202100");
525 llvm_unreachable(
"Unsupported C++ version for OpenCL");
527 Builder.defineMacro(
"__CL_CPP_VERSION_1_0__",
"100");
528 Builder.defineMacro(
"__CL_CPP_VERSION_2021__",
"202100");
537 switch (LangOpts.OpenCLVersion) {
539 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"100");
542 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"110");
545 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"120");
548 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"200");
551 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"300");
554 llvm_unreachable(
"Unsupported OpenCL version");
557 Builder.defineMacro(
"CL_VERSION_1_0",
"100");
558 Builder.defineMacro(
"CL_VERSION_1_1",
"110");
559 Builder.defineMacro(
"CL_VERSION_1_2",
"120");
560 Builder.defineMacro(
"CL_VERSION_2_0",
"200");
561 Builder.defineMacro(
"CL_VERSION_3_0",
"300");
564 Builder.defineMacro(
"__ENDIAN_LITTLE__");
566 if (LangOpts.FastRelaxedMath)
567 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
570 if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) {
572 for (
const std::pair<StringRef, StringRef> &Macro :
574 Builder.defineMacro(Macro.first, Macro.second);
576 if (LangOpts.SYCLValueFitInMaxInt)
577 Builder.defineMacro(
"__SYCL_ID_QUERIES_FIT_IN_INT__");
582 switch (LangOpts.getSYCLRangeRounding()) {
584 Builder.defineMacro(
"__SYCL_DISABLE_PARALLEL_FOR_RANGE_ROUNDING__");
587 Builder.defineMacro(
"__SYCL_FORCE_PARALLEL_FOR_RANGE_ROUNDING__");
596 if (LangOpts.SYCLExperimentalRangeRounding)
597 Builder.defineMacro(
"__SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__");
600 if (LangOpts.DeclareSPIRVBuiltins) {
601 Builder.defineMacro(
"__SPIRV_BUILTIN_DECLARATIONS__");
605 if (LangOpts.AsmPreprocessor)
606 Builder.defineMacro(
"__ASSEMBLER__");
608 if (LangOpts.GPURelocatableDeviceCode)
609 Builder.defineMacro(
"__CLANG_RDC__");
611 Builder.defineMacro(
"__CUDA__");
614 Builder.defineMacro(
"CUDA_API_PER_THREAD_DEFAULT_STREAM");
617 Builder.defineMacro(
"__HIP__");
618 Builder.defineMacro(
"__HIPCC__");
619 if (LangOpts.HIPStdPar) {
620 Builder.defineMacro(
"__HIPSTDPAR__");
621 if (LangOpts.HIPStdParInterposeAlloc)
622 Builder.defineMacro(
"__HIPSTDPAR_INTERPOSE_ALLOC__");
624 if (LangOpts.CUDAIsDevice) {
625 Builder.defineMacro(
"__HIP_DEVICE_COMPILE__");
627 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT__",
"1");
629 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT",
"1");
634 Builder.defineMacro(
"__HIP_API_PER_THREAD_DEFAULT_STREAM__");
636 Builder.defineMacro(
"HIP_API_PER_THREAD_DEFAULT_STREAM");
639 if (LangOpts.HIP || (LangOpts.OpenCL && TI.
getTriple().isAMDGPU())) {
640 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_SINGLETHREAD",
"1");
641 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_WAVEFRONT",
"2");
642 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_WORKGROUP",
"3");
643 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_AGENT",
"4");
644 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_SYSTEM",
"5");
647 if (LangOpts.OpenACC) {
655 Builder.defineMacro(
"_OPENACC",
"1");
665 Builder.defineMacro(
"__cpp_rtti",
"199711L");
666 if (LangOpts.CXXExceptions)
667 Builder.defineMacro(
"__cpp_exceptions",
"199711L");
670 if (LangOpts.CPlusPlus11) {
671 Builder.defineMacro(
"__cpp_unicode_characters",
"200704L");
672 Builder.defineMacro(
"__cpp_raw_strings",
"200710L");
673 Builder.defineMacro(
"__cpp_unicode_literals",
"200710L");
674 Builder.defineMacro(
"__cpp_user_defined_literals",
"200809L");
675 Builder.defineMacro(
"__cpp_lambdas",
"200907L");
676 Builder.defineMacro(
"__cpp_constexpr", LangOpts.CPlusPlus26 ?
"202306L"
677 : LangOpts.CPlusPlus23 ?
"202211L"
678 : LangOpts.CPlusPlus20 ?
"201907L"
679 : LangOpts.CPlusPlus17 ?
"201603L"
680 : LangOpts.CPlusPlus14 ?
"201304L"
682 Builder.defineMacro(
"__cpp_constexpr_in_decltype",
"201711L");
683 Builder.defineMacro(
"__cpp_range_based_for",
684 LangOpts.CPlusPlus23 ?
"202211L"
685 : LangOpts.CPlusPlus17 ?
"201603L"
687 Builder.defineMacro(
"__cpp_static_assert", LangOpts.CPlusPlus26 ?
"202306L"
688 : LangOpts.CPlusPlus17
691 Builder.defineMacro(
"__cpp_decltype",
"200707L");
692 Builder.defineMacro(
"__cpp_attributes",
"200809L");
693 Builder.defineMacro(
"__cpp_rvalue_references",
"200610L");
694 Builder.defineMacro(
"__cpp_variadic_templates",
"200704L");
695 Builder.defineMacro(
"__cpp_initializer_lists",
"200806L");
696 Builder.defineMacro(
"__cpp_delegating_constructors",
"200604L");
697 Builder.defineMacro(
"__cpp_nsdmi",
"200809L");
698 Builder.defineMacro(
"__cpp_inheriting_constructors",
"201511L");
699 Builder.defineMacro(
"__cpp_ref_qualifiers",
"200710L");
700 Builder.defineMacro(
"__cpp_alias_templates",
"200704L");
702 if (LangOpts.ThreadsafeStatics)
703 Builder.defineMacro(
"__cpp_threadsafe_static_init",
"200806L");
706 if (LangOpts.CPlusPlus14) {
707 Builder.defineMacro(
"__cpp_binary_literals",
"201304L");
708 Builder.defineMacro(
"__cpp_digit_separators",
"201309L");
709 Builder.defineMacro(
"__cpp_init_captures",
710 LangOpts.CPlusPlus20 ?
"201803L" :
"201304L");
711 Builder.defineMacro(
"__cpp_generic_lambdas",
712 LangOpts.CPlusPlus20 ?
"201707L" :
"201304L");
713 Builder.defineMacro(
"__cpp_decltype_auto",
"201304L");
714 Builder.defineMacro(
"__cpp_return_type_deduction",
"201304L");
715 Builder.defineMacro(
"__cpp_aggregate_nsdmi",
"201304L");
716 Builder.defineMacro(
"__cpp_variable_templates",
"201304L");
718 if (LangOpts.SizedDeallocation)
719 Builder.defineMacro(
"__cpp_sized_deallocation",
"201309L");
722 if (LangOpts.CPlusPlus17) {
723 Builder.defineMacro(
"__cpp_hex_float",
"201603L");
724 Builder.defineMacro(
"__cpp_inline_variables",
"201606L");
725 Builder.defineMacro(
"__cpp_noexcept_function_type",
"201510L");
726 Builder.defineMacro(
"__cpp_capture_star_this",
"201603L");
727 Builder.defineMacro(
"__cpp_if_constexpr",
"201606L");
728 Builder.defineMacro(
"__cpp_deduction_guides",
"201703L");
729 Builder.defineMacro(
"__cpp_template_auto",
"201606L");
730 Builder.defineMacro(
"__cpp_namespace_attributes",
"201411L");
731 Builder.defineMacro(
"__cpp_enumerator_attributes",
"201411L");
732 Builder.defineMacro(
"__cpp_nested_namespace_definitions",
"201411L");
733 Builder.defineMacro(
"__cpp_variadic_using",
"201611L");
734 Builder.defineMacro(
"__cpp_aggregate_bases",
"201603L");
735 Builder.defineMacro(
"__cpp_structured_bindings",
"202403L");
736 Builder.defineMacro(
"__cpp_nontype_template_args",
738 Builder.defineMacro(
"__cpp_fold_expressions",
"201603L");
739 Builder.defineMacro(
"__cpp_guaranteed_copy_elision",
"201606L");
740 Builder.defineMacro(
"__cpp_nontype_template_parameter_auto",
"201606L");
742 if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)
743 Builder.defineMacro(
"__cpp_aligned_new",
"201606L");
744 if (LangOpts.RelaxedTemplateTemplateArgs)
745 Builder.defineMacro(
"__cpp_template_template_args",
"201611L");
748 if (LangOpts.CPlusPlus20) {
749 Builder.defineMacro(
"__cpp_aggregate_paren_init",
"201902L");
751 Builder.defineMacro(
"__cpp_concepts",
"202002");
752 Builder.defineMacro(
"__cpp_conditional_explicit",
"201806L");
753 Builder.defineMacro(
"__cpp_consteval",
"202211L");
754 Builder.defineMacro(
"__cpp_constexpr_dynamic_alloc",
"201907L");
755 Builder.defineMacro(
"__cpp_constinit",
"201907L");
756 Builder.defineMacro(
"__cpp_impl_coroutine",
"201902L");
757 Builder.defineMacro(
"__cpp_designated_initializers",
"201707L");
758 Builder.defineMacro(
"__cpp_impl_three_way_comparison",
"201907L");
760 Builder.defineMacro(
"__cpp_using_enum",
"201907L");
763 if (LangOpts.CPlusPlus23) {
764 Builder.defineMacro(
"__cpp_implicit_move",
"202207L");
765 Builder.defineMacro(
"__cpp_size_t_suffix",
"202011L");
766 Builder.defineMacro(
"__cpp_if_consteval",
"202106L");
767 Builder.defineMacro(
"__cpp_multidimensional_subscript",
"202211L");
768 Builder.defineMacro(
"__cpp_auto_cast",
"202110L");
773 if (LangOpts.CPlusPlus11)
774 Builder.defineMacro(
"__cpp_static_call_operator",
"202207L");
775 Builder.defineMacro(
"__cpp_named_character_escapes",
"202207L");
776 Builder.defineMacro(
"__cpp_placeholder_variables",
"202306L");
779 Builder.defineMacro(
"__cpp_deleted_function",
"202403L");
782 Builder.defineMacro(
"__cpp_char8_t",
"202207L");
783 Builder.defineMacro(
"__cpp_impl_destroying_delete",
"201806L");
794 auto defineOpenCLExtMacro = [&](llvm::StringRef Name,
auto... OptArgs) {
799 Builder.defineMacro(Name);
801 #define OPENCL_GENERIC_EXTENSION(Ext, ...) \
802 defineOpenCLExtMacro(#Ext, __VA_ARGS__);
803 #include "clang/Basic/OpenCLExtensions.def"
806 Builder.defineMacro(
"__opencl_c_int64");
810 llvm::StringRef Suffix) {
811 if (Val.isSigned() && Val == llvm::APFixedPoint::getMin(Val.getSemantics())) {
838 llvm::StringRef TypeName, llvm::StringRef Suffix,
839 unsigned Width,
unsigned Scale,
bool Signed) {
842 llvm::FixedPointSemantics FXSema(
843 Width, Scale,
Signed,
false,
847 Builder.defineMacro(MacroPrefix +
"_EPSILON__",
849 llvm::APFixedPoint::getEpsilon(FXSema), Suffix));
850 Builder.defineMacro(MacroPrefix +
"_FBIT__", Twine(Scale));
852 MacroPrefix +
"_MAX__",
859 MacroPrefix +
"_MIN__",
869 Builder.defineMacro(
"__llvm__");
870 Builder.defineMacro(
"__clang__");
872 #define TOSTR(X) TOSTR2(X)
873 Builder.defineMacro(
"__clang_major__",
TOSTR(CLANG_VERSION_MAJOR));
874 Builder.defineMacro(
"__clang_minor__",
TOSTR(CLANG_VERSION_MINOR));
875 Builder.defineMacro(
"__clang_patchlevel__",
TOSTR(CLANG_VERSION_PATCHLEVEL));
878 Builder.defineMacro(
"__clang_version__",
879 "\"" CLANG_VERSION_STRING
" "
882 if (LangOpts.GNUCVersion != 0) {
885 unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100;
886 unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100;
887 unsigned GNUCPatch = LangOpts.GNUCVersion % 100;
888 Builder.defineMacro(
"__GNUC__", Twine(GNUCMajor));
889 Builder.defineMacro(
"__GNUC_MINOR__", Twine(GNUCMinor));
890 Builder.defineMacro(
"__GNUC_PATCHLEVEL__", Twine(GNUCPatch));
891 Builder.defineMacro(
"__GXX_ABI_VERSION",
"1002");
893 if (LangOpts.CPlusPlus) {
894 Builder.defineMacro(
"__GNUG__", Twine(GNUCMajor));
895 Builder.defineMacro(
"__GXX_WEAK__");
900 Builder.defineMacro(
"__ATOMIC_RELAXED",
"0");
901 Builder.defineMacro(
"__ATOMIC_CONSUME",
"1");
902 Builder.defineMacro(
"__ATOMIC_ACQUIRE",
"2");
903 Builder.defineMacro(
"__ATOMIC_RELEASE",
"3");
904 Builder.defineMacro(
"__ATOMIC_ACQ_REL",
"4");
905 Builder.defineMacro(
"__ATOMIC_SEQ_CST",
"5");
908 Builder.defineMacro(
"__MEMORY_SCOPE_SYSTEM",
"0");
909 Builder.defineMacro(
"__MEMORY_SCOPE_DEVICE",
"1");
910 Builder.defineMacro(
"__MEMORY_SCOPE_WRKGRP",
"2");
911 Builder.defineMacro(
"__MEMORY_SCOPE_WVFRNT",
"3");
912 Builder.defineMacro(
"__MEMORY_SCOPE_SINGLE",
"4");
921 "Invalid OpenCL memory scope enum definition");
922 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_ITEM",
"0");
923 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_GROUP",
"1");
924 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_DEVICE",
"2");
925 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES",
"3");
926 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_SUB_GROUP",
"4");
929 Builder.defineMacro(
"__FPCLASS_SNAN",
"0x0001");
930 Builder.defineMacro(
"__FPCLASS_QNAN",
"0x0002");
931 Builder.defineMacro(
"__FPCLASS_NEGINF",
"0x0004");
932 Builder.defineMacro(
"__FPCLASS_NEGNORMAL",
"0x0008");
933 Builder.defineMacro(
"__FPCLASS_NEGSUBNORMAL",
"0x0010");
934 Builder.defineMacro(
"__FPCLASS_NEGZERO",
"0x0020");
935 Builder.defineMacro(
"__FPCLASS_POSZERO",
"0x0040");
936 Builder.defineMacro(
"__FPCLASS_POSSUBNORMAL",
"0x0080");
937 Builder.defineMacro(
"__FPCLASS_POSNORMAL",
"0x0100");
938 Builder.defineMacro(
"__FPCLASS_POSINF",
"0x0200");
941 Builder.defineMacro(
"__PRAGMA_REDEFINE_EXTNAME",
"1");
945 Builder.defineMacro(
"__VERSION__",
"\"" +
951 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
952 Builder.defineMacro(
"__STRICT_ANSI__");
954 if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11)
955 Builder.defineMacro(
"__GXX_EXPERIMENTAL_CXX0X__");
959 Builder.defineMacro(
"__OBJC2__");
961 if (LangOpts.ObjCExceptions)
962 Builder.defineMacro(
"OBJC_ZEROCOST_EXCEPTIONS");
966 Builder.defineMacro(
"__OBJC_GC__");
969 Builder.defineMacro(
"__NEXT_RUNTIME__");
973 std::string versionString =
"1";
977 if (version >= VersionTuple(2, 0))
978 Builder.defineMacro(
"__OBJC_GNUSTEP_RUNTIME_ABI__",
"20");
981 "__OBJC_GNUSTEP_RUNTIME_ABI__",
982 "1" + Twine(
std::min(8U, version.getMinor().value_or(0))));
987 unsigned minor = tuple.getMinor().value_or(0);
988 unsigned subminor = tuple.getSubminor().value_or(0);
989 Builder.defineMacro(
"__OBJFW_RUNTIME_ABI__",
990 Twine(tuple.getMajor() * 10000 + minor * 100 +
994 Builder.defineMacro(
"IBOutlet",
"__attribute__((iboutlet))");
995 Builder.defineMacro(
"IBOutletCollection(ClassName)",
996 "__attribute__((iboutletcollection(ClassName)))");
997 Builder.defineMacro(
"IBAction",
"void)__attribute__((ibaction)");
998 Builder.defineMacro(
"IBInspectable",
"");
999 Builder.defineMacro(
"IB_DESIGNABLE",
"");
1004 Builder.defineMacro(
"__OBJC_BOOL_IS_BOOL",
1007 if (LangOpts.CPlusPlus)
1012 if (!LangOpts.NoConstantCFStrings)
1013 Builder.defineMacro(
"__CONSTANT_CFSTRINGS__");
1016 Builder.defineMacro(
"OBJC_NEW_PROPERTIES");
1018 if (LangOpts.PascalStrings)
1019 Builder.defineMacro(
"__PASCAL_STRINGS__");
1021 if (LangOpts.Blocks) {
1022 Builder.defineMacro(
"__block",
"__attribute__((__blocks__(byref)))");
1023 Builder.defineMacro(
"__BLOCKS__");
1026 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
1027 Builder.defineMacro(
"__EXCEPTIONS");
1028 if (LangOpts.GNUCVersion && LangOpts.RTTI)
1029 Builder.defineMacro(
"__GXX_RTTI");
1032 Builder.defineMacro(
"__USING_SJLJ_EXCEPTIONS__");
1034 Builder.defineMacro(
"__SEH__");
1037 Builder.defineMacro(
"__ARM_DWARF_EH__");
1039 Builder.defineMacro(
"__WASM_EXCEPTIONS__");
1041 if (LangOpts.Deprecated)
1042 Builder.defineMacro(
"__DEPRECATED");
1044 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus)
1045 Builder.defineMacro(
"__private_extern__",
"extern");
1047 if (LangOpts.MicrosoftExt) {
1048 if (LangOpts.WChar) {
1050 Builder.defineMacro(
"_WCHAR_T_DEFINED");
1051 Builder.defineMacro(
"_NATIVE_WCHAR_T_DEFINED");
1058 Builder.defineMacro(
"__clang_literal_encoding__",
"\"UTF-8\"");
1062 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-32\"");
1067 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-16\"");
1070 if (LangOpts.Optimize)
1071 Builder.defineMacro(
"__OPTIMIZE__");
1072 if (LangOpts.OptimizeSize)
1073 Builder.defineMacro(
"__OPTIMIZE_SIZE__");
1075 if (LangOpts.FastMath)
1076 Builder.defineMacro(
"__FAST_MATH__");
1085 Builder.defineMacro(
"__ORDER_LITTLE_ENDIAN__",
"1234");
1086 Builder.defineMacro(
"__ORDER_BIG_ENDIAN__",
"4321");
1087 Builder.defineMacro(
"__ORDER_PDP_ENDIAN__",
"3412");
1089 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_BIG_ENDIAN__");
1090 Builder.defineMacro(
"__BIG_ENDIAN__");
1092 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_LITTLE_ENDIAN__");
1093 Builder.defineMacro(
"__LITTLE_ENDIAN__");
1098 Builder.defineMacro(
"_LP64");
1099 Builder.defineMacro(
"__LP64__");
1104 Builder.defineMacro(
"_ILP32");
1105 Builder.defineMacro(
"__ILP32__");
1109 assert(TI.
getCharWidth() == 8 &&
"Only support 8-bit char so far");
1110 Builder.defineMacro(
"__CHAR_BIT__", Twine(TI.
getCharWidth()));
1112 Builder.defineMacro(
"__BOOL_WIDTH__", Twine(TI.
getBoolWidth()));
1113 Builder.defineMacro(
"__SHRT_WIDTH__", Twine(TI.
getShortWidth()));
1114 Builder.defineMacro(
"__INT_WIDTH__", Twine(TI.
getIntWidth()));
1115 Builder.defineMacro(
"__LONG_WIDTH__", Twine(TI.
getLongWidth()));
1119 assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&
1120 "Target defined a max bit width larger than LLVM can support!");
1122 "Target defined a max bit width smaller than the C standard allows!");
1123 Builder.defineMacro(
"__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));
1164 Builder.defineMacro(
"__INTMAX_C_SUFFIX__",
1168 Builder.defineMacro(
"__UINTMAX_C_SUFFIX__",
1190 "uintptr_t and intptr_t have different widths?");
1193 "uintmax_t and intmax_t have different widths?");
1195 if (LangOpts.FixedPoint) {
1227 Builder.defineMacro(
"__USACCUM_IBIT__",
1229 Builder.defineMacro(
"__ACCUM_IBIT__", Twine(TI.
getAccumIBits()));
1232 Builder.defineMacro(
"__ULACCUM_IBIT__",
1243 Builder.defineMacro(
"__POINTER_WIDTH__",
1247 Builder.defineMacro(
"__BIGGEST_ALIGNMENT__",
1250 if (!LangOpts.CharIsSigned)
1251 Builder.defineMacro(
"__CHAR_UNSIGNED__");
1254 Builder.defineMacro(
"__WCHAR_UNSIGNED__");
1257 Builder.defineMacro(
"__WINT_UNSIGNED__");
1323 if (!LangOpts.MathErrno)
1324 Builder.defineMacro(
"__NO_MATH_ERRNO__");
1326 if (LangOpts.FastMath || LangOpts.FiniteMathOnly)
1327 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"1");
1329 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"0");
1331 if (LangOpts.GNUCVersion) {
1332 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
1333 Builder.defineMacro(
"__GNUC_GNU_INLINE__");
1335 Builder.defineMacro(
"__GNUC_STDC_INLINE__");
1339 Builder.defineMacro(
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
"1");
1345 Builder.defineMacro(
"__GCC_DESTRUCTIVE_SIZE", Twine(Destructive));
1346 Builder.defineMacro(
"__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive));
1349 Builder.append(
"#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")");
1350 Builder.append(
"#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")");
1352 auto addLockFreeMacros = [&](
const llvm::Twine &Prefix) {
1354 #define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
1355 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \
1356 getLockFreeValue(TI.get##Type##Width(), TI));
1368 Builder.defineMacro(
1369 Prefix +
"POINTER_LOCK_FREE",
1371 #undef DEFINE_LOCK_FREE_MACRO
1373 addLockFreeMacros(
"__CLANG_ATOMIC_");
1374 if (LangOpts.GNUCVersion)
1375 addLockFreeMacros(
"__GCC_ATOMIC_");
1377 if (LangOpts.NoInlineDefine)
1378 Builder.defineMacro(
"__NO_INLINE__");
1380 if (
unsigned PICLevel = LangOpts.PICLevel) {
1381 Builder.defineMacro(
"__PIC__", Twine(PICLevel));
1382 Builder.defineMacro(
"__pic__", Twine(PICLevel));
1384 Builder.defineMacro(
"__PIE__", Twine(PICLevel));
1385 Builder.defineMacro(
"__pie__", Twine(PICLevel));
1390 Builder.defineMacro(
"__FLT_RADIX__",
"2");
1391 Builder.defineMacro(
"__DECIMAL_DIG__",
"__LDBL_DECIMAL_DIG__");
1394 Builder.defineMacro(
"__SSP__");
1396 Builder.defineMacro(
"__SSP_STRONG__",
"2");
1398 Builder.defineMacro(
"__SSP_ALL__",
"3");
1401 Builder.defineMacro(
"__clang_analyzer__");
1403 if (LangOpts.FastRelaxedMath)
1404 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
1408 Builder.defineMacro(
"__weak",
"__attribute__((objc_gc(weak)))");
1409 Builder.defineMacro(
"__strong",
"__attribute__((objc_gc(strong)))");
1410 Builder.defineMacro(
"__autoreleasing",
"");
1411 Builder.defineMacro(
"__unsafe_unretained",
"");
1412 }
else if (LangOpts.ObjC) {
1413 Builder.defineMacro(
"__weak",
"__attribute__((objc_ownership(weak)))");
1414 Builder.defineMacro(
"__strong",
"__attribute__((objc_ownership(strong)))");
1415 Builder.defineMacro(
"__autoreleasing",
1416 "__attribute__((objc_ownership(autoreleasing)))");
1417 Builder.defineMacro(
"__unsafe_unretained",
1418 "__attribute__((objc_ownership(none)))");
1424 Builder.defineMacro(
"__nonnull",
"_Nonnull");
1425 Builder.defineMacro(
"__null_unspecified",
"_Null_unspecified");
1426 Builder.defineMacro(
"__nullable",
"_Nullable");
1432 Builder.defineMacro(
"__APPLE_EMBEDDED_SIMULATOR__",
"1");
1440 if (!LangOpts.OpenMPSimd) {
1441 switch (LangOpts.OpenMP) {
1445 Builder.defineMacro(
"_OPENMP",
"201107");
1448 Builder.defineMacro(
"_OPENMP",
"201307");
1451 Builder.defineMacro(
"_OPENMP",
"201511");
1454 Builder.defineMacro(
"_OPENMP",
"201811");
1457 Builder.defineMacro(
"_OPENMP",
"202111");
1461 Builder.defineMacro(
"_OPENMP",
"202011");
1467 if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {
1470 Builder.defineMacro(
"__CUDA_ARCH__");
1475 if (LangOpts.GPUDeviceApproxTranscendentals)
1476 Builder.defineMacro(
"__CLANG_GPU_APPROX_TRANSCENDENTALS__");
1480 if (LangOpts.SYCLIsDevice) {
1481 Builder.defineMacro(
"__SYCL_DEVICE_ONLY__");
1482 if (LangOpts.GPURelocatableDeviceCode)
1483 Builder.defineMacro(
"SYCL_EXTERNAL",
"__attribute__((sycl_device))");
1485 const llvm::Triple &DeviceTriple = TI.
getTriple();
1486 const llvm::Triple::SubArchType DeviceSubArch = DeviceTriple.getSubArch();
1487 if (DeviceTriple.isNVPTX() || DeviceTriple.isAMDGPU() ||
1488 (DeviceTriple.isSPIR() &&
1489 DeviceSubArch != llvm::Triple::SPIRSubArch_fpga))
1490 Builder.defineMacro(
"SYCL_USE_NATIVE_FP_ATOMICS");
1492 if (DeviceSubArch == llvm::Triple::SPIRSubArch_fpga) {
1493 Builder.defineMacro(
"__ENABLE_USM_ADDR_SPACE__");
1494 Builder.defineMacro(
"SYCL_DISABLE_FALLBACK_ASSERT");
1496 }
else if (LangOpts.SYCLIsHost && LangOpts.SYCLESIMDBuildHostCode) {
1497 Builder.defineMacro(
"__ESIMD_BUILD_HOST_CODE");
1499 if (LangOpts.SYCLUnnamedLambda)
1500 Builder.defineMacro(
"__SYCL_UNNAMED_LAMBDA__");
1503 if ((LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) &&
1504 LangOpts.SYCLESIMDForceStatelessMem)
1505 Builder.defineMacro(
"__ESIMD_FORCE_STATELESS_MEM");
1508 if (LangOpts.OpenCL) {
1512 Builder.defineMacro(
"__IMAGE_SUPPORT__");
1515 if (TI.
hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1519 Builder.defineMacro(
"__GLIBCXX_TYPE_INT_N_0",
"__int128");
1520 Builder.defineMacro(
"__GLIBCXX_BITSIZE_INT_N_0",
"128");
1525 Builder.defineMacro(
"__ELF__");
1529 const llvm::Triple &Triple = TI.
getTriple();
1530 #define TARGET_OS(Name, Predicate) \
1531 Builder.defineMacro(#Name, (Predicate) ? "1" : "0");
1532 #include "clang/Basic/TargetOSMacros.def"
1543 Builder.defineMacro(
"__LLVM_INSTR_PROFILE_GENERATE");
1546 Builder.defineMacro(
"__LLVM_INSTR_PROFILE_USE");
1557 std::string PredefineBuffer;
1558 PredefineBuffer.reserve(4080);
1559 llvm::raw_string_ostream Predefines(PredefineBuffer);
1565 Builder.append(
"# 1 \"<built-in>\" 3");
1571 if ((LangOpts.CUDA || LangOpts.OpenMPIsTargetDevice ||
1572 LangOpts.SYCLIsDevice) &&
1582 if (LangOpts.ObjC && LangOpts.CPlusPlus &&
1583 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1609 Builder.append(
"# 1 \"<command line>\" 1");
1612 for (
unsigned i = 0, e = InitOpts.
Macros.size(); i != e; ++i) {
1613 if (InitOpts.
Macros[i].second)
1614 Builder.undefineMacro(InitOpts.
Macros[i].first);
1621 Builder.append(
"# 1 \"<built-in>\" 2");
1625 for (
unsigned i = 0, e = InitOpts.
MacroIncludes.size(); i != e; ++i)
1634 for (
unsigned i = 0, e = InitOpts.
Includes.size(); i != e; ++i) {
1635 const std::string &Path = InitOpts.
Includes[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)
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 void DefineTypeSizeAndWidth(const Twine &Prefix, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, MacroBuilder &Builder)
static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, T IEEEQuadVal)
PickFP - This is used to pick a value based on the FP semantics of the specified FP model.
static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro, DiagnosticsEngine &Diags)
#define DEFINE_LOCK_FREE_MACRO(TYPE, Type)
static void InitializeStandardPredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, MacroBuilder &Builder)
static const char * getLockFreeValue(unsigned TypeWidth, const TargetInfo &TI)
Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with the specified properties.
static void DefineFastIntType(const LangOptions &LangOpts, unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder)
llvm::SmallString< 32 > ConstructFixedPointLiteral(llvm::APFixedPoint Val, llvm::StringRef Suffix)
Defines the clang::MacroBuilder utility class.
Defines the clang::Preprocessor interface.
Defines the SourceManager interface.
Provides definitions for the atomic synchronization scopes.
Defines version macros and version-related utility functions for Clang.
__DEVICE__ int min(int __a, int __b)
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
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.
@ PerThread
Per-thread default stream.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
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.
const VersionTuple & getVersion() const
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
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.
PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
DiagnosticsEngine & getDiagnostics() const
FileManager & getFileManager() const
void setPredefines(std::string P)
Set the predefines for this Preprocessor.
void setSkipMainFilePreamble(unsigned Bytes, bool StartOfLine)
Instruct the preprocessor to skip part of the main source file.
const TargetInfo * getAuxTargetInfo() const
const LangOptions & getLangOpts() const
const TargetInfo & getTargetInfo() const
Exposes information about the current target.
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
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.
const llvm::fltSemantics & getFloatFormat() const
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
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.
const llvm::fltSemantics & getDoubleFormat() const
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.
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
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...
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 -----------------------—===//
const char * getUserLabelPrefix() const
Returns the default value of the USER_LABEL_PREFIX macro, which is the prefix given to user symbols b...
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 & getLongDoubleFormat() 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
IntType getWCharType() const
const llvm::fltSemantics & getHalfFormat() const
IntType getUInt16Type() const
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 _...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getUnsignedLongAccumIBits() const
unsigned getUnsignedShortFractScale() const
getUnsignedShortFractScale - Return the number of fractional bits in a 'unsigned short _Fract' type.
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.
uint32_t Literal
Literals are represented as positive integers.
@ RewriteObjC
ObjC->C Rewriter.
constexpr ShaderStage getStageFromEnvironment(const llvm::Triple::EnvironmentType &E)
std::string toString(const til::SExpr *E)
The JSON file list parser is used to communicate input to InstallAPI.
llvm::SmallVector< std::pair< llvm::StringRef, llvm::StringRef >, 2 > getSYCLVersionMacros(const LangOptions &LangOpts)
Retrieves a string representing the SYCL standard version for use in the CL_SYCL_LANGUAGE_VERSION and...
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 ----------------------------—===//