diff options
author | Micah Villmow <villmow@gmail.com> | 2012-10-24 15:52:52 +0000 |
---|---|---|
committer | Micah Villmow <villmow@gmail.com> | 2012-10-24 15:52:52 +0000 |
commit | aa76e9e2cf50af190de90bc778b7f7e42ef9ceff (patch) | |
tree | 5206b0fb0ac695e3ab1c9cf434b5a85195abf336 /lib/VMCore/DataLayout.cpp | |
parent | 3575222175b4982f380ff291bb17be67aadc0966 (diff) |
Add in support for getIntPtrType to get the pointer type based on the address space.
This checkin also adds in some tests that utilize these paths and updates some of the
clients.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166578 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/DataLayout.cpp')
-rw-r--r-- | lib/VMCore/DataLayout.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/lib/VMCore/DataLayout.cpp b/lib/VMCore/DataLayout.cpp index e6994be257..8d7a8e267c 100644 --- a/lib/VMCore/DataLayout.cpp +++ b/lib/VMCore/DataLayout.cpp @@ -660,13 +660,32 @@ unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const { return Log2_32(Align); } -/// getIntPtrType - Return an unsigned integer type that is the same size or -/// greater to the host pointer size. +/// getIntPtrType - Return an integer type that is the same size or +/// greater to the pointer size for the address space. IntegerType *DataLayout::getIntPtrType(LLVMContext &C, unsigned AddressSpace) const { return IntegerType::get(C, getPointerSizeInBits(AddressSpace)); } +/// getIntPtrType - Return an integer type that is the same size or +/// greater to the pointer size of the specific PointerType. +IntegerType *DataLayout::getIntPtrType(Type *Ty) const { + LLVMContext &C = Ty->getContext(); + // For pointers, we return the size for the specific address space. + if (Ty->isPointerTy()) return IntegerType::get(C, getTypeSizeInBits(Ty)); + // For vector of pointers, we return the size of the address space + // of the pointer type. + if (Ty->isVectorTy() && cast<VectorType>(Ty)->getElementType()->isPointerTy()) + return IntegerType::get(C, + getTypeSizeInBits(cast<VectorType>(Ty)->getElementType())); + // Otherwise return the address space for the default address space. + // An example of this occuring is that you want to get the IntPtr + // for all of the arguments in a function. However, the IntPtr + // for a non-pointer type cannot be determined by the type, so + // the default value is used. + return getIntPtrType(C, 0); +} + uint64_t DataLayout::getIndexedOffset(Type *ptrTy, ArrayRef<Value *> Indices) const { |