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
|
/// Null is returned if the indices are invalid for the specified
|
||||||
/// pointer type.
|
/// pointer type.
|
||||||
///
|
///
|
||||||
static const Type *getIndexedType(const Type *Ptr,
|
|
||||||
Value* const *Idx, unsigned NumIdx);
|
|
||||||
|
|
||||||
template<typename InputIterator>
|
template<typename InputIterator>
|
||||||
static const Type *getIndexedType(const Type *Ptr,
|
static const Type *getIndexedType(const Type *Ptr,
|
||||||
InputIterator IdxBegin,
|
InputIterator IdxBegin,
|
||||||
|
@ -509,6 +506,13 @@ public:
|
||||||
typename std::iterator_traits<InputIterator>::
|
typename std::iterator_traits<InputIterator>::
|
||||||
iterator_category());
|
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);
|
static const Type *getIndexedType(const Type *Ptr, Value *Idx);
|
||||||
|
|
||||||
inline op_iterator idx_begin() { return op_begin()+1; }
|
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
|
// getIndexedType - Returns the type of the element that would be loaded with
|
||||||
// a load instruction with the specified parameters.
|
// 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
|
// A null type is returned if the indices are invalid for the specified
|
||||||
// pointer type.
|
// pointer type.
|
||||||
//
|
//
|
||||||
const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
template <typename IndexTy>
|
||||||
Value* const *Idxs,
|
static const Type* getIndexedTypeInternal(const Type *Ptr,
|
||||||
unsigned NumIdx) {
|
IndexTy const *Idxs,
|
||||||
|
unsigned NumIdx) {
|
||||||
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
|
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
|
||||||
if (!PTy) return 0; // Type isn't a pointer type!
|
if (!PTy) return 0; // Type isn't a pointer type!
|
||||||
const Type *Agg = PTy->getElementType();
|
const Type *Agg = PTy->getElementType();
|
||||||
|
@ -1044,7 +1048,7 @@ const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
||||||
for (; CurIdx != NumIdx; ++CurIdx) {
|
for (; CurIdx != NumIdx; ++CurIdx) {
|
||||||
const CompositeType *CT = dyn_cast<CompositeType>(Agg);
|
const CompositeType *CT = dyn_cast<CompositeType>(Agg);
|
||||||
if (!CT || isa<PointerType>(CT)) return 0;
|
if (!CT || isa<PointerType>(CT)) return 0;
|
||||||
Value *Index = Idxs[CurIdx];
|
IndexTy Index = Idxs[CurIdx];
|
||||||
if (!CT->indexValid(Index)) return 0;
|
if (!CT->indexValid(Index)) return 0;
|
||||||
Agg = CT->getTypeAtIndex(Index);
|
Agg = CT->getTypeAtIndex(Index);
|
||||||
|
|
||||||
|
@ -1058,6 +1062,18 @@ const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
||||||
return CurIdx == NumIdx ? Agg : 0;
|
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 Type* GetElementPtrInst::getIndexedType(const Type *Ptr, Value *Idx) {
|
||||||
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
|
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
|
||||||
if (!PTy) return 0; // Type isn't a pointer type!
|
if (!PTy) return 0; // Type isn't a pointer type!
|
||||||
|
|
Loading…
Reference in New Issue