X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetData.cpp;h=20e7522e5036f8fef6c6798ae06108d82d6e7a99;hb=d3e0faca06397b652640de09d65b9c6cbd41da56;hp=8479c6c8dbdae0a92b230538a858fbe901ba84d3;hpb=31bcdb822fe9133b1973de51519d34e5813a6184;p=oota-llvm.git diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 8479c6c8dbd..20e7522e503 100644 --- a/lib/Target/TargetData.cpp +++ b/lib/Target/TargetData.cpp @@ -14,8 +14,15 @@ #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, - unsigned &Size, unsigned char &Alignment); + uint64_t &Size, unsigned char &Alignment); //===----------------------------------------------------------------------===// // Support for StructLayout Annotation @@ -32,8 +39,10 @@ StructLayout::StructLayout(const StructType *ST, const TargetData &TD) TE = ST->getElementTypes().end(); TI != TE; ++TI) { const Type *Ty = *TI; unsigned char A; - unsigned TySize, TyAlign; - getTypeInfo(Ty, &TD, TySize, A); TyAlign = A; + unsigned TyAlign; + uint64_t TySize; + getTypeInfo(Ty, &TD, TySize, A); + TyAlign = A; // Add padding if neccesary to make the data element aligned properly... if (StructSize % TyAlign != 0) @@ -43,7 +52,7 @@ StructLayout::StructLayout(const StructType *ST, const TargetData &TD) StructAlignment = std::max(TyAlign, StructAlignment); MemberOffsets.push_back(StructSize); - StructSize += TySize; // Consume space for this data item... + StructSize += TySize; // Consume space for this data item } // Add padding to the end of the struct so that it could be put in an array @@ -62,7 +71,7 @@ Annotation *TargetData::TypeAnFactory(AnnotationID AID, const Annotable *T, const TargetData &TD = *(const TargetData*)D; assert(AID == TD.AID && "Target data annotation ID mismatch!"); const Type *Ty = cast((const Value *)T); - assert(Ty->isStructType() && + assert(isa(Ty) && "Can only create StructLayout annotation on structs!"); return new StructLayout((const StructType *)Ty, TD); } @@ -71,14 +80,19 @@ Annotation *TargetData::TypeAnFactory(AnnotationID AID, const Annotable *T, // TargetData Class Implementation //===----------------------------------------------------------------------===// -TargetData::TargetData(const std::string &TargetName, unsigned char PtrSize = 8, - unsigned char PtrAl = 8, unsigned char DoubleAl = 8, - unsigned char FloatAl = 4, unsigned char LongAl = 8, - unsigned char IntAl = 4, unsigned char ShortAl = 2, - unsigned char ByteAl = 1) +TargetData::TargetData(const std::string &TargetName, + 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; DoubleAlignment = DoubleAl; @@ -94,7 +108,7 @@ TargetData::~TargetData() { } static inline void getTypeInfo(const Type *Ty, const TargetData *TD, - unsigned &Size, unsigned char &Alignment) { + uint64_t &Size, unsigned char &Alignment) { assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!"); switch (Ty->getPrimitiveID()) { case Type::VoidTyID: @@ -133,28 +147,38 @@ static inline void getTypeInfo(const Type *Ty, const TargetData *TD, } } -unsigned TargetData::getTypeSize(const Type *Ty) const { - unsigned Size; unsigned char Align; +uint64_t TargetData::getTypeSize(const Type *Ty) const { + uint64_t Size; + unsigned char Align; getTypeInfo(Ty, this, Size, Align); return Size; } unsigned char TargetData::getTypeAlignment(const Type *Ty) const { - unsigned Size; unsigned char Align; + uint64_t Size; + unsigned char Align; getTypeInfo(Ty, this, Size, Align); return Align; } -unsigned TargetData::getIndexedOffset(const Type *ptrTy, +uint64_t TargetData::getIndexedOffset(const Type *ptrTy, const std::vector &Idx) const { - const PointerType *PtrTy = cast(ptrTy); - unsigned Result = 0; + 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(); + + // Get the array index and the size of each array element. + // 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)); - for (unsigned CurIDX = 0; CurIDX < Idx.size(); ++CurIDX) { - if (const StructType *STy = dyn_cast(Ty)) { + } else if (const StructType *STy = dyn_cast(Ty)) { assert(Idx[CurIDX]->getType() == Type::UByteTy && "Illegal struct idx"); unsigned FieldNo = cast(Idx[CurIDX])->getValue(); @@ -162,9 +186,9 @@ unsigned TargetData::getIndexedOffset(const Type *ptrTy, const StructLayout *Layout = getStructLayout(STy); // Add in the offset, as calculated by the structure layout info... - assert(FieldNo < Layout->MemberOffsets.size() && "FieldNo out of range!"); + assert(FieldNo < Layout->MemberOffsets.size() &&"FieldNo out of range!"); Result += Layout->MemberOffsets[FieldNo]; - + // Update Ty to refer to current element Ty = STy->getElementTypes()[FieldNo];