Factor code out to the TargetData class

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@380 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2001-08-27 15:50:41 +00:00
parent fed72d5973
commit 3a13c7e56f

View File

@ -39,93 +39,22 @@ const MachineInstrDescriptor* TargetInstrDescriptors = NULL;
// function TargetMachine::findOptimalStorageSize // function TargetMachine::findOptimalStorageSize
// //
// Purpose: // 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 // This default implementation assumes that all sub-word data items use
// space equal to optSizeForSubWordData, and all other primitive data // space equal to optSizeForSubWordData, and all other primitive data
// items use space according to the type. // items use space according to the type.
// //
unsigned int unsigned int TargetMachine::findOptimalStorageSize(const Type* ty) const {
TargetMachine::findOptimalStorageSize(const Type* ty) const switch(ty->getPrimitiveID()) {
{ case Type::BoolTyID:
switch(ty->getPrimitiveID()) case Type::UByteTyID:
{ case Type::SByteTyID:
case Type::BoolTyID: case Type::UShortTyID:
case Type::UByteTyID: case Type::SByteTyID: case Type::ShortTyID:
case Type::UShortTyID: case Type::ShortTyID: return optSizeForSubWordData;
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;
case Type::ArrayTyID: default:
{ return DataLayout.getTypeSize(ty);
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;
} }