diff options
| author | Chris Lattner <sabre@nondot.org> | 2001-08-27 15:50:41 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2001-08-27 15:50:41 +0000 |
| commit | 8dd99f33ea3ebb35435f69b635e722bf38159807 (patch) | |
| tree | 585b4fdf5294ae2184d6bb7ffe11cb9904da1fc7 /llvm/lib/CodeGen | |
| parent | eae2201f08b1c28f585a69d81718453f62d0b64c (diff) | |
| download | bcm5719-llvm-8dd99f33ea3ebb35435f69b635e722bf38159807.tar.gz bcm5719-llvm-8dd99f33ea3ebb35435f69b635e722bf38159807.zip | |
Factor code out to the TargetData class
llvm-svn: 380
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp | 93 |
1 files changed, 11 insertions, 82 deletions
diff --git a/llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp b/llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp index 03819099bf2..cf4cbc68002 100644 --- a/llvm/lib/CodeGen/TargetMachine/TargetMachine.cpp +++ b/llvm/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); + } } |

