summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2015-12-30 23:37:25 +0000
committerChandler Carruth <chandlerc@gmail.com>2015-12-30 23:37:25 +0000
commit9c1b6aad77ae19cb730c41487cc971fde43865e1 (patch)
tree0c658866e1d7318e1dcedf317049fe216ee3464c
parent41160c2094b458a1bd363d40c47a120c26614300 (diff)
downloadbcm5719-llvm-9c1b6aad77ae19cb730c41487cc971fde43865e1.tar.gz
bcm5719-llvm-9c1b6aad77ae19cb730c41487cc971fde43865e1.zip
Revert "Revert "[ptr-traits] Implement the base pointer traits using the actual""
This reverts commit r256642 and restores r256620 now that Tobias has updated Polly. There are still some potential problems with the code in Polly that I've sent post-commit review about, but they're unlikely to break anything in practice, and I'd like to avoid the rest of LLVM and Clang regressing here. llvm-svn: 256656
-rw-r--r--llvm/include/llvm/Support/PointerLikeTypeTraits.h28
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.
OpenPOWER on IntegriCloud