diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 8712fc9f598..08a6536b78a 100644 --- a/lib/Target/TargetData.cpp +++ b/lib/Target/TargetData.cpp @@ -153,12 +153,10 @@ unsigned char TargetData::getTypeAlignment(const Type *Ty) const { uint64_t TargetData::getIndexedOffset(const Type *ptrTy, const std::vector &Idx) const { - const PointerType *PtrTy = cast(ptrTy); + const Type *Ty = ptrTy; + assert(isa(Ty) && "Illegal argument for getIndexedOffset()"); uint64_t Result = 0; - // Get the type pointed to... - const Type *Ty = PtrTy->getElementType(); - for (unsigned CurIDX = 0; CurIDX < Idx.size(); ++CurIDX) { if (Idx[CurIDX]->getType() == Type::UIntTy) { // Get the array index and the size of each array element. @@ -166,7 +164,10 @@ uint64_t TargetData::getIndexedOffset(const Type *ptrTy, unsigned arrayIdx = cast(Idx[CurIDX])->getValue(); uint64_t elementSize = this->getTypeSize(Ty); Result += arrayIdx * elementSize; - + + // Update Ty to refer to current element + Ty = cast(Ty)->getElementType(); + } else if (const StructType *STy = dyn_cast(Ty)) { assert(Idx[CurIDX]->getType() == Type::UByteTy && "Illegal struct idx"); unsigned FieldNo = cast(Idx[CurIDX])->getValue(); @@ -177,7 +178,7 @@ uint64_t TargetData::getIndexedOffset(const Type *ptrTy, // Add in the offset, as calculated by the structure layout info... assert(FieldNo < Layout->MemberOffsets.size() &&"FieldNo out of range!"); Result += Layout->MemberOffsets[FieldNo]; - + // Update Ty to refer to current element Ty = STy->getElementTypes()[FieldNo];