blob: 653f0217cd8024c4302aa3ef6f0d142e3f99f435 [file] [log] [blame]
Vikram S. Advedaae6992001-07-21 12:42:08 +00001// $Id$
2//***************************************************************************
3// File:
4// TargetMachine.cpp
5//
6// Purpose:
7//
8// History:
9// 7/12/01 - Vikram Adve - Created
10//**************************************************************************/
11
12
Vikram S. Advedaae6992001-07-21 12:42:08 +000013//*************************** User Include Files ***************************/
14
Chris Lattner7e583cf2001-07-21 20:58:30 +000015#include "llvm/CodeGen/TargetMachine.h"
Chris Lattner68498ce2001-07-21 23:24:48 +000016#include "llvm/DerivedTypes.h"
Vikram S. Advedaae6992001-07-21 12:42:08 +000017
18
19//************************ Class Implementations **************************/
20
Vikram S. Advedaae6992001-07-21 12:42:08 +000021//---------------------------------------------------------------------------
22// function TargetMachine::findOptimalMemberOffsets
23//
24// Purpose:
25// Compute optimal offsets for the members of a structure.
26// Returns a vector of unsigned ints, one per member.
27// Caller is responsible for freeing the vector.
28//---------------------------------------------------------------------------
29
30unsigned int
31TargetMachine::findOptimalStorageSize(const Type* ty) const
32{
33 switch(ty->getPrimitiveID())
34 {
35 case Type::BoolTyID:
36 case Type::UByteTyID: case Type::SByteTyID:
37 case Type::UShortTyID: case Type::ShortTyID:
38 return optSizeForSubWordData;
39 break;
40
41 case Type::UIntTyID: case Type::IntTyID:
42 return intSize;
43 break;
44
45 case Type::FloatTyID:
46 return floatSize;
47 break;
48
49 case Type::ULongTyID: case Type::LongTyID:
50 return longSize;
51 break;
52
53 case Type::DoubleTyID:
54 return doubleSize;
55 break;
56
57 case Type::PointerTyID:
58 case Type::LabelTyID: case Type::MethodTyID:
59 return pointerSize;
60 break;
61
62 case Type::ArrayTyID:
63 {
64 ArrayType* aty = (ArrayType*) ty;
65 assert(aty->getNumElements() >= 0 &&
66 "Attempting to compute size for unknown-size array");
67 return (unsigned) aty->getNumElements() *
68 this->findOptimalStorageSize(aty->getElementType());
69 break;
70 }
71
72 case Type::StructTyID:
73 {// This code should be invoked only from StructType::getStorageSize().
74 StructType* sty = (StructType*) ty;
75 unsigned lastMemberIdx = sty->getElementTypes().size() - 1;
76 unsigned lastMemberOffset = sty->getElementOffset(lastMemberIdx, *this);
77 unsigned storageSize = lastMemberOffset
78 + this->findOptimalStorageSize(sty->getElementTypes()[lastMemberIdx]);
79 return storageSize;
80 break;
81 }
82
83 default:
84 assert(0 && "Unexpected type in `findOptimalStorageSize'");
85 return 0;
86 break;
87 }
88}
89
90unsigned int*
91TargetMachine::findOptimalMemberOffsets(const StructType* stype) const
92{
93 int numMembers = stype->getElementTypes().size();
94 unsigned int* offsetVec = new unsigned int[numMembers];
95 unsigned int netOffset = 0;
96 for (int i = 0; i < numMembers; i++)
97 {
98 offsetVec[i] = netOffset;
99 const Type* memberType = stype->getElementTypes()[i];
100 netOffset += this->findOptimalStorageSize(memberType);
101 }
102 return offsetVec;
103}
104
105//---------------------------------------------------------------------------