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#if LLVM_VERSION_MAJOR >= 11
80 Type* CT =
CurTy.getPointer();
81 if (
auto ST = dyn_cast<StructType>(CT))
83 else if (
auto Array = dyn_cast<ArrayType>(CT))
84 return Array->getElementType();
85 else if (
auto Vector = dyn_cast<VectorType>(CT))
86 return Vector->getElementType();
90 CompositeType *CT = llvm::cast<CompositeType>(
CurTy.getPointer() );
104 return const_cast<Value*
>(&**
OpIt);
110 if (
CurTy.getInt() )
114#if LLVM_VERSION_MAJOR >= 11
115 else if ( Type* CT =
CurTy.getPointer() )
117 if (
auto ST = dyn_cast<StructType>(CT))
119 else if (
auto Array = dyn_cast<ArrayType>(CT))
120 CurTy.setPointer(Array->getElementType());
121 else if (
auto Vector = dyn_cast<VectorType>(CT))
122 CurTy.setPointer(Vector->getElementType());
124 CurTy.setPointer(
nullptr);
127 else if ( CompositeType * CT = dyn_cast<CompositeType>(
CurTy.getPointer()) )
134 CurTy.setPointer(
nullptr);
155 auto *GEPOp = llvm::cast<GEPOperator>(GEP);
157 llvm::cast<PointerType>(GEPOp->getPointerOperandType()->getScalarType())->getAddressSpace(),
158 GEP->op_begin() + 1);
168 auto &GEPOp = llvm::cast<GEPOperator>(GEP);
170 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