diff options
Diffstat (limited to 'lib/CodeGen/TargetMachine/TargetData.cpp')
-rw-r--r-- | lib/CodeGen/TargetMachine/TargetData.cpp | 180 |
1 files changed, 0 insertions, 180 deletions
diff --git a/lib/CodeGen/TargetMachine/TargetData.cpp b/lib/CodeGen/TargetMachine/TargetData.cpp deleted file mode 100644 index fd9dd26d28..0000000000 --- a/lib/CodeGen/TargetMachine/TargetData.cpp +++ /dev/null @@ -1,180 +0,0 @@ -//===-- TargetData.cpp - Data size & alignment routines --------------------==// -// -// This file defines target properties related to datatype size/offset/alignment -// information. It uses lazy annotations to cache information about how -// structure types are laid out and used. -// -// This structure should be created once, filled in if the defaults are not -// correct and then passed around by const&. None of the members functions -// require modification to the object. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CodeGen/TargetData.h" -#include "llvm/DerivedTypes.h" -#include "llvm/ConstPoolVals.h" - -static inline void getTypeInfo(const Type *Ty, const TargetData *TD, - unsigned &Size, unsigned char &Alignment); - -//===----------------------------------------------------------------------===// -// Support for StructLayout Annotation -//===----------------------------------------------------------------------===// - -StructLayout::StructLayout(const StructType *ST, const TargetData &TD) - : Annotation(TD.getStructLayoutAID()) { - StructAlignment = 0; - StructSize = 0; - - // Loop over each of the elements, placing them in memory... - for (StructType::ElementTypes::const_iterator - TI = ST->getElementTypes().begin(), - TE = ST->getElementTypes().end(); TI != TE; ++TI) { - const Type *Ty = *TI; - unsigned char A; - unsigned TySize, TyAlign; - getTypeInfo(Ty, &TD, TySize, A); TyAlign = A; - - // Add padding if neccesary to make the data element aligned properly... - if (StructSize % TyAlign != 0) - StructSize = (StructSize/TyAlign + 1) * TyAlign; // Add padding... - - // Keep track of maximum alignment constraint - StructAlignment = max(TyAlign, StructAlignment); - - MemberOffsets.push_back(StructSize); - 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 - // and all array elements would be aligned correctly. - if (StructSize % StructAlignment != 0) - StructSize = (StructSize/StructAlignment + 1) * StructAlignment; - - if (StructSize == 0) { - StructSize = 1; // Empty struct is 1 byte - StructAlignment = 1; - } -} - -Annotation *TargetData::TypeAnFactory(AnnotationID AID, const Annotable *T, - void *D) { - const TargetData &TD = *(const TargetData*)D; - assert(AID == TD.AID && "Target data annotation ID mismatch!"); - const Type *Ty = ((const Value *)T)->castTypeAsserting(); - assert(Ty->isStructType() && - "Can only create StructLayout annotation on structs!"); - return new StructLayout((const StructType *)Ty, TD); -} - -//===----------------------------------------------------------------------===// -// TargetData Class Implementation -//===----------------------------------------------------------------------===// - -TargetData::TargetData(const 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) - : AID(AnnotationManager::getID("TargetData::" + TargetName)) { - AnnotationManager::registerAnnotationFactory(AID, TypeAnFactory, this); - - PointerSize = PtrSize; - PointerAlignment = PtrAl; - DoubleAlignment = DoubleAl; - FloatAlignment = FloatAl; - LongAlignment = LongAl; - IntAlignment = IntAl; - ShortAlignment = ShortAl; - ByteAlignment = ByteAl; -} - -TargetData::~TargetData() { - AnnotationManager::registerAnnotationFactory(AID, 0); // Deregister factory -} - -static inline void getTypeInfo(const Type *Ty, const TargetData *TD, - unsigned &Size, unsigned char &Alignment) { - switch (Ty->getPrimitiveID()) { - case Type::VoidTyID: - case Type::BoolTyID: - case Type::UByteTyID: - case Type::SByteTyID: Size = 1; Alignment = TD->getByteAlignment(); return; - case Type::UShortTyID: - case Type::ShortTyID: Size = 2; Alignment = TD->getShortAlignment(); return; - case Type::UIntTyID: - case Type::IntTyID: Size = 4; Alignment = TD->getIntAlignment(); return; - case Type::ULongTyID: - case Type::LongTyID: Size = 8; Alignment = TD->getLongAlignment(); return; - case Type::FloatTyID: Size = 4; Alignment = TD->getFloatAlignment(); return; - case Type::DoubleTyID: Size = 8; Alignment = TD->getDoubleAlignment(); return; - case Type::LabelTyID: - case Type::PointerTyID: - Size = TD->getPointerSize(); Alignment = TD->getPointerAlignment(); - return; - case Type::ArrayTyID: { - const ArrayType *ATy = (const ArrayType *)Ty; - assert(ATy->isSized() && "Can't get TypeInfo of an unsized array!"); - getTypeInfo(ATy->getElementType(), TD, Size, Alignment); - Size *= ATy->getNumElements(); - return; - } - case Type::StructTyID: { - // Get the layout annotation... which is lazily created on demand. - const StructLayout *Layout = TD->getStructLayout((const StructType*)Ty); - Size = Layout->StructSize; Alignment = Layout->StructAlignment; - return; - } - - case Type::TypeTyID: - default: - assert(0 && "Bad type for getTypeInfo!!!"); - return; - } -} - -unsigned TargetData::getTypeSize(const Type *Ty) const { - unsigned Size; unsigned char Align; - getTypeInfo(Ty, this, Size, Align); - return Size; -} - -unsigned char TargetData::getTypeAlignment(const Type *Ty) const { - unsigned Size; unsigned char Align; - getTypeInfo(Ty, this, Size, Align); - return Align; -} - -unsigned TargetData::getIndexedOffset(const Type *ptrTy, - const vector<ConstPoolVal*> &Idx) const { - const PointerType *PtrTy = ptrTy->castPointerType(); - unsigned Result = 0; - - // Get the type pointed to... - const Type *Ty = PtrTy->getValueType(); - - for (unsigned CurIDX = 0; CurIDX < Idx.size(); ++CurIDX) { - if (const StructType *STy = Ty->dyncastStructType()) { - assert(Idx[CurIDX]->getType() == Type::UByteTy && "Illegal struct idx"); - unsigned FieldNo = ((ConstPoolUInt*)Idx[CurIDX++])->getValue(); - - // Get structure layout information... - 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!"); - Result += Layout->MemberOffsets[FieldNo]; - - // Update Ty to refer to current element - Ty = STy->getElementTypes()[FieldNo]; - - } else if (const ArrayType *ATy = Ty->dyncastArrayType()) { - assert(0 && "Loading from arrays not implemented yet!"); - } else { - assert(0 && "Indexing type that is not struct or array?"); - return 0; // Load directly through ptr - } - } - - return Result; -} |