aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDavid Greene <greened@obbligato.org>2007-09-04 15:46:09 +0000
committerDavid Greene <greened@obbligato.org>2007-09-04 15:46:09 +0000
commit393be88e51bce88754c8b5615e8a295adbdab1e2 (patch)
tree3e79ac89138858c59c1f73af09b64527778ad944 /include
parent23ca9c580eb8df31bd537a084ed450eca8ebcf58 (diff)
downloadexternal_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.h107
-rw-r--r--include/llvm/Support/LLVMBuilder.h13
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));
}
//===--------------------------------------------------------------------===//