blob: 6d566693e8507be9fa499acb8391d19ff3b035c9 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===-- TargetData.cpp - Data size & alignment routines --------------------==//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Dan Gohmanf17a25c2007-07-18 16:29:46 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file defines target properties related to datatype size/offset/alignment
11// information.
12//
13// This structure should be created once, filled in if the defaults are not
14// correct and then passed around by const&. None of the members functions
15// require modification to the object.
16//
17//===----------------------------------------------------------------------===//
18
19#include "llvm/Target/TargetData.h"
20#include "llvm/Module.h"
21#include "llvm/DerivedTypes.h"
22#include "llvm/Constants.h"
23#include "llvm/Support/GetElementPtrTypeIterator.h"
24#include "llvm/Support/MathExtras.h"
25#include "llvm/Support/ManagedStatic.h"
26#include "llvm/ADT/DenseMap.h"
27#include "llvm/ADT/StringExtras.h"
28#include <algorithm>
29#include <cstdlib>
30#include <sstream>
31using namespace llvm;
32
33// Handle the Pass registration stuff necessary to use TargetData's.
34namespace {
35 // Register the default SparcV9 implementation...
36 RegisterPass<TargetData> X("targetdata", "Target Data Layout");
37}
38char TargetData::ID = 0;
39
40//===----------------------------------------------------------------------===//
41// Support for StructLayout
42//===----------------------------------------------------------------------===//
43
44StructLayout::StructLayout(const StructType *ST, const TargetData &TD) {
45 StructAlignment = 0;
46 StructSize = 0;
47 NumElements = ST->getNumElements();
48
49 // Loop over each of the elements, placing them in memory...
50 for (unsigned i = 0, e = NumElements; i != e; ++i) {
51 const Type *Ty = ST->getElementType(i);
Duncan Sandsf99fdc62007-11-01 20:53:16 +000052 unsigned TyAlign = ST->isPacked() ?
53 1 : TD.getABITypeAlignment(Ty);
54 uint64_t TySize = ST->isPacked() ?
55 TD.getTypeStoreSize(Ty) : TD.getABITypeSize(Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000056
Duncan Sandsf99fdc62007-11-01 20:53:16 +000057 // Add padding if necessary to align the data element properly...
58 StructSize = (StructSize + TyAlign - 1)/TyAlign * TyAlign;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000059
60 // Keep track of maximum alignment constraint
61 StructAlignment = std::max(TyAlign, StructAlignment);
62
63 MemberOffsets[i] = StructSize;
64 StructSize += TySize; // Consume space for this data item
65 }
66
67 // Empty structures have alignment of 1 byte.
68 if (StructAlignment == 0) StructAlignment = 1;
69
70 // Add padding to the end of the struct so that it could be put in an array
71 // and all array elements would be aligned correctly.
72 if (StructSize % StructAlignment != 0)
73 StructSize = (StructSize/StructAlignment + 1) * StructAlignment;
74}
75
76
77/// getElementContainingOffset - Given a valid offset into the structure,
78/// return the structure index that contains it.
79unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
80 const uint64_t *SI =
81 std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset);
82 assert(SI != &MemberOffsets[0] && "Offset not in structure type!");
83 --SI;
84 assert(*SI <= Offset && "upper_bound didn't work");
Chris Lattner49d6b242007-10-29 02:40:02 +000085 assert((SI == &MemberOffsets[0] || *(SI-1) <= Offset) &&
Dan Gohmanf17a25c2007-07-18 16:29:46 +000086 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
87 "Upper bound didn't work!");
Chris Lattner49d6b242007-10-29 02:40:02 +000088
89 // Multiple fields can have the same offset if any of them are zero sized.
90 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
91 // at the i32 element, because it is the last element at that offset. This is
92 // the right one to return, because anything after it will have a higher
93 // offset, implying that this element is non-empty.
Dan Gohmanf17a25c2007-07-18 16:29:46 +000094 return SI-&MemberOffsets[0];
95}
96
97//===----------------------------------------------------------------------===//
98// TargetAlignElem, TargetAlign support
99//===----------------------------------------------------------------------===//
100
101TargetAlignElem
102TargetAlignElem::get(AlignTypeEnum align_type, unsigned char abi_align,
103 unsigned char pref_align, uint32_t bit_width) {
104 TargetAlignElem retval;
105 retval.AlignType = align_type;
106 retval.ABIAlign = abi_align;
107 retval.PrefAlign = pref_align;
108 retval.TypeBitWidth = bit_width;
109 return retval;
110}
111
112bool
113TargetAlignElem::operator==(const TargetAlignElem &rhs) const {
114 return (AlignType == rhs.AlignType
115 && ABIAlign == rhs.ABIAlign
116 && PrefAlign == rhs.PrefAlign
117 && TypeBitWidth == rhs.TypeBitWidth);
118}
119
120std::ostream &
121TargetAlignElem::dump(std::ostream &os) const {
122 return os << AlignType
123 << TypeBitWidth
124 << ":" << (int) (ABIAlign * 8)
125 << ":" << (int) (PrefAlign * 8);
126}
127
128const TargetAlignElem TargetData::InvalidAlignmentElem =
129 TargetAlignElem::get((AlignTypeEnum) -1, 0, 0, 0);
130
131//===----------------------------------------------------------------------===//
132// TargetData Class Implementation
133//===----------------------------------------------------------------------===//
134
135/*!
136 A TargetDescription string consists of a sequence of hyphen-delimited
137 specifiers for target endianness, pointer size and alignments, and various
138 primitive type sizes and alignments. A typical string looks something like:
139 <br><br>
140 "E-p:32:32:32-i1:8:8-i8:8:8-i32:32:32-i64:32:64-f32:32:32-f64:32:64"
141 <br><br>
142 (note: this string is not fully specified and is only an example.)
143 \p
144 Alignments come in two flavors: ABI and preferred. ABI alignment (abi_align,
145 below) dictates how a type will be aligned within an aggregate and when used
146 as an argument. Preferred alignment (pref_align, below) determines a type's
147 alignment when emitted as a global.
148 \p
149 Specifier string details:
150 <br><br>
151 <i>[E|e]</i>: Endianness. "E" specifies a big-endian target data model, "e"
152 specifies a little-endian target data model.
153 <br><br>
Reid Spencer37c7cea2007-08-05 20:06:04 +0000154 <i>p:@verbatim<size>:<abi_align>:<pref_align>@endverbatim</i>: Pointer size,
155 ABI and preferred alignment.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000156 <br><br>
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000157 <i>@verbatim<type><size>:<abi_align>:<pref_align>@endverbatim</i>: Numeric type
158 alignment. Type is
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000159 one of <i>i|f|v|a</i>, corresponding to integer, floating point, vector (aka
160 packed) or aggregate. Size indicates the size, e.g., 32 or 64 bits.
161 \p
162 The default string, fully specified is:
163 <br><br>
164 "E-p:64:64:64-a0:0:0-f32:32:32-f64:0:64"
165 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:0:64"
166 "-v64:64:64-v128:128:128"
167 <br><br>
168 Note that in the case of aggregates, 0 is the default ABI and preferred
169 alignment. This is a special case, where the aggregate's computed worst-case
170 alignment will be used.
171 */
172void TargetData::init(const std::string &TargetDescription) {
173 std::string temp = TargetDescription;
174
175 LittleEndian = false;
176 PointerMemSize = 8;
177 PointerABIAlign = 8;
178 PointerPrefAlign = PointerABIAlign;
179
180 // Default alignments
181 setAlignment(INTEGER_ALIGN, 1, 1, 1); // Bool
182 setAlignment(INTEGER_ALIGN, 1, 1, 8); // Byte
183 setAlignment(INTEGER_ALIGN, 2, 2, 16); // short
184 setAlignment(INTEGER_ALIGN, 4, 4, 32); // int
185 setAlignment(INTEGER_ALIGN, 4, 8, 64); // long
186 setAlignment(FLOAT_ALIGN, 4, 4, 32); // float
187 setAlignment(FLOAT_ALIGN, 8, 8, 64); // double
188 setAlignment(VECTOR_ALIGN, 8, 8, 64); // v2i32
189 setAlignment(VECTOR_ALIGN, 16, 16, 128); // v16i8, v8i16, v4i32, ...
190 setAlignment(AGGREGATE_ALIGN, 0, 8, 0); // struct, union, class, ...
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000191
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000192 while (!temp.empty()) {
193 std::string token = getToken(temp, "-");
194 std::string arg0 = getToken(token, ":");
195 const char *p = arg0.c_str();
196 switch(*p) {
197 case 'E':
198 LittleEndian = false;
199 break;
200 case 'e':
201 LittleEndian = true;
202 break;
203 case 'p':
204 PointerMemSize = atoi(getToken(token,":").c_str()) / 8;
205 PointerABIAlign = atoi(getToken(token,":").c_str()) / 8;
206 PointerPrefAlign = atoi(getToken(token,":").c_str()) / 8;
207 if (PointerPrefAlign == 0)
208 PointerPrefAlign = PointerABIAlign;
209 break;
210 case 'i':
211 case 'v':
212 case 'f':
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000213 case 'a':
214 case 's': {
Anton Korobeynikov4b30e762007-11-09 19:06:14 +0000215 AlignTypeEnum align_type = STACK_ALIGN; // Dummy init, silence warning
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000216 switch(*p) {
217 case 'i': align_type = INTEGER_ALIGN; break;
218 case 'v': align_type = VECTOR_ALIGN; break;
219 case 'f': align_type = FLOAT_ALIGN; break;
220 case 'a': align_type = AGGREGATE_ALIGN; break;
221 case 's': align_type = STACK_ALIGN; break;
222 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000223 uint32_t size = (uint32_t) atoi(++p);
224 unsigned char abi_align = atoi(getToken(token, ":").c_str()) / 8;
225 unsigned char pref_align = atoi(getToken(token, ":").c_str()) / 8;
226 if (pref_align == 0)
227 pref_align = abi_align;
228 setAlignment(align_type, abi_align, pref_align, size);
229 break;
230 }
231 default:
232 break;
233 }
234 }
235}
236
237TargetData::TargetData(const Module *M)
238 : ImmutablePass((intptr_t)&ID) {
239 init(M->getDataLayout());
240}
241
242void
243TargetData::setAlignment(AlignTypeEnum align_type, unsigned char abi_align,
244 unsigned char pref_align, uint32_t bit_width) {
245 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
246 if (Alignments[i].AlignType == align_type &&
247 Alignments[i].TypeBitWidth == bit_width) {
248 // Update the abi, preferred alignments.
249 Alignments[i].ABIAlign = abi_align;
250 Alignments[i].PrefAlign = pref_align;
251 return;
252 }
253 }
254
255 Alignments.push_back(TargetAlignElem::get(align_type, abi_align,
256 pref_align, bit_width));
257}
258
259/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
260/// preferred if ABIInfo = false) the target wants for the specified datatype.
261unsigned TargetData::getAlignmentInfo(AlignTypeEnum AlignType,
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000262 uint32_t BitWidth, bool ABIInfo,
263 const Type *Ty) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000264 // Check to see if we have an exact match and remember the best match we see.
265 int BestMatchIdx = -1;
266 int LargestInt = -1;
267 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
268 if (Alignments[i].AlignType == AlignType &&
269 Alignments[i].TypeBitWidth == BitWidth)
270 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
271
272 // The best match so far depends on what we're looking for.
Duncan Sandsb3412482007-12-21 20:18:41 +0000273 if (AlignType == VECTOR_ALIGN && Alignments[i].AlignType == VECTOR_ALIGN) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000274 // If this is a specification for a smaller vector type, we will fall back
275 // to it. This happens because <128 x double> can be implemented in terms
276 // of 64 <2 x double>.
Duncan Sandsb3412482007-12-21 20:18:41 +0000277 if (Alignments[i].TypeBitWidth < BitWidth) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000278 // Verify that we pick the biggest of the fallbacks.
279 if (BestMatchIdx == -1 ||
Duncan Sandsb3412482007-12-21 20:18:41 +0000280 Alignments[BestMatchIdx].TypeBitWidth < Alignments[i].TypeBitWidth)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000281 BestMatchIdx = i;
282 }
283 } else if (AlignType == INTEGER_ALIGN &&
284 Alignments[i].AlignType == INTEGER_ALIGN) {
285 // The "best match" for integers is the smallest size that is larger than
286 // the BitWidth requested.
287 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
288 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
289 BestMatchIdx = i;
290 // However, if there isn't one that's larger, then we must use the
291 // largest one we have (see below)
292 if (LargestInt == -1 ||
293 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
294 LargestInt = i;
295 }
296 }
297
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000298 // Okay, we didn't find an exact solution. Fall back here depending on what
299 // is being looked for.
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000300 if (BestMatchIdx == -1) {
301 // If we didn't find an integer alignment, fall back on most conservative.
302 if (AlignType == INTEGER_ALIGN) {
303 BestMatchIdx = LargestInt;
304 } else {
305 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
306
307 // If we didn't find a vector size that is smaller or equal to this type,
308 // then we will end up scalarizing this to its element type. Just return
309 // the alignment of the element.
310 return getAlignment(cast<VectorType>(Ty)->getElementType(), ABIInfo);
311 }
312 }
313
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000314 // Since we got a "best match" index, just return it.
315 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
316 : Alignments[BestMatchIdx].PrefAlign;
317}
318
319/// LayoutInfo - The lazy cache of structure layout information maintained by
320/// TargetData. Note that the struct types must have been free'd before
321/// llvm_shutdown is called (and thus this is deallocated) because all the
322/// targets with cached elements should have been destroyed.
323///
324typedef std::pair<const TargetData*,const StructType*> LayoutKey;
325
326struct DenseMapLayoutKeyInfo {
327 static inline LayoutKey getEmptyKey() { return LayoutKey(0, 0); }
328 static inline LayoutKey getTombstoneKey() {
329 return LayoutKey((TargetData*)(intptr_t)-1, 0);
330 }
331 static unsigned getHashValue(const LayoutKey &Val) {
Chris Lattner92eea072007-09-17 18:34:04 +0000332 return DenseMapInfo<void*>::getHashValue(Val.first) ^
333 DenseMapInfo<void*>::getHashValue(Val.second);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000334 }
Chris Lattner92eea072007-09-17 18:34:04 +0000335 static bool isEqual(const LayoutKey &LHS, const LayoutKey &RHS) {
336 return LHS == RHS;
337 }
338
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000339 static bool isPod() { return true; }
340};
341
342typedef DenseMap<LayoutKey, StructLayout*, DenseMapLayoutKeyInfo> LayoutInfoTy;
343static ManagedStatic<LayoutInfoTy> LayoutInfo;
344
345
346TargetData::~TargetData() {
347 if (LayoutInfo.isConstructed()) {
348 // Remove any layouts for this TD.
349 LayoutInfoTy &TheMap = *LayoutInfo;
350 for (LayoutInfoTy::iterator I = TheMap.begin(), E = TheMap.end();
351 I != E; ) {
352 if (I->first.first == this) {
353 I->second->~StructLayout();
354 free(I->second);
355 TheMap.erase(I++);
356 } else {
357 ++I;
358 }
359 }
360 }
361}
362
363const StructLayout *TargetData::getStructLayout(const StructType *Ty) const {
364 LayoutInfoTy &TheMap = *LayoutInfo;
365
366 StructLayout *&SL = TheMap[LayoutKey(this, Ty)];
367 if (SL) return SL;
368
369 // Otherwise, create the struct layout. Because it is variable length, we
370 // malloc it, then use placement new.
371 int NumElts = Ty->getNumElements();
372 StructLayout *L =
373 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1)*sizeof(uint64_t));
374
375 // Set SL before calling StructLayout's ctor. The ctor could cause other
376 // entries to be added to TheMap, invalidating our reference.
377 SL = L;
378
379 new (L) StructLayout(Ty, *this);
380 return L;
381}
382
383/// InvalidateStructLayoutInfo - TargetData speculatively caches StructLayout
384/// objects. If a TargetData object is alive when types are being refined and
385/// removed, this method must be called whenever a StructType is removed to
386/// avoid a dangling pointer in this cache.
387void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const {
388 if (!LayoutInfo.isConstructed()) return; // No cache.
389
390 LayoutInfoTy::iterator I = LayoutInfo->find(LayoutKey(this, Ty));
391 if (I != LayoutInfo->end()) {
392 I->second->~StructLayout();
393 free(I->second);
394 LayoutInfo->erase(I);
395 }
396}
397
398
399std::string TargetData::getStringRepresentation() const {
400 std::string repr;
401 repr.append(LittleEndian ? "e" : "E");
402 repr.append("-p:").append(itostr((int64_t) (PointerMemSize * 8))).
403 append(":").append(itostr((int64_t) (PointerABIAlign * 8))).
404 append(":").append(itostr((int64_t) (PointerPrefAlign * 8)));
405 for (align_const_iterator I = Alignments.begin();
406 I != Alignments.end();
407 ++I) {
408 repr.append("-").append(1, (char) I->AlignType).
409 append(utostr((int64_t) I->TypeBitWidth)).
410 append(":").append(utostr((uint64_t) (I->ABIAlign * 8))).
411 append(":").append(utostr((uint64_t) (I->PrefAlign * 8)));
412 }
413 return repr;
414}
415
416
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000417uint64_t TargetData::getTypeSizeInBits(const Type *Ty) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000418 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
419 switch (Ty->getTypeID()) {
420 case Type::LabelTyID:
421 case Type::PointerTyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000422 return getPointerSizeInBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000423 case Type::ArrayTyID: {
424 const ArrayType *ATy = cast<ArrayType>(Ty);
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000425 return getABITypeSizeInBits(ATy->getElementType())*ATy->getNumElements();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000426 }
427 case Type::StructTyID: {
428 // Get the layout annotation... which is lazily created on demand.
429 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000430 return Layout->getSizeInBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000431 }
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000432 case Type::IntegerTyID:
433 return cast<IntegerType>(Ty)->getBitWidth();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000434 case Type::VoidTyID:
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000435 return 8;
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000436 case Type::FloatTyID:
437 return 32;
438 case Type::DoubleTyID:
439 return 64;
Dale Johannesen4c39f712007-08-03 20:20:50 +0000440 case Type::PPC_FP128TyID:
441 case Type::FP128TyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000442 return 128;
Dale Johannesen4c39f712007-08-03 20:20:50 +0000443 // In memory objects this is always aligned to a higher boundary, but
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000444 // only 80 bits contain information.
Dale Johannesen4c39f712007-08-03 20:20:50 +0000445 case Type::X86_FP80TyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000446 return 80;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000447 case Type::VectorTyID: {
448 const VectorType *PTy = cast<VectorType>(Ty);
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000449 return PTy->getBitWidth();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000450 }
451 default:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000452 assert(0 && "TargetData::getTypeSizeInBits(): Unsupported type");
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000453 break;
454 }
455 return 0;
456}
457
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000458/*!
459 \param abi_or_pref Flag that determines which alignment is returned. true
460 returns the ABI alignment, false returns the preferred alignment.
461 \param Ty The underlying type for which alignment is determined.
462
463 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
464 == false) for the requested type \a Ty.
465 */
466unsigned char TargetData::getAlignment(const Type *Ty, bool abi_or_pref) const {
467 int AlignType = -1;
468
469 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
470 switch (Ty->getTypeID()) {
471 /* Early escape for the non-numeric types */
472 case Type::LabelTyID:
473 case Type::PointerTyID:
474 return (abi_or_pref
475 ? getPointerABIAlignment()
476 : getPointerPrefAlignment());
477 case Type::ArrayTyID:
478 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
479
480 case Type::StructTyID: {
481 // Packed structure types always have an ABI alignment of one.
482 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
483 return 1;
484
485 // Get the layout annotation... which is lazily created on demand.
486 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000487 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000488 return std::max(Align, (unsigned)Layout->getAlignment());
489 }
490 case Type::IntegerTyID:
491 case Type::VoidTyID:
492 AlignType = INTEGER_ALIGN;
493 break;
494 case Type::FloatTyID:
495 case Type::DoubleTyID:
Dale Johannesen4c39f712007-08-03 20:20:50 +0000496 // PPC_FP128TyID and FP128TyID have different data contents, but the
497 // same size and alignment, so they look the same here.
498 case Type::PPC_FP128TyID:
499 case Type::FP128TyID:
500 case Type::X86_FP80TyID:
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000501 AlignType = FLOAT_ALIGN;
502 break;
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000503 case Type::VectorTyID:
504 AlignType = VECTOR_ALIGN;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000505 break;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000506 default:
507 assert(0 && "Bad type for getAlignment!!!");
508 break;
509 }
510
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000511 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000512 abi_or_pref, Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000513}
514
515unsigned char TargetData::getABITypeAlignment(const Type *Ty) const {
516 return getAlignment(Ty, true);
517}
518
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000519unsigned char TargetData::getCallFrameTypeAlignment(const Type *Ty) const {
520 for (unsigned i = 0, e = Alignments.size(); i != e; ++i)
521 if (Alignments[i].AlignType == STACK_ALIGN)
522 return Alignments[i].ABIAlign;
523
524 return getABITypeAlignment(Ty);
525}
526
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000527unsigned char TargetData::getPrefTypeAlignment(const Type *Ty) const {
528 return getAlignment(Ty, false);
529}
530
531unsigned char TargetData::getPreferredTypeAlignmentShift(const Type *Ty) const {
532 unsigned Align = (unsigned) getPrefTypeAlignment(Ty);
533 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
534 return Log2_32(Align);
535}
536
537/// getIntPtrType - Return an unsigned integer type that is the same size or
538/// greater to the host pointer size.
539const Type *TargetData::getIntPtrType() const {
Dan Gohmandf0817f2007-10-08 15:16:25 +0000540 return IntegerType::get(getPointerSizeInBits());
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000541}
542
543
544uint64_t TargetData::getIndexedOffset(const Type *ptrTy, Value* const* Indices,
545 unsigned NumIndices) const {
546 const Type *Ty = ptrTy;
547 assert(isa<PointerType>(Ty) && "Illegal argument for getIndexedOffset()");
548 uint64_t Result = 0;
549
550 generic_gep_type_iterator<Value* const*>
551 TI = gep_type_begin(ptrTy, Indices, Indices+NumIndices);
552 for (unsigned CurIDX = 0; CurIDX != NumIndices; ++CurIDX, ++TI) {
553 if (const StructType *STy = dyn_cast<StructType>(*TI)) {
554 assert(Indices[CurIDX]->getType() == Type::Int32Ty &&
555 "Illegal struct idx");
556 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
557
558 // Get structure layout information...
559 const StructLayout *Layout = getStructLayout(STy);
560
561 // Add in the offset, as calculated by the structure layout info...
562 Result += Layout->getElementOffset(FieldNo);
563
564 // Update Ty to refer to current element
565 Ty = STy->getElementType(FieldNo);
566 } else {
567 // Update Ty to refer to current element
568 Ty = cast<SequentialType>(Ty)->getElementType();
569
570 // Get the array index and the size of each array element.
571 int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue();
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000572 Result += arrayIdx * (int64_t)getABITypeSize(Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000573 }
574 }
575
576 return Result;
577}
578
579/// getPreferredAlignmentLog - Return the preferred alignment of the
580/// specified global, returned in log form. This includes an explicitly
581/// requested alignment (if the global has one).
582unsigned TargetData::getPreferredAlignmentLog(const GlobalVariable *GV) const {
583 const Type *ElemType = GV->getType()->getElementType();
584 unsigned Alignment = getPreferredTypeAlignmentShift(ElemType);
585 if (GV->getAlignment() > (1U << Alignment))
586 Alignment = Log2_32(GV->getAlignment());
587
588 if (GV->hasInitializer()) {
589 if (Alignment < 4) {
590 // If the global is not external, see if it is large. If so, give it a
591 // larger alignment.
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000592 if (getTypeSizeInBits(ElemType) > 128)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000593 Alignment = 4; // 16-byte alignment.
594 }
595 }
596 return Alignment;
597}