134b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//===- llvm/ADT/PointerIntPair.h - Pair for pointer and int -----*- C++ -*-===// 234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// 334b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// The LLVM Compiler Infrastructure 434b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// 534b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// This file is distributed under the University of Illinois Open Source 634b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// License. See LICENSE.TXT for details. 734b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// 834b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//===----------------------------------------------------------------------===// 934b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// 1034b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// This file defines the PointerIntPair class. 1134b763694e74ee16e68fd85488bfe0443c51170dChris Lattner// 1234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner//===----------------------------------------------------------------------===// 1334b763694e74ee16e68fd85488bfe0443c51170dChris Lattner 1434b763694e74ee16e68fd85488bfe0443c51170dChris Lattner#ifndef LLVM_ADT_POINTERINTPAIR_H 1534b763694e74ee16e68fd85488bfe0443c51170dChris Lattner#define LLVM_ADT_POINTERINTPAIR_H 1634b763694e74ee16e68fd85488bfe0443c51170dChris Lattner 17118a0659ab8a4d0e0af343b88e5fa71a5c1eb6a6Reid Kleckner#include "llvm/Support/Compiler.h" 18e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner#include "llvm/Support/PointerLikeTypeTraits.h" 1934b763694e74ee16e68fd85488bfe0443c51170dChris Lattner#include <cassert> 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <limits> 2134b763694e74ee16e68fd85488bfe0443c51170dChris Lattner 2234b763694e74ee16e68fd85488bfe0443c51170dChris Lattnernamespace llvm { 233a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename T> struct DenseMapInfo; 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerT, unsigned IntBits, typename PtrTraits> 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct PointerIntPairInfo; 283a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 2934b763694e74ee16e68fd85488bfe0443c51170dChris Lattner/// PointerIntPair - This class implements a pair of a pointer and small 30d55da4de048684e3791dbae8018666e5b7549506Chris Lattner/// integer. It is designed to represent this in the space required by one 3134b763694e74ee16e68fd85488bfe0443c51170dChris Lattner/// pointer by bitmangling the integer into the low part of the pointer. This 3234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner/// can only be done for small integers: typically up to 3 bits, but it depends 33e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// on the number of bits available according to PointerLikeTypeTraits for the 34e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// type. 35e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// 36b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff/// Note that PointerIntPair always puts the IntVal part in the highest bits 3754e01d06db7c04208a684e34cb82b0847a077261Chris Lattner/// possible. For example, PointerIntPair<void*, 1, bool> will put the bit for 38e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// the bool into bit #2, not bit #0, which allows the low two bits to be used 39e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// for something else. For example, this allows: 4054e01d06db7c04208a684e34cb82b0847a077261Chris Lattner/// PointerIntPair<PointerIntPair<void*, 1, bool>, 1, bool> 41e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner/// ... and the two bools will land in different bits. 4234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner/// 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerTy, unsigned IntBits, typename IntType = unsigned, 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar typename PtrTraits = PointerLikeTypeTraits<PointerTy>, 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar typename Info = PointerIntPairInfo<PointerTy, IntBits, PtrTraits>> 4634b763694e74ee16e68fd85488bfe0443c51170dChris Lattnerclass PointerIntPair { 4734b763694e74ee16e68fd85488bfe0443c51170dChris Lattner intptr_t Value; 48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 4934b763694e74ee16e68fd85488bfe0443c51170dChris Lattnerpublic: 5034b763694e74ee16e68fd85488bfe0443c51170dChris Lattner PointerIntPair() : Value(0) {} 51b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff PointerIntPair(PointerTy PtrVal, IntType IntVal) { 52b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff setPointerAndInt(PtrVal, IntVal); 53acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis } 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar explicit PointerIntPair(PointerTy PtrVal) { initWithPointer(PtrVal); } 5534b763694e74ee16e68fd85488bfe0443c51170dChris Lattner 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PointerTy getPointer() const { return Info::getPointer(Value); } 573a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 5834b763694e74ee16e68fd85488bfe0443c51170dChris Lattner IntType getInt() const { 59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return (IntType)Info::getInt(Value); 6034b763694e74ee16e68fd85488bfe0443c51170dChris Lattner } 613a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 62b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff void setPointer(PointerTy PtrVal) { 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Value = Info::updatePointer(Value, PtrVal); 6434b763694e74ee16e68fd85488bfe0443c51170dChris Lattner } 653a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 66b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff void setInt(IntType IntVal) { 67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Value = Info::updateInt(Value, static_cast<intptr_t>(IntVal)); 6834b763694e74ee16e68fd85488bfe0443c51170dChris Lattner } 693a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 70b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff void initWithPointer(PointerTy PtrVal) { 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Value = Info::updatePointer(0, PtrVal); 72acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis } 73acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis 74b3d25a940cfd44ffbac71adc6d8f3759ad8a8cb4Joe Groff void setPointerAndInt(PointerTy PtrVal, IntType IntVal) { 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Value = Info::updateInt(Info::updatePointer(0, PtrVal), 76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static_cast<intptr_t>(IntVal)); 77acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis } 78acb8d9fbe3853394a2537985349993580309b8cdArgyrios Kyrtzidis 7938297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis PointerTy const *getAddrOfPointer() const { 800db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis return const_cast<PointerIntPair *>(this)->getAddrOfPointer(); 810db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis } 820db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis 830db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis PointerTy *getAddrOfPointer() { 8438297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis assert(Value == reinterpret_cast<intptr_t>(getPointer()) && 8538297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis "Can only return the address if IntBits is cleared and " 8638297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis "PtrTraits doesn't change the pointer"); 870db235a2b0ed6ae5c3c870012061906054b6dbc4Argyrios Kyrtzidis return reinterpret_cast<PointerTy *>(&Value); 8838297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis } 8938297f5f760de604258aaa9000e5aadb43c78921Argyrios Kyrtzidis 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void *getOpaqueValue() const { return reinterpret_cast<void *>(Value); } 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setFromOpaqueValue(void *Val) { 92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Value = reinterpret_cast<intptr_t>(Val); 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 943a54b3dc87a581c203b18050b4f787b4ca28a12cMisha Brukman 954d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner static PointerIntPair getFromOpaqueValue(void *V) { 96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar PointerIntPair P; 97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar P.setFromOpaqueValue(V); 98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return P; 994d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner } 1006ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose 1016ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose // Allow PointerIntPairs to be created from const void * if and only if the 1026ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose // pointer type could be created from a const void *. 1036ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose static PointerIntPair getFromOpaqueValue(const void *V) { 1046ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose (void)PtrTraits::getFromVoidPointer(V); 1056ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose return getFromOpaqueValue(const_cast<void *>(V)); 1066ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose } 1076ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose 108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool operator==(const PointerIntPair &RHS) const { 109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Value == RHS.Value; 110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool operator!=(const PointerIntPair &RHS) const { 112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Value != RHS.Value; 113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool operator<(const PointerIntPair &RHS) const { return Value < RHS.Value; } 115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool operator>(const PointerIntPair &RHS) const { return Value > RHS.Value; } 116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool operator<=(const PointerIntPair &RHS) const { 117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Value <= RHS.Value; 118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool operator>=(const PointerIntPair &RHS) const { 120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Value >= RHS.Value; 121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerT, unsigned IntBits, typename PtrTraits> 125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct PointerIntPairInfo { 126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static_assert(PtrTraits::NumLowBitsAvailable < 127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::numeric_limits<uintptr_t>::digits, 128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar "cannot use a pointer type that has all bits free"); 129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static_assert(IntBits <= PtrTraits::NumLowBitsAvailable, 130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar "PointerIntPair with integer size too large for pointer"); 131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar enum : uintptr_t { 132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// PointerBitMask - The bits that come from the pointer. 133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PointerBitMask = 134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ~(uintptr_t)(((intptr_t)1 << PtrTraits::NumLowBitsAvailable) - 1), 135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// IntShift - The number of low bits that we reserve for other uses, and 137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// keep zero. 138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar IntShift = (uintptr_t)PtrTraits::NumLowBitsAvailable - IntBits, 139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// IntMask - This is the unshifted mask for valid bits of the int type. 141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar IntMask = (uintptr_t)(((intptr_t)1 << IntBits) - 1), 142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // ShiftedIntMask - This is the bits for the integer shifted in place. 144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ShiftedIntMask = (uintptr_t)(IntMask << IntShift) 145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static PointerT getPointer(intptr_t Value) { 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return PtrTraits::getFromVoidPointer( 149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar reinterpret_cast<void *>(Value & PointerBitMask)); 150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static intptr_t getInt(intptr_t Value) { 153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return (Value >> IntShift) & IntMask; 154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static intptr_t updatePointer(intptr_t OrigValue, PointerT Ptr) { 157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar intptr_t PtrWord = 158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar reinterpret_cast<intptr_t>(PtrTraits::getAsVoidPointer(Ptr)); 159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert((PtrWord & ~PointerBitMask) == 0 && 160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar "Pointer is not sufficiently aligned"); 161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Preserve all low bits, just update the pointer. 162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return PtrWord | (OrigValue & ~PointerBitMask); 163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static intptr_t updateInt(intptr_t OrigValue, intptr_t Int) { 166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar intptr_t IntWord = static_cast<intptr_t>(Int); 167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert((IntWord & ~IntMask) == 0 && "Integer too large for field"); 168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Preserve all bits other than the ones we are updating. 170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return (OrigValue & ~ShiftedIntMask) | IntWord << IntShift; 171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 17234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner}; 17334b763694e74ee16e68fd85488bfe0443c51170dChris Lattner 1744bbf4ee1491637c247e195e19e3e4a8ee5ad72faChris Lattnertemplate <typename T> struct isPodLike; 175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerTy, unsigned IntBits, typename IntType> 176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct isPodLike<PointerIntPair<PointerTy, IntBits, IntType>> { 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static const bool value = true; 1784bbf4ee1491637c247e195e19e3e4a8ee5ad72faChris Lattner}; 179f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 1809ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner// Provide specialization of DenseMapInfo for PointerIntPair. 181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerTy, unsigned IntBits, typename IntType> 182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct DenseMapInfo<PointerIntPair<PointerTy, IntBits, IntType>> { 1839ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner typedef PointerIntPair<PointerTy, IntBits, IntType> Ty; 1849ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner static Ty getEmptyKey() { 1851144af3c9b4da48cd581156e05b24261c8de366aRichard Smith uintptr_t Val = static_cast<uintptr_t>(-1); 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Val <<= PointerLikeTypeTraits<Ty>::NumLowBitsAvailable; 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Ty::getFromOpaqueValue(reinterpret_cast<void *>(Val)); 1889ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner } 1899ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner static Ty getTombstoneKey() { 1901144af3c9b4da48cd581156e05b24261c8de366aRichard Smith uintptr_t Val = static_cast<uintptr_t>(-2); 191f341a47d10501bc69b5d4d2217992bb6e08668d8Chris Lattner Val <<= PointerLikeTypeTraits<PointerTy>::NumLowBitsAvailable; 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Ty::getFromOpaqueValue(reinterpret_cast<void *>(Val)); 1939ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner } 1949ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner static unsigned getHashValue(Ty V) { 1959ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner uintptr_t IV = reinterpret_cast<uintptr_t>(V.getOpaqueValue()); 1969ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner return unsigned(IV) ^ unsigned(IV >> 9); 1979ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner } 1989ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner static bool isEqual(const Ty &LHS, const Ty &RHS) { return LHS == RHS; } 1999ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner}; 2009ac30537aa3c201b6950bc708e02b1885c288c8dChris Lattner 2014d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner// Teach SmallPtrSet that PointerIntPair is "basically a pointer". 202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename PointerTy, unsigned IntBits, typename IntType, 203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar typename PtrTraits> 204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass PointerLikeTypeTraits< 205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PointerIntPair<PointerTy, IntBits, IntType, PtrTraits>> { 2064d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattnerpublic: 2074d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner static inline void * 2084d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner getAsVoidPointer(const PointerIntPair<PointerTy, IntBits, IntType> &P) { 2094d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner return P.getOpaqueValue(); 2104d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner } 2114d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner static inline PointerIntPair<PointerTy, IntBits, IntType> 2124d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner getFromVoidPointer(void *P) { 2134d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner return PointerIntPair<PointerTy, IntBits, IntType>::getFromOpaqueValue(P); 2144d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner } 2156ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose static inline PointerIntPair<PointerTy, IntBits, IntType> 2166ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose getFromVoidPointer(const void *P) { 2176ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose return PointerIntPair<PointerTy, IntBits, IntType>::getFromOpaqueValue(P); 2186ef4996b095ef6c0d902798d2455716a79bd0a3dJordan Rose } 219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar enum { NumLowBitsAvailable = PtrTraits::NumLowBitsAvailable - IntBits }; 2204d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner}; 2214d4177b9b3ab634e852be1c0a7565a4ec1c7df93Chris Lattner 22234b763694e74ee16e68fd85488bfe0443c51170dChris Lattner} // end namespace llvm 22334b763694e74ee16e68fd85488bfe0443c51170dChris Lattner#endif 224