SmallVector<unsigned, 4> Indices;
ExtractValueInst(const ExtractValueInst &EVI);
- void init(Value *Agg, const unsigned *Idx, unsigned NumIdx,
+ void init(const unsigned *Idx, unsigned NumIdx,
const std::string &Name);
- void init(Value *Agg, unsigned Idx, const std::string &Name);
+ void init(unsigned Idx, const std::string &Name);
template<typename InputIterator>
- void init(Value *Agg, InputIterator IdxBegin, InputIterator IdxEnd,
+ void init(InputIterator IdxBegin, InputIterator IdxEnd,
const std::string &Name,
// This argument ensures that we have an iterator we can
// do arithmetic on in constant time
assert(NumIdx > 0 && "ExtractValueInst must have at least one index");
// This requires that the iterator points to contiguous memory.
- init(Agg, &*IdxBegin, NumIdx, Name); // FIXME: for the general case
+ init(&*IdxBegin, NumIdx, Name); // FIXME: for the general case
// we have to build an array here
}
if (NumIdx > 0)
// This requires that the iterator points to contiguous memory.
- return getIndexedType(Ptr, (const unsigned *)&*IdxBegin, NumIdx);
+ return getIndexedType(Ptr, &*IdxBegin, NumIdx);
else
return getIndexedType(Ptr, (const unsigned *)0, NumIdx);
}
InputIterator IdxBegin, InputIterator IdxEnd,
const std::string &Name, BasicBlock *InsertAtEnd);
- /// Constructors - These two constructors are convenience methods because one
- /// and two index extractvalue instructions are so common.
- ExtractValueInst(Value *Agg, unsigned Idx, const std::string &Name = "",
- Instruction *InsertBefore = 0);
- ExtractValueInst(Value *Agg, unsigned Idx,
- const std::string &Name, BasicBlock *InsertAtEnd);
-
// allocate space for exactly one operand
void *operator new(size_t s) {
return User::operator new(s, 1);
static ExtractValueInst *Create(Value *Agg, unsigned Idx,
const std::string &Name = "",
Instruction *InsertBefore = 0) {
- return new ExtractValueInst(Agg, Idx, Name, InsertBefore);
+ unsigned Idxs[1] = { Idx };
+ return new ExtractValueInst(Agg, Idxs, Idxs + 1, Name, InsertBefore);
}
static ExtractValueInst *Create(Value *Agg, unsigned Idx,
const std::string &Name,
BasicBlock *InsertAtEnd) {
- return new ExtractValueInst(Agg, Idx, Name, InsertAtEnd);
+ unsigned Idxs[1] = { Idx };
+ return new ExtractValueInst(Agg, Idxs, Idxs + 1, Name, InsertAtEnd);
}
virtual ExtractValueInst *clone() const;
}
static const Type *getIndexedType(const Type *Ptr, unsigned Idx);
- inline const unsigned *idx_begin() const { return Indices.begin(); }
- inline const unsigned *idx_end() const { return Indices.end(); }
+ typedef const unsigned* idx_iterator;
+ inline idx_iterator idx_begin() const { return Indices.begin(); }
+ inline idx_iterator idx_end() const { return Indices.end(); }
Value *getAggregateOperand() {
return getOperand(0);
: UnaryInstruction(checkType(getIndexedType(Agg->getType(),
IdxBegin, IdxEnd)),
ExtractValue, Agg, InsertBefore) {
- init(Agg, IdxBegin, IdxEnd, Name,
+ init(IdxBegin, IdxEnd, Name,
typename std::iterator_traits<InputIterator>::iterator_category());
}
template<typename InputIterator>
: UnaryInstruction(checkType(getIndexedType(Agg->getType(),
IdxBegin, IdxEnd)),
ExtractValue, Agg, InsertAtEnd) {
- init(Agg, IdxBegin, IdxEnd, Name,
+ init(IdxBegin, IdxEnd, Name,
typename std::iterator_traits<InputIterator>::iterator_category());
}
return reinterpret_cast<const PointerType*>(Instruction::getType());
}
- inline const unsigned *idx_begin() const { return Indices.begin(); }
- inline const unsigned *idx_end() const { return Indices.end(); }
+ typedef const unsigned* idx_iterator;
+ inline idx_iterator idx_begin() const { return Indices.begin(); }
+ inline idx_iterator idx_end() const { return Indices.end(); }
Value *getAggregateOperand() {
return getOperand(0);