X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FPointerIntPair.h;h=ccdcd1a8d1b949c5f1698d4a74b0288f28420e84;hb=1cacae0f297b7330c4cd2b4f0a1f95ab2615bd65;hp=999b802ffca1160dfc194f9ca69116aa7b8a3d1c;hpb=e30173ac3396510bd0bb26a66fd615ff9083436d;p=oota-llvm.git diff --git a/include/llvm/ADT/PointerIntPair.h b/include/llvm/ADT/PointerIntPair.h index 999b802ffca..ccdcd1a8d1b 100644 --- a/include/llvm/ADT/PointerIntPair.h +++ b/include/llvm/ADT/PointerIntPair.h @@ -14,7 +14,6 @@ #ifndef LLVM_ADT_POINTERINTPAIR_H #define LLVM_ADT_POINTERINTPAIR_H -#include "llvm/Support/DataTypes.h" #include "llvm/Support/PointerLikeTypeTraits.h" #include @@ -31,28 +30,30 @@ struct DenseMapInfo; /// type. /// /// Note that PointerIntPair always puts the Int part in the highest bits -/// possible. For example, PointerIntPair will put the bit for +/// possible. For example, PointerIntPair will put the bit for /// the bool into bit #2, not bit #0, which allows the low two bits to be used /// for something else. For example, this allows: -/// PointerIntPair, 1, bool> +/// PointerIntPair, 1, bool> /// ... and the two bools will land in different bits. /// -template +template > class PointerIntPair { intptr_t Value; - typedef PointerLikeTypeTraits PtrTraits; enum { /// PointerBitMask - The bits that come from the pointer. - PointerBitMask = ~(((intptr_t)1 << PtrTraits::NumLowBitsAvailable)-1), + PointerBitMask = + ~(uintptr_t)(((intptr_t)1 << PtrTraits::NumLowBitsAvailable)-1), + /// IntShift - The number of low bits that we reserve for other uses, and /// keep zero. - IntShift = PtrTraits::NumLowBitsAvailable-IntBits, + IntShift = (uintptr_t)PtrTraits::NumLowBitsAvailable-IntBits, /// IntMask - This is the unshifted mask for valid bits of the int type. - IntMask = ((intptr_t)1 << IntBits)-1, + IntMask = (uintptr_t)(((intptr_t)1 << IntBits)-1), // ShiftedIntMask - This is the bits for the integer shifted in place. - ShiftedIntMask = IntMask << IntShift + ShiftedIntMask = (uintptr_t)(IntMask << IntShift) }; public: PointerIntPair() : Value(0) {} @@ -64,7 +65,8 @@ public: } PointerTy getPointer() const { - return reinterpret_cast(Value & PointerBitMask); + return PtrTraits::getFromVoidPointer( + reinterpret_cast(Value & PointerBitMask)); } IntType getInt() const { @@ -72,7 +74,8 @@ public: } void setPointer(PointerTy Ptr) { - intptr_t PtrVal = reinterpret_cast(Ptr); + intptr_t PtrVal + = reinterpret_cast(PtrTraits::getAsVoidPointer(Ptr)); assert((PtrVal & ((1 << PtrTraits::NumLowBitsAvailable)-1)) == 0 && "Pointer is not sufficiently aligned"); // Preserve all low bits, just update the pointer. @@ -88,6 +91,17 @@ public: Value |= IntVal << IntShift; // Set new integer. } + PointerTy const *getAddrOfPointer() const { + return const_cast(this)->getAddrOfPointer(); + } + + PointerTy *getAddrOfPointer() { + assert(Value == reinterpret_cast(getPointer()) && + "Can only return the address if IntBits is cleared and " + "PtrTraits doesn't change the pointer"); + return reinterpret_cast(&Value); + } + void *getOpaqueValue() const { return reinterpret_cast(Value); } void setFromOpaqueValue(void *Val) { Value = reinterpret_cast(Val);} @@ -103,28 +117,38 @@ public: bool operator>=(const PointerIntPair &RHS) const {return Value >= RHS.Value;} }; +template struct isPodLike; +template +struct isPodLike > { + static const bool value = true; +}; + // Provide specialization of DenseMapInfo for PointerIntPair. template struct DenseMapInfo > { typedef PointerIntPair Ty; static Ty getEmptyKey() { - return Ty(reinterpret_cast(-1 << IntBits), - IntType((1 << IntBits)-1)); + intptr_t Val = -1; + Val <<= PointerLikeTypeTraits::NumLowBitsAvailable; + return Ty(reinterpret_cast(Val), IntType((1 << IntBits)-1)); } static Ty getTombstoneKey() { - return Ty(reinterpret_cast(-2 << IntBits), IntType(0)); + intptr_t Val = -2; + Val <<= PointerLikeTypeTraits::NumLowBitsAvailable; + return Ty(reinterpret_cast(Val), IntType(0)); } static unsigned getHashValue(Ty V) { uintptr_t IV = reinterpret_cast(V.getOpaqueValue()); return unsigned(IV) ^ unsigned(IV >> 9); } static bool isEqual(const Ty &LHS, const Ty &RHS) { return LHS == RHS; } - static bool isPod() { return true; } }; // Teach SmallPtrSet that PointerIntPair is "basically a pointer". -template -class PointerLikeTypeTraits > { +template +class PointerLikeTypeTraits > { public: static inline void * getAsVoidPointer(const PointerIntPair &P) { @@ -135,8 +159,7 @@ public: return PointerIntPair::getFromOpaqueValue(P); } enum { - NumLowBitsAvailable = - PointerLikeTypeTraits::NumLowBitsAvailable - IntBits + NumLowBitsAvailable = PtrTraits::NumLowBitsAvailable - IntBits }; };