// $Id$ //*************************************************************************** // File: // TargetMachine.cpp // // Purpose: // // History: // 7/12/01 - Vikram Adve - Created //**************************************************************************/ //*************************** User Include Files ***************************/ #include "llvm/CodeGen/TargetMachine.h" #include "llvm/DerivedTypes.h" //************************ Class Implementations **************************/ //--------------------------------------------------------------------------- // 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::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; 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; } } 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; } //---------------------------------------------------------------------------