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