diff options
author | Alex Richardson <alexrichardson@google.com> | 2022-11-15 12:29:23 +0000 |
---|---|---|
committer | Alex Richardson <alexrichardson@google.com> | 2022-11-15 12:42:19 +0000 |
commit | 00b1f7a6ab2aecd2309e2faebde18a11309c6181 (patch) | |
tree | 8112ef2fec01d1d0e9edf282621a33ba3fe2e432 /clang/lib/Frontend/InitPreprocessor.cpp | |
parent | a5c9330b540fa2be776130ced016af3ec232270b (diff) | |
download | llvm-00b1f7a6ab2aecd2309e2faebde18a11309c6181.zip llvm-00b1f7a6ab2aecd2309e2faebde18a11309c6181.tar.gz llvm-00b1f7a6ab2aecd2309e2faebde18a11309c6181.tar.bz2 |
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
Diffstat (limited to 'clang/lib/Frontend/InitPreprocessor.cpp')
-rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 8e0a42c..bdff0bd 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_"); |