27#include "llvm/ADT/APFloat.h"
28#include "llvm/IR/DataLayout.h"
29#include "llvm/IR/DerivedTypes.h"
33 while (!MacroBody.empty() &&
isWhitespace(MacroBody.back()))
34 MacroBody = MacroBody.drop_back();
35 return !MacroBody.empty() && MacroBody.back() ==
'\\';
43 std::pair<StringRef, StringRef> MacroPair = Macro.split(
'=');
44 StringRef MacroName = MacroPair.first;
45 StringRef MacroBody = MacroPair.second;
46 if (MacroName.size() != Macro.size()) {
48 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
49 if (End != StringRef::npos)
50 Diags.
Report(diag::warn_fe_macro_contains_embedded_newline)
52 MacroBody = MacroBody.substr(0, End);
57 Builder.defineMacro(MacroName, Twine(MacroBody) +
"\\\n");
59 Builder.defineMacro(MacroName, MacroBody);
62 Builder.defineMacro(Macro);
71 Builder.append(Twine(
"#include \"") +
File +
"\"");
75 Builder.append(Twine(
"#__include_macros \"") +
File +
"\"");
84 StringRef ImplicitIncludePCH) {
86 std::string(ImplicitIncludePCH), PP.
getFileManager(), PCHContainerRdr,
88 if (OriginalFile.empty())
97static T PickFP(
const llvm::fltSemantics *Sem,
T IEEEHalfVal,
T IEEESingleVal,
98 T IEEEDoubleVal,
T X87DoubleExtendedVal,
T PPCDoubleDoubleVal,
100 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf())
102 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle())
103 return IEEESingleVal;
104 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble())
105 return IEEEDoubleVal;
106 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended())
107 return X87DoubleExtendedVal;
108 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble())
109 return PPCDoubleDoubleVal;
110 assert(Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEquad());
115 const llvm::fltSemantics *Sem, StringRef Ext) {
116 const char *DenormMin, *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,
275 if (Ty == TargetInfo::NoInt)
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);
295 if (Ty == TargetInfo::NoInt)
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",
397 Twine((uint32_t)ShaderStage::Vertex));
398 Builder.defineMacro(
"__SHADER_STAGE_PIXEL",
399 Twine((uint32_t)ShaderStage::Pixel));
400 Builder.defineMacro(
"__SHADER_STAGE_GEOMETRY",
401 Twine((uint32_t)ShaderStage::Geometry));
402 Builder.defineMacro(
"__SHADER_STAGE_HULL",
403 Twine((uint32_t)ShaderStage::Hull));
404 Builder.defineMacro(
"__SHADER_STAGE_DOMAIN",
405 Twine((uint32_t)ShaderStage::Domain));
406 Builder.defineMacro(
"__SHADER_STAGE_COMPUTE",
407 Twine((uint32_t)ShaderStage::Compute));
408 Builder.defineMacro(
"__SHADER_STAGE_AMPLIFICATION",
409 Twine((uint32_t)ShaderStage::Amplification));
410 Builder.defineMacro(
"__SHADER_STAGE_MESH",
411 Twine((uint32_t)ShaderStage::Mesh));
412 Builder.defineMacro(
"__SHADER_STAGE_LIBRARY",
413 Twine((uint32_t)ShaderStage::Library));
415 uint32_t StageInteger =
static_cast<uint32_t
>(
416 hlsl::getStageFromEnvironment(TI.
getTriple().getEnvironment()));
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.TraditionalCPP)
436 Builder.defineMacro(
"__STDC__");
440 if (LangOpts.Freestanding)
441 Builder.defineMacro(
"__STDC_HOSTED__",
"0");
443 Builder.defineMacro(
"__STDC_HOSTED__");
449 if (!LangOpts.CPlusPlus) {
451 Builder.defineMacro(
"__STDC_VERSION__",
"202311L");
452 else if (LangOpts.C17)
453 Builder.defineMacro(
"__STDC_VERSION__",
"201710L");
454 else if (LangOpts.C11)
455 Builder.defineMacro(
"__STDC_VERSION__",
"201112L");
456 else if (LangOpts.C99)
457 Builder.defineMacro(
"__STDC_VERSION__",
"199901L");
458 else if (!LangOpts.GNUMode && LangOpts.Digraphs)
459 Builder.defineMacro(
"__STDC_VERSION__",
"199409L");
462 if (LangOpts.CPlusPlus26)
464 Builder.defineMacro(
"__cplusplus",
"202400L");
465 else if (LangOpts.CPlusPlus23)
466 Builder.defineMacro(
"__cplusplus",
"202302L");
468 else if (LangOpts.CPlusPlus20)
469 Builder.defineMacro(
"__cplusplus",
"202002L");
471 else if (LangOpts.CPlusPlus17)
472 Builder.defineMacro(
"__cplusplus",
"201703L");
475 else if (LangOpts.CPlusPlus14)
476 Builder.defineMacro(
"__cplusplus",
"201402L");
479 else if (LangOpts.CPlusPlus11)
480 Builder.defineMacro(
"__cplusplus",
"201103L");
484 Builder.defineMacro(
"__cplusplus",
"199711L");
491 Builder.defineMacro(
"__STDCPP_DEFAULT_NEW_ALIGNMENT__",
498 if (LangOpts.getThreadModel() == LangOptions::ThreadModelKind::POSIX)
499 Builder.defineMacro(
"__STDCPP_THREADS__",
"1");
507 Builder.defineMacro(
"__STDC_UTF_16__",
"1");
508 Builder.defineMacro(
"__STDC_UTF_32__",
"1");
511 Builder.defineMacro(
"__OBJC__");
514 if (LangOpts.OpenCL) {
515 if (LangOpts.CPlusPlus) {
516 switch (LangOpts.OpenCLCPlusPlusVersion) {
518 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"100");
521 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"202100");
524 llvm_unreachable(
"Unsupported C++ version for OpenCL");
526 Builder.defineMacro(
"__CL_CPP_VERSION_1_0__",
"100");
527 Builder.defineMacro(
"__CL_CPP_VERSION_2021__",
"202100");
536 switch (LangOpts.OpenCLVersion) {
538 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"100");
541 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"110");
544 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"120");
547 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"200");
550 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"300");
553 llvm_unreachable(
"Unsupported OpenCL version");
556 Builder.defineMacro(
"CL_VERSION_1_0",
"100");
557 Builder.defineMacro(
"CL_VERSION_1_1",
"110");
558 Builder.defineMacro(
"CL_VERSION_1_2",
"120");
559 Builder.defineMacro(
"CL_VERSION_2_0",
"200");
560 Builder.defineMacro(
"CL_VERSION_3_0",
"300");
563 Builder.defineMacro(
"__ENDIAN_LITTLE__");
565 if (LangOpts.FastRelaxedMath)
566 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
569 if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) {
571 if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2017)
572 Builder.defineMacro(
"CL_SYCL_LANGUAGE_VERSION",
"121");
573 else if (LangOpts.getSYCLVersion() == LangOptions::SYCL_2020)
574 Builder.defineMacro(
"SYCL_LANGUAGE_VERSION",
"202001");
578 if (LangOpts.AsmPreprocessor)
579 Builder.defineMacro(
"__ASSEMBLER__");
581 if (LangOpts.GPURelocatableDeviceCode)
582 Builder.defineMacro(
"__CLANG_RDC__");
584 Builder.defineMacro(
"__CUDA__");
586 LangOptions::GPUDefaultStreamKind::PerThread)
587 Builder.defineMacro(
"CUDA_API_PER_THREAD_DEFAULT_STREAM");
590 Builder.defineMacro(
"__HIP__");
591 Builder.defineMacro(
"__HIPCC__");
592 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_SINGLETHREAD",
"1");
593 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_WAVEFRONT",
"2");
594 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_WORKGROUP",
"3");
595 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_AGENT",
"4");
596 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_SYSTEM",
"5");
597 if (LangOpts.HIPStdPar) {
598 Builder.defineMacro(
"__HIPSTDPAR__");
599 if (LangOpts.HIPStdParInterposeAlloc)
600 Builder.defineMacro(
"__HIPSTDPAR_INTERPOSE_ALLOC__");
602 if (LangOpts.CUDAIsDevice) {
603 Builder.defineMacro(
"__HIP_DEVICE_COMPILE__");
605 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT__",
"1");
607 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT",
"1");
611 LangOptions::GPUDefaultStreamKind::PerThread) {
612 Builder.defineMacro(
"__HIP_API_PER_THREAD_DEFAULT_STREAM__");
614 Builder.defineMacro(
"HIP_API_PER_THREAD_DEFAULT_STREAM");
618 if (LangOpts.OpenACC) {
626 Builder.defineMacro(
"_OPENACC",
"1");
636 Builder.defineMacro(
"__cpp_rtti",
"199711L");
637 if (LangOpts.CXXExceptions)
638 Builder.defineMacro(
"__cpp_exceptions",
"199711L");
641 if (LangOpts.CPlusPlus11) {
642 Builder.defineMacro(
"__cpp_unicode_characters",
"200704L");
643 Builder.defineMacro(
"__cpp_raw_strings",
"200710L");
644 Builder.defineMacro(
"__cpp_unicode_literals",
"200710L");
645 Builder.defineMacro(
"__cpp_user_defined_literals",
"200809L");
646 Builder.defineMacro(
"__cpp_lambdas",
"200907L");
647 Builder.defineMacro(
"__cpp_constexpr", LangOpts.CPlusPlus26 ?
"202306L"
648 : LangOpts.CPlusPlus23 ?
"202211L"
649 : LangOpts.CPlusPlus20 ?
"201907L"
650 : LangOpts.CPlusPlus17 ?
"201603L"
651 : LangOpts.CPlusPlus14 ?
"201304L"
653 Builder.defineMacro(
"__cpp_constexpr_in_decltype",
"201711L");
654 Builder.defineMacro(
"__cpp_range_based_for",
655 LangOpts.CPlusPlus23 ?
"202211L"
656 : LangOpts.CPlusPlus17 ?
"201603L"
658 Builder.defineMacro(
"__cpp_static_assert", LangOpts.CPlusPlus26 ?
"202306L"
659 : LangOpts.CPlusPlus17
662 Builder.defineMacro(
"__cpp_decltype",
"200707L");
663 Builder.defineMacro(
"__cpp_attributes",
"200809L");
664 Builder.defineMacro(
"__cpp_rvalue_references",
"200610L");
665 Builder.defineMacro(
"__cpp_variadic_templates",
"200704L");
666 Builder.defineMacro(
"__cpp_initializer_lists",
"200806L");
667 Builder.defineMacro(
"__cpp_delegating_constructors",
"200604L");
668 Builder.defineMacro(
"__cpp_nsdmi",
"200809L");
669 Builder.defineMacro(
"__cpp_inheriting_constructors",
"201511L");
670 Builder.defineMacro(
"__cpp_ref_qualifiers",
"200710L");
671 Builder.defineMacro(
"__cpp_alias_templates",
"200704L");
673 if (LangOpts.ThreadsafeStatics)
674 Builder.defineMacro(
"__cpp_threadsafe_static_init",
"200806L");
677 if (LangOpts.CPlusPlus14) {
678 Builder.defineMacro(
"__cpp_binary_literals",
"201304L");
679 Builder.defineMacro(
"__cpp_digit_separators",
"201309L");
680 Builder.defineMacro(
"__cpp_init_captures",
681 LangOpts.CPlusPlus20 ?
"201803L" :
"201304L");
682 Builder.defineMacro(
"__cpp_generic_lambdas",
683 LangOpts.CPlusPlus20 ?
"201707L" :
"201304L");
684 Builder.defineMacro(
"__cpp_decltype_auto",
"201304L");
685 Builder.defineMacro(
"__cpp_return_type_deduction",
"201304L");
686 Builder.defineMacro(
"__cpp_aggregate_nsdmi",
"201304L");
687 Builder.defineMacro(
"__cpp_variable_templates",
"201304L");
689 if (LangOpts.SizedDeallocation)
690 Builder.defineMacro(
"__cpp_sized_deallocation",
"201309L");
693 if (LangOpts.CPlusPlus17) {
694 Builder.defineMacro(
"__cpp_hex_float",
"201603L");
695 Builder.defineMacro(
"__cpp_inline_variables",
"201606L");
696 Builder.defineMacro(
"__cpp_noexcept_function_type",
"201510L");
697 Builder.defineMacro(
"__cpp_capture_star_this",
"201603L");
698 Builder.defineMacro(
"__cpp_if_constexpr",
"201606L");
699 Builder.defineMacro(
"__cpp_deduction_guides",
"201703L");
700 Builder.defineMacro(
"__cpp_template_auto",
"201606L");
701 Builder.defineMacro(
"__cpp_namespace_attributes",
"201411L");
702 Builder.defineMacro(
"__cpp_enumerator_attributes",
"201411L");
703 Builder.defineMacro(
"__cpp_nested_namespace_definitions",
"201411L");
704 Builder.defineMacro(
"__cpp_variadic_using",
"201611L");
705 Builder.defineMacro(
"__cpp_aggregate_bases",
"201603L");
706 Builder.defineMacro(
"__cpp_structured_bindings",
"202403L");
707 Builder.defineMacro(
"__cpp_nontype_template_args",
709 Builder.defineMacro(
"__cpp_fold_expressions",
"201603L");
710 Builder.defineMacro(
"__cpp_guaranteed_copy_elision",
"201606L");
711 Builder.defineMacro(
"__cpp_nontype_template_parameter_auto",
"201606L");
713 if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)
714 Builder.defineMacro(
"__cpp_aligned_new",
"201606L");
715 if (LangOpts.RelaxedTemplateTemplateArgs)
716 Builder.defineMacro(
"__cpp_template_template_args",
"201611L");
719 if (LangOpts.CPlusPlus20) {
720 Builder.defineMacro(
"__cpp_aggregate_paren_init",
"201902L");
722 Builder.defineMacro(
"__cpp_concepts",
"202002");
723 Builder.defineMacro(
"__cpp_conditional_explicit",
"201806L");
724 Builder.defineMacro(
"__cpp_consteval",
"202211L");
725 Builder.defineMacro(
"__cpp_constexpr_dynamic_alloc",
"201907L");
726 Builder.defineMacro(
"__cpp_constinit",
"201907L");
727 Builder.defineMacro(
"__cpp_impl_coroutine",
"201902L");
728 Builder.defineMacro(
"__cpp_designated_initializers",
"201707L");
729 Builder.defineMacro(
"__cpp_impl_three_way_comparison",
"201907L");
731 Builder.defineMacro(
"__cpp_using_enum",
"201907L");
734 if (LangOpts.CPlusPlus23) {
735 Builder.defineMacro(
"__cpp_implicit_move",
"202207L");
736 Builder.defineMacro(
"__cpp_size_t_suffix",
"202011L");
737 Builder.defineMacro(
"__cpp_if_consteval",
"202106L");
738 Builder.defineMacro(
"__cpp_multidimensional_subscript",
"202211L");
739 Builder.defineMacro(
"__cpp_auto_cast",
"202110L");
744 if (LangOpts.CPlusPlus11)
745 Builder.defineMacro(
"__cpp_static_call_operator",
"202207L");
746 Builder.defineMacro(
"__cpp_named_character_escapes",
"202207L");
747 Builder.defineMacro(
"__cpp_placeholder_variables",
"202306L");
750 Builder.defineMacro(
"__cpp_deleted_function",
"202403L");
753 Builder.defineMacro(
"__cpp_char8_t",
"202207L");
754 Builder.defineMacro(
"__cpp_impl_destroying_delete",
"201806L");
765 auto defineOpenCLExtMacro = [&](llvm::StringRef Name,
auto... OptArgs) {
770 Builder.defineMacro(Name);
772#define OPENCL_GENERIC_EXTENSION(Ext, ...) \
773 defineOpenCLExtMacro(#Ext, __VA_ARGS__);
774#include "clang/Basic/OpenCLExtensions.def"
777 Builder.defineMacro(
"__opencl_c_int64");
781 llvm::StringRef Suffix) {
782 if (Val.isSigned() && Val == llvm::APFixedPoint::getMin(Val.getSemantics())) {
794 Literal.push_back(
'(');
799 Literal.push_back(
')');
809 llvm::StringRef TypeName, llvm::StringRef Suffix,
810 unsigned Width,
unsigned Scale,
bool Signed) {
813 llvm::FixedPointSemantics FXSema(
814 Width, Scale,
Signed,
false,
818 Builder.defineMacro(MacroPrefix +
"_EPSILON__",
820 llvm::APFixedPoint::getEpsilon(FXSema), Suffix));
821 Builder.defineMacro(MacroPrefix +
"_FBIT__", Twine(Scale));
823 MacroPrefix +
"_MAX__",
830 MacroPrefix +
"_MIN__",
840 Builder.defineMacro(
"__llvm__");
841 Builder.defineMacro(
"__clang__");
843#define TOSTR(X) TOSTR2(X)
844 Builder.defineMacro(
"__clang_major__",
TOSTR(CLANG_VERSION_MAJOR));
845 Builder.defineMacro(
"__clang_minor__",
TOSTR(CLANG_VERSION_MINOR));
846 Builder.defineMacro(
"__clang_patchlevel__",
TOSTR(CLANG_VERSION_PATCHLEVEL));
849 Builder.defineMacro(
"__clang_version__",
850 "\"" CLANG_VERSION_STRING
" "
853 if (LangOpts.GNUCVersion != 0) {
856 unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100;
857 unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100;
858 unsigned GNUCPatch = LangOpts.GNUCVersion % 100;
859 Builder.defineMacro(
"__GNUC__", Twine(GNUCMajor));
860 Builder.defineMacro(
"__GNUC_MINOR__", Twine(GNUCMinor));
861 Builder.defineMacro(
"__GNUC_PATCHLEVEL__", Twine(GNUCPatch));
862 Builder.defineMacro(
"__GXX_ABI_VERSION",
"1002");
864 if (LangOpts.CPlusPlus) {
865 Builder.defineMacro(
"__GNUG__", Twine(GNUCMajor));
866 Builder.defineMacro(
"__GXX_WEAK__");
871 Builder.defineMacro(
"__ATOMIC_RELAXED",
"0");
872 Builder.defineMacro(
"__ATOMIC_CONSUME",
"1");
873 Builder.defineMacro(
"__ATOMIC_ACQUIRE",
"2");
874 Builder.defineMacro(
"__ATOMIC_RELEASE",
"3");
875 Builder.defineMacro(
"__ATOMIC_ACQ_REL",
"4");
876 Builder.defineMacro(
"__ATOMIC_SEQ_CST",
"5");
879 Builder.defineMacro(
"__MEMORY_SCOPE_SYSTEM",
"0");
880 Builder.defineMacro(
"__MEMORY_SCOPE_DEVICE",
"1");
881 Builder.defineMacro(
"__MEMORY_SCOPE_WRKGRP",
"2");
882 Builder.defineMacro(
"__MEMORY_SCOPE_WVFRNT",
"3");
883 Builder.defineMacro(
"__MEMORY_SCOPE_SINGLE",
"4");
892 "Invalid OpenCL memory scope enum definition");
893 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_ITEM",
"0");
894 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_GROUP",
"1");
895 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_DEVICE",
"2");
896 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES",
"3");
897 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_SUB_GROUP",
"4");
900 Builder.defineMacro(
"__FPCLASS_SNAN",
"0x0001");
901 Builder.defineMacro(
"__FPCLASS_QNAN",
"0x0002");
902 Builder.defineMacro(
"__FPCLASS_NEGINF",
"0x0004");
903 Builder.defineMacro(
"__FPCLASS_NEGNORMAL",
"0x0008");
904 Builder.defineMacro(
"__FPCLASS_NEGSUBNORMAL",
"0x0010");
905 Builder.defineMacro(
"__FPCLASS_NEGZERO",
"0x0020");
906 Builder.defineMacro(
"__FPCLASS_POSZERO",
"0x0040");
907 Builder.defineMacro(
"__FPCLASS_POSSUBNORMAL",
"0x0080");
908 Builder.defineMacro(
"__FPCLASS_POSNORMAL",
"0x0100");
909 Builder.defineMacro(
"__FPCLASS_POSINF",
"0x0200");
912 Builder.defineMacro(
"__PRAGMA_REDEFINE_EXTNAME",
"1");
916 Builder.defineMacro(
"__VERSION__",
"\"" +
922 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
923 Builder.defineMacro(
"__STRICT_ANSI__");
925 if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11)
926 Builder.defineMacro(
"__GXX_EXPERIMENTAL_CXX0X__");
930 Builder.defineMacro(
"__OBJC2__");
932 if (LangOpts.ObjCExceptions)
933 Builder.defineMacro(
"OBJC_ZEROCOST_EXCEPTIONS");
936 if (LangOpts.getGC() != LangOptions::NonGC)
937 Builder.defineMacro(
"__OBJC_GC__");
940 Builder.defineMacro(
"__NEXT_RUNTIME__");
944 std::string versionString =
"1";
948 if (version >= VersionTuple(2, 0))
949 Builder.defineMacro(
"__OBJC_GNUSTEP_RUNTIME_ABI__",
"20");
952 "__OBJC_GNUSTEP_RUNTIME_ABI__",
953 "1" + Twine(std::min(8U, version.getMinor().value_or(0))));
958 unsigned minor = tuple.getMinor().value_or(0);
959 unsigned subminor = tuple.getSubminor().value_or(0);
960 Builder.defineMacro(
"__OBJFW_RUNTIME_ABI__",
961 Twine(tuple.getMajor() * 10000 + minor * 100 +
965 Builder.defineMacro(
"IBOutlet",
"__attribute__((iboutlet))");
966 Builder.defineMacro(
"IBOutletCollection(ClassName)",
967 "__attribute__((iboutletcollection(ClassName)))");
968 Builder.defineMacro(
"IBAction",
"void)__attribute__((ibaction)");
969 Builder.defineMacro(
"IBInspectable",
"");
970 Builder.defineMacro(
"IB_DESIGNABLE",
"");
975 Builder.defineMacro(
"__OBJC_BOOL_IS_BOOL",
978 if (LangOpts.CPlusPlus)
983 if (!LangOpts.NoConstantCFStrings)
984 Builder.defineMacro(
"__CONSTANT_CFSTRINGS__");
987 Builder.defineMacro(
"OBJC_NEW_PROPERTIES");
989 if (LangOpts.PascalStrings)
990 Builder.defineMacro(
"__PASCAL_STRINGS__");
992 if (LangOpts.Blocks) {
993 Builder.defineMacro(
"__block",
"__attribute__((__blocks__(byref)))");
994 Builder.defineMacro(
"__BLOCKS__");
997 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
998 Builder.defineMacro(
"__EXCEPTIONS");
999 if (LangOpts.GNUCVersion && LangOpts.RTTI)
1000 Builder.defineMacro(
"__GXX_RTTI");
1003 Builder.defineMacro(
"__USING_SJLJ_EXCEPTIONS__");
1005 Builder.defineMacro(
"__SEH__");
1008 Builder.defineMacro(
"__ARM_DWARF_EH__");
1010 if (LangOpts.Deprecated)
1011 Builder.defineMacro(
"__DEPRECATED");
1013 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus)
1014 Builder.defineMacro(
"__private_extern__",
"extern");
1016 if (LangOpts.MicrosoftExt) {
1017 if (LangOpts.WChar) {
1019 Builder.defineMacro(
"_WCHAR_T_DEFINED");
1020 Builder.defineMacro(
"_NATIVE_WCHAR_T_DEFINED");
1027 Builder.defineMacro(
"__clang_literal_encoding__",
"\"UTF-8\"");
1031 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-32\"");
1036 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-16\"");
1039 if (LangOpts.Optimize)
1040 Builder.defineMacro(
"__OPTIMIZE__");
1041 if (LangOpts.OptimizeSize)
1042 Builder.defineMacro(
"__OPTIMIZE_SIZE__");
1044 if (LangOpts.FastMath)
1045 Builder.defineMacro(
"__FAST_MATH__");
1054 Builder.defineMacro(
"__ORDER_LITTLE_ENDIAN__",
"1234");
1055 Builder.defineMacro(
"__ORDER_BIG_ENDIAN__",
"4321");
1056 Builder.defineMacro(
"__ORDER_PDP_ENDIAN__",
"3412");
1058 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_BIG_ENDIAN__");
1059 Builder.defineMacro(
"__BIG_ENDIAN__");
1061 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_LITTLE_ENDIAN__");
1062 Builder.defineMacro(
"__LITTLE_ENDIAN__");
1067 Builder.defineMacro(
"_LP64");
1068 Builder.defineMacro(
"__LP64__");
1073 Builder.defineMacro(
"_ILP32");
1074 Builder.defineMacro(
"__ILP32__");
1078 assert(TI.
getCharWidth() == 8 &&
"Only support 8-bit char so far");
1079 Builder.defineMacro(
"__CHAR_BIT__", Twine(TI.
getCharWidth()));
1081 Builder.defineMacro(
"__BOOL_WIDTH__", Twine(TI.
getBoolWidth()));
1082 Builder.defineMacro(
"__SHRT_WIDTH__", Twine(TI.
getShortWidth()));
1083 Builder.defineMacro(
"__INT_WIDTH__", Twine(TI.
getIntWidth()));
1084 Builder.defineMacro(
"__LONG_WIDTH__", Twine(TI.
getLongWidth()));
1088 assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&
1089 "Target defined a max bit width larger than LLVM can support!");
1091 "Target defined a max bit width smaller than the C standard allows!");
1092 Builder.defineMacro(
"__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));
1094 DefineTypeSize(
"__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder);
1095 DefineTypeSize(
"__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder);
1096 DefineTypeSize(
"__INT_MAX__", TargetInfo::SignedInt, TI, Builder);
1097 DefineTypeSize(
"__LONG_MAX__", TargetInfo::SignedLong, TI, Builder);
1098 DefineTypeSize(
"__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder);
1133 Builder.defineMacro(
"__INTMAX_C_SUFFIX__",
1137 Builder.defineMacro(
"__UINTMAX_C_SUFFIX__",
1159 "uintptr_t and intptr_t have different widths?");
1162 "uintmax_t and intmax_t have different widths?");
1164 if (LangOpts.FixedPoint) {
1196 Builder.defineMacro(
"__USACCUM_IBIT__",
1198 Builder.defineMacro(
"__ACCUM_IBIT__", Twine(TI.
getAccumIBits()));
1201 Builder.defineMacro(
"__ULACCUM_IBIT__",
1212 Builder.defineMacro(
"__POINTER_WIDTH__",
1216 Builder.defineMacro(
"__BIGGEST_ALIGNMENT__",
1219 if (!LangOpts.CharIsSigned)
1220 Builder.defineMacro(
"__CHAR_UNSIGNED__");
1223 Builder.defineMacro(
"__WCHAR_UNSIGNED__");
1226 Builder.defineMacro(
"__WINT_UNSIGNED__");
1292 if (!LangOpts.MathErrno)
1293 Builder.defineMacro(
"__NO_MATH_ERRNO__");
1295 if (LangOpts.FastMath || LangOpts.FiniteMathOnly)
1296 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"1");
1298 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"0");
1300 if (LangOpts.GNUCVersion) {
1301 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
1302 Builder.defineMacro(
"__GNUC_GNU_INLINE__");
1304 Builder.defineMacro(
"__GNUC_STDC_INLINE__");
1308 Builder.defineMacro(
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
"1");
1314 Builder.defineMacro(
"__GCC_DESTRUCTIVE_SIZE", Twine(Destructive));
1315 Builder.defineMacro(
"__GCC_CONSTRUCTIVE_SIZE", Twine(Constructive));
1318 Builder.append(
"#pragma push_macro(\"__GCC_DESTRUCTIVE_SIZE\")");
1319 Builder.append(
"#pragma push_macro(\"__GCC_CONSTRUCTIVE_SIZE\")");
1321 auto addLockFreeMacros = [&](
const llvm::Twine &Prefix) {
1323#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
1324 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \
1325 getLockFreeValue(TI.get##Type##Width(), TI));
1337 Builder.defineMacro(
1338 Prefix +
"POINTER_LOCK_FREE",
1340#undef DEFINE_LOCK_FREE_MACRO
1342 addLockFreeMacros(
"__CLANG_ATOMIC_");
1343 if (LangOpts.GNUCVersion)
1344 addLockFreeMacros(
"__GCC_ATOMIC_");
1346 if (LangOpts.NoInlineDefine)
1347 Builder.defineMacro(
"__NO_INLINE__");
1349 if (
unsigned PICLevel = LangOpts.PICLevel) {
1350 Builder.defineMacro(
"__PIC__", Twine(PICLevel));
1351 Builder.defineMacro(
"__pic__", Twine(PICLevel));
1353 Builder.defineMacro(
"__PIE__", Twine(PICLevel));
1354 Builder.defineMacro(
"__pie__", Twine(PICLevel));
1359 Builder.defineMacro(
"__FLT_RADIX__",
"2");
1360 Builder.defineMacro(
"__DECIMAL_DIG__",
"__LDBL_DECIMAL_DIG__");
1362 if (LangOpts.getStackProtector() == LangOptions::SSPOn)
1363 Builder.defineMacro(
"__SSP__");
1364 else if (LangOpts.getStackProtector() == LangOptions::SSPStrong)
1365 Builder.defineMacro(
"__SSP_STRONG__",
"2");
1366 else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
1367 Builder.defineMacro(
"__SSP_ALL__",
"3");
1370 Builder.defineMacro(
"__clang_analyzer__");
1372 if (LangOpts.FastRelaxedMath)
1373 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
1376 LangOpts.getGC() != LangOptions::NonGC) {
1377 Builder.defineMacro(
"__weak",
"__attribute__((objc_gc(weak)))");
1378 Builder.defineMacro(
"__strong",
"__attribute__((objc_gc(strong)))");
1379 Builder.defineMacro(
"__autoreleasing",
"");
1380 Builder.defineMacro(
"__unsafe_unretained",
"");
1381 }
else if (LangOpts.ObjC) {
1382 Builder.defineMacro(
"__weak",
"__attribute__((objc_ownership(weak)))");
1383 Builder.defineMacro(
"__strong",
"__attribute__((objc_ownership(strong)))");
1384 Builder.defineMacro(
"__autoreleasing",
1385 "__attribute__((objc_ownership(autoreleasing)))");
1386 Builder.defineMacro(
"__unsafe_unretained",
1387 "__attribute__((objc_ownership(none)))");
1393 Builder.defineMacro(
"__nonnull",
"_Nonnull");
1394 Builder.defineMacro(
"__null_unspecified",
"_Null_unspecified");
1395 Builder.defineMacro(
"__nullable",
"_Nullable");
1401 Builder.defineMacro(
"__APPLE_EMBEDDED_SIMULATOR__",
"1");
1409 if (!LangOpts.OpenMPSimd) {
1410 switch (LangOpts.OpenMP) {
1414 Builder.defineMacro(
"_OPENMP",
"201107");
1417 Builder.defineMacro(
"_OPENMP",
"201307");
1420 Builder.defineMacro(
"_OPENMP",
"201511");
1423 Builder.defineMacro(
"_OPENMP",
"201811");
1426 Builder.defineMacro(
"_OPENMP",
"202111");
1430 Builder.defineMacro(
"_OPENMP",
"202011");
1436 if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {
1439 Builder.defineMacro(
"__CUDA_ARCH__");
1444 if (LangOpts.GPUDeviceApproxTranscendentals)
1445 Builder.defineMacro(
"__CLANG_GPU_APPROX_TRANSCENDENTALS__");
1449 if (LangOpts.SYCLIsDevice) {
1450 Builder.defineMacro(
"__SYCL_DEVICE_ONLY__",
"1");
1454 if (LangOpts.OpenCL) {
1458 Builder.defineMacro(
"__IMAGE_SUPPORT__");
1461 if (TI.
hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1465 Builder.defineMacro(
"__GLIBCXX_TYPE_INT_N_0",
"__int128");
1466 Builder.defineMacro(
"__GLIBCXX_BITSIZE_INT_N_0",
"128");
1471 Builder.defineMacro(
"__ELF__");
1475 const llvm::Triple &Triple = TI.
getTriple();
1476#define TARGET_OS(Name, Predicate) \
1477 Builder.defineMacro(#Name, (Predicate) ? "1" : "0");
1478#include "clang/Basic/TargetOSMacros.def"
1489 Builder.defineMacro(
"__LLVM_INSTR_PROFILE_GENERATE");
1492 Builder.defineMacro(
"__LLVM_INSTR_PROFILE_USE");
1503 std::string PredefineBuffer;
1504 PredefineBuffer.reserve(4080);
1505 llvm::raw_string_ostream Predefines(PredefineBuffer);
1511 Builder.append(
"# 1 \"<built-in>\" 3");
1517 if ((LangOpts.CUDA || LangOpts.OpenMPIsTargetDevice ||
1518 LangOpts.SYCLIsDevice) &&
1528 if (LangOpts.ObjC && LangOpts.CPlusPlus &&
1529 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1555 Builder.append(
"# 1 \"<command line>\" 1");
1558 for (
unsigned i = 0, e = InitOpts.
Macros.size(); i != e; ++i) {
1559 if (InitOpts.
Macros[i].second)
1560 Builder.undefineMacro(InitOpts.
Macros[i].first);
1567 Builder.append(
"# 1 \"<built-in>\" 2");
1571 for (
unsigned i = 0, e = InitOpts.
MacroIncludes.size(); i != e; ++i)
1580 for (
unsigned i = 0, e = InitOpts.
Includes.size(); i != e; ++i) {
1581 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)
llvm::SmallString< 32 > ConstructFixedPointLiteral(llvm::APFixedPoint Val, llvm::StringRef Suffix)
static void DefineLeastWidthIntType(const LangOptions &LangOpts, unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder)
static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts, MacroBuilder &Builder)
Initialize the predefined C++ language feature test macros defined in ISO/IEC JTC1/SC22/WG21 (C++) SD...
static const char * getLockFreeValue(unsigned TypeWidth, const TargetInfo &TI)
Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with the specified properties.
static void DefineTypeSizeAndWidth(const Twine &Prefix, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, MacroBuilder &Builder)
static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal, T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal, T IEEEQuadVal)
PickFP - This is used to pick a value based on the FP semantics of the specified FP model.
static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro, DiagnosticsEngine &Diags)
#define DEFINE_LOCK_FREE_MACRO(TYPE, Type)
static void InitializeStandardPredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, MacroBuilder &Builder)
static void DefineFastIntType(const LangOptions &LangOpts, unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder)
Defines the clang::MacroBuilder utility class.
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the SourceManager interface.
Provides definitions for the atomic synchronization scopes.
Defines version macros and version-related utility functions for Clang.
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
bool hasProfileInstr() const
Check if any form of instrumentation is on.
bool hasProfileIRUse() const
Check if IR level profile use is on.
bool hasProfileClangUse() const
Check if Clang profile use is on.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
FrontendOptions - Options for controlling the behavior of the frontend.
frontend::ActionKind ProgramAction
The frontend action to perform.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
bool hasSjLjExceptions() const
bool hasDWARFExceptions() const
bool hasSEHExceptions() const
std::string OpenACCMacroOverride
GPUDefaultStreamKind GPUDefaultStream
The default stream kind used for HIP kernel launching.
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
const VersionTuple & getVersion() const
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
@ GNUstep
'gnustep' is the modern non-fragile GNUstep runtime.
@ ObjFW
'objfw' is the Objective-C runtime included in ObjFW
static bool isOpenCLOptionAvailableIn(const LangOptions &LO, Args &&... args)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
bool DefineTargetOSMacros
Indicates whether to predefine target OS macros.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
bool SetUpStaticAnalyzer
Set up preprocessor for RunAnalysis action.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
const TargetInfo * getAuxTargetInfo() const
const TargetInfo & getTargetInfo() const
FileManager & getFileManager() const
PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
void setPredefines(std::string P)
Set the predefines for this Preprocessor.
void setSkipMainFilePreamble(unsigned Bytes, bool StartOfLine)
Instruct the preprocessor to skip part of the main source file.
const LangOptions & getLangOpts() const
DiagnosticsEngine & getDiagnostics() const
Exposes information about the current target.
unsigned getNewAlign() const
Return the largest alignment for which a suitably-sized allocation with '::operator new(size_t)' is g...
unsigned getUnsignedLongFractScale() const
getUnsignedLongFractScale - Return the number of fractional bits in a 'unsigned long _Fract' type.
unsigned getShortWidth() const
Return the size of 'signed short' and 'unsigned short' for this target, in bits.
unsigned getUnsignedAccumScale() const
getUnsignedAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned _Accum' ty...
unsigned getUnsignedAccumIBits() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getAccumWidth() const
getAccumWidth/Align - Return the size of 'signed _Accum' and 'unsigned _Accum' for this target,...
IntType getUIntPtrType() const
IntType getInt64Type() const
unsigned getUnsignedFractScale() const
getUnsignedFractScale - Return the number of fractional bits in a 'unsigned _Fract' type.
virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return the smallest integer type with at least the specified width.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
virtual size_t getMaxBitIntWidth() const
unsigned getTypeWidth(IntType T) const
Return the width (in bits) of the specified integer type enum.
unsigned getLongAccumScale() const
getLongAccumScale/IBits - Return the number of fractional/integral bits in a 'signed long _Accum' typ...
unsigned getLongFractScale() const
getLongFractScale - Return the number of fractional bits in a 'signed long _Fract' type.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
virtual std::pair< unsigned, unsigned > hardwareInterferenceSizes() const
The first value in the pair is the minimum offset between two objects to avoid false sharing (destruc...
bool useSignedCharForObjCBool() const
Check if the Objective-C built-in boolean type should be signed char.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
unsigned getAccumIBits() const
IntType getSigAtomicType() const
unsigned getAccumScale() const
getAccumScale/IBits - Return the number of fractional/integral bits in a 'signed _Accum' type.
virtual bool hasFloat16Type() const
Determine whether the _Float16 type is supported on this target.
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
IntType getPtrDiffType(LangAS AddrSpace) const
bool isLittleEndian() const
unsigned getShortAccumIBits() const
unsigned getFloatWidth() const
getFloatWidth/Align/Format - Return the size/align/format of 'float'.
unsigned getLongAccumIBits() const
IntType getSizeType() const
IntType getWIntType() const
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned getLongAccumWidth() const
getLongAccumWidth/Align - Return the size of 'signed long _Accum' and 'unsigned long _Accum' for this...
unsigned getShortAccumScale() const
getShortAccumScale/IBits - Return the number of fractional/integral bits in a 'signed short _Accum' t...
const llvm::fltSemantics & getDoubleFormat() const
static const char * getTypeName(IntType T)
Return the user string for the specified integer type enum.
unsigned getLongLongWidth() const
getLongLongWidth/Align - Return the size of 'signed long long' and 'unsigned long long' for this targ...
virtual bool hasBuiltinAtomic(uint64_t AtomicSizeInBits, uint64_t AlignmentInBits) const
Returns true if the given target supports lock-free atomic operations at the specified width and alig...
IntType getIntPtrType() const
IntType getInt16Type() const
const llvm::fltSemantics & getHalfFormat() const
llvm::StringMap< bool > & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
IntType getWCharType() const
IntType getUInt16Type() const
const char * getUserLabelPrefix() const
Returns the default value of the USER_LABEL_PREFIX macro, which is the prefix given to user symbols b...
IntType getChar16Type() const
unsigned getUnsignedShortAccumIBits() const
IntType getChar32Type() const
IntType getUInt64Type() const
unsigned getUnsignedLongAccumScale() const
getUnsignedLongAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned long _...
unsigned getUnsignedLongAccumIBits() const
unsigned getUnsignedShortFractScale() const
getUnsignedShortFractScale - Return the number of fractional bits in a 'unsigned short _Fract' type.
const llvm::fltSemantics & getLongDoubleFormat() const
const llvm::fltSemantics & getFloatFormat() const
const char * getTypeConstantSuffix(IntType T) const
Return the constant suffix for the specified integer type enum.
unsigned getDoubleWidth() const
getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
unsigned getShortAccumWidth() const
getShortAccumWidth/Align - Return the size of 'signed short _Accum' and 'unsigned short _Accum' for t...
unsigned getSuitableAlign() const
Return the alignment that is the largest alignment ever used for any scalar/SIMD data type on the tar...
unsigned getBoolWidth() const
Return the size of '_Bool' and C++ 'bool' for this target, in bits.
unsigned getCharWidth() const
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
unsigned getLongFractWidth() const
getLongFractWidth/Align - Return the size of 'signed long _Fract' and 'unsigned long _Fract' for this...
IntType getIntMaxType() const
unsigned getFractScale() const
getFractScale - Return the number of fractional bits in a 'signed _Fract' type.
unsigned getFractWidth() const
getFractWidth/Align - Return the size of 'signed _Fract' and 'unsigned _Fract' for this target,...
unsigned getShortFractScale() const
getShortFractScale - Return the number of fractional bits in a 'signed short _Fract' type.
unsigned getShortFractWidth() const
getShortFractWidth/Align - Return the size of 'signed short _Fract' and 'unsigned short _Fract' for t...
virtual bool hasHIPImageSupport() const
Whether to support HIP image/texture API's.
static const char * getTypeFormatModifier(IntType T)
Return the printf format modifier for the specified integer type enum.
unsigned getUnsignedShortAccumScale() const
getUnsignedShortAccumScale/IBits - Return the number of fractional/integral bits in a 'unsigned short...
bool doUnsignedFixedPointTypesHavePadding() const
In the event this target uses the same number of fractional bits for its unsigned types as it does wi...
IntType getUIntMaxType() const
unsigned getLongDoubleWidth() const
getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.
Defines the clang::TargetInfo interface.
@ RewriteObjC
ObjC->C Rewriter.
The JSON file list parser is used to communicate input to InstallAPI.
void InitializePreprocessor(Preprocessor &PP, const PreprocessorOptions &PPOpts, const PCHContainerReader &PCHContainerRdr, const FrontendOptions &FEOpts, const CodeGenOptions &CodeGenOpts)
InitializePreprocessor - Initialize the preprocessor getting it and the environment ready to process ...
@ ARCXX_libstdcxx
libstdc++
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
const FunctionProtoType * T
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
std::string getClangFullCPPVersion()
Retrieves a string representing the complete clang version suitable for use in the CPP VERSION macro,...
IntType
===-— Target Data Type Query Methods ----------------------------—===//