Author: Alex Richardson Date: 2022-11-15T12:42:19Z New Revision: 00b1f7a6ab2aecd2309e2faebde18a11309c6181
URL: https://github.com/llvm/llvm-project/commit/00b1f7a6ab2aecd2309e2faebde18a11309c6181 DIFF: https://github.com/llvm/llvm-project/commit/00b1f7a6ab2aecd2309e2faebde18a11309c6181.diff LOG: Use TI.hasBuiltinAtomic() when setting ATOMIC_*_LOCK_FREE values. NFCI I noticed that the values for __{CLANG,GCC}_ATOMIC_POINTER_LOCK_FREE were incorrectly set to 1 instead of two in downstream CHERI targets because pointers are handled specially there. While fixing this downstream, I noticed that the existing code could be refactored to use TargetInfo::hasBuiltinAtomic instead of repeating the almost identical logic. In theory there could be a difference here since hasBuiltinAtomic() also returns true for types less than 1 char in size, but since InitializePredefinedMacros() never passes such a value this change should not introduce any functional changes. Reviewed By: rprichard, efriedma Differential Revision: https://reviews.llvm.org/D135142 Added: Modified: clang/lib/Frontend/InitPreprocessor.cpp Removed: ################################################################################ diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 8e0a42c644799..bdff0bd04f290 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -299,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. @@ -1150,11 +1150,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) @@ -1167,8 +1165,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, DEFINE_LOCK_FREE_MACRO(LONG, Long); DEFINE_LOCK_FREE_MACRO(LLONG, LongLong); Builder.defineMacro(Prefix + "POINTER_LOCK_FREE", - getLockFreeValue(TI.getPointerWidth(0), - InlineWidthBits)); + getLockFreeValue(TI.getPointerWidth(0), TI)); #undef DEFINE_LOCK_FREE_MACRO }; addLockFreeMacros("__CLANG_ATOMIC_"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits