4#ifndef SVF_GEPTYPEBRIDGEITERATOR_H
5#define SVF_GEPTYPEBRIDGEITERATOR_H
7#include "llvm/IR/DerivedTypes.h"
8#include "llvm/IR/Operator.h"
9#include "llvm/IR/User.h"
10#include "llvm/ADT/PointerIntPair.h"
11#include "llvm/IR/GetElementPtrTypeIterator.h"
16template<
typename ItTy = User::const_op_iterator>
34 I.
CurTy.setPointer(Ty);
43 I.
CurTy.setPointer(Ty);
70 return PointerType::get(
CurTy.getPointer()->getContext(),
AddrSpace);
71 return CurTy.getPointer();
76 assert(
false &&
"needs to be refactored");
78 return CurTy.getPointer();
79 Type* CT =
CurTy.getPointer();
80 if (
auto ST = dyn_cast<StructType>(CT))
82 else if (
auto Array = dyn_cast<ArrayType>(CT))
83 return Array->getElementType();
84 else if (
auto Vector = dyn_cast<VectorType>(CT))
85 return Vector->getElementType();
99 return const_cast<Value*
>(&**
OpIt);
105 if (
CurTy.getInt() )
109 else if ( Type* CT =
CurTy.getPointer() )
111 if (
auto ST = dyn_cast<StructType>(CT))
113 else if (
auto Array = dyn_cast<ArrayType>(CT))
114 CurTy.setPointer(Array->getElementType());
115 else if (
auto Vector = dyn_cast<VectorType>(CT))
116 CurTy.setPointer(Vector->getElementType());
118 CurTy.setPointer(
nullptr);
122 CurTy.setPointer(
nullptr);
143 auto *GEPOp = llvm::cast<GEPOperator>(GEP);
145 llvm::cast<PointerType>(GEPOp->getPointerOperandType()->getScalarType())->getAddressSpace(),
146 GEP->op_begin() + 1);
156 auto &GEPOp = llvm::cast<GEPOperator>(GEP);
158 llvm::cast<PointerType>(GEPOp.getPointerOperandType()->getScalarType())->getAddressSpace(),
bool operator==(const generic_bridge_gep_type_iterator &x) const
static generic_bridge_gep_type_iterator begin(Type *Ty, unsigned AddrSpace, ItTy It)
static generic_bridge_gep_type_iterator end(ItTy It)
generic_bridge_gep_type_iterator operator++(int)
ptrdiff_t difference_type
Type * getIndexedType() const
Value * getOperand() const
generic_bridge_gep_type_iterator & operator++()
generic_bridge_gep_type_iterator()
static generic_bridge_gep_type_iterator begin(Type *Ty, ItTy It)
bool operator!=(const generic_bridge_gep_type_iterator &x) const
std::forward_iterator_tag iterator_category
Type * operator->() const
PointerIntPair< Type *, 1 > CurTy
bridge_gep_iterator bridge_gep_end(const User *GEP)
bridge_gep_iterator bridge_gep_begin(const User *GEP)
generic_bridge_gep_type_iterator bridge_gep_iterator