summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-05-07 20:00:33 +0000
committerChris Lattner <sabre@nondot.org>2002-05-07 20:00:33 +0000
commit8b1e4d63feb5664aea9d60f94a78112436a3338c (patch)
treefbe1266ac9da31a31fa84b298557e62d3c6c9fe0 /llvm/lib/Target
parentac70e1cdd039549d572542761938699148d36459 (diff)
downloadbcm5719-llvm-8b1e4d63feb5664aea9d60f94a78112436a3338c.tar.gz
bcm5719-llvm-8b1e4d63feb5664aea9d60f94a78112436a3338c.zip
Extend TargetData::getIndexedOffset to support arrays and pointers!
llvm-svn: 2535
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/TargetData.cpp23
1 files changed, 13 insertions, 10 deletions
diff --git a/llvm/lib/Target/TargetData.cpp b/llvm/lib/Target/TargetData.cpp
index 0df95209b55..85c9e683da4 100644
--- a/llvm/lib/Target/TargetData.cpp
+++ b/llvm/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<Value*> &Idx) const {
- const PointerType *PtrTy = cast<const PointerType>(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<const StructType>(Ty)) {
+ for (unsigned CurIDX = 0, E = Idx.size(); CurIDX != E; ++CurIDX) {
+ if (const StructType *STy = dyn_cast<StructType>(Ty)) {
assert(Idx[CurIDX]->getType() == Type::UByteTy && "Illegal struct idx");
unsigned FieldNo = cast<ConstantUInt>(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<const ArrayType>(Ty)) {
- assert(0 && "Loading from arrays not implemented yet!");
+ } else if (const SequentialType *STy = dyn_cast<SequentialType>(Ty)) {
+ assert(Idx[CurIDX]->getType() == Type::UIntTy &&"Illegal sequential idx");
+ assert(isa<ConstantUInt>(Idx[CurIDX]) &&
+ "getIndexedOffset cannot compute offset of non-constant index!");
+
+ unsigned IndexNo = cast<ConstantUInt>(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
}
}
OpenPOWER on IntegriCloud