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);
188 for (
const char *Fmt = IsSigned ?
"di" :
"ouxX"; *Fmt; ++Fmt) {
189 Builder.defineMacro(Prefix +
"_FMT" + Twine(*Fmt) +
"__",
190 Twine(
"\"") + FmtModifier + Twine(*Fmt) +
"\"");
201 Builder.defineMacro(MacroName, Twine(TI.
getTypeWidth(Ty)));
206 Builder.defineMacro(MacroName,
236 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
238 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
239 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
242 Builder.defineMacro(Prefix + Twine(TypeWidth) +
"_C_SUFFIX__", ConstSuffix);
258 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
259 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
266 if (Ty == TargetInfo::NoInt)
269 const char *Prefix = IsSigned ?
"__INT_LEAST" :
"__UINT_LEAST";
270 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
276 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
277 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
285 if (Ty == TargetInfo::NoInt)
288 const char *Prefix = IsSigned ?
"__INT_FAST" :
"__UINT_FAST";
289 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
295 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
296 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
318 Builder.defineMacro(
"_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
327 llvm::raw_string_ostream Out(Result);
329 Out <<
"namespace std {\n"
331 <<
"struct __true_type;\n"
332 <<
"struct __false_type;\n"
335 Out <<
"template<typename _Tp> struct __is_scalar;\n"
338 if (LangOpts.ObjCAutoRefCount) {
339 Out <<
"template<typename _Tp>\n"
340 <<
"struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"
341 <<
" enum { __value = 0 };\n"
342 <<
" typedef __false_type __type;\n"
347 if (LangOpts.ObjCWeak) {
348 Out <<
"template<typename _Tp>\n"
349 <<
"struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"
350 <<
" enum { __value = 0 };\n"
351 <<
" typedef __false_type __type;\n"
356 if (LangOpts.ObjCAutoRefCount) {
357 Out <<
"template<typename _Tp>\n"
358 <<
"struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
360 <<
" enum { __value = 0 };\n"
361 <<
" typedef __false_type __type;\n"
368 Builder.append(Result);
376 Builder.defineMacro(
"__hlsl_clang");
378 Builder.defineMacro(
"__HLSL_VERSION",
379 Twine((
unsigned)LangOpts.getHLSLVersion()));
381 if (LangOpts.NativeHalfType)
382 Builder.defineMacro(
"__HLSL_ENABLE_16_BIT",
383 Twine((
unsigned)LangOpts.getHLSLVersion()));
387 Builder.defineMacro(
"__SHADER_STAGE_VERTEX",
388 Twine((uint32_t)ShaderStage::Vertex));
389 Builder.defineMacro(
"__SHADER_STAGE_PIXEL",
390 Twine((uint32_t)ShaderStage::Pixel));
391 Builder.defineMacro(
"__SHADER_STAGE_GEOMETRY",
392 Twine((uint32_t)ShaderStage::Geometry));
393 Builder.defineMacro(
"__SHADER_STAGE_HULL",
394 Twine((uint32_t)ShaderStage::Hull));
395 Builder.defineMacro(
"__SHADER_STAGE_DOMAIN",
396 Twine((uint32_t)ShaderStage::Domain));
397 Builder.defineMacro(
"__SHADER_STAGE_COMPUTE",
398 Twine((uint32_t)ShaderStage::Compute));
399 Builder.defineMacro(
"__SHADER_STAGE_AMPLIFICATION",
400 Twine((uint32_t)ShaderStage::Amplification));
401 Builder.defineMacro(
"__SHADER_STAGE_MESH",
402 Twine((uint32_t)ShaderStage::Mesh));
403 Builder.defineMacro(
"__SHADER_STAGE_LIBRARY",
404 Twine((uint32_t)ShaderStage::Library));
406 uint32_t StageInteger =
static_cast<uint32_t
>(
407 hlsl::getStageFromEnvironment(TI.
getTriple().getEnvironment()));
409 Builder.defineMacro(
"__SHADER_TARGET_STAGE", Twine(StageInteger));
411 if (TI.
getTriple().getOS() == llvm::Triple::ShaderModel) {
412 VersionTuple Version = TI.
getTriple().getOSVersion();
413 Builder.defineMacro(
"__SHADER_TARGET_MAJOR", Twine(Version.getMajor()));
414 unsigned Minor = Version.getMinor().value_or(0);
415 Builder.defineMacro(
"__SHADER_TARGET_MINOR", Twine(Minor));
426 if (!LangOpts.MSVCCompat && !LangOpts.TraditionalCPP)
427 Builder.defineMacro(
"__STDC__");
431 if (LangOpts.Freestanding)
432 Builder.defineMacro(
"__STDC_HOSTED__",
"0");
434 Builder.defineMacro(
"__STDC_HOSTED__");
440 if (!LangOpts.CPlusPlus) {
442 Builder.defineMacro(
"__STDC_VERSION__",
"202311L");
443 else if (LangOpts.C17)
444 Builder.defineMacro(
"__STDC_VERSION__",
"201710L");
445 else if (LangOpts.C11)
446 Builder.defineMacro(
"__STDC_VERSION__",
"201112L");
447 else if (LangOpts.C99)
448 Builder.defineMacro(
"__STDC_VERSION__",
"199901L");
449 else if (!LangOpts.GNUMode && LangOpts.Digraphs)
450 Builder.defineMacro(
"__STDC_VERSION__",
"199409L");
453 if (LangOpts.CPlusPlus26)
455 Builder.defineMacro(
"__cplusplus",
"202400L");
456 else if (LangOpts.CPlusPlus23)
457 Builder.defineMacro(
"__cplusplus",
"202302L");
459 else if (LangOpts.CPlusPlus20)
460 Builder.defineMacro(
"__cplusplus",
"202002L");
462 else if (LangOpts.CPlusPlus17)
463 Builder.defineMacro(
"__cplusplus",
"201703L");
466 else if (LangOpts.CPlusPlus14)
467 Builder.defineMacro(
"__cplusplus",
"201402L");
470 else if (LangOpts.CPlusPlus11)
471 Builder.defineMacro(
"__cplusplus",
"201103L");
475 Builder.defineMacro(
"__cplusplus",
"199711L");
482 Builder.defineMacro(
"__STDCPP_DEFAULT_NEW_ALIGNMENT__",
489 if (LangOpts.getThreadModel() == LangOptions::ThreadModelKind::POSIX)
490 Builder.defineMacro(
"__STDCPP_THREADS__",
"1");
498 Builder.defineMacro(
"__STDC_UTF_16__",
"1");
499 Builder.defineMacro(
"__STDC_UTF_32__",
"1");
502 Builder.defineMacro(
"__OBJC__");
505 if (LangOpts.OpenCL) {
506 if (LangOpts.CPlusPlus) {
507 switch (LangOpts.OpenCLCPlusPlusVersion) {
509 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"100");
512 Builder.defineMacro(
"__OPENCL_CPP_VERSION__",
"202100");
515 llvm_unreachable(
"Unsupported C++ version for OpenCL");
517 Builder.defineMacro(
"__CL_CPP_VERSION_1_0__",
"100");
518 Builder.defineMacro(
"__CL_CPP_VERSION_2021__",
"202100");
527 switch (LangOpts.OpenCLVersion) {
529 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"100");
532 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"110");
535 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"120");
538 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"200");
541 Builder.defineMacro(
"__OPENCL_C_VERSION__",
"300");
544 llvm_unreachable(
"Unsupported OpenCL version");
547 Builder.defineMacro(
"CL_VERSION_1_0",
"100");
548 Builder.defineMacro(
"CL_VERSION_1_1",
"110");
549 Builder.defineMacro(
"CL_VERSION_1_2",
"120");
550 Builder.defineMacro(
"CL_VERSION_2_0",
"200");
551 Builder.defineMacro(
"CL_VERSION_3_0",
"300");
554 Builder.defineMacro(
"__ENDIAN_LITTLE__");
556 if (LangOpts.FastRelaxedMath)
557 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
560 if (LangOpts.SYCLIsDevice || LangOpts.SYCLIsHost) {
563 Builder.defineMacro(
"CL_SYCL_LANGUAGE_VERSION",
"121");
565 Builder.defineMacro(
"SYCL_LANGUAGE_VERSION",
"202001");
569 if (LangOpts.AsmPreprocessor)
570 Builder.defineMacro(
"__ASSEMBLER__");
572 if (LangOpts.GPURelocatableDeviceCode)
573 Builder.defineMacro(
"__CLANG_RDC__");
575 Builder.defineMacro(
"__CUDA__");
577 LangOptions::GPUDefaultStreamKind::PerThread)
578 Builder.defineMacro(
"CUDA_API_PER_THREAD_DEFAULT_STREAM");
581 Builder.defineMacro(
"__HIP__");
582 Builder.defineMacro(
"__HIPCC__");
583 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_SINGLETHREAD",
"1");
584 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_WAVEFRONT",
"2");
585 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_WORKGROUP",
"3");
586 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_AGENT",
"4");
587 Builder.defineMacro(
"__HIP_MEMORY_SCOPE_SYSTEM",
"5");
588 if (LangOpts.HIPStdPar) {
589 Builder.defineMacro(
"__HIPSTDPAR__");
590 if (LangOpts.HIPStdParInterposeAlloc)
591 Builder.defineMacro(
"__HIPSTDPAR_INTERPOSE_ALLOC__");
593 if (LangOpts.CUDAIsDevice) {
594 Builder.defineMacro(
"__HIP_DEVICE_COMPILE__");
596 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT__",
"1");
598 Builder.defineMacro(
"__HIP_NO_IMAGE_SUPPORT",
"1");
602 LangOptions::GPUDefaultStreamKind::PerThread) {
603 Builder.defineMacro(
"__HIP_API_PER_THREAD_DEFAULT_STREAM__");
605 Builder.defineMacro(
"HIP_API_PER_THREAD_DEFAULT_STREAM");
609 if (LangOpts.OpenACC) {
617 Builder.defineMacro(
"_OPENACC",
"1");
627 Builder.defineMacro(
"__cpp_rtti",
"199711L");
628 if (LangOpts.CXXExceptions)
629 Builder.defineMacro(
"__cpp_exceptions",
"199711L");
632 if (LangOpts.CPlusPlus11) {
633 Builder.defineMacro(
"__cpp_unicode_characters",
"200704L");
634 Builder.defineMacro(
"__cpp_raw_strings",
"200710L");
635 Builder.defineMacro(
"__cpp_unicode_literals",
"200710L");
636 Builder.defineMacro(
"__cpp_user_defined_literals",
"200809L");
637 Builder.defineMacro(
"__cpp_lambdas",
"200907L");
638 Builder.defineMacro(
"__cpp_constexpr", LangOpts.CPlusPlus26 ?
"202306L"
639 : LangOpts.CPlusPlus23 ?
"202211L"
640 : LangOpts.CPlusPlus20 ?
"201907L"
641 : LangOpts.CPlusPlus17 ?
"201603L"
642 : LangOpts.CPlusPlus14 ?
"201304L"
644 Builder.defineMacro(
"__cpp_constexpr_in_decltype",
"201711L");
645 Builder.defineMacro(
"__cpp_range_based_for",
646 LangOpts.CPlusPlus17 ?
"201603L" :
"200907");
647 Builder.defineMacro(
"__cpp_static_assert", LangOpts.CPlusPlus26 ?
"202306L"
648 : LangOpts.CPlusPlus17
651 Builder.defineMacro(
"__cpp_decltype",
"200707L");
652 Builder.defineMacro(
"__cpp_attributes",
"200809L");
653 Builder.defineMacro(
"__cpp_rvalue_references",
"200610L");
654 Builder.defineMacro(
"__cpp_variadic_templates",
"200704L");
655 Builder.defineMacro(
"__cpp_initializer_lists",
"200806L");
656 Builder.defineMacro(
"__cpp_delegating_constructors",
"200604L");
657 Builder.defineMacro(
"__cpp_nsdmi",
"200809L");
658 Builder.defineMacro(
"__cpp_inheriting_constructors",
"201511L");
659 Builder.defineMacro(
"__cpp_ref_qualifiers",
"200710L");
660 Builder.defineMacro(
"__cpp_alias_templates",
"200704L");
662 if (LangOpts.ThreadsafeStatics)
663 Builder.defineMacro(
"__cpp_threadsafe_static_init",
"200806L");
666 if (LangOpts.CPlusPlus14) {
667 Builder.defineMacro(
"__cpp_binary_literals",
"201304L");
668 Builder.defineMacro(
"__cpp_digit_separators",
"201309L");
669 Builder.defineMacro(
"__cpp_init_captures",
670 LangOpts.CPlusPlus20 ?
"201803L" :
"201304L");
671 Builder.defineMacro(
"__cpp_generic_lambdas",
672 LangOpts.CPlusPlus20 ?
"201707L" :
"201304L");
673 Builder.defineMacro(
"__cpp_decltype_auto",
"201304L");
674 Builder.defineMacro(
"__cpp_return_type_deduction",
"201304L");
675 Builder.defineMacro(
"__cpp_aggregate_nsdmi",
"201304L");
676 Builder.defineMacro(
"__cpp_variable_templates",
"201304L");
678 if (LangOpts.SizedDeallocation)
679 Builder.defineMacro(
"__cpp_sized_deallocation",
"201309L");
682 if (LangOpts.CPlusPlus17) {
683 Builder.defineMacro(
"__cpp_hex_float",
"201603L");
684 Builder.defineMacro(
"__cpp_inline_variables",
"201606L");
685 Builder.defineMacro(
"__cpp_noexcept_function_type",
"201510L");
686 Builder.defineMacro(
"__cpp_capture_star_this",
"201603L");
687 Builder.defineMacro(
"__cpp_if_constexpr",
"201606L");
688 Builder.defineMacro(
"__cpp_deduction_guides",
"201703L");
689 Builder.defineMacro(
"__cpp_template_auto",
"201606L");
690 Builder.defineMacro(
"__cpp_namespace_attributes",
"201411L");
691 Builder.defineMacro(
"__cpp_enumerator_attributes",
"201411L");
692 Builder.defineMacro(
"__cpp_nested_namespace_definitions",
"201411L");
693 Builder.defineMacro(
"__cpp_variadic_using",
"201611L");
694 Builder.defineMacro(
"__cpp_aggregate_bases",
"201603L");
695 Builder.defineMacro(
"__cpp_structured_bindings",
"201606L");
696 Builder.defineMacro(
"__cpp_nontype_template_args",
698 Builder.defineMacro(
"__cpp_fold_expressions",
"201603L");
699 Builder.defineMacro(
"__cpp_guaranteed_copy_elision",
"201606L");
700 Builder.defineMacro(
"__cpp_nontype_template_parameter_auto",
"201606L");
702 if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)
703 Builder.defineMacro(
"__cpp_aligned_new",
"201606L");
704 if (LangOpts.RelaxedTemplateTemplateArgs)
705 Builder.defineMacro(
"__cpp_template_template_args",
"201611L");
708 if (LangOpts.CPlusPlus20) {
709 Builder.defineMacro(
"__cpp_aggregate_paren_init",
"201902L");
714 Builder.defineMacro(
"__cpp_concepts",
"201907L");
715 Builder.defineMacro(
"__cpp_conditional_explicit",
"201806L");
716 Builder.defineMacro(
"__cpp_consteval",
"202211L");
717 Builder.defineMacro(
"__cpp_constexpr_dynamic_alloc",
"201907L");
718 Builder.defineMacro(
"__cpp_constinit",
"201907L");
719 Builder.defineMacro(
"__cpp_impl_coroutine",
"201902L");
720 Builder.defineMacro(
"__cpp_designated_initializers",
"201707L");
721 Builder.defineMacro(
"__cpp_impl_three_way_comparison",
"201907L");
723 Builder.defineMacro(
"__cpp_using_enum",
"201907L");
726 if (LangOpts.CPlusPlus23) {
727 Builder.defineMacro(
"__cpp_implicit_move",
"202011L");
728 Builder.defineMacro(
"__cpp_size_t_suffix",
"202011L");
729 Builder.defineMacro(
"__cpp_if_consteval",
"202106L");
730 Builder.defineMacro(
"__cpp_multidimensional_subscript",
"202211L");
735 if (LangOpts.CPlusPlus11)
736 Builder.defineMacro(
"__cpp_static_call_operator",
"202207L");
737 Builder.defineMacro(
"__cpp_named_character_escapes",
"202207L");
738 Builder.defineMacro(
"__cpp_placeholder_variables",
"202306L");
741 Builder.defineMacro(
"__cpp_char8_t",
"202207L");
742 Builder.defineMacro(
"__cpp_impl_destroying_delete",
"201806L");
753 auto defineOpenCLExtMacro = [&](llvm::StringRef Name,
auto... OptArgs) {
758 Builder.defineMacro(Name);
760#define OPENCL_GENERIC_EXTENSION(Ext, ...) \
761 defineOpenCLExtMacro(#Ext, __VA_ARGS__);
762#include "clang/Basic/OpenCLExtensions.def"
765 Builder.defineMacro(
"__opencl_c_int64");
774 Builder.defineMacro(
"__llvm__");
775 Builder.defineMacro(
"__clang__");
777#define TOSTR(X) TOSTR2(X)
778 Builder.defineMacro(
"__clang_major__",
TOSTR(CLANG_VERSION_MAJOR));
779 Builder.defineMacro(
"__clang_minor__",
TOSTR(CLANG_VERSION_MINOR));
780 Builder.defineMacro(
"__clang_patchlevel__",
TOSTR(CLANG_VERSION_PATCHLEVEL));
783 Builder.defineMacro(
"__clang_version__",
784 "\"" CLANG_VERSION_STRING
" "
787 if (LangOpts.GNUCVersion != 0) {
790 unsigned GNUCMajor = LangOpts.GNUCVersion / 100 / 100;
791 unsigned GNUCMinor = LangOpts.GNUCVersion / 100 % 100;
792 unsigned GNUCPatch = LangOpts.GNUCVersion % 100;
793 Builder.defineMacro(
"__GNUC__", Twine(GNUCMajor));
794 Builder.defineMacro(
"__GNUC_MINOR__", Twine(GNUCMinor));
795 Builder.defineMacro(
"__GNUC_PATCHLEVEL__", Twine(GNUCPatch));
796 Builder.defineMacro(
"__GXX_ABI_VERSION",
"1002");
798 if (LangOpts.CPlusPlus) {
799 Builder.defineMacro(
"__GNUG__", Twine(GNUCMajor));
800 Builder.defineMacro(
"__GXX_WEAK__");
805 Builder.defineMacro(
"__ATOMIC_RELAXED",
"0");
806 Builder.defineMacro(
"__ATOMIC_CONSUME",
"1");
807 Builder.defineMacro(
"__ATOMIC_ACQUIRE",
"2");
808 Builder.defineMacro(
"__ATOMIC_RELEASE",
"3");
809 Builder.defineMacro(
"__ATOMIC_ACQ_REL",
"4");
810 Builder.defineMacro(
"__ATOMIC_SEQ_CST",
"5");
819 "Invalid OpenCL memory scope enum definition");
820 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_ITEM",
"0");
821 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_GROUP",
"1");
822 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_DEVICE",
"2");
823 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES",
"3");
824 Builder.defineMacro(
"__OPENCL_MEMORY_SCOPE_SUB_GROUP",
"4");
827 Builder.defineMacro(
"__FPCLASS_SNAN",
"0x0001");
828 Builder.defineMacro(
"__FPCLASS_QNAN",
"0x0002");
829 Builder.defineMacro(
"__FPCLASS_NEGINF",
"0x0004");
830 Builder.defineMacro(
"__FPCLASS_NEGNORMAL",
"0x0008");
831 Builder.defineMacro(
"__FPCLASS_NEGSUBNORMAL",
"0x0010");
832 Builder.defineMacro(
"__FPCLASS_NEGZERO",
"0x0020");
833 Builder.defineMacro(
"__FPCLASS_POSZERO",
"0x0040");
834 Builder.defineMacro(
"__FPCLASS_POSSUBNORMAL",
"0x0080");
835 Builder.defineMacro(
"__FPCLASS_POSNORMAL",
"0x0100");
836 Builder.defineMacro(
"__FPCLASS_POSINF",
"0x0200");
839 Builder.defineMacro(
"__PRAGMA_REDEFINE_EXTNAME",
"1");
843 Builder.defineMacro(
"__VERSION__",
"\"" +
849 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
850 Builder.defineMacro(
"__STRICT_ANSI__");
852 if (LangOpts.GNUCVersion && LangOpts.CPlusPlus11)
853 Builder.defineMacro(
"__GXX_EXPERIMENTAL_CXX0X__");
857 Builder.defineMacro(
"__OBJC2__");
859 if (LangOpts.ObjCExceptions)
860 Builder.defineMacro(
"OBJC_ZEROCOST_EXCEPTIONS");
864 Builder.defineMacro(
"__OBJC_GC__");
867 Builder.defineMacro(
"__NEXT_RUNTIME__");
871 std::string versionString =
"1";
875 if (version >= VersionTuple(2, 0))
876 Builder.defineMacro(
"__OBJC_GNUSTEP_RUNTIME_ABI__",
"20");
879 "__OBJC_GNUSTEP_RUNTIME_ABI__",
880 "1" + Twine(std::min(8U, version.getMinor().value_or(0))));
885 unsigned minor = tuple.getMinor().value_or(0);
886 unsigned subminor = tuple.getSubminor().value_or(0);
887 Builder.defineMacro(
"__OBJFW_RUNTIME_ABI__",
888 Twine(tuple.getMajor() * 10000 + minor * 100 +
892 Builder.defineMacro(
"IBOutlet",
"__attribute__((iboutlet))");
893 Builder.defineMacro(
"IBOutletCollection(ClassName)",
894 "__attribute__((iboutletcollection(ClassName)))");
895 Builder.defineMacro(
"IBAction",
"void)__attribute__((ibaction)");
896 Builder.defineMacro(
"IBInspectable",
"");
897 Builder.defineMacro(
"IB_DESIGNABLE",
"");
902 Builder.defineMacro(
"__OBJC_BOOL_IS_BOOL",
905 if (LangOpts.CPlusPlus)
910 if (!LangOpts.NoConstantCFStrings)
911 Builder.defineMacro(
"__CONSTANT_CFSTRINGS__");
914 Builder.defineMacro(
"OBJC_NEW_PROPERTIES");
916 if (LangOpts.PascalStrings)
917 Builder.defineMacro(
"__PASCAL_STRINGS__");
919 if (LangOpts.Blocks) {
920 Builder.defineMacro(
"__block",
"__attribute__((__blocks__(byref)))");
921 Builder.defineMacro(
"__BLOCKS__");
924 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
925 Builder.defineMacro(
"__EXCEPTIONS");
926 if (LangOpts.GNUCVersion && LangOpts.RTTI)
927 Builder.defineMacro(
"__GXX_RTTI");
930 Builder.defineMacro(
"__USING_SJLJ_EXCEPTIONS__");
932 Builder.defineMacro(
"__SEH__");
935 Builder.defineMacro(
"__ARM_DWARF_EH__");
937 if (LangOpts.Deprecated)
938 Builder.defineMacro(
"__DEPRECATED");
940 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus)
941 Builder.defineMacro(
"__private_extern__",
"extern");
943 if (LangOpts.MicrosoftExt) {
944 if (LangOpts.WChar) {
946 Builder.defineMacro(
"_WCHAR_T_DEFINED");
947 Builder.defineMacro(
"_NATIVE_WCHAR_T_DEFINED");
954 Builder.defineMacro(
"__clang_literal_encoding__",
"\"UTF-8\"");
958 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-32\"");
963 Builder.defineMacro(
"__clang_wide_literal_encoding__",
"\"UTF-16\"");
966 if (LangOpts.Optimize)
967 Builder.defineMacro(
"__OPTIMIZE__");
968 if (LangOpts.OptimizeSize)
969 Builder.defineMacro(
"__OPTIMIZE_SIZE__");
971 if (LangOpts.FastMath)
972 Builder.defineMacro(
"__FAST_MATH__");
981 Builder.defineMacro(
"__ORDER_LITTLE_ENDIAN__",
"1234");
982 Builder.defineMacro(
"__ORDER_BIG_ENDIAN__",
"4321");
983 Builder.defineMacro(
"__ORDER_PDP_ENDIAN__",
"3412");
985 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_BIG_ENDIAN__");
986 Builder.defineMacro(
"__BIG_ENDIAN__");
988 Builder.defineMacro(
"__BYTE_ORDER__",
"__ORDER_LITTLE_ENDIAN__");
989 Builder.defineMacro(
"__LITTLE_ENDIAN__");
994 Builder.defineMacro(
"_LP64");
995 Builder.defineMacro(
"__LP64__");
1000 Builder.defineMacro(
"_ILP32");
1001 Builder.defineMacro(
"__ILP32__");
1005 assert(TI.
getCharWidth() == 8 &&
"Only support 8-bit char so far");
1006 Builder.defineMacro(
"__CHAR_BIT__", Twine(TI.
getCharWidth()));
1008 Builder.defineMacro(
"__BOOL_WIDTH__", Twine(TI.
getBoolWidth()));
1009 Builder.defineMacro(
"__SHRT_WIDTH__", Twine(TI.
getShortWidth()));
1010 Builder.defineMacro(
"__INT_WIDTH__", Twine(TI.
getIntWidth()));
1011 Builder.defineMacro(
"__LONG_WIDTH__", Twine(TI.
getLongWidth()));
1015 assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&
1016 "Target defined a max bit width larger than LLVM can support!");
1018 "Target defined a max bit width smaller than the C standard allows!");
1019 Builder.defineMacro(
"__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));
1021 DefineTypeSize(
"__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder);
1022 DefineTypeSize(
"__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder);
1023 DefineTypeSize(
"__INT_MAX__", TargetInfo::SignedInt, TI, Builder);
1024 DefineTypeSize(
"__LONG_MAX__", TargetInfo::SignedLong, TI, Builder);
1025 DefineTypeSize(
"__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder);
1060 Builder.defineMacro(
"__INTMAX_C_SUFFIX__",
1064 Builder.defineMacro(
"__UINTMAX_C_SUFFIX__",
1085 "uintptr_t and intptr_t have different widths?");
1088 "uintmax_t and intmax_t have different widths?");
1097 Builder.defineMacro(
"__POINTER_WIDTH__",
1101 Builder.defineMacro(
"__BIGGEST_ALIGNMENT__",
1104 if (!LangOpts.CharIsSigned)
1105 Builder.defineMacro(
"__CHAR_UNSIGNED__");
1108 Builder.defineMacro(
"__WCHAR_UNSIGNED__");
1111 Builder.defineMacro(
"__WINT_UNSIGNED__");
1176 if (!LangOpts.MathErrno)
1177 Builder.defineMacro(
"__NO_MATH_ERRNO__");
1179 if (LangOpts.FastMath || LangOpts.FiniteMathOnly)
1180 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"1");
1182 Builder.defineMacro(
"__FINITE_MATH_ONLY__",
"0");
1184 if (LangOpts.GNUCVersion) {
1185 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
1186 Builder.defineMacro(
"__GNUC_GNU_INLINE__");
1188 Builder.defineMacro(
"__GNUC_STDC_INLINE__");
1192 Builder.defineMacro(
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
"1");
1195 auto addLockFreeMacros = [&](
const llvm::Twine &Prefix) {
1197#define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
1198 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \
1199 getLockFreeValue(TI.get##Type##Width(), TI));
1211 Builder.defineMacro(
1212 Prefix +
"POINTER_LOCK_FREE",
1214#undef DEFINE_LOCK_FREE_MACRO
1216 addLockFreeMacros(
"__CLANG_ATOMIC_");
1217 if (LangOpts.GNUCVersion)
1218 addLockFreeMacros(
"__GCC_ATOMIC_");
1220 if (LangOpts.NoInlineDefine)
1221 Builder.defineMacro(
"__NO_INLINE__");
1223 if (
unsigned PICLevel = LangOpts.PICLevel) {
1224 Builder.defineMacro(
"__PIC__", Twine(PICLevel));
1225 Builder.defineMacro(
"__pic__", Twine(PICLevel));
1227 Builder.defineMacro(
"__PIE__", Twine(PICLevel));
1228 Builder.defineMacro(
"__pie__", Twine(PICLevel));
1233 Builder.defineMacro(
"__FLT_RADIX__",
"2");
1234 Builder.defineMacro(
"__DECIMAL_DIG__",
"__LDBL_DECIMAL_DIG__");
1237 Builder.defineMacro(
"__SSP__");
1239 Builder.defineMacro(
"__SSP_STRONG__",
"2");
1241 Builder.defineMacro(
"__SSP_ALL__",
"3");
1244 Builder.defineMacro(
"__clang_analyzer__");
1246 if (LangOpts.FastRelaxedMath)
1247 Builder.defineMacro(
"__FAST_RELAXED_MATH__");
1251 Builder.defineMacro(
"__weak",
"__attribute__((objc_gc(weak)))");
1252 Builder.defineMacro(
"__strong",
"__attribute__((objc_gc(strong)))");
1253 Builder.defineMacro(
"__autoreleasing",
"");
1254 Builder.defineMacro(
"__unsafe_unretained",
"");
1255 }
else if (LangOpts.ObjC) {
1256 Builder.defineMacro(
"__weak",
"__attribute__((objc_ownership(weak)))");
1257 Builder.defineMacro(
"__strong",
"__attribute__((objc_ownership(strong)))");
1258 Builder.defineMacro(
"__autoreleasing",
1259 "__attribute__((objc_ownership(autoreleasing)))");
1260 Builder.defineMacro(
"__unsafe_unretained",
1261 "__attribute__((objc_ownership(none)))");
1267 Builder.defineMacro(
"__nonnull",
"_Nonnull");
1268 Builder.defineMacro(
"__null_unspecified",
"_Null_unspecified");
1269 Builder.defineMacro(
"__nullable",
"_Nullable");
1275 Builder.defineMacro(
"__APPLE_EMBEDDED_SIMULATOR__",
"1");
1283 if (!LangOpts.OpenMPSimd) {
1284 switch (LangOpts.OpenMP) {
1288 Builder.defineMacro(
"_OPENMP",
"201107");
1291 Builder.defineMacro(
"_OPENMP",
"201307");
1294 Builder.defineMacro(
"_OPENMP",
"201511");
1297 Builder.defineMacro(
"_OPENMP",
"201811");
1300 Builder.defineMacro(
"_OPENMP",
"202111");
1304 Builder.defineMacro(
"_OPENMP",
"202011");
1310 if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {
1313 Builder.defineMacro(
"__CUDA_ARCH__");
1318 if (LangOpts.GPUDeviceApproxTranscendentals)
1319 Builder.defineMacro(
"__CLANG_GPU_APPROX_TRANSCENDENTALS__");
1323 if (LangOpts.SYCLIsDevice) {
1324 Builder.defineMacro(
"__SYCL_DEVICE_ONLY__",
"1");
1328 if (LangOpts.OpenCL) {
1332 Builder.defineMacro(
"__IMAGE_SUPPORT__");
1335 if (TI.
hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1339 Builder.defineMacro(
"__GLIBCXX_TYPE_INT_N_0",
"__int128");
1340 Builder.defineMacro(
"__GLIBCXX_BITSIZE_INT_N_0",
"128");
1345 Builder.defineMacro(
"__ELF__");
1358 std::string PredefineBuffer;
1359 PredefineBuffer.reserve(4080);
1360 llvm::raw_string_ostream Predefines(PredefineBuffer);
1366 Builder.append(
"# 1 \"<built-in>\" 3");
1372 if ((LangOpts.CUDA || LangOpts.OpenMPIsTargetDevice ||
1373 LangOpts.SYCLIsDevice) &&
1383 if (LangOpts.ObjC && LangOpts.CPlusPlus &&
1384 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1405 Builder.append(
"# 1 \"<command line>\" 1");
1408 for (
unsigned i = 0, e = InitOpts.
Macros.size(); i != e; ++i) {
1409 if (InitOpts.
Macros[i].second)
1410 Builder.undefineMacro(InitOpts.
Macros[i].first);
1417 Builder.append(
"# 1 \"<built-in>\" 2");
1421 for (
unsigned i = 0, e = InitOpts.
MacroIncludes.size(); i != e; ++i)
1430 for (
unsigned i = 0, e = InitOpts.
Includes.size(); i != e; ++i) {
1431 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 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 DefineExactWidthIntType(TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty, const TargetInfo &TI, 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 DefineFmt(const Twine &Prefix, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
static void DefineLeastWidthIntType(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(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.
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...
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 getShortWidth() const
Return the size of 'signed short' and 'unsigned short' for this target, in bits.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
IntType getUIntPtrType() const
IntType getInt64Type() 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.
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
bool useSignedCharForObjCBool() const
Check if the Objective-C built-in boolean type should be signed char.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
IntType getSigAtomicType() const
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 getFloatWidth() const
getFloatWidth/Align/Format - Return the size/align/format of 'float'.
IntType getSizeType() const
IntType getWIntType() const
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
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
IntType getChar32Type() const
IntType getUInt64Type() const
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 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,...
IntType getIntMaxType() const
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.
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.
@ ARCXX_libstdcxx
libstdc++
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
void InitializePreprocessor(Preprocessor &PP, const PreprocessorOptions &PPOpts, const PCHContainerReader &PCHContainerRdr, const FrontendOptions &FEOpts)
InitializePreprocessor - Initialize the preprocessor getting it and the environment ready to process ...
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 ----------------------------—===//