diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-08-04 20:52:39 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-08-04 20:52:39 +0000 |
commit | ed0030e2bc45b9d355a3f80ed783ac9b2026fb1f (patch) | |
tree | cdec6291b04684b678fb38b987dc17e8b99ebe75 /lib/Target/TargetData.cpp | |
parent | 99d4a38c77cf26706d5deedf170748a6fc4e97d8 (diff) |
Bug fix in TargetData::getIndexedOffset(): handle struct offset
after array offset correctly. The type was not being updated for
array offsets!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3246 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/TargetData.cpp')
-rw-r--r-- | lib/Target/TargetData.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 8712fc9f59..08a6536b78 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<Value*> &Idx) const { - const PointerType *PtrTy = cast<const PointerType>(ptrTy); + const Type *Ty = ptrTy; + assert(isa<PointerType>(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<ConstantUInt>(Idx[CurIDX])->getValue(); uint64_t elementSize = this->getTypeSize(Ty); Result += arrayIdx * elementSize; - + + // Update Ty to refer to current element + Ty = cast<SequentialType>(Ty)->getElementType(); + } else if (const StructType *STy = dyn_cast<const StructType>(Ty)) { assert(Idx[CurIDX]->getType() == Type::UByteTy && "Illegal struct idx"); unsigned FieldNo = cast<ConstantUInt>(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]; |