28 #include "llvm/ADT/APFloat.h" 29 using namespace clang;
32 while (!MacroBody.empty() &&
isWhitespace(MacroBody.back()))
33 MacroBody = MacroBody.drop_back();
34 return !MacroBody.empty() && MacroBody.back() ==
'\\';
42 std::pair<StringRef, StringRef> MacroPair = Macro.split(
'=');
43 StringRef MacroName = MacroPair.first;
44 StringRef MacroBody = MacroPair.second;
45 if (MacroName.size() != Macro.size()) {
47 StringRef::size_type
End = MacroBody.find_first_of(
"\n\r");
48 if (End != StringRef::npos)
49 Diags.
Report(diag::warn_fe_macro_contains_embedded_newline)
51 MacroBody = MacroBody.substr(0, End);
56 Builder.
defineMacro(MacroName, Twine(MacroBody) +
"\\\n");
70 Builder.
append(Twine(
"#include \"") + File +
"\"");
74 Builder.
append(Twine(
"#__include_macros \"") + File +
"\"");
82 StringRef ImplicitIncludePTH) {
89 << ImplicitIncludePTH;
100 StringRef ImplicitIncludePCH) {
101 std::string OriginalFile =
104 if (OriginalFile.empty())
112 template <
typename T>
113 static T
PickFP(
const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal,
114 T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal,
116 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf())
118 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle())
119 return IEEESingleVal;
120 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble())
121 return IEEEDoubleVal;
122 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended())
123 return X87DoubleExtendedVal;
124 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble())
125 return PPCDoubleDoubleVal;
126 assert(Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEquad());
131 const llvm::fltSemantics *Sem, StringRef Ext) {
132 const char *DenormMin, *Epsilon, *Max, *Min;
133 DenormMin =
PickFP(Sem,
"5.9604644775390625e-8",
"1.40129846e-45",
134 "4.9406564584124654e-324",
"3.64519953188247460253e-4951",
135 "4.94065645841246544176568792868221e-324",
136 "6.47517511943802511092443895822764655e-4966");
137 int Digits =
PickFP(Sem, 3, 6, 15, 18, 31, 33);
138 int DecimalDigits =
PickFP(Sem, 5, 9, 17, 21, 33, 36);
139 Epsilon =
PickFP(Sem,
"9.765625e-4",
"1.19209290e-7",
140 "2.2204460492503131e-16",
"1.08420217248550443401e-19",
141 "4.94065645841246544176568792868221e-324",
142 "1.92592994438723585305597794258492732e-34");
143 int MantissaDigits =
PickFP(Sem, 11, 24, 53, 64, 106, 113);
144 int Min10Exp =
PickFP(Sem, -13, -37, -307, -4931, -291, -4931);
145 int Max10Exp =
PickFP(Sem, 4, 38, 308, 4932, 308, 4932);
146 int MinExp =
PickFP(Sem, -14, -125, -1021, -16381, -968, -16381);
147 int MaxExp =
PickFP(Sem, 15, 128, 1024, 16384, 1024, 16384);
148 Min =
PickFP(Sem,
"6.103515625e-5",
"1.17549435e-38",
"2.2250738585072014e-308",
149 "3.36210314311209350626e-4932",
150 "2.00416836000897277799610805135016e-292",
151 "3.36210314311209350626267781732175260e-4932");
152 Max =
PickFP(Sem,
"6.5504e+4",
"3.40282347e+38",
"1.7976931348623157e+308",
153 "1.18973149535723176502e+4932",
154 "1.79769313486231580793728971405301e+308",
155 "1.18973149535723176508575932662800702e+4932");
162 Builder.
defineMacro(DefPrefix +
"DENORM_MIN__", Twine(DenormMin)+Ext);
164 Builder.
defineMacro(DefPrefix +
"DIG__", Twine(Digits));
165 Builder.
defineMacro(DefPrefix +
"DECIMAL_DIG__", Twine(DecimalDigits));
166 Builder.
defineMacro(DefPrefix +
"EPSILON__", Twine(Epsilon)+Ext);
168 Builder.
defineMacro(DefPrefix +
"HAS_QUIET_NAN__");
169 Builder.
defineMacro(DefPrefix +
"MANT_DIG__", Twine(MantissaDigits));
171 Builder.
defineMacro(DefPrefix +
"MAX_10_EXP__", Twine(Max10Exp));
172 Builder.
defineMacro(DefPrefix +
"MAX_EXP__", Twine(MaxExp));
173 Builder.
defineMacro(DefPrefix +
"MAX__", Twine(Max)+Ext);
175 Builder.
defineMacro(DefPrefix +
"MIN_10_EXP__",
"("+Twine(Min10Exp)+
")");
176 Builder.
defineMacro(DefPrefix +
"MIN_EXP__",
"("+Twine(MinExp)+
")");
177 Builder.
defineMacro(DefPrefix +
"MIN__", Twine(Min)+Ext);
185 StringRef ValSuffix,
bool isSigned,
187 llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth)
188 : llvm::APInt::getMaxValue(TypeWidth);
189 Builder.
defineMacro(MacroName, MaxVal.toString(10, isSigned) + ValSuffix);
204 for (
const char *Fmt = IsSigned ?
"di" :
"ouxX"; *Fmt; ++Fmt) {
205 Builder.
defineMacro(Prefix +
"_FMT" + Twine(*Fmt) +
"__",
206 Twine(
"\"") + FmtModifier + Twine(*Fmt) +
"\"");
237 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
239 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
240 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
243 Builder.
defineMacro(Prefix + Twine(TypeWidth) +
"_C_SUFFIX__", ConstSuffix);
257 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
258 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
268 const char *Prefix = IsSigned ?
"__INT_LEAST" :
"__UINT_LEAST";
269 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
270 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
271 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
282 const char *Prefix = IsSigned ?
"__INT_FAST" :
"__UINT_FAST";
283 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
284 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
286 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
293 unsigned InlineWidth) {
296 if (TypeWidth == TypeAlign && (TypeWidth & (TypeWidth - 1)) == 0 &&
297 TypeWidth <= InlineWidth)
308 Builder.
defineMacro(
"_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
317 llvm::raw_string_ostream Out(Result);
319 Out <<
"namespace std {\n" 321 <<
"struct __true_type;\n" 322 <<
"struct __false_type;\n" 325 Out <<
"template<typename _Tp> struct __is_scalar;\n" 328 if (LangOpts.ObjCAutoRefCount) {
329 Out <<
"template<typename _Tp>\n" 330 <<
"struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n" 331 <<
" enum { __value = 0 };\n" 332 <<
" typedef __false_type __type;\n" 337 if (LangOpts.ObjCWeak) {
338 Out <<
"template<typename _Tp>\n" 339 <<
"struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n" 340 <<
" enum { __value = 0 };\n" 341 <<
" typedef __false_type __type;\n" 346 if (LangOpts.ObjCAutoRefCount) {
347 Out <<
"template<typename _Tp>\n" 348 <<
"struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))" 350 <<
" enum { __value = 0 };\n" 351 <<
" typedef __false_type __type;\n" 365 if (!LangOpts.MSVCCompat && !LangOpts.TraditionalCPP)
367 if (LangOpts.Freestanding)
372 if (!LangOpts.CPlusPlus) {
374 Builder.
defineMacro(
"__STDC_VERSION__",
"201710L");
375 else if (LangOpts.C11)
376 Builder.
defineMacro(
"__STDC_VERSION__",
"201112L");
377 else if (LangOpts.C99)
378 Builder.
defineMacro(
"__STDC_VERSION__",
"199901L");
379 else if (!LangOpts.GNUMode && LangOpts.Digraphs)
380 Builder.
defineMacro(
"__STDC_VERSION__",
"199409L");
383 if (LangOpts.CPlusPlus2a)
388 else if (LangOpts.CPlusPlus17)
393 else if (LangOpts.CPlusPlus14)
398 else if (LangOpts.CPlusPlus11)
411 Builder.
defineMacro(
"__STDCPP_DEFAULT_NEW_ALIGNMENT__",
428 if (LangOpts.OpenCL) {
429 if (LangOpts.CPlusPlus) {
430 if (LangOpts.OpenCLCPlusPlusVersion == 100)
431 Builder.
defineMacro(
"__OPENCL_CPP_VERSION__",
"100");
433 llvm_unreachable(
"Unsupported OpenCL C++ version");
434 Builder.
defineMacro(
"__CL_CPP_VERSION_1_0__",
"100");
443 switch (LangOpts.OpenCLVersion) {
445 Builder.
defineMacro(
"__OPENCL_C_VERSION__",
"100");
448 Builder.
defineMacro(
"__OPENCL_C_VERSION__",
"110");
451 Builder.
defineMacro(
"__OPENCL_C_VERSION__",
"120");
454 Builder.
defineMacro(
"__OPENCL_C_VERSION__",
"200");
457 llvm_unreachable(
"Unsupported OpenCL version");
467 if (LangOpts.FastRelaxedMath)
472 if (LangOpts.AsmPreprocessor)
474 if (LangOpts.CUDA && !LangOpts.HIP)
479 if (LangOpts.CUDAIsDevice)
491 if (LangOpts.CXXExceptions)
492 Builder.
defineMacro(
"__cpp_exceptions",
"199711L");
495 if (LangOpts.CPlusPlus11) {
496 Builder.
defineMacro(
"__cpp_unicode_characters",
"200704L");
497 Builder.
defineMacro(
"__cpp_raw_strings",
"200710L");
498 Builder.
defineMacro(
"__cpp_unicode_literals",
"200710L");
499 Builder.
defineMacro(
"__cpp_user_defined_literals",
"200809L");
502 LangOpts.CPlusPlus17 ?
"201603L" :
503 LangOpts.CPlusPlus14 ?
"201304L" :
"200704");
505 LangOpts.CPlusPlus17 ?
"201603L" :
"200907");
507 LangOpts.CPlusPlus17 ?
"201411L" :
"200410");
509 Builder.
defineMacro(
"__cpp_attributes",
"200809L");
510 Builder.
defineMacro(
"__cpp_rvalue_references",
"200610L");
511 Builder.
defineMacro(
"__cpp_variadic_templates",
"200704L");
512 Builder.
defineMacro(
"__cpp_initializer_lists",
"200806L");
513 Builder.
defineMacro(
"__cpp_delegating_constructors",
"200604L");
515 Builder.
defineMacro(
"__cpp_inheriting_constructors",
"201511L");
516 Builder.
defineMacro(
"__cpp_ref_qualifiers",
"200710L");
517 Builder.
defineMacro(
"__cpp_alias_templates",
"200704L");
519 if (LangOpts.ThreadsafeStatics)
520 Builder.
defineMacro(
"__cpp_threadsafe_static_init",
"200806L");
523 if (LangOpts.CPlusPlus14) {
524 Builder.
defineMacro(
"__cpp_binary_literals",
"201304L");
525 Builder.
defineMacro(
"__cpp_digit_separators",
"201309L");
526 Builder.
defineMacro(
"__cpp_init_captures",
"201304L");
527 Builder.
defineMacro(
"__cpp_generic_lambdas",
"201304L");
528 Builder.
defineMacro(
"__cpp_decltype_auto",
"201304L");
529 Builder.
defineMacro(
"__cpp_return_type_deduction",
"201304L");
530 Builder.
defineMacro(
"__cpp_aggregate_nsdmi",
"201304L");
531 Builder.
defineMacro(
"__cpp_variable_templates",
"201304L");
533 if (LangOpts.SizedDeallocation)
534 Builder.
defineMacro(
"__cpp_sized_deallocation",
"201309L");
537 if (LangOpts.CPlusPlus17) {
539 Builder.
defineMacro(
"__cpp_inline_variables",
"201606L");
540 Builder.
defineMacro(
"__cpp_noexcept_function_type",
"201510L");
541 Builder.
defineMacro(
"__cpp_capture_star_this",
"201603L");
542 Builder.
defineMacro(
"__cpp_if_constexpr",
"201606L");
543 Builder.
defineMacro(
"__cpp_deduction_guides",
"201703L");
544 Builder.
defineMacro(
"__cpp_template_auto",
"201606L");
545 Builder.
defineMacro(
"__cpp_namespace_attributes",
"201411L");
546 Builder.
defineMacro(
"__cpp_enumerator_attributes",
"201411L");
547 Builder.
defineMacro(
"__cpp_nested_namespace_definitions",
"201411L");
548 Builder.
defineMacro(
"__cpp_variadic_using",
"201611L");
549 Builder.
defineMacro(
"__cpp_aggregate_bases",
"201603L");
550 Builder.
defineMacro(
"__cpp_structured_bindings",
"201606L");
551 Builder.
defineMacro(
"__cpp_nontype_template_args",
"201411L");
552 Builder.
defineMacro(
"__cpp_fold_expressions",
"201603L");
553 Builder.
defineMacro(
"__cpp_guaranteed_copy_elision",
"201606L");
554 Builder.
defineMacro(
"__cpp_nontype_template_parameter_auto",
"201606L");
556 if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable)
557 Builder.
defineMacro(
"__cpp_aligned_new",
"201606L");
558 if (LangOpts.RelaxedTemplateTemplateArgs)
559 Builder.
defineMacro(
"__cpp_template_template_args",
"201611L");
562 if (LangOpts.ConceptsTS)
563 Builder.
defineMacro(
"__cpp_experimental_concepts",
"1L");
564 if (LangOpts.CoroutinesTS)
565 Builder.
defineMacro(
"__cpp_coroutines",
"201703L");
580 #define TOSTR(X) TOSTR2(X) 583 Builder.
defineMacro(
"__clang_patchlevel__",
TOSTR(CLANG_VERSION_PATCHLEVEL));
587 "\"" CLANG_VERSION_STRING
" " 589 if (!LangOpts.MSVCCompat) {
613 "Invalid OpenCL memory scope enum definition");
614 Builder.
defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_ITEM",
"0");
615 Builder.
defineMacro(
"__OPENCL_MEMORY_SCOPE_WORK_GROUP",
"1");
616 Builder.
defineMacro(
"__OPENCL_MEMORY_SCOPE_DEVICE",
"2");
617 Builder.
defineMacro(
"__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES",
"3");
618 Builder.
defineMacro(
"__OPENCL_MEMORY_SCOPE_SUB_GROUP",
"4");
621 Builder.
defineMacro(
"__PRAGMA_REDEFINE_EXTNAME",
"1");
626 Builder.
defineMacro(
"__VERSION__",
"\"4.2.1 Compatible " +
632 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
635 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus11)
638 if (LangOpts.ObjC1) {
642 if (LangOpts.ObjCExceptions)
654 std::string versionString =
"1";
658 if (version >= VersionTuple(2, 0))
659 Builder.
defineMacro(
"__OBJC_GNUSTEP_RUNTIME_ABI__",
"20");
661 Builder.
defineMacro(
"__OBJC_GNUSTEP_RUNTIME_ABI__",
662 "1" + Twine(
std::min(8U, version.getMinor().getValueOr(0))));
669 if (tuple.getMinor().hasValue())
670 minor = tuple.getMinor().getValue();
672 unsigned subminor = 0;
673 if (tuple.getSubminor().hasValue())
674 subminor = tuple.getSubminor().getValue();
677 Twine(tuple.getMajor() * 10000 + minor * 100 +
681 Builder.
defineMacro(
"IBOutlet",
"__attribute__((iboutlet))");
682 Builder.
defineMacro(
"IBOutletCollection(ClassName)",
683 "__attribute__((iboutletcollection(ClassName)))");
684 Builder.
defineMacro(
"IBAction",
"void)__attribute__((ibaction)");
694 if (LangOpts.CPlusPlus)
699 if (!LangOpts.NoConstantCFStrings)
705 if (LangOpts.PascalStrings)
708 if (LangOpts.Blocks) {
709 Builder.
defineMacro(
"__block",
"__attribute__((__blocks__(byref)))");
713 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
715 if (!LangOpts.MSVCCompat && LangOpts.RTTI)
718 if (LangOpts.SjLjExceptions)
720 else if (LangOpts.SEHExceptions)
722 else if (LangOpts.DWARFExceptions &&
726 if (LangOpts.Deprecated)
729 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus) {
732 Builder.
defineMacro(
"__private_extern__",
"extern");
735 if (LangOpts.MicrosoftExt) {
736 if (LangOpts.WChar) {
743 if (LangOpts.Optimize)
745 if (LangOpts.OptimizeSize)
748 if (LangOpts.FastMath)
758 Builder.
defineMacro(
"__ORDER_LITTLE_ENDIAN__",
"1234");
759 Builder.
defineMacro(
"__ORDER_BIG_ENDIAN__",
"4321");
760 Builder.
defineMacro(
"__ORDER_PDP_ENDIAN__",
"3412");
762 Builder.
defineMacro(
"__BYTE_ORDER__",
"__ORDER_BIG_ENDIAN__");
765 Builder.
defineMacro(
"__BYTE_ORDER__",
"__ORDER_LITTLE_ENDIAN__");
782 assert(TI.
getCharWidth() == 8 &&
"Only support 8-bit char so far");
864 if (!LangOpts.CharIsSigned)
934 char UserLabelPrefix[2] = {TI.
getDataLayout().getGlobalPrefix(), 0};
935 Builder.
defineMacro(
"__USER_LABEL_PREFIX__", UserLabelPrefix);
937 if (LangOpts.FastMath || LangOpts.FiniteMathOnly)
942 if (!LangOpts.MSVCCompat) {
943 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
950 Builder.
defineMacro(
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
"1");
953 auto addLockFreeMacros = [&](
const llvm::Twine &Prefix) {
956 #define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \ 957 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \ 958 getLockFreeValue(TI.get##Type##Width(), \ 959 TI.get##Type##Align(), \ 976 #undef DEFINE_LOCK_FREE_MACRO 978 addLockFreeMacros(
"__CLANG_ATOMIC_");
979 if (!LangOpts.MSVCCompat)
980 addLockFreeMacros(
"__GCC_ATOMIC_");
982 if (LangOpts.NoInlineDefine)
985 if (
unsigned PICLevel = LangOpts.PICLevel) {
997 Builder.
defineMacro(
"__DECIMAL_DIG__",
"__LDBL_DECIMAL_DIG__");
1010 if (LangOpts.FastRelaxedMath)
1015 Builder.
defineMacro(
"__weak",
"__attribute__((objc_gc(weak)))");
1016 Builder.
defineMacro(
"__strong",
"__attribute__((objc_gc(strong)))");
1019 }
else if (LangOpts.ObjC1) {
1020 Builder.
defineMacro(
"__weak",
"__attribute__((objc_ownership(weak)))");
1021 Builder.
defineMacro(
"__strong",
"__attribute__((objc_ownership(strong)))");
1023 "__attribute__((objc_ownership(autoreleasing)))");
1025 "__attribute__((objc_ownership(none)))");
1032 Builder.
defineMacro(
"__null_unspecified",
"_Null_unspecified");
1039 Builder.
defineMacro(
"__APPLE_EMBEDDED_SIMULATOR__",
"1");
1047 if (!LangOpts.OpenMPSimd) {
1048 switch (LangOpts.OpenMP) {
1065 if (LangOpts.CUDAIsDevice && !LangOpts.HIP) {
1073 if (LangOpts.CUDADeviceApproxTranscendentals || LangOpts.FastMath) {
1074 Builder.
defineMacro(
"__CLANG_CUDA_APPROX_TRANSCENDENTALS__");
1078 if (LangOpts.OpenCL) {
1079 #define OPENCLEXT(Ext) \ 1080 if (TI.getSupportedOpenCLOpts().isSupported(#Ext, \ 1081 LangOpts.OpenCLVersion)) \ 1082 Builder.defineMacro(#Ext); 1083 #include "clang/Basic/OpenCLExtensions.def" 1086 if (Arch == llvm::Triple::spir || Arch == llvm::Triple::spir64)
1090 if (TI.
hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1094 Builder.
defineMacro(
"__GLIBCXX_TYPE_INT_N_0",
"__int128");
1095 Builder.
defineMacro(
"__GLIBCXX_BITSIZE_INT_N_0",
"128");
1110 std::string PredefineBuffer;
1111 PredefineBuffer.reserve(4080);
1112 llvm::raw_string_ostream Predefines(PredefineBuffer);
1119 Builder.
append(
"# 1 \"<built-in>\" 3");
1133 if (LangOpts.ObjC1 && LangOpts.CPlusPlus &&
1134 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1156 Builder.
append(
"# 1 \"<command line>\" 1");
1159 for (
unsigned i = 0, e = InitOpts.
Macros.size(); i != e; ++i) {
1160 if (InitOpts.
Macros[i].second)
1169 Builder.
append(
"# 1 \"<built-in>\" 2");
1173 for (
unsigned i = 0, e = InitOpts.
MacroIncludes.size(); i != e; ++i)
1184 for (
unsigned i = 0, e = InitOpts.
Includes.size(); i != e; ++i) {
1185 const std::string &Path = InitOpts.
Includes[i];
unsigned getTypeWidth(IntType T) const
Return the width (in bits) of the specified integer type enum.
IntType getInt64Type() const
unsigned getFloatWidth() const
getFloatWidth/Align/Format - Return the size/align/format of 'float'.
std::vector< std::pair< std::string, bool > > Macros
Defines the clang::MacroBuilder utility class.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target...
Defines the clang::FileManager interface and associated types.
unsigned getSuitableAlign() const
Return the alignment that is suitable for storing any object with a fundamental alignment requirement...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Defines the SourceManager interface.
virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return the smallest integer type with at least the specified width.
FileManager & getFileManager() const
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 DefineFmt(const Twine &Prefix, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
std::vector< std::string > Includes
static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File)
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
unsigned getCharWidth() const
std::string ImplicitPTHInclude
The implicit PTH input included at the start of the translation unit, or empty.
const llvm::fltSemantics & getHalfFormat() const
static void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth, const TargetInfo &TI, MacroBuilder &Builder)
void setPredefines(const char *P)
Set the predefines for this Preprocessor.
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.
uint64_t getPointerWidth(unsigned AddrSpace) const
Return the width of pointers on this target, for the specified address space.
const char * getTypeConstantSuffix(IntType T) const
Return the constant suffix for the specified integer type enum.
static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, MacroBuilder &Builder)
Add definitions required for a smooth interaction between Objective-C++ automated reference counting ...
IntType getChar32Type() const
unsigned getNewAlign() const
Return the largest alignment for which a suitably-sized allocation with '::operator new(size_t)' is g...
const TargetInfo & getTargetInfo() const
void undefineMacro(const Twine &Name)
Append a #undef line for Name.
IntType getSizeType() const
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
const LangOptions & getLangOpts() const
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t', '\f', '\v', '\n', '\r'.
Concrete class used by the front-end to report problems and issues.
static void InitializePredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, MacroBuilder &Builder)
void append(const Twine &Str)
Directly append Str and a newline to the underlying buffer.
unsigned getShortWidth() const
Return the size of 'signed short' and 'unsigned short' for this target, in bits.
static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, MacroBuilder &Builder)
const TargetInfo * getAuxTargetInfo() const
static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix, const llvm::fltSemantics *Sem, StringRef Ext)
static void AddImplicitInclude(MacroBuilder &Builder, StringRef File)
AddImplicitInclude - Add an implicit #include of the specified file to the predefines buffer...
static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool isLittleEndian() const
const llvm::fltSemantics & getDoubleFormat() const
static void DefineExactWidthIntType(TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
const llvm::fltSemantics & getLongDoubleFormat() const
Exposes information about the current target.
static void DefineLeastWidthIntType(unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder)
IntType getUIntPtrType() const
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target, in bits.
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...
Defines version macros and version-related utility functions for Clang.
Defines the clang::Preprocessor interface.
IntType getChar16Type() const
clang::ObjCRuntime ObjCRuntime
'gnustep' is the modern non-fragile GNUstep runtime.
IntType getUIntMaxType() const
unsigned getDoubleWidth() const
getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
static const char * getTypeName(IntType T)
Return the user string for the specified integer type enum.
static const char * getLockFreeValue(unsigned TypeWidth, unsigned TypeAlign, unsigned InlineWidth)
Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with the specified properties...
static bool MacroBodyEndsInBackslash(StringRef MacroBody)
IntType getPtrDiffType(unsigned AddrSpace) const
IntType getSigAtomicType() const
static void DefineFastIntType(unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder)
static void InitializeStandardPredefinedMacros(const TargetInfo &TI, const LangOptions &LangOpts, const FrontendOptions &FEOpts, MacroBuilder &Builder)
unsigned getMaxAtomicInlineWidth() const
Return the maximum width lock-free atomic operation which can be inlined given the supported features...
static void DefineBuiltinMacro(MacroBuilder &Builder, StringRef Macro, DiagnosticsEngine &Diags)
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...
IntType getWIntType() const
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
'objfw' is the Objective-C runtime included in ObjFW
static void AddImplicitIncludePTH(MacroBuilder &Builder, Preprocessor &PP, StringRef ImplicitIncludePTH)
AddImplicitIncludePTH - Add an implicit #include using the original file used to generate a PTH cache...
unsigned getLongLongWidth() const
getLongLongWidth/Align - Return the size of 'signed long long' and 'unsigned long long' for this targ...
IntType getIntMaxType() const
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
const llvm::DataLayout & getDataLayout() const
virtual unsigned getFloatEvalMethod() const
Return the value for the C99 FLT_EVAL_METHOD macro.
IntType getUInt64Type() const
const VersionTuple & getVersion() const
const char * getOriginalSourceFile() const
getOriginalSourceFile - Return the full path to the original header file name that was used to genera...
unsigned getLongDoubleWidth() const
getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.
std::vector< std::string > MacroIncludes
IntType
===-— Target Data Type Query Methods ----------------------------—===//
Dataflow Directional Tag Classes.
static const char * getTypeFormatModifier(IntType T)
Return the printf format modifier for the specified integer type enum.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
frontend::ActionKind ProgramAction
The frontend action to perform.
FrontendOptions - Options for controlling the behavior of the frontend.
#define DEFINE_LOCK_FREE_MACRO(TYPE, Type)
bool useSignedCharForObjCBool() const
Check if the Objective-C built-in boolean type should be signed char.
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods --------------------——===//
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string getClangFullCPPVersion()
Retrieves a string representing the complete clang version suitable for use in the CPP VERSION macro...
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
Provides definitions for the atomic synchronization scopes.
DiagnosticsEngine & getDiagnostics() const
const llvm::fltSemantics & getFloatFormat() const
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 ...
IntType getWCharType() const
Run one or more source code analyses.
uint64_t getPointerAlign(unsigned AddrSpace) const
std::pair< unsigned, bool > PrecompiledPreambleBytes
If non-zero, the implicit PCH include is actually a precompiled preamble that covers this number of b...
Defines the clang::TargetInfo interface.
IntType getIntPtrType() const
__DEVICE__ int min(int __a, int __b)
void defineMacro(const Twine &Name, const Twine &Value="1")
Append a #define line for macro of the form "\#define Name Value\n".
void setSkipMainFilePreamble(unsigned Bytes, bool StartOfLine)
Instruct the preprocessor to skip part of the main source file.
PTHManager * getPTHManager()
static void DefineTypeWidth(StringRef MacroName, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
Engages in a tight little dance with the lexer to efficiently preprocess tokens.