X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetData.cpp;h=20e7522e5036f8fef6c6798ae06108d82d6e7a99;hb=d3e0faca06397b652640de09d65b9c6cbd41da56;hp=761ae00ae373ea5e7ac2fe4eb215d69fce1b4554;hpb=3cac88ac9e32070d46de011b01e62e316276d527;p=oota-llvm.git diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 761ae00ae37..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; @@ -163,11 +173,10 @@ uint64_t TargetData::getIndexedOffset(const Type *ptrTy, 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. - int64_t elementSize = (int64_t)getTypeSize(Ty); + // Both must be known constants, or the index shd be 0; else this fails. int64_t arrayIdx = cast(Idx[CurIDX])->getValue(); - Result += (uint64_t)(arrayIdx * elementSize); + 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");