X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetData.cpp;h=20e7522e5036f8fef6c6798ae06108d82d6e7a99;hb=d3e0faca06397b652640de09d65b9c6cbd41da56;hp=7c55f6730ed2d9da351ca03999552ad27d4e0b7d;hpb=f519b999a62996b91923d5aa3d71fba86291b4f3;p=oota-llvm.git diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 7c55f6730ed..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; @@ -157,17 +167,16 @@ uint64_t TargetData::getIndexedOffset(const Type *ptrTy, assert(isa(Ty) && "Illegal argument for getIndexedOffset()"); uint64_t Result = 0; - for (unsigned CurIDX = 0; CurIDX < Idx.size(); ++CurIDX) { - if (Idx[CurIDX]->getType() == Type::UIntTy) { + 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(); // Get the array index and the size of each array element. - // Both must be known constants, or this will fail. - // Also, the product needs to be sign-extended from 32 to 64 bits. - uint64_t elementSize = this->getTypeSize(Ty); - uint64_t arrayIdx = cast(Idx[CurIDX])->getValue(); - Result += (uint64_t) (int) (arrayIdx * elementSize); // sign-extend + // 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");