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.ends_with(
'\\');
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);
191 Builder.defineMacro(Prefix +
"_MIN__",
193 ? Twine(
"(-") + Prefix +
"_MAX__ - 1)"
202 Builder.defineMacro(Prefix +
"_FMT" + Twine(Fmt) +
"__",
203 Twine(
"\"") + FmtModifier + Twine(Fmt) +
"\"");
206 llvm::for_each(StringRef(IsSigned ?
"di" :
"ouxX"),
Emitter);
210 if (LangOpts.C23 && !IsSigned)
211 llvm::for_each(StringRef(
"bB"),
Emitter);
221 Builder.defineMacro(MacroName, Twine(TI.
getTypeWidth(Ty)));
226 Builder.defineMacro(MacroName,
257 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
259 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
260 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
263 Builder.defineMacro(Prefix + Twine(TypeWidth) +
"_C_SUFFIX__", ConstSuffix);
264 Builder.defineMacro(Prefix + Twine(TypeWidth) +
"_C(c)",
265 ConstSuffix.size() ? Twine(
"c##") + ConstSuffix :
"c");
281 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
282 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
286 unsigned TypeWidth,
bool IsSigned,
293 const char *Prefix = IsSigned ?
"__INT_LEAST" :
"__UINT_LEAST";
294 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
300 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
301 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
313 const char *Prefix = IsSigned ?
"__INT_FAST" :
"__UINT_FAST";
314 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
320 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
321 DefineFmt(LangOpts, Prefix + Twine(TypeWidth), Ty, TI, Builder);
343 Builder.defineMacro(
"_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
352 llvm::raw_string_ostream Out(
Result);
354 Out <<
"namespace std {\n"
356 <<
"struct __true_type;\n"
357 <<
"struct __false_type;\n"
360 Out <<
"template<typename _Tp> struct __is_scalar;\n"
363 if (LangOpts.ObjCAutoRefCount) {
364 Out <<
"template<typename _Tp>\n"
365 <<
"struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"
366 <<
" enum { __value = 0 };\n"
367 <<
" typedef __false_type __type;\n"
372 if (LangOpts.ObjCWeak) {
373 Out <<
"template<typename _Tp>\n"
374 <<
"struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"
375 <<
" enum { __value = 0 };\n"
376 <<
" typedef __false_type __type;\n"
381 if (LangOpts.ObjCAutoRefCount) {
382 Out <<
"template<typename _Tp>\n"
383 <<
"struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
385 <<
" enum { __value = 0 };\n"
386 <<
" typedef __false_type __type;\n"
401 Builder.defineMacro(
"__hlsl_clang");
403 Builder.defineMacro(
"__HLSL_VERSION",
404 Twine((
unsigned)LangOpts.getHLSLVersion()));
405 Builder.defineMacro(
"__HLSL_202x",
407 Builder.defineMacro(
"__HLSL_202y",
410 if (LangOpts.NativeHalfType && LangOpts.NativeInt16Type)
411 Builder.defineMacro(
"__HLSL_ENABLE_16_BIT",
"1");
415 Builder.defineMacro(
"__SHADER_STAGE_VERTEX",
417 Builder.defineMacro(
"__SHADER_STAGE_PIXEL",
419 Builder.defineMacro(
"__SHADER_STAGE_GEOMETRY",
421 Builder.defineMacro(
"__SHADER_STAGE_HULL",
423 Builder.defineMacro(
"__SHADER_STAGE_DOMAIN",
425 Builder.defineMacro(
"__SHADER_STAGE_COMPUTE",
427 Builder.defineMacro(
"__SHADER_STAGE_AMPLIFICATION",
429 Builder.defineMacro(
"__SHADER_STAGE_MESH",
431 Builder.defineMacro(
"__SHADER_STAGE_LIBRARY",
437 Builder.defineMacro(
"__SHADER_TARGET_STAGE", Twine(StageInteger));
439 if (TI.
getTriple().getOS() == llvm::Triple::ShaderModel) {
440 VersionTuple Version = TI.
getTriple().getOSVersion();
441 Builder.defineMacro(
"__SHADER_TARGET_MAJOR", Twine(Version.getMajor()));
442 unsigned Minor = Version.getMinor().value_or(0);
443 Builder.defineMacro(
"__SHADER_TARGET_MINOR", Twine(Minor));
454 if ((!LangOpts.MSVCCompat || LangOpts.MSVCEnableStdcMacro) &&
455 !LangOpts.TraditionalCPP)
456 Builder.defineMacro(
"__STDC__");
460 if (LangOpts.Freestanding)
461 Builder.defineMacro(
"__STDC_HOSTED__",
"0");
463 Builder.defineMacro(
"__STDC_HOSTED__");
469 if (!LangOpts.CPlusPlus) {
470 if (std::optional<uint32_t> Lang = LangOpts.
getCLangStd())
471 Builder.defineMacro(
"__STDC_VERSION__", Twine(*Lang) +
"L");
474 Builder.defineMacro(
"__cplusplus",
482 Builder.defineMacro(
"__STDCPP_DEFAULT_NEW_ALIGNMENT__",
490 Builder.defineMacro(
"__STDCPP_THREADS__",
"1");
498 Builder.defineMacro(
"__STDC_UTF_16__",
"1");
499 Builder.defineMacro(
"__STDC_UTF_32__",
"1");
502 Builder.defineMacro(
"__STDC_EMBED_NOT_FOUND__",
504 Builder.defineMacro(
"__STDC_EMBED_FOUND__",
506 Builder.defineMacro(
"__STDC_EMBED_EMPTY__",
511 if (LangOpts.DeferTS)
512 Builder.defineMacro(
"__STDC_DEFER_TS25755__",
"1");
515 Builder.defineMacro(
"__OBJC__");
518 if (LangOpts.OpenCL) {
519 if (LangOpts.CPlusPlus) {
520 switch (LangOpts.OpenCLCPlusPlusVersion) {
522 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"100");
525 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"202100");
528 llvm_unreachable(
"Unsupported C++ version for OpenCL");
530 Builder.defineMacro(
"__CL_CPP_VERSION_1_0__",
"100");
531 Builder.defineMacro(
"__CL_CPP_VERSION_2021__",
"202100");
540 switch (LangOpts.OpenCLVersion) {
542 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"100");
545 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"110");
548 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"120");
551 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"200");
554 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"300");
557 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"310");
560 llvm_unreachable(
"Unsupported OpenCL version");
563 Builder.defineMacro(
"CL_VERSION_1_0",
"100");
564 Builder.defineMacro(
"CL_VERSION_1_1",
"110");
565 Builder.defineMacro(
"CL_VERSION_1_2",
"120");
566 Builder.defineMacro(
"CL_VERSION_2_0",
"200");
567 Builder.defineMacro(
"CL_VERSION_3_0",
"300");
568 Builder.defineMacro(
"CL_VERSION_3_1",
"310");
571 Builder.defineMacro(
"__ENDIAN_LITTLE__");
573 if (LangOpts.FastRelaxedMath)
574 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
577 if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) {
580 Builder.defineMacro(
"CL_SYCL_LANGUAGE_VERSION",
"121");
582 Builder.defineMacro(
"SYCL_LANGUAGE_VERSION",
"202012L");
586 if (LangOpts.AsmPreprocessor)
587 Builder.defineMacro(
"__ASSEMBLER__");
589 if (LangOpts.GPURelocatableDeviceCode)
590 Builder.defineMacro(
"__CLANG_RDC__");
592 Builder.defineMacro(
"__CUDA__");
595 Builder.defineMacro(
"CUDA_API_PER_THREAD_DEFAULT_STREAM");
598 Builder.defineMacro(
"__HIP__");
599 Builder.defineMacro(
"__HIPCC__");
600 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_SINGLETHREAD",
"1");
601 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_WAVEFRONT",
"2");
602 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_WORKGROUP",
"3");
603 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_AGENT",
"4");
604 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_SYSTEM",
"5");
605 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_CLUSTER",
"6");
606 if (LangOpts.HIPStdPar) {
607 Builder.defineMacro(
"__HIPSTDPAR__");
608 if (LangOpts.HIPStdParInterposeAlloc) {
609 Builder.defineMacro(
"__HIPSTDPAR_INTERPOSE_ALLOC__");
610 Builder.defineMacro(
"__HIPSTDPAR_INTERPOSE_ALLOC_V1__");
613 if (LangOpts.CUDAIsDevice) {
614 Builder.defineMacro(
"__HIP_DEVICE_COMPILE__");
615 if (TI.
getTriple().getEnvironment() == llvm::Triple::LLVM)
616 Builder.defineMacro(
"__HIP_LLVM__");
618 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT__",
"1");
620 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT",
"1");
625 Builder.defineMacro(
"__HIP_API_PER_THREAD_DEFAULT_STREAM__");
627 Builder.defineMacro(
"HIP_API_PER_THREAD_DEFAULT_STREAM");
631 if (LangOpts.OpenACC)
632 Builder.defineMacro(
"_OPENACC",
"202506");
642 Builder.defineMacro(
"__cpp_rtti",
"199711L");
643 if (LangOpts.CXXExceptions)
644 Builder.defineMacro(
"__cpp_exceptions",
"199711L");
647 if (LangOpts.CPlusPlus11) {
648 Builder.defineMacro(
"__cpp_unicode_characters",
"200704L");
649 Builder.defineMacro(
"__cpp_raw_strings",
"200710L");
650 Builder.defineMacro(
"__cpp_unicode_literals",
"200710L");
651 Builder.defineMacro(
"__cpp_user_defined_literals",
"200809L");
652 Builder.defineMacro(
"__cpp_lambdas",
"200907L");
653 Builder.defineMacro(
"__cpp_constexpr", LangOpts.CPlusPlus26 ?
"202406L"
654 : LangOpts.CPlusPlus23 ?
"202211L"
655 : LangOpts.CPlusPlus20 ?
"202002L"
656 : LangOpts.CPlusPlus17 ?
"201603L"
657 : LangOpts.CPlusPlus14 ?
"201304L"
659 Builder.defineMacro(
"__cpp_constexpr_in_decltype",
"201711L");
660 Builder.defineMacro(
"__cpp_range_based_for",
661 LangOpts.CPlusPlus23 ?
"202211L"
662 : LangOpts.CPlusPlus17 ?
"201603L"
666 Builder.defineMacro(
"__cpp_static_assert",
"202306L");
667 Builder.defineMacro(
"__cpp_decltype",
"200707L");
668 Builder.defineMacro(
"__cpp_attributes",
"200809L");
669 Builder.defineMacro(
"__cpp_rvalue_references",
"200610L");
670 Builder.defineMacro(
"__cpp_variadic_templates",
"200704L");
671 Builder.defineMacro(
"__cpp_initializer_lists",
"200806L");
672 Builder.defineMacro(
"__cpp_delegating_constructors",
"200604L");
673 Builder.defineMacro(
"__cpp_nsdmi",
"200809L");
674 Builder.defineMacro(
"__cpp_inheriting_constructors",
"201511L");
675 Builder.defineMacro(
"__cpp_ref_qualifiers",
"200710L");
676 Builder.defineMacro(
"__cpp_alias_templates",
"200704L");
678 if (LangOpts.ThreadsafeStatics)
679 Builder.defineMacro(
"__cpp_threadsafe_static_init",
"200806L");
682 if (LangOpts.CPlusPlus14) {
683 Builder.defineMacro(
"__cpp_binary_literals",
"201304L");
684 Builder.defineMacro(
"__cpp_digit_separators",
"201309L");
685 Builder.defineMacro(
"__cpp_init_captures",
686 LangOpts.CPlusPlus20 ?
"201803L" :
"201304L");
687 Builder.defineMacro(
"__cpp_generic_lambdas",
688 LangOpts.CPlusPlus20 ?
"201707L" :
"201304L");
689 Builder.defineMacro(
"__cpp_decltype_auto",
"201304L");
690 Builder.defineMacro(
"__cpp_return_type_deduction",
"201304L");
691 Builder.defineMacro(
"__cpp_aggregate_nsdmi",
"201304L");
692 Builder.defineMacro(
"__cpp_variable_templates",
"201304L");
694 if (LangOpts.SizedDeallocation)
695 Builder.defineMacro(
"__cpp_sized_deallocation",
"201309L");
698 if (LangOpts.CPlusPlus17) {
699 Builder.defineMacro(
"__cpp_hex_float",
"201603L");
700 Builder.defineMacro(
"__cpp_inline_variables",
"201606L");
701 Builder.defineMacro(
"__cpp_noexcept_function_type",
"201510L");
702 Builder.defineMacro(
"__cpp_capture_star_this",
"201603L");
703 Builder.defineMacro(
"__cpp_if_constexpr",
"201606L");
704 Builder.defineMacro(
"__cpp_deduction_guides",
"201703L");
705 Builder.defineMacro(
"__cpp_template_auto",
"201606L");
706 Builder.defineMacro(
"__cpp_namespace_attributes",
"201411L");
707 Builder.defineMacro(
"__cpp_enumerator_attributes",
"201411L");
708 Builder.defineMacro(
"__cpp_nested_namespace_definitions",
"201411L");
709 Builder.defineMacro(
"__cpp_variadic_using",
"201611L");
710 Builder.defineMacro(
"__cpp_aggregate_bases",
"201603L");
711 Builder.defineMacro(
"__cpp_structured_bindings",
"202411L");
712 Builder.defineMacro(
"__cpp_nontype_template_args",
714 Builder.defineMacro(
"__cpp_fold_expressions",
"201603L");
715 Builder.defineMacro(
"__cpp_guaranteed_copy_elision",
"201606L");
716 Builder.defineMacro(
"__cpp_nontype_template_parameter_auto",
"201606L");
718 if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)
719 Builder.defineMacro(
"__cpp_aligned_new",
"201606L");
721 Builder.defineMacro(
"__cpp_template_template_args",
"201611L");
724 if (LangOpts.CPlusPlus20) {
725 Builder.defineMacro(
"__cpp_aggregate_paren_init",
"201902L");
727 Builder.defineMacro(
"__cpp_concepts",
"202002");
728 Builder.defineMacro(
"__cpp_conditional_explicit",
"201806L");
729 Builder.defineMacro(
"__cpp_consteval",
"202211L");
730 Builder.defineMacro(
"__cpp_constexpr_dynamic_alloc",
"201907L");
731 Builder.defineMacro(
"__cpp_constinit",
"201907L");
736 Builder.defineMacro(
"__cpp_impl_coroutine",
"201902L");
738 Builder.defineMacro(
"__cpp_designated_initializers",
"201707L");
739 Builder.defineMacro(
"__cpp_impl_three_way_comparison",
"201907L");
743 Builder.defineMacro(
"__cpp_modules",
"1");
744 Builder.defineMacro(
"__cpp_using_enum",
"201907L");
747 if (LangOpts.CPlusPlus23) {
748 Builder.defineMacro(
"__cpp_implicit_move",
"202207L");
749 Builder.defineMacro(
"__cpp_size_t_suffix",
"202011L");
750 Builder.defineMacro(
"__cpp_if_consteval",
"202106L");
751 Builder.defineMacro(
"__cpp_multidimensional_subscript",
"202211L");
752 Builder.defineMacro(
"__cpp_auto_cast",
"202110L");
753 Builder.defineMacro(
"__cpp_explicit_this_parameter",
"202110L");
758 if (LangOpts.CPlusPlus11)
759 Builder.defineMacro(
"__cpp_static_call_operator",
"202207L");
760 Builder.defineMacro(
"__cpp_named_character_escapes",
"202606L");
761 Builder.defineMacro(
"__cpp_placeholder_variables",
"202306L");
764 Builder.defineMacro(
"__cpp_pack_indexing",
"202311L");
765 Builder.defineMacro(
"__cpp_deleted_function",
"202403L");
766 Builder.defineMacro(
"__cpp_variadic_friend",
"202403L");
767 Builder.defineMacro(
"__cpp_trivial_relocatability",
"202502L");
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__",
858 Builder.defineMacro(
"__llvm__");
859 Builder.defineMacro(
"__clang__");
861#define TOSTR(X) TOSTR2(X)
862 Builder.defineMacro(
"__clang_major__",
TOSTR(CLANG_VERSION_MAJOR));
863 Builder.defineMacro(
"__clang_minor__",
TOSTR(CLANG_VERSION_MINOR));
864 Builder.defineMacro(
"__clang_patchlevel__",
TOSTR(CLANG_VERSION_PATCHLEVEL));
867 Builder.defineMacro(
"__clang_version__",
868 "\"" CLANG_VERSION_STRING
" "
871 if (LangOpts.GNUCVersion != 0) {
874 unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100;
875 unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100;
876 unsigned GNUCPatch = LangOpts.GNUCVersion % 100;
877 Builder.defineMacro(
"__GNUC__", Twine(GNUCMajor));
878 Builder.defineMacro(
"__GNUC_MINOR__", Twine(GNUCMinor));
879 Builder.defineMacro(
"__GNUC_PATCHLEVEL__", Twine(GNUCPatch));
880 Builder.defineMacro(
"__GXX_ABI_VERSION",
"1002");
882 if (LangOpts.CPlusPlus) {
883 Builder.defineMacro(
"__GNUG__", Twine(GNUCMajor));
884 Builder.defineMacro(
"__GXX_WEAK__");
889 Builder.defineMacro(
"__ATOMIC_RELAXED",
"0");
890 Builder.defineMacro(
"__ATOMIC_CONSUME",
"1");
891 Builder.defineMacro(
"__ATOMIC_ACQUIRE",
"2");
892 Builder.defineMacro(
"__ATOMIC_RELEASE",
"3");
893 Builder.defineMacro(
"__ATOMIC_ACQ_REL",
"4");
894 Builder.defineMacro(
"__ATOMIC_SEQ_CST",
"5");
897 Builder.defineMacro(
"__MEMORY_SCOPE_SYSTEM",
"0");
898 Builder.defineMacro(
"__MEMORY_SCOPE_DEVICE",
"1");
899 Builder.defineMacro(
"__MEMORY_SCOPE_WRKGRP",
"2");
900 Builder.defineMacro(
"__MEMORY_SCOPE_WVFRNT",
"3");
901 Builder.defineMacro(
"__MEMORY_SCOPE_SINGLE",
"4");
902 Builder.defineMacro(
"__MEMORY_SCOPE_CLUSTR",
"5");
911 "Invalid OpenCL memory scope enum definition");
912 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_ITEM",
"0");
913 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_GROUP",
"1");
914 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_DEVICE",
"2");
915 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES",
"3");
916 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_SUB_GROUP",
"4");
919 Builder.defineMacro(
"__FPCLASS_SNAN",
"0x0001");
920 Builder.defineMacro(
"__FPCLASS_QNAN",
"0x0002");
921 Builder.defineMacro(
"__FPCLASS_NEGINF",
"0x0004");
922 Builder.defineMacro(
"__FPCLASS_NEGNORMAL",
"0x0008");
923 Builder.defineMacro(
"__FPCLASS_NEGSUBNORMAL",
"0x0010");
924 Builder.defineMacro(
"__FPCLASS_NEGZERO",
"0x0020");
925 Builder.defineMacro(
"__FPCLASS_POSZERO",
"0x0040");
926 Builder.defineMacro(
"__FPCLASS_POSSUBNORMAL",
"0x0080");
927 Builder.defineMacro(
"__FPCLASS_POSNORMAL",
"0x0100");
928 Builder.defineMacro(
"__FPCLASS_POSINF",
"0x0200");
931 Builder.defineMacro(
"__PRAGMA_REDEFINE_EXTNAME",
"1");
935 Builder.defineMacro(
"__VERSION__",
"\"" +
941 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
942 Builder.defineMacro(
"__STRICT_ANSI__");
944 if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11)
945 Builder.defineMacro(
"__GXX_EXPERIMENTAL_CXX0X__");
950 Builder.defineMacro(
"__GXX_TYPEINFO_EQUALITY_INLINE",
"0");
955 Builder.defineMacro(
"__OBJC2__");
957 if (LangOpts.ObjCExceptions)
958 Builder.defineMacro(
"OBJC_ZEROCOST_EXCEPTIONS");
962 Builder.defineMacro(
"__OBJC_GC__");
965 Builder.defineMacro(
"__NEXT_RUNTIME__");
972 if (version >= VersionTuple(2, 0))
973 Builder.defineMacro(
"__OBJC_GNUSTEP_RUNTIME_ABI__",
"20");
976 "__OBJC_GNUSTEP_RUNTIME_ABI__",
977 "1" + Twine(std::min(8U, version.getMinor().value_or(0))));
982 unsigned minor = tuple.getMinor().value_or(0);
983 unsigned subminor = tuple.getSubminor().value_or(0);
984 Builder.defineMacro(
"__OBJFW_RUNTIME_ABI__",
985 Twine(tuple.getMajor() * 10000 + minor * 100 +
989 Builder.defineMacro(
"IBOutlet",
"__attribute__((iboutlet))");
990 Builder.defineMacro(
"IBOutletCollection(ClassName)",
991 "__attribute__((iboutletcollection(ClassName)))");
992 Builder.defineMacro(
"IBAction",
"void)__attribute__((ibaction)");
993 Builder.defineMacro(
"IBInspectable",
"");
994 Builder.defineMacro(
"IB_DESIGNABLE",
"");
999 Builder.defineMacro(
"__OBJC_BOOL_IS_BOOL",
1002 if (LangOpts.CPlusPlus)
1007 if (!LangOpts.NoConstantCFStrings)
1008 Builder.defineMacro(
"__CONSTANT_CFSTRINGS__");
1011 Builder.defineMacro(
"OBJC_NEW_PROPERTIES");
1013 if (LangOpts.PascalStrings)
1014 Builder.defineMacro(
"__PASCAL_STRINGS__");
1016 if (LangOpts.Blocks) {
1017 Builder.defineMacro(
"__block",
"__attribute__((__blocks__(byref)))");
1018 Builder.defineMacro(
"__BLOCKS__");
1021 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
1022 Builder.defineMacro(
"__EXCEPTIONS");
1023 if (LangOpts.GNUCVersion && LangOpts.RTTI)
1024 Builder.defineMacro(
"__GXX_RTTI");
1027 Builder.defineMacro(
"__USING_SJLJ_EXCEPTIONS__");
1029 Builder.defineMacro(
"__SEH__");
1032 Builder.defineMacro(
"__ARM_DWARF_EH__");
1034 Builder.defineMacro(
"__WASM_EXCEPTIONS__");
1036 if (LangOpts.Deprecated)
1037 Builder.defineMacro(
"__DEPRECATED");
1039 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus)
1040 Builder.defineMacro(
"__private_extern__",
"extern");
1042 if (LangOpts.MicrosoftExt) {
1043 if (LangOpts.WChar) {
1045 Builder.defineMacro(
"_WCHAR_T_DEFINED");
1046 Builder.defineMacro(
"_NATIVE_WCHAR_T_DEFINED");
1053 Builder.defineMacro(
"__clang_literal_encoding__",
1063 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-32\"");
1068 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-16\"");
1071 if (CGOpts.OptimizationLevel != 0)
1072 Builder.defineMacro(
"__OPTIMIZE__");
1073 if (CGOpts.OptimizeSize != 0)
1074 Builder.defineMacro(
"__OPTIMIZE_SIZE__");
1076 if (LangOpts.FastMath)
1077 Builder.defineMacro(
"__FAST_MATH__");
1086 Builder.defineMacro(
"__ORDER_LITTLE_ENDIAN__",
"1234");
1087 Builder.defineMacro(
"__ORDER_BIG_ENDIAN__",
"4321");
1088 Builder.defineMacro(
"__ORDER_PDP_ENDIAN__",
"3412");
1090 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_BIG_ENDIAN__");
1091 Builder.defineMacro(
"__BIG_ENDIAN__");
1093 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_LITTLE_ENDIAN__");
1094 Builder.defineMacro(
"__LITTLE_ENDIAN__");
1099 Builder.defineMacro(
"_LP64");
1100 Builder.defineMacro(
"__LP64__");
1105 Builder.defineMacro(
"_ILP32");
1106 Builder.defineMacro(
"__ILP32__");
1110 assert(TI.
getCharWidth() == 8 &&
"Only support 8-bit char so far");
1111 Builder.defineMacro(
"__CHAR_BIT__", Twine(TI.
getCharWidth()));
1121 Builder.defineMacro(
"__BOOL_WIDTH__",
"1");
1122 Builder.defineMacro(
"__SHRT_WIDTH__", Twine(TI.
getShortWidth()));
1123 Builder.defineMacro(
"__INT_WIDTH__", Twine(TI.
getIntWidth()));
1124 Builder.defineMacro(
"__LONG_WIDTH__", Twine(TI.
getLongWidth()));
1128 assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&
1129 "Target defined a max bit width larger than LLVM can support!");
1131 "Target defined a max bit width smaller than the C standard allows!");
1132 Builder.defineMacro(
"__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));
1176 Builder.defineMacro(
"__INTMAX_C_SUFFIX__", ConstSuffix);
1177 Builder.defineMacro(
"__INTMAX_C(c)",
1178 ConstSuffix.size() ? Twine(
"c##") + ConstSuffix :
"c");
1182 Builder.defineMacro(
"__UINTMAX_C_SUFFIX__", ConstSuffix);
1183 Builder.defineMacro(
"__UINTMAX_C(c)",
1184 ConstSuffix.size() ? Twine(
"c##") + ConstSuffix :
"c");
1208 "uintptr_t and intptr_t have different widths?");
1211 "uintmax_t and intmax_t have different widths?");
1213 if (LangOpts.FixedPoint) {
1245 Builder.defineMacro(
"__USACCUM_IBIT__",
1247 Builder.defineMacro(
"__ACCUM_IBIT__", Twine(TI.
getAccumIBits()));
1250 Builder.defineMacro(
"__ULACCUM_IBIT__",
1261 Builder.defineMacro(
"__POINTER_WIDTH__",
1265 Builder.defineMacro(
"__BIGGEST_ALIGNMENT__",
1268 if (!LangOpts.CharIsSigned)
1269 Builder.defineMacro(
"__CHAR_UNSIGNED__");
1272 Builder.defineMacro(
"__WCHAR_UNSIGNED__");
1275 Builder.defineMacro(
"__WINT_UNSIGNED__");
1341 if (!LangOpts.MathErrno)
1342 Builder.defineMacro(
"__NO_MATH_ERRNO__");
1344 if (LangOpts.FastMath || (LangOpts.NoHonorInfs && LangOpts.NoHonorNaNs))
1345 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"1");
1347 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"0");
1349 if (LangOpts.GNUCVersion) {
1350 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
1351 Builder.defineMacro(
"__GNUC_GNU_INLINE__");
1353 Builder.defineMacro(
"__GNUC_STDC_INLINE__");
1357 Builder.defineMacro(
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
"1");
1363 Builder.defineMacro(
"__GCC_DESTRUCTIVE_SIZE", Twine(Destructive));
1364 Builder.defineMacro(
"__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive));
1367 Builder.append(
"#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")");
1368 Builder.append(
"#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")");
1370 auto addLockFreeMacros = [&](
const llvm::Twine &Prefix) {
1372#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
1373 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \
1374 getLockFreeValue(TI.get##Type##Width(), TI));
1379 if (LangOpts.Char8 || LangOpts.C23)
1388 Builder.defineMacro(
1389 Prefix +
"POINTER_LOCK_FREE",
1391#undef DEFINE_LOCK_FREE_MACRO
1393 addLockFreeMacros(
"__CLANG_ATOMIC_");
1394 if (LangOpts.GNUCVersion)
1395 addLockFreeMacros(
"__GCC_ATOMIC_");
1398 Builder.defineMacro(
"__NO_INLINE__");
1400 if (
unsigned PICLevel = LangOpts.PICLevel) {
1401 Builder.defineMacro(
"__PIC__", Twine(PICLevel));
1402 Builder.defineMacro(
"__pic__", Twine(PICLevel));
1404 Builder.defineMacro(
"__PIE__", Twine(PICLevel));
1405 Builder.defineMacro(
"__pie__", Twine(PICLevel));
1410 Builder.defineMacro(
"__FLT_RADIX__",
"2");
1411 Builder.defineMacro(
"__DECIMAL_DIG__",
"__LDBL_DECIMAL_DIG__");
1414 Builder.defineMacro(
"__SSP__");
1416 Builder.defineMacro(
"__SSP_STRONG__",
"2");
1418 Builder.defineMacro(
"__SSP_ALL__",
"3");
1421 Builder.defineMacro(
"__clang_analyzer__");
1423 if (LangOpts.FastRelaxedMath)
1424 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
1428 Builder.defineMacro(
"__weak",
"__attribute__((objc_gc(weak)))");
1429 Builder.defineMacro(
"__strong",
"__attribute__((objc_gc(strong)))");
1430 Builder.defineMacro(
"__autoreleasing",
"");
1431 Builder.defineMacro(
"__unsafe_unretained",
"");
1432 }
else if (LangOpts.ObjC) {
1433 Builder.defineMacro(
"__weak",
"__attribute__((objc_ownership(weak)))");
1434 Builder.defineMacro(
"__strong",
"__attribute__((objc_ownership(strong)))");
1435 Builder.defineMacro(
"__autoreleasing",
1436 "__attribute__((objc_ownership(autoreleasing)))");
1437 Builder.defineMacro(
"__unsafe_unretained",
1438 "__attribute__((objc_ownership(none)))");
1444 Builder.defineMacro(
"__nonnull",
"_Nonnull");
1445 Builder.defineMacro(
"__null_unspecified",
"_Null_unspecified");
1446 Builder.defineMacro(
"__nullable",
"_Nullable");
1452 Builder.defineMacro(
"__APPLE_EMBEDDED_SIMULATOR__",
"1");
1460 if (!LangOpts.OpenMPSimd) {
1461 switch (LangOpts.OpenMP) {
1465 Builder.defineMacro(
"_OPENMP",
"201107");
1468 Builder.defineMacro(
"_OPENMP",
"201307");
1471 Builder.defineMacro(
"_OPENMP",
"201511");
1474 Builder.defineMacro(
"_OPENMP",
"201811");
1477 Builder.defineMacro(
"_OPENMP",
"202011");
1480 Builder.defineMacro(
"_OPENMP",
"202111");
1483 Builder.defineMacro(
"_OPENMP",
"202411");
1487 Builder.defineMacro(
"_OPENMP",
"202011");
1493 if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {
1496 Builder.defineMacro(
"__CUDA_ARCH__");
1501 if (LangOpts.GPUDeviceApproxTranscendentals)
1502 Builder.defineMacro(
"__CLANG_GPU_APPROX_TRANSCENDENTALS__");
1506 if (LangOpts.SYCLIsDevice) {
1507 Builder.defineMacro(
"__SYCL_DEVICE_ONLY__",
"1");
1511 if (LangOpts.OpenCL) {
1515 Builder.defineMacro(
"__IMAGE_SUPPORT__");
1518 if (TI.
hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1522 Builder.defineMacro(
"__GLIBCXX_TYPE_INT_N_0",
"__int128");
1523 Builder.defineMacro(
"__GLIBCXX_BITSIZE_INT_N_0",
"128");
1528 Builder.defineMacro(
"__ELF__");
1531 SanitizerKind::KernelAddress))
1532 Builder.defineMacro(
"__SANITIZE_ADDRESS__");
1534 SanitizerKind::KernelHWAddress))
1535 Builder.defineMacro(
"__SANITIZE_HWADDRESS__");
1537 Builder.defineMacro(
"__SANITIZE_THREAD__");
1538 if (LangOpts.
Sanitize.
has(SanitizerKind::AllocToken))
1539 Builder.defineMacro(
"__SANITIZE_ALLOC_TOKEN__");
1541 if (LangOpts.PointerFieldProtectionABI)
1542 Builder.defineMacro(
"__POINTER_FIELD_PROTECTION_ABI__");
1543 if (LangOpts.PointerFieldProtectionTagged)
1544 Builder.defineMacro(
"__POINTER_FIELD_PROTECTION_TAGGED__");
1548 const llvm::Triple &Triple = TI.
getTriple();
1549#define TARGET_OS(Name, Predicate) \
1550 Builder.defineMacro(#Name, (Predicate) ? "1" : "0");
1551#include "clang/Basic/TargetOSMacros.def"
1555 if (LangOpts.PointerAuthIntrinsics)
1556 Builder.defineMacro(
"__PTRAUTH__");
1558 if (CGOpts.Dwarf2CFIAsm)
1559 Builder.defineMacro(
"__GCC_HAVE_DWARF2_CFI_ASM");
1568 Builder.defineMacro(
"__LLVM_INSTR_PROFILE_GENERATE");
1571 Builder.defineMacro(
"__LLVM_INSTR_PROFILE_USE");
1582 std::string PredefineBuffer;
1583 PredefineBuffer.reserve(4080);
1584 llvm::raw_string_ostream Predefines(PredefineBuffer);
1593 Builder.append(
"# 1 \"<built-in>\" 3");
1609 if (LangOpts.ObjC && LangOpts.CPlusPlus &&
1610 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1636 Builder.append(
"# 1 \"<command line>\" 1");
1639 for (
unsigned i = 0, e = InitOpts.
Macros.size(); i != e; ++i) {
1640 if (InitOpts.
Macros[i].second)
1641 Builder.undefineMacro(InitOpts.
Macros[i].first);
1648 Builder.append(
"# 1 \"<built-in>\" 2");
1652 for (
unsigned i = 0, e = InitOpts.
MacroIncludes.size(); i != e; ++i)
1661 for (
unsigned i = 0, e = InitOpts.
Includes.size(); i != e; ++i) {
1662 const std::string &Path = InitOpts.
Includes[i];
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 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 InitializePredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, const PreprocessorOptions &PPOpts, const CodeGenOptions &CGOpts, MacroBuilder &Builder)
llvm::SmallString< 32 > ConstructFixedPointLiteral(llvm::APFixedPoint Val, llvm::StringRef Suffix)
static void DefineTypeMin(const Twine &Prefix, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static void DefineLeastWidthIntType(const LangOptions &LangOpts, unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, 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 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 InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts, MacroBuilder &Builder, const TargetInfo &TI)
Initialize the predefined C++ language feature test macros defined in ISO/IEC JTC1/SC22/WG21 (C++) SD...
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)
Result
Implement __builtin_bit_cast and related operations.
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 hasDWARFExceptions() const
bool hasProfileInstr() const
Check if any form of instrumentation is on.
bool hasProfileIRUse() const
Check if IR level profile use is on.
bool hasWasmExceptions() const
bool hasSjLjExceptions() const
bool hasSEHExceptions() const
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.
void setSeverity(diag::kind Diag, diag::Severity Map, SourceLocation Loc)
This allows the client to specify that certain warnings are ignored.
FrontendOptions - Options for controlling the behavior of the frontend.
InputKind DashX
The input kind, either specified via -x argument or deduced from the input file name.
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...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
std::string LiteralEncoding
Name of the literal encoding to convert the internal encoding to.
bool isTargetDevice() const
True when compiling for an offloading target device.
std::optional< uint32_t > getCPlusPlusLangStd() const
Returns the most applicable C++ standard-compliant language version code.
std::optional< uint32_t > getCLangStd() const
Returns the most applicable C standard-compliant language version code.
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...
uint32_t InitialCounterValue
The initial value for COUNTER; typically is zero but can be set via a -cc1 flag for testing purposes.
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
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 PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
const LangOptions & getLangOpts() const
void setCounterValue(uint32_t V)
DiagnosticsEngine & getDiagnostics() const
void markMainFileAsPreprocessedModuleFile()
Mark the main file as a preprocessed module file, then the 'module' and 'import' directive recognitio...
Encodes a location in the source.
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
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 gua...
unsigned getUnsignedLongFractScale() const
getUnsignedLongFractScale - Return the number of fractional bits in a 'unsigned long _Fract' type.
unsigned getShortWidth() const
getShortWidth/Align - Return the size of 'signed short' and 'unsigned short' for this target,...
unsigned getUnsignedAccumScale() const
getUnsignedAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned _Accum' ty...
unsigned getUnsignedAccumIBits() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getAccumWidth() const
getAccumWidth/Align - Return the size of 'signed _Accum' and 'unsigned _Accum' for this target,...
IntType getUIntPtrType() const
IntType getInt64Type() const
unsigned getUnsignedFractScale() const
getUnsignedFractScale - Return the number of fractional bits in a 'unsigned _Fract' type.
StringRef getDefaultOrdinaryLiteralEncoding() const
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
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
const char * getTypeConstantSuffix(IntType T) const
Return the constant suffix for the specified integer type enum.
unsigned getDoubleWidth() const
getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
unsigned getShortAccumWidth() const
getShortAccumWidth/Align - Return the size of 'signed short _Accum' and 'unsigned short _Accum' for t...
unsigned getSuitableAlign() const
Return the alignment that is the largest alignment ever used for any scalar/SIMD data type on the tar...
unsigned getCharWidth() const
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
unsigned getLongFractWidth() const
getLongFractWidth/Align - Return the size of 'signed long _Fract' and 'unsigned long _Fract' for this...
IntType getIntMaxType() const
unsigned getFractScale() const
getFractScale - Return the number of fractional bits in a 'signed _Fract' type.
unsigned getFractWidth() const
getFractWidth/Align - Return the size of 'signed _Fract' and 'unsigned _Fract' for this target,...
unsigned getShortFractScale() const
getShortFractScale - Return the number of fractional bits in a 'signed short _Fract' type.
unsigned getShortFractWidth() const
getShortFractWidth/Align - Return the size of 'signed short _Fract' and 'unsigned short _Fract' for t...
virtual bool hasHIPImageSupport() const
Whether to support HIP image/texture API's.
static const char * getTypeFormatModifier(IntType T)
Return the printf format modifier for the specified integer type enum.
unsigned getUnsignedShortAccumScale() const
getUnsignedShortAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned short...
bool doUnsignedFixedPointTypesHavePadding() const
In the event this target uses the same number of fractional bits for its unsigned types as it does wi...
IntType getUIntMaxType() const
unsigned getLongDoubleWidth() const
getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.
Defines the clang::TargetInfo interface.
@ Ignored
Do not present this diagnostic, ignore it.
@ RewriteObjC
ObjC->C Rewriter.
constexpr ShaderStage getStageFromEnvironment(const llvm::Triple::EnvironmentType &E)
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++
const FunctionProtoType * T
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\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,...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.
IntType
===-— Target Data Type Query Methods ----------------------------—===//