From 3a13c7e56fe7dd722ce8b9be6b4fde7f37569800 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 27 Aug 2001 15:50:41 +0000 Subject: [PATCH] Factor code out to the TargetData class git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@380 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/TargetMachine/TargetMachine.cpp | 93 +++------------------ 1 file changed, 11 insertions(+), 82 deletions(-) diff --git a/lib/CodeGen/TargetMachine/TargetMachine.cpp b/lib/CodeGen/TargetMachine/TargetMachine.cpp index 03819099bf2..cf4cbc68002 100644 --- a/lib/CodeGen/TargetMachine/TargetMachine.cpp +++ b/lib/CodeGen/TargetMachine/TargetMachine.cpp @@ -39,93 +39,22 @@ const MachineInstrDescriptor* TargetInstrDescriptors = NULL; // function TargetMachine::findOptimalStorageSize // // Purpose: -// Compute optimal storage size for a structure, based on -// the optimal member offsets. // This default implementation assumes that all sub-word data items use // space equal to optSizeForSubWordData, and all other primitive data // items use space according to the type. // -unsigned int -TargetMachine::findOptimalStorageSize(const Type* ty) const -{ - switch(ty->getPrimitiveID()) - { - case Type::BoolTyID: - case Type::UByteTyID: case Type::SByteTyID: - case Type::UShortTyID: case Type::ShortTyID: - return optSizeForSubWordData; - break; - - case Type::UIntTyID: case Type::IntTyID: - return intSize; - break; - - case Type::FloatTyID: - return floatSize; - break; - - case Type::ULongTyID: case Type::LongTyID: - return longSize; - break; - - case Type::DoubleTyID: - return doubleSize; - break; - - case Type::PointerTyID: - case Type::LabelTyID: case Type::MethodTyID: - return pointerSize; - break; +unsigned int TargetMachine::findOptimalStorageSize(const Type* ty) const { + switch(ty->getPrimitiveID()) { + case Type::BoolTyID: + case Type::UByteTyID: + case Type::SByteTyID: + case Type::UShortTyID: + case Type::ShortTyID: + return optSizeForSubWordData; - case Type::ArrayTyID: - { - ArrayType* aty = (ArrayType*) ty; - assert(aty->getNumElements() >= 0 && - "Attempting to compute size for unknown-size array"); - return (unsigned) aty->getNumElements() * - this->findOptimalStorageSize(aty->getElementType()); - break; - } - - case Type::StructTyID: - {// This code should be invoked only from StructType::getStorageSize(). - StructType* sty = (StructType*) ty; - unsigned lastMemberIdx = sty->getElementTypes().size() - 1; - unsigned lastMemberOffset = sty->getElementOffset(lastMemberIdx, *this); - unsigned storageSize = lastMemberOffset - + this->findOptimalStorageSize(sty->getElementTypes()[lastMemberIdx]); - return storageSize; - break; - } - - default: - assert(0 && "Unexpected type in `findOptimalStorageSize'"); - return 0; - break; - } -} - - -// function TargetMachine::findOptimalMemberOffsets -// -// Purpose: -// Compute optimal offsets for the members of a structure. -// Returns a vector of unsigned ints, one per member. -// Caller is responsible for freeing the vector. - -unsigned int* -TargetMachine::findOptimalMemberOffsets(const StructType* stype) const -{ - int numMembers = stype->getElementTypes().size(); - unsigned int* offsetVec = new unsigned int[numMembers]; - unsigned int netOffset = 0; - for (int i = 0; i < numMembers; i++) - { - offsetVec[i] = netOffset; - const Type* memberType = stype->getElementTypes()[i]; - netOffset += this->findOptimalStorageSize(memberType); - } - return offsetVec; + default: + return DataLayout.getTypeSize(ty); + } }