X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetData.cpp;h=20e7522e5036f8fef6c6798ae06108d82d6e7a99;hb=d3e0faca06397b652640de09d65b9c6cbd41da56;hp=8712fc9f5987744405855bccf7922bf85a76c9e8;hpb=0c0edf8afc35a42b15a24ebb5fa5f3fc674290ae;p=oota-llvm.git diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 8712fc9f598..20e7522e503 100644 --- a/lib/Target/TargetData.cpp +++ b/lib/Target/TargetData.cpp @@ -14,6 +14,13 @@ #include "llvm/DerivedTypes.h" #include "llvm/Constants.h" +// Handle the Pass registration stuff neccesary to use TargetData's. +namespace { + // Register the default SparcV9 implementation... + RegisterPass X("targetdata", "Target Data Layout"); +} + + static inline void getTypeInfo(const Type *Ty, const TargetData *TD, uint64_t &Size, unsigned char &Alignment); @@ -74,14 +81,17 @@ Annotation *TargetData::TypeAnFactory(AnnotationID AID, const Annotable *T, //===----------------------------------------------------------------------===// TargetData::TargetData(const std::string &TargetName, - unsigned char IntRegSize, unsigned char PtrSize, - unsigned char PtrAl, unsigned char DoubleAl, - unsigned char FloatAl, unsigned char LongAl, - unsigned char IntAl, unsigned char ShortAl, - unsigned char ByteAl) + bool isLittleEndian, unsigned char SubWordSize, + unsigned char IntRegSize, unsigned char PtrSize, + unsigned char PtrAl, unsigned char DoubleAl, + unsigned char FloatAl, unsigned char LongAl, + unsigned char IntAl, unsigned char ShortAl, + unsigned char ByteAl) : AID(AnnotationManager::getID("TargetData::" + TargetName)) { AnnotationManager::registerAnnotationFactory(AID, TypeAnFactory, this); + LittleEndian = isLittleEndian; + SubWordDataSize = SubWordSize; IntegerRegSize = IntRegSize; PointerSize = PtrSize; PointerAlignment = PtrAl; @@ -153,20 +163,21 @@ 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::LongTy) { + // Update Ty to refer to current element + Ty = cast(Ty)->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. - // Both must be known constants, or this will fail. - unsigned arrayIdx = cast(Idx[CurIDX])->getValue(); - uint64_t elementSize = this->getTypeSize(Ty); - Result += arrayIdx * elementSize; - + // Both must be known constants, or the index shd be 0; else this fails. + int64_t arrayIdx = cast(Idx[CurIDX])->getValue(); + Result += arrayIdx == 0? 0 + : (uint64_t) (arrayIdx * (int64_t) getTypeSize(Ty)); + } 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 +188,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];