27 #include "llvm/ADT/APFloat.h"
28 using namespace clang;
31 while (!MacroBody.empty() &&
isWhitespace(MacroBody.back()))
32 MacroBody = MacroBody.drop_back();
33 return !MacroBody.empty() && MacroBody.back() ==
'\\';
41 std::pair<StringRef, StringRef> MacroPair = Macro.split(
'=');
42 StringRef MacroName = MacroPair.first;
43 StringRef MacroBody = MacroPair.second;
44 if (MacroName.size() != Macro.size()) {
46 StringRef::size_type
End = MacroBody.find_first_of(
"\n\r");
47 if (End != StringRef::npos)
48 Diags.
Report(diag::warn_fe_macro_contains_embedded_newline)
50 MacroBody = MacroBody.substr(0, End);
55 Builder.
defineMacro(MacroName, Twine(MacroBody) +
"\\\n");
69 Builder.
append(Twine(
"#include \"") + File +
"\"");
73 Builder.
append(Twine(
"#__include_macros \"") + File +
"\"");
81 StringRef ImplicitIncludePTH) {
88 << ImplicitIncludePTH;
99 StringRef ImplicitIncludePCH) {
100 std::string OriginalFile =
103 if (OriginalFile.empty())
111 template <
typename T>
112 static T
PickFP(
const llvm::fltSemantics *Sem, T IEEESingleVal,
113 T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal,
115 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle())
116 return IEEESingleVal;
117 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble())
118 return IEEEDoubleVal;
119 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::x87DoubleExtended())
120 return X87DoubleExtendedVal;
121 if (Sem == (
const llvm::fltSemantics*)&llvm::APFloat::PPCDoubleDouble())
122 return PPCDoubleDoubleVal;
123 assert(Sem == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEquad());
128 const llvm::fltSemantics *Sem, StringRef Ext) {
129 const char *DenormMin, *Epsilon, *Max, *Min;
130 DenormMin =
PickFP(Sem,
"1.40129846e-45",
"4.9406564584124654e-324",
131 "3.64519953188247460253e-4951",
132 "4.94065645841246544176568792868221e-324",
133 "6.47517511943802511092443895822764655e-4966");
134 int Digits =
PickFP(Sem, 6, 15, 18, 31, 33);
135 int DecimalDigits =
PickFP(Sem, 9, 17, 21, 33, 36);
136 Epsilon =
PickFP(Sem,
"1.19209290e-7",
"2.2204460492503131e-16",
137 "1.08420217248550443401e-19",
138 "4.94065645841246544176568792868221e-324",
139 "1.92592994438723585305597794258492732e-34");
140 int MantissaDigits =
PickFP(Sem, 24, 53, 64, 106, 113);
141 int Min10Exp =
PickFP(Sem, -37, -307, -4931, -291, -4931);
142 int Max10Exp =
PickFP(Sem, 38, 308, 4932, 308, 4932);
143 int MinExp =
PickFP(Sem, -125, -1021, -16381, -968, -16381);
144 int MaxExp =
PickFP(Sem, 128, 1024, 16384, 1024, 16384);
145 Min =
PickFP(Sem,
"1.17549435e-38",
"2.2250738585072014e-308",
146 "3.36210314311209350626e-4932",
147 "2.00416836000897277799610805135016e-292",
148 "3.36210314311209350626267781732175260e-4932");
149 Max =
PickFP(Sem,
"3.40282347e+38",
"1.7976931348623157e+308",
150 "1.18973149535723176502e+4932",
151 "1.79769313486231580793728971405301e+308",
152 "1.18973149535723176508575932662800702e+4932");
159 Builder.
defineMacro(DefPrefix +
"DENORM_MIN__", Twine(DenormMin)+Ext);
161 Builder.
defineMacro(DefPrefix +
"DIG__", Twine(Digits));
162 Builder.
defineMacro(DefPrefix +
"DECIMAL_DIG__", Twine(DecimalDigits));
163 Builder.
defineMacro(DefPrefix +
"EPSILON__", Twine(Epsilon)+Ext);
165 Builder.
defineMacro(DefPrefix +
"HAS_QUIET_NAN__");
166 Builder.
defineMacro(DefPrefix +
"MANT_DIG__", Twine(MantissaDigits));
168 Builder.
defineMacro(DefPrefix +
"MAX_10_EXP__", Twine(Max10Exp));
169 Builder.
defineMacro(DefPrefix +
"MAX_EXP__", Twine(MaxExp));
170 Builder.
defineMacro(DefPrefix +
"MAX__", Twine(Max)+Ext);
172 Builder.
defineMacro(DefPrefix +
"MIN_10_EXP__",
"("+Twine(Min10Exp)+
")");
173 Builder.
defineMacro(DefPrefix +
"MIN_EXP__",
"("+Twine(MinExp)+
")");
174 Builder.
defineMacro(DefPrefix +
"MIN__", Twine(Min)+Ext);
182 StringRef ValSuffix,
bool isSigned,
184 llvm::APInt MaxVal = isSigned ? llvm::APInt::getSignedMaxValue(TypeWidth)
185 : llvm::APInt::getMaxValue(TypeWidth);
186 Builder.
defineMacro(MacroName, MaxVal.toString(10, isSigned) + ValSuffix);
201 for (
const char *Fmt = IsSigned ?
"di" :
"ouxX"; *Fmt; ++Fmt) {
202 Builder.
defineMacro(Prefix +
"_FMT" + Twine(*Fmt) +
"__",
203 Twine(
"\"") + FmtModifier + Twine(*Fmt) +
"\"");
234 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
236 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
237 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
240 Builder.
defineMacro(Prefix + Twine(TypeWidth) +
"_C_SUFFIX__", ConstSuffix);
254 const char *Prefix = IsSigned ?
"__INT" :
"__UINT";
255 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
265 const char *Prefix = IsSigned ?
"__INT_LEAST" :
"__UINT_LEAST";
266 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
267 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
268 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
279 const char *Prefix = IsSigned ?
"__INT_FAST" :
"__UINT_FAST";
280 DefineType(Prefix + Twine(TypeWidth) +
"_TYPE__", Ty, Builder);
281 DefineTypeSize(Prefix + Twine(TypeWidth) +
"_MAX__", Ty, TI, Builder);
283 DefineFmt(Prefix + Twine(TypeWidth), Ty, TI, Builder);
290 unsigned InlineWidth) {
293 if (TypeWidth == TypeAlign && (TypeWidth & (TypeWidth - 1)) == 0 &&
294 TypeWidth <= InlineWidth)
305 Builder.
defineMacro(
"_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR");
314 llvm::raw_string_ostream Out(Result);
316 Out <<
"namespace std {\n"
318 <<
"struct __true_type;\n"
319 <<
"struct __false_type;\n"
322 Out <<
"template<typename _Tp> struct __is_scalar;\n"
325 if (LangOpts.ObjCAutoRefCount) {
326 Out <<
"template<typename _Tp>\n"
327 <<
"struct __is_scalar<__attribute__((objc_ownership(strong))) _Tp> {\n"
328 <<
" enum { __value = 0 };\n"
329 <<
" typedef __false_type __type;\n"
334 if (LangOpts.ObjCWeak) {
335 Out <<
"template<typename _Tp>\n"
336 <<
"struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n"
337 <<
" enum { __value = 0 };\n"
338 <<
" typedef __false_type __type;\n"
343 if (LangOpts.ObjCAutoRefCount) {
344 Out <<
"template<typename _Tp>\n"
345 <<
"struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))"
347 <<
" enum { __value = 0 };\n"
348 <<
" typedef __false_type __type;\n"
362 if (!LangOpts.MSVCCompat && !LangOpts.TraditionalCPP)
364 if (LangOpts.Freestanding)
369 if (!LangOpts.CPlusPlus) {
371 Builder.
defineMacro(
"__STDC_VERSION__",
"201112L");
372 else if (LangOpts.C99)
373 Builder.
defineMacro(
"__STDC_VERSION__",
"199901L");
374 else if (!LangOpts.GNUMode && LangOpts.Digraphs)
375 Builder.
defineMacro(
"__STDC_VERSION__",
"199409L");
378 if (LangOpts.CPlusPlus2a)
383 else if (LangOpts.CPlusPlus1z)
388 else if (LangOpts.CPlusPlus14)
393 else if (LangOpts.CPlusPlus11)
406 Builder.
defineMacro(
"__STDCPP_DEFAULT_NEW_ALIGNMENT__",
423 if (LangOpts.OpenCL) {
431 switch (LangOpts.OpenCLVersion) {
433 Builder.
defineMacro(
"__OPENCL_C_VERSION__",
"100");
436 Builder.
defineMacro(
"__OPENCL_C_VERSION__",
"110");
439 Builder.
defineMacro(
"__OPENCL_C_VERSION__",
"120");
442 Builder.
defineMacro(
"__OPENCL_C_VERSION__",
"200");
445 llvm_unreachable(
"Unsupported OpenCL version");
455 if (LangOpts.FastRelaxedMath)
459 if (LangOpts.AsmPreprocessor)
472 if (LangOpts.CXXExceptions)
476 if (LangOpts.CPlusPlus11) {
477 Builder.
defineMacro(
"__cpp_unicode_characters",
"200704");
478 Builder.
defineMacro(
"__cpp_raw_strings",
"200710");
479 Builder.
defineMacro(
"__cpp_unicode_literals",
"200710");
480 Builder.
defineMacro(
"__cpp_user_defined_literals",
"200809");
483 LangOpts.CPlusPlus1z ?
"201603" :
484 LangOpts.CPlusPlus14 ?
"201304" :
"200704");
486 LangOpts.CPlusPlus1z ?
"201603" :
"200907");
488 LangOpts.CPlusPlus1z ?
"201411" :
"200410");
491 Builder.
defineMacro(
"__cpp_rvalue_references",
"200610");
492 Builder.
defineMacro(
"__cpp_variadic_templates",
"200704");
493 Builder.
defineMacro(
"__cpp_initializer_lists",
"200806");
494 Builder.
defineMacro(
"__cpp_delegating_constructors",
"200604");
496 Builder.
defineMacro(
"__cpp_inheriting_constructors",
"201511");
497 Builder.
defineMacro(
"__cpp_ref_qualifiers",
"200710");
498 Builder.
defineMacro(
"__cpp_alias_templates",
"200704");
500 if (LangOpts.ThreadsafeStatics)
501 Builder.
defineMacro(
"__cpp_threadsafe_static_init",
"200806");
504 if (LangOpts.CPlusPlus14) {
505 Builder.
defineMacro(
"__cpp_binary_literals",
"201304");
506 Builder.
defineMacro(
"__cpp_digit_separators",
"201309");
507 Builder.
defineMacro(
"__cpp_init_captures",
"201304");
508 Builder.
defineMacro(
"__cpp_generic_lambdas",
"201304");
509 Builder.
defineMacro(
"__cpp_decltype_auto",
"201304");
510 Builder.
defineMacro(
"__cpp_return_type_deduction",
"201304");
511 Builder.
defineMacro(
"__cpp_aggregate_nsdmi",
"201304");
512 Builder.
defineMacro(
"__cpp_variable_templates",
"201304");
514 if (LangOpts.SizedDeallocation)
515 Builder.
defineMacro(
"__cpp_sized_deallocation",
"201309");
518 if (LangOpts.CPlusPlus1z) {
520 Builder.
defineMacro(
"__cpp_inline_variables",
"201606");
521 Builder.
defineMacro(
"__cpp_noexcept_function_type",
"201510");
522 Builder.
defineMacro(
"__cpp_capture_star_this",
"201603");
523 Builder.
defineMacro(
"__cpp_if_constexpr",
"201606");
524 Builder.
defineMacro(
"__cpp_deduction_guides",
"201611");
525 Builder.
defineMacro(
"__cpp_template_auto",
"201606");
526 Builder.
defineMacro(
"__cpp_namespace_attributes",
"201411");
527 Builder.
defineMacro(
"__cpp_enumerator_attributes",
"201411");
528 Builder.
defineMacro(
"__cpp_nested_namespace_definitions",
"201411");
529 Builder.
defineMacro(
"__cpp_variadic_using",
"201611");
530 Builder.
defineMacro(
"__cpp_aggregate_bases",
"201603");
531 Builder.
defineMacro(
"__cpp_structured_bindings",
"201606");
532 Builder.
defineMacro(
"__cpp_nontype_template_args",
"201411");
533 Builder.
defineMacro(
"__cpp_fold_expressions",
"201603");
535 if (LangOpts.AlignedAllocation)
536 Builder.
defineMacro(
"__cpp_aligned_new",
"201606");
539 if (LangOpts.ConceptsTS)
540 Builder.
defineMacro(
"__cpp_experimental_concepts",
"1");
541 if (LangOpts.CoroutinesTS)
542 Builder.
defineMacro(
"__cpp_coroutines",
"201703L");
553 #define TOSTR(X) TOSTR2(X)
556 Builder.
defineMacro(
"__clang_patchlevel__",
TOSTR(CLANG_VERSION_PATCHLEVEL));
560 "\"" CLANG_VERSION_STRING
" "
562 if (!LangOpts.MSVCCompat) {
580 Builder.
defineMacro(
"__PRAGMA_REDEFINE_EXTNAME",
"1");
585 Builder.
defineMacro(
"__VERSION__",
"\"4.2.1 Compatible " +
591 if (!LangOpts.GNUMode && !LangOpts.MSVCCompat)
594 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus11)
597 if (LangOpts.ObjC1) {
601 if (LangOpts.ObjCExceptions)
616 minor = tuple.
getMinor().getValue();
618 unsigned subminor = 0;
623 Twine(tuple.
getMajor() * 10000 + minor * 100 +
627 Builder.
defineMacro(
"IBOutlet",
"__attribute__((iboutlet))");
628 Builder.
defineMacro(
"IBOutletCollection(ClassName)",
629 "__attribute__((iboutletcollection(ClassName)))");
630 Builder.
defineMacro(
"IBAction",
"void)__attribute__((ibaction)");
640 if (LangOpts.CPlusPlus)
645 if (!LangOpts.NoConstantCFStrings)
651 if (LangOpts.PascalStrings)
654 if (LangOpts.Blocks) {
655 Builder.
defineMacro(
"__block",
"__attribute__((__blocks__(byref)))");
659 if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
661 if (!LangOpts.MSVCCompat && LangOpts.RTTI)
663 if (LangOpts.SjLjExceptions)
666 if (LangOpts.Deprecated)
669 if (!LangOpts.MSVCCompat && LangOpts.CPlusPlus) {
672 Builder.
defineMacro(
"__private_extern__",
"extern");
675 if (LangOpts.MicrosoftExt) {
676 if (LangOpts.WChar) {
683 if (LangOpts.Optimize)
685 if (LangOpts.OptimizeSize)
688 if (LangOpts.FastMath)
698 Builder.
defineMacro(
"__ORDER_LITTLE_ENDIAN__",
"1234");
699 Builder.
defineMacro(
"__ORDER_BIG_ENDIAN__",
"4321");
700 Builder.
defineMacro(
"__ORDER_PDP_ENDIAN__",
"3412");
702 Builder.
defineMacro(
"__BYTE_ORDER__",
"__ORDER_BIG_ENDIAN__");
705 Builder.
defineMacro(
"__BYTE_ORDER__",
"__ORDER_LITTLE_ENDIAN__");
722 assert(TI.
getCharWidth() == 8 &&
"Only support 8-bit char so far");
802 if (!LangOpts.CharIsSigned)
872 char UserLabelPrefix[2] = {TI.
getDataLayout().getGlobalPrefix(), 0};
873 Builder.
defineMacro(
"__USER_LABEL_PREFIX__", UserLabelPrefix);
875 if (LangOpts.FastMath || LangOpts.FiniteMathOnly)
880 if (!LangOpts.MSVCCompat) {
881 if (LangOpts.GNUInline || LangOpts.CPlusPlus)
888 Builder.
defineMacro(
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL",
"1");
891 auto addLockFreeMacros = [&](
const llvm::Twine &Prefix) {
894 #define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \
895 Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \
896 getLockFreeValue(TI.get##Type##Width(), \
897 TI.get##Type##Align(), \
912 #undef DEFINE_LOCK_FREE_MACRO
914 addLockFreeMacros(
"__CLANG_ATOMIC_");
915 if (!LangOpts.MSVCCompat)
916 addLockFreeMacros(
"__GCC_ATOMIC_");
918 if (LangOpts.NoInlineDefine)
921 if (
unsigned PICLevel = LangOpts.PICLevel) {
933 Builder.
defineMacro(
"__DECIMAL_DIG__",
"__LDBL_DECIMAL_DIG__");
946 if (LangOpts.FastRelaxedMath)
951 Builder.
defineMacro(
"__weak",
"__attribute__((objc_gc(weak)))");
952 Builder.
defineMacro(
"__strong",
"__attribute__((objc_gc(strong)))");
955 }
else if (LangOpts.ObjC1) {
956 Builder.
defineMacro(
"__weak",
"__attribute__((objc_ownership(weak)))");
957 Builder.
defineMacro(
"__strong",
"__attribute__((objc_ownership(strong)))");
959 "__attribute__((objc_ownership(autoreleasing)))");
961 "__attribute__((objc_ownership(none)))");
968 Builder.
defineMacro(
"__null_unspecified",
"_Null_unspecified");
978 switch (LangOpts.OpenMP) {
994 if (LangOpts.CUDAIsDevice) {
1002 if (LangOpts.CUDADeviceApproxTranscendentals || LangOpts.FastMath) {
1003 Builder.
defineMacro(
"__CLANG_CUDA_APPROX_TRANSCENDENTALS__");
1007 if (LangOpts.OpenCL) {
1008 #define OPENCLEXT(Ext) \
1009 if (TI.getSupportedOpenCLOpts().isSupported(#Ext, \
1010 LangOpts.OpenCLVersion)) \
1011 Builder.defineMacro(#Ext);
1012 #include "clang/Basic/OpenCLExtensions.def"
1015 if (TI.
hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
1019 Builder.
defineMacro(
"__GLIBCXX_TYPE_INT_N_0",
"__int128");
1020 Builder.
defineMacro(
"__GLIBCXX_BITSIZE_INT_N_0",
"128");
1035 std::string PredefineBuffer;
1036 PredefineBuffer.reserve(4080);
1037 llvm::raw_string_ostream Predefines(PredefineBuffer);
1044 Builder.
append(
"# 1 \"<built-in>\" 3");
1058 if (LangOpts.ObjC1 && LangOpts.CPlusPlus &&
1059 (LangOpts.ObjCAutoRefCount || LangOpts.ObjCWeak)) {
1081 Builder.
append(
"# 1 \"<command line>\" 1");
1084 for (
unsigned i = 0, e = InitOpts.
Macros.size(); i != e; ++i) {
1085 if (InitOpts.
Macros[i].second)
1094 Builder.
append(
"# 1 \"<built-in>\" 2");
1098 for (
unsigned i = 0, e = InitOpts.
MacroIncludes.size(); i != e; ++i)
1109 for (
unsigned i = 0, e = InitOpts.
Includes.size(); i != e; ++i) {
1110 const std::string &Path = InitOpts.
Includes[i];
std::vector< std::pair< std::string, bool > > Macros
Defines the clang::MacroBuilder utility class.
Represents a version number in the form major[.minor[.subminor[.build]]].
Defines the clang::FileManager interface and associated types.
static LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t', '\f', '\v', '\n', '\r'.
Defines the SourceManager interface.
static void DefineFmt(const Twine &Prefix, TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
IntType getSizeType() const
std::vector< std::string > Includes
Optional< unsigned > getMinor() const
Retrieve the minor version number, if provided.
IntType getWIntType() const
bool isLittleEndian() const
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...
std::string ImplicitPTHInclude
The implicit PTH input included at the start of the translation unit, or empty.
static void DefineTypeSizeof(StringRef MacroName, unsigned BitWidth, const TargetInfo &TI, MacroBuilder &Builder)
unsigned getLongDoubleWidth() const
getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.
void setPredefines(const char *P)
Set the predefines for this Preprocessor.
unsigned getFloatWidth() const
getFloatWidth/Align/Format - Return the size/align/format of 'float'.
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 AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, MacroBuilder &Builder)
Add definitions required for a smooth interaction between Objective-C++ automated reference counting ...
unsigned getDoubleWidth() const
getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
const char * getTypeConstantSuffix(IntType T) const
Return the constant suffix for the specified integer type enum.
void undefineMacro(const Twine &Name)
Append a #undef line for Name.
const LangOptions & getLangOpts() const
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
FileManager & getFileManager() const
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
virtual unsigned getFloatEvalMethod() const
Return the value for the C99 FLT_EVAL_METHOD macro.
const llvm::fltSemantics & getDoubleFormat() const
unsigned getNewAlign() const
Return the largest alignment for which a suitably-sized allocation with '::operator new(size_t)' is g...
IntType getIntMaxType() const
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.
static void DefineType(const Twine &MacroName, TargetInfo::IntType Ty, MacroBuilder &Builder)
const char * getOriginalSourceFile() const
getOriginalSourceFile - Return the full path to the original header file name that was used to genera...
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...
const TargetInfo & getTargetInfo() const
static void DefineExactWidthIntTypeSize(TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
static void DefineExactWidthIntType(TargetInfo::IntType Ty, const TargetInfo &TI, MacroBuilder &Builder)
unsigned UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
unsigned getTypeWidth(IntType T) const
Return the width (in bits) of the specified integer type enum.
Exposes information about the current target.
static void DefineLeastWidthIntType(unsigned TypeWidth, bool IsSigned, const TargetInfo &TI, MacroBuilder &Builder)
bool isNeXTFamily() const
Is this runtime basically of the NeXT family of runtimes?
IntType getIntPtrType() const
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...
const llvm::fltSemantics & getFloatFormat() const
Defines version macros and version-related utility functions for Clang.
Defines the clang::Preprocessor interface.
IntType getUInt64Type() const
clang::ObjCRuntime ObjCRuntime
IntType getChar32Type() const
static const char * getTypeName(IntType T)
Return the user string for the specified integer type enum.
IntType getUIntPtrType() const
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)
bool isNonFragile() const
Does this runtime follow the set of implied behaviors for a "non-fragile" ABI?
uint64_t getPointerAlign(unsigned AddrSpace) 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)
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...
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
IntType getSigAtomicType() const
static void AddImplicitIncludePTH(MacroBuilder &Builder, Preprocessor &PP, StringRef ImplicitIncludePTH)
AddImplicitIncludePTH - Add an implicit #include using the original file used to generate a PTH cache...
const TargetInfo * getAuxTargetInfo() const
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
unsigned getMajor() const
Retrieve the major version number.
IntType getUIntMaxType() const
const VersionTuple & getVersion() const
DiagnosticsEngine & getDiagnostics() const
std::vector< std::string > MacroIncludes
IntType getWCharType() const
IntType
===-— Target Data Type Query Methods ----------------------------—===//
const llvm::fltSemantics & getLongDoubleFormat() const
static const char * getTypeFormatModifier(IntType T)
Return the printf format modifier for the specified integer type enum.
frontend::ActionKind ProgramAction
The frontend action to perform.
unsigned getCharWidth() const
unsigned getShortWidth() const
Return the size of 'signed short' and 'unsigned short' for this target, in bits.
virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return the smallest integer type with at least the specified width.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
unsigned getMaxAtomicInlineWidth() const
Return the maximum width lock-free atomic operation which can be inlined given the supported features...
FrontendOptions - Options for controlling the behavior of the frontend.
#define DEFINE_LOCK_FREE_MACRO(TYPE, Type)
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods --------------------——===//
Optional< unsigned > getSubminor() const
Retrieve the subminor version number, if provided.
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target, in bits.
unsigned getLongLongWidth() const
getLongLongWidth/Align - Return the size of 'signed long long' and 'unsigned long long' for this targ...
std::string getClangFullCPPVersion()
Retrieves a string representing the complete clang version suitable for use in the CPP VERSION macro...
uint64_t getPointerWidth(unsigned AddrSpace) const
Return the width of pointers on this target, for the specified address space.
bool useSignedCharForObjCBool() const
Check if the Objective-C built-in boolean type should be signed char.
BoundNodesTreeBuilder *const Builder
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 getInt64Type() const
IntType getChar16Type() const
Run one or more source code analyses.
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target...
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.
unsigned getSuitableAlign() const
Return the alignment that is suitable for storing any object with a fundamental alignment requirement...
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.
static T PickFP(const llvm::fltSemantics *Sem, 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...
const llvm::DataLayout & getDataLayout() const
IntType getPtrDiffType(unsigned AddrSpace) const
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.