X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FPointerIntPair.h;h=ccdcd1a8d1b949c5f1698d4a74b0288f28420e84;hb=1cacae0f297b7330c4cd2b4f0a1f95ab2615bd65;hp=31ee2c8e26cc685e848a651d195d2c2156508efb;hpb=b14a495c3682a9804e81326691f039ab2e15738f;p=oota-llvm.git diff --git a/include/llvm/ADT/PointerIntPair.h b/include/llvm/ADT/PointerIntPair.h index 31ee2c8e26c..ccdcd1a8d1b 100644 --- a/include/llvm/ADT/PointerIntPair.h +++ b/include/llvm/ADT/PointerIntPair.h @@ -43,17 +43,17 @@ class PointerIntPair { enum { /// PointerBitMask - The bits that come from the pointer. PointerBitMask = - ~(uint64_t)(((intptr_t)1 << PtrTraits::NumLowBitsAvailable)-1), + ~(uintptr_t)(((intptr_t)1 << PtrTraits::NumLowBitsAvailable)-1), /// IntShift - The number of low bits that we reserve for other uses, and /// keep zero. - IntShift = (uint64_t)PtrTraits::NumLowBitsAvailable-IntBits, + IntShift = (uintptr_t)PtrTraits::NumLowBitsAvailable-IntBits, /// IntMask - This is the unshifted mask for valid bits of the int type. - IntMask = (uint64_t)(((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 = (uint64_t)(IntMask << IntShift) + ShiftedIntMask = (uintptr_t)(IntMask << IntShift) }; public: PointerIntPair() : Value(0) {} @@ -65,7 +65,8 @@ public: } PointerTy getPointer() const { - return reinterpret_cast(Value & PointerBitMask); + return PtrTraits::getFromVoidPointer( + reinterpret_cast(Value & PointerBitMask)); } IntType getInt() const { @@ -73,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. @@ -89,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);} @@ -104,6 +117,12 @@ 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 > { @@ -123,7 +142,6 @@ struct DenseMapInfo > { 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". @@ -141,8 +159,7 @@ public: return PointerIntPair::getFromOpaqueValue(P); } enum { - NumLowBitsAvailable = - PointerLikeTypeTraits::NumLowBitsAvailable - IntBits + NumLowBitsAvailable = PtrTraits::NumLowBitsAvailable - IntBits }; };