From: David Blaikie Date: Wed, 15 Jan 2020 20:36:20 +0000 (-0800) Subject: PointerLikeTypeTraits: Standardize NumLowBitsAvailable on static constexpr rather... X-Git-Tag: llvmorg-12-init~17667 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=65eb74e94b414fcde6bfa810d1c30c7fcb136b77;p=platform%2Fupstream%2Fllvm.git PointerLikeTypeTraits: Standardize NumLowBitsAvailable on static constexpr rather than anonymous enum This is (more?) usable by GDB pretty printers and seems nicer to write. There's one tricky caveat that in C++14 (LLVM's codebase today) the static constexpr member declaration is not a definition - so odr use of this constant requires an out of line definition, which won't be provided (that'd make all these trait classes more annoyidng/expensive to maintain). But the use of this constant in the library implementation is/should always be in a non-odr context - only two unit tests needed to be touched to cope with this/avoid odr using these constants. Based on/expanded from D72590 by Christian Sigg. --- diff --git a/clang/include/clang/AST/CanonicalType.h b/clang/include/clang/AST/CanonicalType.h index 2e00d34..64ec1c0 100644 --- a/clang/include/clang/AST/CanonicalType.h +++ b/clang/include/clang/AST/CanonicalType.h @@ -384,7 +384,7 @@ struct PointerLikeTypeTraits> { } // qualifier information is encoded in the low bits. - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; }; } // namespace llvm diff --git a/clang/include/clang/AST/DeclGroup.h b/clang/include/clang/AST/DeclGroup.h index 2be9dae..672b7b0 100644 --- a/clang/include/clang/AST/DeclGroup.h +++ b/clang/include/clang/AST/DeclGroup.h @@ -147,7 +147,7 @@ namespace llvm { return clang::DeclGroupRef::getFromOpaquePtr(P); } - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; }; } // namespace llvm diff --git a/clang/include/clang/AST/ExternalASTSource.h b/clang/include/clang/AST/ExternalASTSource.h index 899ac3f..75671f7 100644 --- a/clang/include/clang/AST/ExternalASTSource.h +++ b/clang/include/clang/AST/ExternalASTSource.h @@ -504,9 +504,8 @@ struct PointerLikeTypeTraits< static void *getAsVoidPointer(Ptr P) { return P.getOpaqueValue(); } static Ptr getFromVoidPointer(void *P) { return Ptr::getFromOpaqueValue(P); } - enum { - NumLowBitsAvailable = PointerLikeTypeTraits::NumLowBitsAvailable - 1 - }; + static constexpr int NumLowBitsAvailable = + PointerLikeTypeTraits::NumLowBitsAvailable - 1; }; } // namespace llvm diff --git a/clang/include/clang/AST/TemplateName.h b/clang/include/clang/AST/TemplateName.h index cbbcbf6..e1315fa 100644 --- a/clang/include/clang/AST/TemplateName.h +++ b/clang/include/clang/AST/TemplateName.h @@ -559,7 +559,7 @@ struct PointerLikeTypeTraits { } // No bits are available! - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; }; } // namespace llvm. diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index f5955c4..2291d77 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -85,7 +85,7 @@ namespace llvm { return static_cast< ::clang::Type*>(P); } - enum { NumLowBitsAvailable = clang::TypeAlignmentInBits }; + static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits; }; template<> @@ -96,7 +96,7 @@ namespace llvm { return static_cast< ::clang::ExtQuals*>(P); } - enum { NumLowBitsAvailable = clang::TypeAlignmentInBits }; + static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits; }; } // namespace llvm @@ -1295,7 +1295,7 @@ struct PointerLikeTypeTraits { } // Various qualifiers go in low bits. - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; }; } // namespace llvm diff --git a/clang/include/clang/Basic/IdentifierTable.h b/clang/include/clang/Basic/IdentifierTable.h index ea5d7ad..e5ae833 100644 --- a/clang/include/clang/Basic/IdentifierTable.h +++ b/clang/include/clang/Basic/IdentifierTable.h @@ -967,7 +967,7 @@ struct PointerLikeTypeTraits { return clang::Selector(reinterpret_cast(P)); } - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; }; // Provide PointerLikeTypeTraits for IdentifierInfo pointers, which @@ -982,7 +982,7 @@ struct PointerLikeTypeTraits { return static_cast(P); } - enum { NumLowBitsAvailable = 1 }; + static constexpr int NumLowBitsAvailable = 1; }; template<> @@ -995,7 +995,7 @@ struct PointerLikeTypeTraits { return static_cast(P); } - enum { NumLowBitsAvailable = 1 }; + static constexpr int NumLowBitsAvailable = 1; }; } // namespace llvm diff --git a/clang/include/clang/Basic/SourceLocation.h b/clang/include/clang/Basic/SourceLocation.h index d3d1853..3735b90 100644 --- a/clang/include/clang/Basic/SourceLocation.h +++ b/clang/include/clang/Basic/SourceLocation.h @@ -482,7 +482,7 @@ namespace llvm { // Teach SmallPtrSet how to handle SourceLocation. template<> struct PointerLikeTypeTraits { - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; static void *getAsVoidPointer(clang::SourceLocation L) { return L.getPtrEncoding(); diff --git a/clang/include/clang/CodeGen/ConstantInitFuture.h b/clang/include/clang/CodeGen/ConstantInitFuture.h index b08f528..452ba36 100644 --- a/clang/include/clang/CodeGen/ConstantInitFuture.h +++ b/clang/include/clang/CodeGen/ConstantInitFuture.h @@ -35,7 +35,7 @@ struct PointerLikeTypeTraits< ::clang::CodeGen::ConstantInitBuilderBase*> { static inline void *getAsVoidPointer(T p) { return p; } static inline T getFromVoidPointer(void *p) {return static_cast(p);} - enum { NumLowBitsAvailable = 2 }; + static constexpr int NumLowBitsAvailable = 2; }; } @@ -79,10 +79,8 @@ public: result.Data = PairTy::getFromOpaqueValue(value); return result; } - enum { - NumLowBitsAvailable = - llvm::PointerLikeTypeTraits::NumLowBitsAvailable - }; + static constexpr int NumLowBitsAvailable = + llvm::PointerLikeTypeTraits::NumLowBitsAvailable; }; } // end namespace CodeGen @@ -100,7 +98,7 @@ struct PointerLikeTypeTraits< ::clang::CodeGen::ConstantInitFuture> { static inline T getFromVoidPointer(void *p) { return T::getFromOpaqueValue(p); } - enum { NumLowBitsAvailable = T::NumLowBitsAvailable }; + static constexpr int NumLowBitsAvailable = T::NumLowBitsAvailable; }; } // end namespace llvm diff --git a/clang/include/clang/Sema/Ownership.h b/clang/include/clang/Sema/Ownership.h index f395282..4de3397 100644 --- a/clang/include/clang/Sema/Ownership.h +++ b/clang/include/clang/Sema/Ownership.h @@ -116,7 +116,7 @@ namespace llvm { template struct PointerLikeTypeTraits> { - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; static inline void *getAsVoidPointer(clang::OpaquePtr P) { // FIXME: Doesn't work? return P.getAs< void >(); diff --git a/llvm/include/llvm/ADT/IntervalMap.h b/llvm/include/llvm/ADT/IntervalMap.h index a02876e..e9e6c54 100644 --- a/llvm/include/llvm/ADT/IntervalMap.h +++ b/llvm/include/llvm/ADT/IntervalMap.h @@ -491,7 +491,7 @@ class NodeRef { struct CacheAlignedPointerTraits { static inline void *getAsVoidPointer(void *P) { return P; } static inline void *getFromVoidPointer(void *P) { return P; } - enum { NumLowBitsAvailable = Log2CacheLine }; + static constexpr int NumLowBitsAvailable = Log2CacheLine; }; PointerIntPair pip; diff --git a/llvm/include/llvm/ADT/PointerEmbeddedInt.h b/llvm/include/llvm/ADT/PointerEmbeddedInt.h index 3eb6edb..fbc48af 100644 --- a/llvm/include/llvm/ADT/PointerEmbeddedInt.h +++ b/llvm/include/llvm/ADT/PointerEmbeddedInt.h @@ -94,7 +94,7 @@ struct PointerLikeTypeTraits> { return T(reinterpret_cast(P), typename T::RawValueTag()); } - enum { NumLowBitsAvailable = T::Shift }; + static constexpr int NumLowBitsAvailable = T::Shift; }; // Teach DenseMap how to use PointerEmbeddedInt objects as keys if the Int type diff --git a/llvm/include/llvm/ADT/PointerIntPair.h b/llvm/include/llvm/ADT/PointerIntPair.h index fa6bf15..bcd7941 100644 --- a/llvm/include/llvm/ADT/PointerIntPair.h +++ b/llvm/include/llvm/ADT/PointerIntPair.h @@ -235,7 +235,8 @@ struct PointerLikeTypeTraits< return PointerIntPair::getFromOpaqueValue(P); } - enum { NumLowBitsAvailable = PtrTraits::NumLowBitsAvailable - IntBits }; + static constexpr int NumLowBitsAvailable = + PtrTraits::NumLowBitsAvailable - IntBits; }; } // end namespace llvm diff --git a/llvm/include/llvm/IR/Use.h b/llvm/include/llvm/IR/Use.h index 034ca2c..6c5dd60 100644 --- a/llvm/include/llvm/IR/Use.h +++ b/llvm/include/llvm/IR/Use.h @@ -69,7 +69,7 @@ public: return (User *)P; } - enum { NumLowBitsAvailable = 1 }; + static constexpr int NumLowBitsAvailable = 1; }; // A type for the word following an array of hung-off Uses in memory, which is @@ -85,7 +85,7 @@ public: return (Use **)P; } - enum { NumLowBitsAvailable = 2 }; + static constexpr int NumLowBitsAvailable = 2; }; private: diff --git a/llvm/include/llvm/Support/PointerLikeTypeTraits.h b/llvm/include/llvm/Support/PointerLikeTypeTraits.h index 1e7e5b5..71ec818 100644 --- a/llvm/include/llvm/Support/PointerLikeTypeTraits.h +++ b/llvm/include/llvm/Support/PointerLikeTypeTraits.h @@ -56,7 +56,8 @@ template struct PointerLikeTypeTraits { static inline void *getAsVoidPointer(T *P) { return P; } static inline T *getFromVoidPointer(void *P) { return static_cast(P); } - enum { NumLowBitsAvailable = detail::ConstantLog2::value }; + static constexpr int NumLowBitsAvailable = + detail::ConstantLog2::value; }; template <> struct PointerLikeTypeTraits { @@ -70,7 +71,7 @@ template <> struct PointerLikeTypeTraits { /// /// All clients should use assertions to do a run-time check to ensure that /// this is actually true. - enum { NumLowBitsAvailable = 2 }; + static constexpr int NumLowBitsAvailable = 2; }; // Provide PointerLikeTypeTraits for const things. @@ -83,7 +84,7 @@ template struct PointerLikeTypeTraits { static inline const T getFromVoidPointer(const void *P) { return NonConst::getFromVoidPointer(const_cast(P)); } - enum { NumLowBitsAvailable = NonConst::NumLowBitsAvailable }; + static constexpr int NumLowBitsAvailable = NonConst::NumLowBitsAvailable; }; // Provide PointerLikeTypeTraits for const pointers. @@ -96,7 +97,7 @@ template struct PointerLikeTypeTraits { static inline const T *getFromVoidPointer(const void *P) { return NonConst::getFromVoidPointer(const_cast(P)); } - enum { NumLowBitsAvailable = NonConst::NumLowBitsAvailable }; + static constexpr int NumLowBitsAvailable = NonConst::NumLowBitsAvailable; }; // Provide PointerLikeTypeTraits for uintptr_t. @@ -108,7 +109,7 @@ template <> struct PointerLikeTypeTraits { return reinterpret_cast(P); } // No bits are available! - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; }; /// Provide suitable custom traits struct for function pointers. @@ -121,7 +122,8 @@ template <> struct PointerLikeTypeTraits { /// potentially use alignment attributes on functions to satisfy that. template struct FunctionPointerLikeTypeTraits { - enum { NumLowBitsAvailable = detail::ConstantLog2::value }; + static constexpr int NumLowBitsAvailable = + detail::ConstantLog2::value; static inline void *getAsVoidPointer(FunctionPointerT P) { assert((reinterpret_cast(P) & ~((uintptr_t)-1 << NumLowBitsAvailable)) == 0 && diff --git a/llvm/lib/Analysis/GlobalsModRef.cpp b/llvm/lib/Analysis/GlobalsModRef.cpp index 4361e0d..11005c4 100644 --- a/llvm/lib/Analysis/GlobalsModRef.cpp +++ b/llvm/lib/Analysis/GlobalsModRef.cpp @@ -77,7 +77,7 @@ class GlobalsAAResult::FunctionInfo { static inline AlignedMap *getFromVoidPointer(void *P) { return (AlignedMap *)P; } - enum { NumLowBitsAvailable = 3 }; + static constexpr int NumLowBitsAvailable = 3; static_assert(alignof(AlignedMap) >= (1 << NumLowBitsAvailable), "AlignedMap insufficiently aligned to have enough low bits."); }; diff --git a/llvm/unittests/ADT/PointerEmbeddedIntTest.cpp b/llvm/unittests/ADT/PointerEmbeddedIntTest.cpp index d24c8b8..12096e4 100644 --- a/llvm/unittests/ADT/PointerEmbeddedIntTest.cpp +++ b/llvm/unittests/ADT/PointerEmbeddedIntTest.cpp @@ -17,8 +17,8 @@ TEST(PointerEmbeddedIntTest, Basic) { EXPECT_EQ(42, I); EXPECT_EQ(43, I + 1); - EXPECT_EQ(sizeof(uintptr_t) * CHAR_BIT - CHAR_BIT, - PointerLikeTypeTraits::NumLowBitsAvailable); + EXPECT_EQ((int)sizeof(uintptr_t) * CHAR_BIT - CHAR_BIT, + (int)PointerLikeTypeTraits::NumLowBitsAvailable); EXPECT_FALSE(I == J); EXPECT_TRUE(I != J); diff --git a/llvm/unittests/ADT/PointerIntPairTest.cpp b/llvm/unittests/ADT/PointerIntPairTest.cpp index 6b3a4c05..b8ba3e3 100644 --- a/llvm/unittests/ADT/PointerIntPairTest.cpp +++ b/llvm/unittests/ADT/PointerIntPairTest.cpp @@ -72,22 +72,22 @@ TEST(PointerIntPairTest, DefaultInitialize) { EXPECT_EQ(0U, Pair.getInt()); } +// In real code this would be a word-sized integer limited to 31 bits. +struct Fixnum31 { + uintptr_t Value; +}; +struct FixnumPointerTraits { + static inline void *getAsVoidPointer(Fixnum31 Num) { + return reinterpret_cast(Num.Value << NumLowBitsAvailable); + } + static inline Fixnum31 getFromVoidPointer(void *P) { + // In real code this would assert that the value is in range. + return {reinterpret_cast(P) >> NumLowBitsAvailable}; + } + static constexpr int NumLowBitsAvailable = + std::numeric_limits::digits - 31; +}; TEST(PointerIntPairTest, ManyUnusedBits) { - // In real code this would be a word-sized integer limited to 31 bits. - struct Fixnum31 { - uintptr_t Value; - }; - class FixnumPointerTraits { - public: - static inline void *getAsVoidPointer(Fixnum31 Num) { - return reinterpret_cast(Num.Value << NumLowBitsAvailable); - } - static inline Fixnum31 getFromVoidPointer(void *P) { - // In real code this would assert that the value is in range. - return { reinterpret_cast(P) >> NumLowBitsAvailable }; - } - enum { NumLowBitsAvailable = std::numeric_limits::digits - 31 }; - }; PointerIntPair pair; EXPECT_EQ((uintptr_t)0, pair.getPointer().Value); @@ -98,7 +98,7 @@ TEST(PointerIntPairTest, ManyUnusedBits) { EXPECT_TRUE(pair.getInt()); EXPECT_EQ(FixnumPointerTraits::NumLowBitsAvailable - 1, - PointerLikeTypeTraits::NumLowBitsAvailable); + (int)PointerLikeTypeTraits::NumLowBitsAvailable); static_assert( is_trivially_copyable< diff --git a/mlir/include/mlir/IR/Attributes.h b/mlir/include/mlir/IR/Attributes.h index 49f42af..4db7489 100644 --- a/mlir/include/mlir/IR/Attributes.h +++ b/mlir/include/mlir/IR/Attributes.h @@ -622,7 +622,7 @@ public: } // Note: We could steal more bits if the need arises. - enum { NumLowBitsAvailable = 1 }; + static constexpr int NumLowBitsAvailable = 1; }; /// Pair of raw pointer and a boolean flag of whether the pointer holds a splat, @@ -1442,7 +1442,7 @@ template <> struct PointerLikeTypeTraits { static inline mlir::Attribute getFromVoidPointer(void *ptr) { return mlir::Attribute::getFromOpaquePointer(ptr); } - enum { NumLowBitsAvailable = 3 }; + static constexpr int NumLowBitsAvailable = 3; }; template <> diff --git a/mlir/include/mlir/IR/Function.h b/mlir/include/mlir/IR/Function.h index 5323b35..8783c82 100644 --- a/mlir/include/mlir/IR/Function.h +++ b/mlir/include/mlir/IR/Function.h @@ -180,7 +180,7 @@ public: static inline mlir::FuncOp getFromVoidPointer(void *P) { return mlir::FuncOp::getFromOpaquePointer(P); } - enum { NumLowBitsAvailable = 3 }; + static constexpr int NumLowBitsAvailable = 3; }; } // namespace llvm diff --git a/mlir/include/mlir/IR/Identifier.h b/mlir/include/mlir/IR/Identifier.h index 604eebf..46fb640 100644 --- a/mlir/include/mlir/IR/Identifier.h +++ b/mlir/include/mlir/IR/Identifier.h @@ -127,7 +127,7 @@ public: static inline mlir::Identifier getFromVoidPointer(void *P) { return mlir::Identifier::getFromOpaquePointer(P); } - enum { NumLowBitsAvailable = 2 }; + static constexpr int NumLowBitsAvailable = 2; }; } // end namespace llvm diff --git a/mlir/include/mlir/IR/Location.h b/mlir/include/mlir/IR/Location.h index c36bcb3..0cd89a4 100644 --- a/mlir/include/mlir/IR/Location.h +++ b/mlir/include/mlir/IR/Location.h @@ -321,10 +321,8 @@ public: static inline mlir::Location getFromVoidPointer(void *P) { return mlir::Location::getFromOpaquePointer(P); } - enum { - NumLowBitsAvailable = - PointerLikeTypeTraits::NumLowBitsAvailable - }; + static constexpr int NumLowBitsAvailable = + PointerLikeTypeTraits::NumLowBitsAvailable; }; } // namespace llvm diff --git a/mlir/include/mlir/IR/Module.h b/mlir/include/mlir/IR/Module.h index fb7c61f..5387813 100644 --- a/mlir/include/mlir/IR/Module.h +++ b/mlir/include/mlir/IR/Module.h @@ -161,7 +161,7 @@ public: static inline mlir::ModuleOp getFromVoidPointer(void *P) { return mlir::ModuleOp::getFromOpaquePointer(P); } - enum { NumLowBitsAvailable = 3 }; + static constexpr int NumLowBitsAvailable = 3; }; } // end namespace llvm diff --git a/mlir/include/mlir/IR/OperationSupport.h b/mlir/include/mlir/IR/OperationSupport.h index d06131d..11d6821 100644 --- a/mlir/include/mlir/IR/OperationSupport.h +++ b/mlir/include/mlir/IR/OperationSupport.h @@ -706,10 +706,8 @@ public: static inline mlir::OperationName getFromVoidPointer(void *P) { return mlir::OperationName::getFromOpaquePointer(P); } - enum { - NumLowBitsAvailable = PointerLikeTypeTraits< - mlir::OperationName::RepresentationUnion>::NumLowBitsAvailable - }; + static constexpr int NumLowBitsAvailable = PointerLikeTypeTraits< + mlir::OperationName::RepresentationUnion>::NumLowBitsAvailable; }; } // end namespace llvm diff --git a/mlir/include/mlir/IR/Types.h b/mlir/include/mlir/IR/Types.h index 21d6493..00bbfd5 100644 --- a/mlir/include/mlir/IR/Types.h +++ b/mlir/include/mlir/IR/Types.h @@ -293,7 +293,7 @@ public: static inline mlir::Type getFromVoidPointer(void *P) { return mlir::Type::getFromOpaquePointer(P); } - enum { NumLowBitsAvailable = 3 }; + static constexpr int NumLowBitsAvailable = 3; }; } // namespace llvm diff --git a/mlir/include/mlir/IR/Value.h b/mlir/include/mlir/IR/Value.h index 6354156..ec19b7d 100644 --- a/mlir/include/mlir/IR/Value.h +++ b/mlir/include/mlir/IR/Value.h @@ -66,7 +66,7 @@ public: struct ImplTypeTraits : public llvm::PointerLikeTypeTraits { // We know that all pointers within the ImplType are aligned by 8-bytes, // meaning that we can steal up to 3 bits for the different values. - enum { NumLowBitsAvailable = 3 }; + static constexpr int NumLowBitsAvailable = 3; }; using ImplType = llvm::PointerIntPair; diff --git a/polly/include/polly/CodeGen/IslExprBuilder.h b/polly/include/polly/CodeGen/IslExprBuilder.h index fe727cd..998f8f6 100644 --- a/polly/include/polly/CodeGen/IslExprBuilder.h +++ b/polly/include/polly/CodeGen/IslExprBuilder.h @@ -24,7 +24,7 @@ public: static inline const Region *getFromVoidPointer(void *P) { return (Region *)P; } - enum { NumLowBitsAvailable = 0 }; + static constexpr int NumLowBitsAvailable = 0; }; } // namespace llvm