[LLVMdev] GEP::getIndexValid() with other iterators

Chris Lattner clattner at apple.com
Wed Jul 23 10:22:54 PDT 2008


On Jul 23, 2008, at 8:43 AM, Matthijs Kooijman wrote:
> I did use a template function to prevent duplicating code, but since  
> it is
> only used in the implementation of two getIndexedType() methods, it  
> is in the
> cpp file.
>
> So, is this better?

Looks great to me, please commit!  Thanks Matthijs,

-Chris

>
>
> Gr.
>
> Matthijs
>
> Index: lib/VMCore/Instructions.cpp
> ===================================================================
> --- lib/VMCore/Instructions.cpp	(revision 53716)
> +++ lib/VMCore/Instructions.cpp	(working copy)
> @@ -1071,12 +1071,16 @@
> // getIndexedType - Returns the type of the element that would be  
> loaded with
> // a load instruction with the specified parameters.
> //
> +// The Idxs pointer should point to a continuous piece of memory  
> containing the
> +// indices, either as Value* or uint64_t.
> +//
> // A null type is returned if the indices are invalid for the  
> specified
> // pointer type.
> //
> -const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
> -                                              Value* const *Idxs,
> -                                              unsigned NumIdx) {
> +template <typename IndexTy>
> +static const Type* getIndexedTypeInternal(const Type *Ptr,
> +                                  IndexTy const *Idxs,
> +                                  unsigned NumIdx) {
>   const PointerType *PTy = dyn_cast<PointerType>(Ptr);
>   if (!PTy) return 0;   // Type isn't a pointer type!
>   const Type *Agg = PTy->getElementType();
> @@ -1089,7 +1093,7 @@
>   for (; CurIdx != NumIdx; ++CurIdx) {
>     const CompositeType *CT = dyn_cast<CompositeType>(Agg);
>     if (!CT || isa<PointerType>(CT)) return 0;
> -    Value *Index = Idxs[CurIdx];
> +    IndexTy Index = Idxs[CurIdx];
>     if (!CT->indexValid(Index)) return 0;
>     Agg = CT->getTypeAtIndex(Index);
>
> @@ -1103,6 +1107,18 @@
>   return CurIdx == NumIdx ? Agg : 0;
> }
>
> +const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
> +                                              Value* const *Idxs,
> +                                              unsigned NumIdx) {
> +  return getIndexedTypeInternal(Ptr, Idxs, NumIdx);
> +}
> +
> +const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
> +                                              uint64_t const *Idxs,
> +                                              unsigned NumIdx) {
> +  return getIndexedTypeInternal(Ptr, Idxs, NumIdx);
> +}
> +
> const Type* GetElementPtrInst::getIndexedType(const Type *Ptr, Value  
> *Idx) {
>   const PointerType *PTy = dyn_cast<PointerType>(Ptr);
>   if (!PTy) return 0;   // Type isn't a pointer type!
> Index: include/llvm/Instructions.h
> ===================================================================
> --- include/llvm/Instructions.h	(revision 53716)
> +++ include/llvm/Instructions.h	(working copy)
> @@ -407,9 +407,6 @@
>   /// Null is returned if the indices are invalid for the specified
>   /// pointer type.
>   ///
> -  static const Type *getIndexedType(const Type *Ptr,
> -                                    Value* const *Idx, unsigned  
> NumIdx);
> -
>   template<typename InputIterator>
>   static const Type *getIndexedType(const Type *Ptr,
>                                     InputIterator IdxBegin,
> @@ -508,6 +505,13 @@
>                           typename  
> std::iterator_traits<InputIterator>::
>                           iterator_category());
>   }
> +
> +  static const Type *getIndexedType(const Type *Ptr,
> +                                    Value* const *Idx, unsigned  
> NumIdx);
> +
> +  static const Type *getIndexedType(const Type *Ptr,
> +                                    uint64_t const *Idx, unsigned  
> NumIdx);
> +
>   static const Type *getIndexedType(const Type *Ptr, Value *Idx);
>
>   inline op_iterator       idx_begin()       { return op_begin()+1; }
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list