diff options
Diffstat (limited to 'clang/lib/Frontend/InitPreprocessor.cpp')
-rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 64 |
1 files changed, 38 insertions, 26 deletions
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 20bfbf144a30..208c6a8db159 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/FileManager.h" +#include "clang/Basic/HLSLRuntime.h" #include "clang/Basic/MacroBuilder.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/SyncScope.h" @@ -298,12 +299,12 @@ static void DefineFastIntType(unsigned TypeWidth, bool IsSigned, /// Get the value the ATOMIC_*_LOCK_FREE macro should have for a type with /// the specified properties. -static const char *getLockFreeValue(unsigned TypeWidth, unsigned InlineWidth) { +static const char *getLockFreeValue(unsigned TypeWidth, const TargetInfo &TI) { // Fully-aligned, power-of-2 sizes no larger than the inline // width will be inlined as lock-free operations. // Note: we do not need to check alignment since _Atomic(T) is always // appropriately-aligned in clang. - if ((TypeWidth & (TypeWidth - 1)) == 0 && TypeWidth <= InlineWidth) + if (TI.hasBuiltinAtomic(TypeWidth, TypeWidth)) return "2"; // "always lock free" // We cannot be certain what operations the lib calls might be // able to implement as lock-free on future processors. @@ -402,8 +403,8 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__SHADER_STAGE_LIBRARY", Twine((uint32_t)ShaderStage::Library)); // The current shader stage itself - uint32_t StageInteger = (uint32_t)TI.getTriple().getEnvironment() - - (uint32_t)llvm::Triple::Pixel; + uint32_t StageInteger = static_cast<uint32_t>( + hlsl::getStageFromEnvironment(TI.getTriple().getEnvironment())); Builder.defineMacro("__SHADER_TARGET_STAGE", Twine(StageInteger)); // Add target versions @@ -605,7 +606,7 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts, Builder.defineMacro("__cpp_unicode_literals", "200710L"); Builder.defineMacro("__cpp_user_defined_literals", "200809L"); Builder.defineMacro("__cpp_lambdas", "200907L"); - Builder.defineMacro("__cpp_constexpr", LangOpts.CPlusPlus2b ? "202110L" + Builder.defineMacro("__cpp_constexpr", LangOpts.CPlusPlus2b ? "202211L" : LangOpts.CPlusPlus20 ? "201907L" : LangOpts.CPlusPlus17 ? "201603L" : LangOpts.CPlusPlus14 ? "201304L" @@ -673,7 +674,11 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts, // C++20 features. if (LangOpts.CPlusPlus20) { - //Builder.defineMacro("__cpp_aggregate_paren_init", "201902L"); + Builder.defineMacro("__cpp_aggregate_paren_init", "201902L"); + + // P0848 is implemented, but we're still waiting for other concepts + // issues to be addressed before bumping __cpp_concepts up to 202002L. + // Refer to the discussion of this at https://reviews.llvm.org/D128619. Builder.defineMacro("__cpp_concepts", "201907L"); Builder.defineMacro("__cpp_conditional_explicit", "201806L"); //Builder.defineMacro("__cpp_consteval", "201811L"); @@ -690,10 +695,17 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts, Builder.defineMacro("__cpp_implicit_move", "202011L"); Builder.defineMacro("__cpp_size_t_suffix", "202011L"); Builder.defineMacro("__cpp_if_consteval", "202106L"); - Builder.defineMacro("__cpp_multidimensional_subscript", "202110L"); + Builder.defineMacro("__cpp_multidimensional_subscript", "202211L"); } + + // We provide those C++2b features as extensions in earlier language modes, so + // we also define their feature test macros. + if (LangOpts.CPlusPlus11) + Builder.defineMacro("__cpp_static_call_operator", "202207L"); + Builder.defineMacro("__cpp_named_character_escapes", "202207L"); + if (LangOpts.Char8) - Builder.defineMacro("__cpp_char8_t", "201811L"); + Builder.defineMacro("__cpp_char8_t", "202207L"); Builder.defineMacro("__cpp_impl_destroying_delete", "201806L"); // TS features. @@ -936,14 +948,14 @@ static void InitializePredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__LITTLE_ENDIAN__"); } - if (TI.getPointerWidth(0) == 64 && TI.getLongWidth() == 64 - && TI.getIntWidth() == 32) { + if (TI.getPointerWidth(LangAS::Default) == 64 && TI.getLongWidth() == 64 && + TI.getIntWidth() == 32) { Builder.defineMacro("_LP64"); Builder.defineMacro("__LP64__"); } - if (TI.getPointerWidth(0) == 32 && TI.getLongWidth() == 32 - && TI.getIntWidth() == 32) { + if (TI.getPointerWidth(LangAS::Default) == 32 && TI.getLongWidth() == 32 && + TI.getIntWidth() == 32) { Builder.defineMacro("_ILP32"); Builder.defineMacro("__ILP32__"); } @@ -976,7 +988,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI, DefineTypeSizeAndWidth("__SIZE", TI.getSizeType(), TI, Builder); DefineTypeSizeAndWidth("__UINTMAX", TI.getUIntMaxType(), TI, Builder); - DefineTypeSizeAndWidth("__PTRDIFF", TI.getPtrDiffType(0), TI, Builder); + DefineTypeSizeAndWidth("__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI, + Builder); DefineTypeSizeAndWidth("__INTPTR", TI.getIntPtrType(), TI, Builder); DefineTypeSizeAndWidth("__UINTPTR", TI.getUIntPtrType(), TI, Builder); @@ -986,10 +999,12 @@ static void InitializePredefinedMacros(const TargetInfo &TI, DefineTypeSizeof("__SIZEOF_LONG__", TI.getLongWidth(), TI, Builder); DefineTypeSizeof("__SIZEOF_LONG_DOUBLE__",TI.getLongDoubleWidth(),TI,Builder); DefineTypeSizeof("__SIZEOF_LONG_LONG__", TI.getLongLongWidth(), TI, Builder); - DefineTypeSizeof("__SIZEOF_POINTER__", TI.getPointerWidth(0), TI, Builder); + DefineTypeSizeof("__SIZEOF_POINTER__", TI.getPointerWidth(LangAS::Default), + TI, Builder); DefineTypeSizeof("__SIZEOF_SHORT__", TI.getShortWidth(), TI, Builder); DefineTypeSizeof("__SIZEOF_PTRDIFF_T__", - TI.getTypeWidth(TI.getPtrDiffType(0)), TI, Builder); + TI.getTypeWidth(TI.getPtrDiffType(LangAS::Default)), TI, + Builder); DefineTypeSizeof("__SIZEOF_SIZE_T__", TI.getTypeWidth(TI.getSizeType()), TI, Builder); DefineTypeSizeof("__SIZEOF_WCHAR_T__", @@ -1007,8 +1022,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI, DefineFmt("__UINTMAX", TI.getUIntMaxType(), TI, Builder); Builder.defineMacro("__UINTMAX_C_SUFFIX__", TI.getTypeConstantSuffix(TI.getUIntMaxType())); - DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(0), Builder); - DefineFmt("__PTRDIFF", TI.getPtrDiffType(0), TI, Builder); + DefineType("__PTRDIFF_TYPE__", TI.getPtrDiffType(LangAS::Default), Builder); + DefineFmt("__PTRDIFF", TI.getPtrDiffType(LangAS::Default), TI, Builder); DefineType("__INTPTR_TYPE__", TI.getIntPtrType(), Builder); DefineFmt("__INTPTR", TI.getIntPtrType(), TI, Builder); DefineType("__SIZE_TYPE__", TI.getSizeType(), Builder); @@ -1039,7 +1054,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, // Define a __POINTER_WIDTH__ macro for stdint.h. Builder.defineMacro("__POINTER_WIDTH__", - Twine((int)TI.getPointerWidth(0))); + Twine((int)TI.getPointerWidth(LangAS::Default))); // Define __BIGGEST_ALIGNMENT__ to be compatible with gcc. Builder.defineMacro("__BIGGEST_ALIGNMENT__", @@ -1138,11 +1153,9 @@ static void InitializePredefinedMacros(const TargetInfo &TI, auto addLockFreeMacros = [&](const llvm::Twine &Prefix) { // Used by libc++ and libstdc++ to implement ATOMIC_<foo>_LOCK_FREE. - unsigned InlineWidthBits = TI.getMaxAtomicInlineWidth(); #define DEFINE_LOCK_FREE_MACRO(TYPE, Type) \ Builder.defineMacro(Prefix + #TYPE "_LOCK_FREE", \ - getLockFreeValue(TI.get##Type##Width(), \ - InlineWidthBits)); + getLockFreeValue(TI.get##Type##Width(), TI)); DEFINE_LOCK_FREE_MACRO(BOOL, Bool); DEFINE_LOCK_FREE_MACRO(CHAR, Char); if (LangOpts.Char8) @@ -1154,9 +1167,9 @@ static void InitializePredefinedMacros(const TargetInfo &TI, DEFINE_LOCK_FREE_MACRO(INT, Int); DEFINE_LOCK_FREE_MACRO(LONG, Long); DEFINE_LOCK_FREE_MACRO(LLONG, LongLong); - Builder.defineMacro(Prefix + "POINTER_LOCK_FREE", - getLockFreeValue(TI.getPointerWidth(0), - InlineWidthBits)); + Builder.defineMacro( + Prefix + "POINTER_LOCK_FREE", + getLockFreeValue(TI.getPointerWidth(LangAS::Default), TI)); #undef DEFINE_LOCK_FREE_MACRO }; addLockFreeMacros("__CLANG_ATOMIC_"); @@ -1293,8 +1306,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, } /// InitializePreprocessor - Initialize the preprocessor getting it and the -/// environment ready to process a single file. This returns true on error. -/// +/// environment ready to process a single file. void clang::InitializePreprocessor( Preprocessor &PP, const PreprocessorOptions &InitOpts, const PCHContainerReader &PCHContainerRdr, |