diff options
| -rw-r--r-- | llvm/include/llvm/Support/PointerLikeTypeTraits.h | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/llvm/include/llvm/Support/PointerLikeTypeTraits.h b/llvm/include/llvm/Support/PointerLikeTypeTraits.h index 95d735869f2..c12d237b279 100644 --- a/llvm/include/llvm/Support/PointerLikeTypeTraits.h +++ b/llvm/include/llvm/Support/PointerLikeTypeTraits.h @@ -15,6 +15,7 @@ #ifndef LLVM_SUPPORT_POINTERLIKETYPETRAITS_H #define LLVM_SUPPORT_POINTERLIKETYPETRAITS_H +#include "llvm/Support/AlignOf.h" #include "llvm/Support/DataTypes.h" namespace llvm { @@ -27,15 +28,32 @@ template <typename T> class PointerLikeTypeTraits { // getNumLowBitsAvailable }; +namespace detail { +/// A tiny meta function to compute the log2 of a compile time constant. +template <size_t N> +struct ConstantLog2 + : std::integral_constant<size_t, ConstantLog2<N / 2>::value + 1> {}; +template <> struct ConstantLog2<1> : std::integral_constant<size_t, 0> {}; +} + // Provide PointerLikeTypeTraits for non-cvr pointers. -template <typename T> class PointerLikeTypeTraits<T *> { -public: +template <typename T> struct PointerLikeTypeTraits<T *> { static inline void *getAsVoidPointer(T *P) { return P; } static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); } - /// Note, we assume here that malloc returns objects at least 4-byte aligned. - /// However, this may be wrong, or pointers may be from something other than - /// malloc. In this case, you should specialize this template to reduce this. + enum { + NumLowBitsAvailable = detail::ConstantLog2<AlignOf<T>::Alignment>::value + }; +}; + +template <> struct PointerLikeTypeTraits<void *> { + static inline void *getAsVoidPointer(void *P) { return P; } + static inline void *getFromVoidPointer(void *P) { return P; } + + /// Note, we assume here that void* is related to raw malloc'ed memory and + /// that malloc returns objects at least 4-byte aligned. However, this may be + /// wrong, or pointers may be from something other than malloc. In this case, + /// you should specify a real typed pointer or avoid this template. /// /// All clients should use assertions to do a run-time check to ensure that /// this is actually true. |

