forked from OSchip/llvm-project
Add a GetElementPtrInst::getIndexedType that accepts uint64_t's instead of just Value*'s.
llvm-svn: 54157
This commit is contained in:
parent
bf83579b30
commit
0446862796
|
@ -408,9 +408,6 @@ class GetElementPtrInst : public Instruction {
|
|||
/// Null is returned if the indices are invalid for the specified
|
||||
/// pointer type.
|
||||
///
|
||||
static const Type *getIndexedType(const Type *Ptr,
|
||||
Value* const *Idx, unsigned NumIdx);
|
||||
|
||||
template<typename InputIterator>
|
||||
static const Type *getIndexedType(const Type *Ptr,
|
||||
InputIterator IdxBegin,
|
||||
|
@ -509,6 +506,13 @@ public:
|
|||
typename std::iterator_traits<InputIterator>::
|
||||
iterator_category());
|
||||
}
|
||||
|
||||
static const Type *getIndexedType(const Type *Ptr,
|
||||
Value* const *Idx, unsigned NumIdx);
|
||||
|
||||
static const Type *getIndexedType(const Type *Ptr,
|
||||
uint64_t const *Idx, unsigned NumIdx);
|
||||
|
||||
static const Type *getIndexedType(const Type *Ptr, Value *Idx);
|
||||
|
||||
inline op_iterator idx_begin() { return op_begin()+1; }
|
||||
|
|
|
@ -1026,12 +1026,16 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx,
|
|||
// getIndexedType - Returns the type of the element that would be loaded with
|
||||
// a load instruction with the specified parameters.
|
||||
//
|
||||
// The Idxs pointer should point to a continuous piece of memory containing the
|
||||
// indices, either as Value* or uint64_t.
|
||||
//
|
||||
// A null type is returned if the indices are invalid for the specified
|
||||
// pointer type.
|
||||
//
|
||||
const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
||||
Value* const *Idxs,
|
||||
unsigned NumIdx) {
|
||||
template <typename IndexTy>
|
||||
static const Type* getIndexedTypeInternal(const Type *Ptr,
|
||||
IndexTy const *Idxs,
|
||||
unsigned NumIdx) {
|
||||
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
|
||||
if (!PTy) return 0; // Type isn't a pointer type!
|
||||
const Type *Agg = PTy->getElementType();
|
||||
|
@ -1044,7 +1048,7 @@ const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
|||
for (; CurIdx != NumIdx; ++CurIdx) {
|
||||
const CompositeType *CT = dyn_cast<CompositeType>(Agg);
|
||||
if (!CT || isa<PointerType>(CT)) return 0;
|
||||
Value *Index = Idxs[CurIdx];
|
||||
IndexTy Index = Idxs[CurIdx];
|
||||
if (!CT->indexValid(Index)) return 0;
|
||||
Agg = CT->getTypeAtIndex(Index);
|
||||
|
||||
|
@ -1058,6 +1062,18 @@ const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
|||
return CurIdx == NumIdx ? Agg : 0;
|
||||
}
|
||||
|
||||
const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
||||
Value* const *Idxs,
|
||||
unsigned NumIdx) {
|
||||
return getIndexedTypeInternal(Ptr, Idxs, NumIdx);
|
||||
}
|
||||
|
||||
const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
||||
uint64_t const *Idxs,
|
||||
unsigned NumIdx) {
|
||||
return getIndexedTypeInternal(Ptr, Idxs, NumIdx);
|
||||
}
|
||||
|
||||
const Type* GetElementPtrInst::getIndexedType(const Type *Ptr, Value *Idx) {
|
||||
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
|
||||
if (!PTy) return 0; // Type isn't a pointer type!
|
||||
|
|
Loading…
Reference in New Issue