diff options
Diffstat (limited to 'lib/Frontend/InitPreprocessor.cpp')
| -rw-r--r-- | lib/Frontend/InitPreprocessor.cpp | 108 | 
1 files changed, 74 insertions, 34 deletions
diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index 92d61369b40f..d39890494323 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -14,6 +14,7 @@  #include "clang/Basic/FileManager.h"  #include "clang/Basic/MacroBuilder.h"  #include "clang/Basic/SourceManager.h" +#include "clang/Basic/SyncScope.h"  #include "clang/Basic/TargetInfo.h"  #include "clang/Basic/Version.h"  #include "clang/Frontend/FrontendDiagnostic.h" @@ -109,9 +110,11 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP,  /// PickFP - This is used to pick a value based on the FP semantics of the  /// specified FP model.  template <typename T> -static T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal, +static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal,                  T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal,                  T IEEEQuadVal) { +  if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf()) +    return IEEEHalfVal;    if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle())      return IEEESingleVal;    if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble()) @@ -127,26 +130,26 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal,  static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,                                const llvm::fltSemantics *Sem, StringRef Ext) {    const char *DenormMin, *Epsilon, *Max, *Min; -  DenormMin = PickFP(Sem, "1.40129846e-45", "4.9406564584124654e-324", -                     "3.64519953188247460253e-4951", +  DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45", +                     "4.9406564584124654e-324", "3.64519953188247460253e-4951",                       "4.94065645841246544176568792868221e-324",                       "6.47517511943802511092443895822764655e-4966"); -  int Digits = PickFP(Sem, 6, 15, 18, 31, 33); -  int DecimalDigits = PickFP(Sem, 9, 17, 21, 33, 36); -  Epsilon = PickFP(Sem, "1.19209290e-7", "2.2204460492503131e-16", -                   "1.08420217248550443401e-19", +  int Digits = PickFP(Sem, 3, 6, 15, 18, 31, 33); +  int DecimalDigits = PickFP(Sem, 5, 9, 17, 21, 33, 36); +  Epsilon = PickFP(Sem, "9.765625e-4", "1.19209290e-7", +                   "2.2204460492503131e-16", "1.08420217248550443401e-19",                     "4.94065645841246544176568792868221e-324",                     "1.92592994438723585305597794258492732e-34"); -  int MantissaDigits = PickFP(Sem, 24, 53, 64, 106, 113); -  int Min10Exp = PickFP(Sem, -37, -307, -4931, -291, -4931); -  int Max10Exp = PickFP(Sem, 38, 308, 4932, 308, 4932); -  int MinExp = PickFP(Sem, -125, -1021, -16381, -968, -16381); -  int MaxExp = PickFP(Sem, 128, 1024, 16384, 1024, 16384); -  Min = PickFP(Sem, "1.17549435e-38", "2.2250738585072014e-308", +  int MantissaDigits = PickFP(Sem, 11, 24, 53, 64, 106, 113); +  int Min10Exp = PickFP(Sem, -13, -37, -307, -4931, -291, -4931); +  int Max10Exp = PickFP(Sem, 4, 38, 308, 4932, 308, 4932); +  int MinExp = PickFP(Sem, -14, -125, -1021, -16381, -968, -16381); +  int MaxExp = PickFP(Sem, 15, 128, 1024, 16384, 1024, 16384); +  Min = PickFP(Sem, "6.103515625e-5", "1.17549435e-38", "2.2250738585072014e-308",                 "3.36210314311209350626e-4932",                 "2.00416836000897277799610805135016e-292",                 "3.36210314311209350626267781732175260e-4932"); -  Max = PickFP(Sem, "3.40282347e+38", "1.7976931348623157e+308", +  Max = PickFP(Sem, "6.5504e+4", "3.40282347e+38", "1.7976931348623157e+308",                 "1.18973149535723176502e+4932",                 "1.79769313486231580793728971405301e+308",                 "1.18973149535723176508575932662800702e+4932"); @@ -190,7 +193,7 @@ static void DefineTypeSize(const Twine &MacroName, unsigned TypeWidth,  /// the width, suffix, and signedness of the given type  static void DefineTypeSize(const Twine &MacroName, TargetInfo::IntType Ty,                             const TargetInfo &TI, MacroBuilder &Builder) { -  DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty),  +  DefineTypeSize(MacroName, TI.getTypeWidth(Ty), TI.getTypeConstantSuffix(Ty),                   TI.isTypeSigned(Ty), Builder);  } @@ -300,25 +303,25 @@ static const char *getLockFreeValue(unsigned TypeWidth, unsigned TypeAlign,  /// \brief Add definitions required for a smooth interaction between  /// Objective-C++ automated reference counting and libstdc++ (4.2). -static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,  +static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,                                           MacroBuilder &Builder) {    Builder.defineMacro("_GLIBCXX_PREDEFINED_OBJC_ARC_IS_SCALAR"); -   +    std::string Result;    { -    // Provide specializations for the __is_scalar type trait so that  +    // Provide specializations for the __is_scalar type trait so that      // lifetime-qualified objects are not considered "scalar" types, which      // libstdc++ uses as an indicator of the presence of trivial copy, assign,      // default-construct, and destruct semantics (none of which hold for      // lifetime-qualified objects in ARC).      llvm::raw_string_ostream Out(Result); -     +      Out << "namespace std {\n"          << "\n"          << "struct __true_type;\n"          << "struct __false_type;\n"          << "\n"; -     +      Out << "template<typename _Tp> struct __is_scalar;\n"          << "\n"; @@ -330,7 +333,7 @@ static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,            << "};\n"            << "\n";      } -       +      if (LangOpts.ObjCWeak) {        Out << "template<typename _Tp>\n"            << "struct __is_scalar<__attribute__((objc_ownership(weak))) _Tp> {\n" @@ -339,7 +342,7 @@ static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,            << "};\n"            << "\n";      } -     +      if (LangOpts.ObjCAutoRefCount) {        Out << "template<typename _Tp>\n"            << "struct __is_scalar<__attribute__((objc_ownership(autoreleasing)))" @@ -349,7 +352,7 @@ static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts,            << "};\n"            << "\n";      } -       +      Out << "}\n";    }    Builder.append(Result); @@ -367,7 +370,9 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,      Builder.defineMacro("__STDC_HOSTED__");    if (!LangOpts.CPlusPlus) { -    if (LangOpts.C11) +    if (LangOpts.C17) +      Builder.defineMacro("__STDC_VERSION__", "201710L"); +    else if (LangOpts.C11)        Builder.defineMacro("__STDC_VERSION__", "201112L");      else if (LangOpts.C99)        Builder.defineMacro("__STDC_VERSION__", "199901L"); @@ -380,7 +385,7 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI,      // C++17 [cpp.predefined]p1:      //   The name __cplusplus is defined to the value 201703L when compiling a      //   C++ translation unit. -    else if (LangOpts.CPlusPlus1z) +    else if (LangOpts.CPlusPlus17)        Builder.defineMacro("__cplusplus", "201703L");      // C++1y [cpp.predefined]p1:      //   The name __cplusplus is defined to the value 201402L when compiling a @@ -480,12 +485,12 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,      Builder.defineMacro("__cpp_user_defined_literals", "200809");      Builder.defineMacro("__cpp_lambdas", "200907");      Builder.defineMacro("__cpp_constexpr", -                        LangOpts.CPlusPlus1z ? "201603" :  +                        LangOpts.CPlusPlus17 ? "201603" :                          LangOpts.CPlusPlus14 ? "201304" : "200704");      Builder.defineMacro("__cpp_range_based_for", -                        LangOpts.CPlusPlus1z ? "201603" : "200907"); +                        LangOpts.CPlusPlus17 ? "201603" : "200907");      Builder.defineMacro("__cpp_static_assert", -                        LangOpts.CPlusPlus1z ? "201411" : "200410"); +                        LangOpts.CPlusPlus17 ? "201411" : "200410");      Builder.defineMacro("__cpp_decltype", "200707");      Builder.defineMacro("__cpp_attributes", "200809");      Builder.defineMacro("__cpp_rvalue_references", "200610"); @@ -515,7 +520,7 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,      Builder.defineMacro("__cpp_sized_deallocation", "201309");    // C++17 features. -  if (LangOpts.CPlusPlus1z) { +  if (LangOpts.CPlusPlus17) {      Builder.defineMacro("__cpp_hex_float", "201603");      Builder.defineMacro("__cpp_inline_variables", "201606");      Builder.defineMacro("__cpp_noexcept_function_type", "201510"); @@ -556,7 +561,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,    Builder.defineMacro("__clang_patchlevel__", TOSTR(CLANG_VERSION_PATCHLEVEL));  #undef TOSTR  #undef TOSTR2 -  Builder.defineMacro("__clang_version__",  +  Builder.defineMacro("__clang_version__",                        "\"" CLANG_VERSION_STRING " "                        + getClangFullRepositoryVersion() + "\"");    if (!LangOpts.MSVCCompat) { @@ -576,13 +581,27 @@ static void InitializePredefinedMacros(const TargetInfo &TI,    Builder.defineMacro("__ATOMIC_ACQ_REL", "4");    Builder.defineMacro("__ATOMIC_SEQ_CST", "5"); +  // Define macros for the OpenCL memory scope. +  // The values should match AtomicScopeOpenCLModel::ID enum. +  static_assert( +      static_cast<unsigned>(AtomicScopeOpenCLModel::WorkGroup) == 1 && +          static_cast<unsigned>(AtomicScopeOpenCLModel::Device) == 2 && +          static_cast<unsigned>(AtomicScopeOpenCLModel::AllSVMDevices) == 3 && +          static_cast<unsigned>(AtomicScopeOpenCLModel::SubGroup) == 4, +      "Invalid OpenCL memory scope enum definition"); +  Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_ITEM", "0"); +  Builder.defineMacro("__OPENCL_MEMORY_SCOPE_WORK_GROUP", "1"); +  Builder.defineMacro("__OPENCL_MEMORY_SCOPE_DEVICE", "2"); +  Builder.defineMacro("__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES", "3"); +  Builder.defineMacro("__OPENCL_MEMORY_SCOPE_SUB_GROUP", "4"); +    // Support for #pragma redefine_extname (Sun compatibility)    Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1");    // As sad as it is, enough software depends on the __VERSION__ for version    // checks that it is necessary to report 4.2.1 (the base GCC version we claim    // compatibility with) first. -  Builder.defineMacro("__VERSION__", "\"4.2.1 Compatible " +  +  Builder.defineMacro("__VERSION__", "\"4.2.1 Compatible " +                        Twine(getClangFullCPPVersion()) + "\"");    // Initialize language-specific preprocessor defines. @@ -597,7 +616,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,    if (LangOpts.ObjC1) {      if (LangOpts.ObjCRuntime.isNonFragile()) {        Builder.defineMacro("__OBJC2__"); -       +        if (LangOpts.ObjCExceptions)          Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS");      } @@ -660,8 +679,14 @@ static void InitializePredefinedMacros(const TargetInfo &TI,      Builder.defineMacro("__EXCEPTIONS");    if (!LangOpts.MSVCCompat && LangOpts.RTTI)      Builder.defineMacro("__GXX_RTTI"); +    if (LangOpts.SjLjExceptions)      Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__"); +  else if (LangOpts.SEHExceptions) +    Builder.defineMacro("__SEH__"); +  else if (LangOpts.DWARFExceptions && +          (TI.getTriple().isThumb() || TI.getTriple().isARM())) +    Builder.defineMacro("__ARM_DWARF_EH__");    if (LangOpts.Deprecated)      Builder.defineMacro("__DEPRECATED"); @@ -728,6 +753,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,    DefineTypeSize("__LONG_MAX__", TargetInfo::SignedLong, TI, Builder);    DefineTypeSize("__LONG_LONG_MAX__", TargetInfo::SignedLongLong, TI, Builder);    DefineTypeSize("__WCHAR_MAX__", TI.getWCharType(), TI, Builder); +  DefineTypeSize("__WINT_MAX__", TI.getWIntType(), TI, Builder);    DefineTypeSize("__INTMAX_MAX__", TI.getIntMaxType(), TI, Builder);    DefineTypeSize("__SIZE_MAX__", TI.getSizeType(), TI, Builder); @@ -787,9 +813,14 @@ static void InitializePredefinedMacros(const TargetInfo &TI,    DefineFmt("__UINTPTR", TI.getUIntPtrType(), TI, Builder);    DefineTypeWidth("__UINTPTR_WIDTH__", TI.getUIntPtrType(), TI, Builder); +  DefineFloatMacros(Builder, "FLT16", &TI.getHalfFormat(), "F16");    DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F");    DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), "");    DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L"); +  if (TI.hasFloat128Type()) +    // FIXME: Switch away from the non-standard "Q" when we can +    DefineFloatMacros(Builder, "FLT128", &TI.getFloat128Format(), "Q"); +    // Define a __POINTER_WIDTH__ macro for stdint.h.    Builder.defineMacro("__POINTER_WIDTH__", @@ -969,6 +1000,11 @@ static void InitializePredefinedMacros(const TargetInfo &TI,      Builder.defineMacro("__nullable", "_Nullable");    } +  // Add a macro to differentiate between regular iOS/tvOS/watchOS targets and +  // the corresponding simulator targets. +  if (TI.getTriple().isOSDarwin() && TI.getTriple().isSimulatorEnvironment()) +    Builder.defineMacro("__APPLE_EMBEDDED_SIMULATOR__", "1"); +    // OpenMP definition    // OpenMP 2.2:    //   In implementations that support a preprocessor, the _OPENMP @@ -1010,6 +1046,10 @@ static void InitializePredefinedMacros(const TargetInfo &TI,          LangOpts.OpenCLVersion)) \        Builder.defineMacro(#Ext);  #include "clang/Basic/OpenCLExtensions.def" + +    auto Arch = TI.getTriple().getArch(); +    if (Arch == llvm::Triple::spir || Arch == llvm::Triple::spir64) +      Builder.defineMacro("__IMAGE_SUPPORT__");    }    if (TI.hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) { @@ -1068,7 +1108,7 @@ void clang::InitializePreprocessor(        }      }    } -   +    // Even with predefines off, some macros are still predefined.    // These should all be defined in the preprocessor according to the    // current language configuration. @@ -1114,7 +1154,7 @@ void clang::InitializePreprocessor(    // Instruct the preprocessor to skip the preamble.    PP.setSkipMainFilePreamble(InitOpts.PrecompiledPreambleBytes.first,                               InitOpts.PrecompiledPreambleBytes.second); -                           +    // Copy PredefinedBuffer into the Preprocessor.    PP.setPredefines(Predefines.str());  }  | 
