diff options
author | David Greene <greened@obbligato.org> | 2007-09-04 15:46:09 +0000 |
---|---|---|
committer | David Greene <greened@obbligato.org> | 2007-09-04 15:46:09 +0000 |
commit | 393be88e51bce88754c8b5615e8a295adbdab1e2 (patch) | |
tree | 3e79ac89138858c59c1f73af09b64527778ad944 /include | |
parent | 23ca9c580eb8df31bd537a084ed450eca8ebcf58 (diff) | |
download | external_llvm-393be88e51bce88754c8b5615e8a295adbdab1e2.zip external_llvm-393be88e51bce88754c8b5615e8a295adbdab1e2.tar.gz external_llvm-393be88e51bce88754c8b5615e8a295adbdab1e2.tar.bz2 |
Update GEP constructors to use an iterator interface to fix
GLIBCXX_DEBUG issues.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41697 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Instructions.h | 107 | ||||
-rw-r--r-- | include/llvm/Support/LLVMBuilder.h | 13 |
2 files changed, 97 insertions, 23 deletions
diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h index 328932a..5aeccec 100644 --- a/include/llvm/Instructions.h +++ b/include/llvm/Instructions.h @@ -367,6 +367,14 @@ public: // GetElementPtrInst Class //===----------------------------------------------------------------------===// +// checkType - Simple wrapper function to give a better assertion failure +// message on bad indexes for a gep instruction. +// +static inline const Type *checkType(const Type *Ty) { + assert(Ty && "Invalid GetElementPtrInst indices for type!"); + return Ty; +} + /// GetElementPtrInst - an instruction for type-safe pointer arithmetic to /// access elements of arrays and structs /// @@ -380,28 +388,94 @@ class GetElementPtrInst : public Instruction { OL[i].init(GEPIOL[i], this); } void init(Value *Ptr, Value* const *Idx, unsigned NumIdx); - void init(Value *Ptr, Value *Idx0, Value *Idx1); void init(Value *Ptr, Value *Idx); + + template<typename InputIterator> + void init(Value *Ptr, InputIterator IdxBegin, InputIterator IdxEnd, + const std::string &Name, + // This argument ensures that we have an iterator we can + // do arithmetic on in constant time + std::random_access_iterator_tag) { + typename std::iterator_traits<InputIterator>::difference_type NumIdx = + std::distance(IdxBegin, IdxEnd); + + if (NumIdx > 0) { + // This requires that the itoerator points to contiguous memory. + init(Ptr, &*IdxBegin, NumIdx); + } + else { + init(Ptr, 0, NumIdx); + } + + setName(Name); + } + + /// getIndexedType - Returns the type of the element that would be loaded with + /// a load instruction with the specified parameters. + /// + /// A null type is returned if the indices are invalid for the specified + /// pointer type. + /// + static const Type *getIndexedType(const Type *Ptr, + Value* const *Idx, unsigned NumIdx, + bool AllowStructLeaf = false); + + template<typename InputIterator> + static const Type *getIndexedType(const Type *Ptr, + InputIterator IdxBegin, + InputIterator IdxEnd, + bool AllowStructLeaf, + // This argument ensures that we + // have an iterator we can do + // arithmetic on in constant time + std::random_access_iterator_tag) { + typename std::iterator_traits<InputIterator>::difference_type NumIdx = + std::distance(IdxBegin, IdxEnd); + + if (NumIdx > 0) { + // This requires that the iterator points to contiguous memory. + return(getIndexedType(Ptr, (Value *const *)&*IdxBegin, NumIdx, + AllowStructLeaf)); + } + else { + return(getIndexedType(Ptr, (Value *const*)0, NumIdx, AllowStructLeaf)); + } + } + public: /// Constructors - Create a getelementptr instruction with a base pointer an /// list of indices. The first ctor can optionally insert before an existing /// instruction, the second appends the new instruction to the specified /// BasicBlock. - GetElementPtrInst(Value *Ptr, Value* const *Idx, unsigned NumIdx, - const std::string &Name = "", Instruction *InsertBefore =0); - GetElementPtrInst(Value *Ptr, Value* const *Idx, unsigned NumIdx, - const std::string &Name, BasicBlock *InsertAtEnd); - + template<typename InputIterator> + GetElementPtrInst(Value *Ptr, InputIterator IdxBegin, + InputIterator IdxEnd, + const std::string &Name = "", + Instruction *InsertBefore =0) + : Instruction(PointerType::get( + checkType(getIndexedType(Ptr->getType(), + IdxBegin, IdxEnd, true))), + GetElementPtr, 0, 0, InsertBefore) { + init(Ptr, IdxBegin, IdxEnd, Name, + typename std::iterator_traits<InputIterator>::iterator_category()); + } + template<typename InputIterator> + GetElementPtrInst(Value *Ptr, InputIterator IdxBegin, InputIterator IdxEnd, + const std::string &Name, BasicBlock *InsertAtEnd) + : Instruction(PointerType::get( + checkType(getIndexedType(Ptr->getType(), + IdxBegin, IdxEnd, true))), + GetElementPtr, 0, 0, InsertAtEnd) { + init(Ptr, IdxBegin, IdxEnd, Name, + typename std::iterator_traits<InputIterator>::iterator_category()); + } + /// Constructors - These two constructors are convenience methods because one /// and two index getelementptr instructions are so common. GetElementPtrInst(Value *Ptr, Value *Idx, const std::string &Name = "", Instruction *InsertBefore =0); GetElementPtrInst(Value *Ptr, Value *Idx, const std::string &Name, BasicBlock *InsertAtEnd); - GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1, - const std::string &Name = "", Instruction *InsertBefore =0); - GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1, - const std::string &Name, BasicBlock *InsertAtEnd); ~GetElementPtrInst(); virtual GetElementPtrInst *clone() const; @@ -417,12 +491,15 @@ public: /// A null type is returned if the indices are invalid for the specified /// pointer type. /// + template<typename InputIterator> static const Type *getIndexedType(const Type *Ptr, - Value* const *Idx, unsigned NumIdx, - bool AllowStructLeaf = false); - - static const Type *getIndexedType(const Type *Ptr, Value *Idx0, Value *Idx1, - bool AllowStructLeaf = false); + InputIterator IdxBegin, + InputIterator IdxEnd, + bool AllowStructLeaf = false) { + return(getIndexedType(Ptr, IdxBegin, IdxEnd, AllowStructLeaf, + typename std::iterator_traits<InputIterator>:: + iterator_category())); + } static const Type *getIndexedType(const Type *Ptr, Value *Idx); inline op_iterator idx_begin() { return op_begin()+1; } diff --git a/include/llvm/Support/LLVMBuilder.h b/include/llvm/Support/LLVMBuilder.h index ce403f1..cdfd961 100644 --- a/include/llvm/Support/LLVMBuilder.h +++ b/include/llvm/Support/LLVMBuilder.h @@ -217,16 +217,13 @@ public: StoreInst *CreateStore(Value *Val, Value *Ptr, bool isVolatile = false) { return Insert(new StoreInst(Val, Ptr, isVolatile)); } - GetElementPtrInst *CreateGEP(Value *Ptr, Value* const *Idx, unsigned NumIdx, - const char *Name = "") { - return Insert(new GetElementPtrInst(Ptr, Idx, NumIdx, Name)); + template<typename InputIterator> + GetElementPtrInst *CreateGEP(Value *Ptr, InputIterator IdxBegin, + InputIterator IdxEnd, const char *Name = "") { + return(Insert(new GetElementPtrInst(Ptr, IdxBegin, IdxEnd, Name))); } GetElementPtrInst *CreateGEP(Value *Ptr, Value *Idx, const char *Name = "") { - return Insert(new GetElementPtrInst(Ptr, &Idx, 1, Name)); - } - GetElementPtrInst *CreateGEP(Value *Ptr, Value *Idx0, Value *Idx1, - const char *Name = "") { - return Insert(new GetElementPtrInst(Ptr, Idx0, Idx1, Name)); + return Insert(new GetElementPtrInst(Ptr, Idx, Name)); } //===--------------------------------------------------------------------===// |