From a163fdfc80e46ad93afe2fab5bd1d99a550c3868 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 7 May 2002 20:00:33 +0000 Subject: [PATCH] Extend TargetData::getIndexedOffset to support arrays and pointers! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2535 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/TargetData.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 0df95209b55..85c9e683da4 100644 --- a/lib/Target/TargetData.cpp +++ b/lib/Target/TargetData.cpp @@ -145,16 +145,12 @@ unsigned char TargetData::getTypeAlignment(const Type *Ty) const { return Align; } -unsigned TargetData::getIndexedOffset(const Type *ptrTy, +unsigned TargetData::getIndexedOffset(const Type *Ty, const std::vector &Idx) const { - const PointerType *PtrTy = cast(ptrTy); unsigned Result = 0; - // Get the type pointed to... - const Type *Ty = PtrTy->getElementType(); - - for (unsigned CurIDX = 0; CurIDX < Idx.size(); ++CurIDX) { - if (const StructType *STy = dyn_cast(Ty)) { + for (unsigned CurIDX = 0, E = Idx.size(); CurIDX != E; ++CurIDX) { + if (const StructType *STy = dyn_cast(Ty)) { assert(Idx[CurIDX]->getType() == Type::UByteTy && "Illegal struct idx"); unsigned FieldNo = cast(Idx[CurIDX])->getValue(); @@ -168,10 +164,17 @@ unsigned TargetData::getIndexedOffset(const Type *ptrTy, // Update Ty to refer to current element Ty = STy->getElementTypes()[FieldNo]; - } else if (isa(Ty)) { - assert(0 && "Loading from arrays not implemented yet!"); + } else if (const SequentialType *STy = dyn_cast(Ty)) { + assert(Idx[CurIDX]->getType() == Type::UIntTy &&"Illegal sequential idx"); + assert(isa(Idx[CurIDX]) && + "getIndexedOffset cannot compute offset of non-constant index!"); + + unsigned IndexNo = cast(Idx[CurIDX])->getValue(); + Ty = STy->getElementType(); + + Result += IndexNo*getTypeSize(Ty); } else { - assert(0 && "Indexing type that is not struct or array?"); + assert(0 && "Indexing type that is not struct, array, or pointer?"); return 0; // Load directly through ptr } } -- 2.34.1