blob: b1b78a8adad3fcfbf4d27f8ae9ab3e582bc2bb46 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===-- TargetData.cpp - Data size & alignment routines --------------------==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
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);
52 unsigned TyAlign;
53 uint64_t TySize;
54 TyAlign = (ST->isPacked() ? 1 : TD.getABITypeAlignment(Ty));
55 TySize = TD.getTypeSize(Ty);
56
57 // Add padding if necessary to make the data element aligned properly...
58 if (StructSize % TyAlign != 0)
59 StructSize = (StructSize/TyAlign + 1) * TyAlign; // Add padding...
60
61 // Keep track of maximum alignment constraint
62 StructAlignment = std::max(TyAlign, StructAlignment);
63
64 MemberOffsets[i] = StructSize;
65 StructSize += TySize; // Consume space for this data item
66 }
67
68 // Empty structures have alignment of 1 byte.
69 if (StructAlignment == 0) StructAlignment = 1;
70
71 // Add padding to the end of the struct so that it could be put in an array
72 // and all array elements would be aligned correctly.
73 if (StructSize % StructAlignment != 0)
74 StructSize = (StructSize/StructAlignment + 1) * StructAlignment;
75}
76
77
78/// getElementContainingOffset - Given a valid offset into the structure,
79/// return the structure index that contains it.
80unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
81 const uint64_t *SI =
82 std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset);
83 assert(SI != &MemberOffsets[0] && "Offset not in structure type!");
84 --SI;
85 assert(*SI <= Offset && "upper_bound didn't work");
Chris Lattner49d6b242007-10-29 02:40:02 +000086 assert((SI == &MemberOffsets[0] || *(SI-1) <= Offset) &&
Dan Gohmanf17a25c2007-07-18 16:29:46 +000087 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
88 "Upper bound didn't work!");
Chris Lattner49d6b242007-10-29 02:40:02 +000089
90 // Multiple fields can have the same offset if any of them are zero sized.
91 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
92 // at the i32 element, because it is the last element at that offset. This is
93 // the right one to return, because anything after it will have a higher
94 // offset, implying that this element is non-empty.
Dan Gohmanf17a25c2007-07-18 16:29:46 +000095 return SI-&MemberOffsets[0];
96}
97
98//===----------------------------------------------------------------------===//
99// TargetAlignElem, TargetAlign support
100//===----------------------------------------------------------------------===//
101
102TargetAlignElem
103TargetAlignElem::get(AlignTypeEnum align_type, unsigned char abi_align,
104 unsigned char pref_align, uint32_t bit_width) {
105 TargetAlignElem retval;
106 retval.AlignType = align_type;
107 retval.ABIAlign = abi_align;
108 retval.PrefAlign = pref_align;
109 retval.TypeBitWidth = bit_width;
110 return retval;
111}
112
113bool
114TargetAlignElem::operator==(const TargetAlignElem &rhs) const {
115 return (AlignType == rhs.AlignType
116 && ABIAlign == rhs.ABIAlign
117 && PrefAlign == rhs.PrefAlign
118 && TypeBitWidth == rhs.TypeBitWidth);
119}
120
121std::ostream &
122TargetAlignElem::dump(std::ostream &os) const {
123 return os << AlignType
124 << TypeBitWidth
125 << ":" << (int) (ABIAlign * 8)
126 << ":" << (int) (PrefAlign * 8);
127}
128
129const TargetAlignElem TargetData::InvalidAlignmentElem =
130 TargetAlignElem::get((AlignTypeEnum) -1, 0, 0, 0);
131
132//===----------------------------------------------------------------------===//
133// TargetData Class Implementation
134//===----------------------------------------------------------------------===//
135
136/*!
137 A TargetDescription string consists of a sequence of hyphen-delimited
138 specifiers for target endianness, pointer size and alignments, and various
139 primitive type sizes and alignments. A typical string looks something like:
140 <br><br>
141 "E-p:32:32:32-i1:8:8-i8:8:8-i32:32:32-i64:32:64-f32:32:32-f64:32:64"
142 <br><br>
143 (note: this string is not fully specified and is only an example.)
144 \p
145 Alignments come in two flavors: ABI and preferred. ABI alignment (abi_align,
146 below) dictates how a type will be aligned within an aggregate and when used
147 as an argument. Preferred alignment (pref_align, below) determines a type's
148 alignment when emitted as a global.
149 \p
150 Specifier string details:
151 <br><br>
152 <i>[E|e]</i>: Endianness. "E" specifies a big-endian target data model, "e"
153 specifies a little-endian target data model.
154 <br><br>
Reid Spencer37c7cea2007-08-05 20:06:04 +0000155 <i>p:@verbatim<size>:<abi_align>:<pref_align>@endverbatim</i>: Pointer size,
156 ABI and preferred alignment.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000157 <br><br>
Reid Spencer37c7cea2007-08-05 20:06:04 +0000158 <i>@verbatim<type><size>:<abi_align>:<pref_align>@endverbatim</i>: Numeric type 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': {
215 AlignTypeEnum align_type;
216 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,
262 uint32_t BitWidth, bool ABIInfo) const {
263 // Check to see if we have an exact match and remember the best match we see.
264 int BestMatchIdx = -1;
265 int LargestInt = -1;
266 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
267 if (Alignments[i].AlignType == AlignType &&
268 Alignments[i].TypeBitWidth == BitWidth)
269 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
270
271 // The best match so far depends on what we're looking for.
272 if (AlignType == VECTOR_ALIGN) {
273 // If this is a specification for a smaller vector type, we will fall back
274 // to it. This happens because <128 x double> can be implemented in terms
275 // of 64 <2 x double>.
276 if (Alignments[i].AlignType == VECTOR_ALIGN &&
277 Alignments[i].TypeBitWidth < BitWidth) {
278 // Verify that we pick the biggest of the fallbacks.
279 if (BestMatchIdx == -1 ||
280 Alignments[BestMatchIdx].TypeBitWidth < BitWidth)
281 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
298 // For integers, if we didn't find a best match, use the largest one found.
299 if (BestMatchIdx == -1)
300 BestMatchIdx = LargestInt;
301
302 // Okay, we didn't find an exact solution. Fall back here depending on what
303 // is being looked for.
304 assert(BestMatchIdx != -1 && "Didn't find alignment info for this datatype!");
305
306 // Since we got a "best match" index, just return it.
307 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
308 : Alignments[BestMatchIdx].PrefAlign;
309}
310
311/// LayoutInfo - The lazy cache of structure layout information maintained by
312/// TargetData. Note that the struct types must have been free'd before
313/// llvm_shutdown is called (and thus this is deallocated) because all the
314/// targets with cached elements should have been destroyed.
315///
316typedef std::pair<const TargetData*,const StructType*> LayoutKey;
317
318struct DenseMapLayoutKeyInfo {
319 static inline LayoutKey getEmptyKey() { return LayoutKey(0, 0); }
320 static inline LayoutKey getTombstoneKey() {
321 return LayoutKey((TargetData*)(intptr_t)-1, 0);
322 }
323 static unsigned getHashValue(const LayoutKey &Val) {
Chris Lattner92eea072007-09-17 18:34:04 +0000324 return DenseMapInfo<void*>::getHashValue(Val.first) ^
325 DenseMapInfo<void*>::getHashValue(Val.second);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000326 }
Chris Lattner92eea072007-09-17 18:34:04 +0000327 static bool isEqual(const LayoutKey &LHS, const LayoutKey &RHS) {
328 return LHS == RHS;
329 }
330
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000331 static bool isPod() { return true; }
332};
333
334typedef DenseMap<LayoutKey, StructLayout*, DenseMapLayoutKeyInfo> LayoutInfoTy;
335static ManagedStatic<LayoutInfoTy> LayoutInfo;
336
337
338TargetData::~TargetData() {
339 if (LayoutInfo.isConstructed()) {
340 // Remove any layouts for this TD.
341 LayoutInfoTy &TheMap = *LayoutInfo;
342 for (LayoutInfoTy::iterator I = TheMap.begin(), E = TheMap.end();
343 I != E; ) {
344 if (I->first.first == this) {
345 I->second->~StructLayout();
346 free(I->second);
347 TheMap.erase(I++);
348 } else {
349 ++I;
350 }
351 }
352 }
353}
354
355const StructLayout *TargetData::getStructLayout(const StructType *Ty) const {
356 LayoutInfoTy &TheMap = *LayoutInfo;
357
358 StructLayout *&SL = TheMap[LayoutKey(this, Ty)];
359 if (SL) return SL;
360
361 // Otherwise, create the struct layout. Because it is variable length, we
362 // malloc it, then use placement new.
363 int NumElts = Ty->getNumElements();
364 StructLayout *L =
365 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1)*sizeof(uint64_t));
366
367 // Set SL before calling StructLayout's ctor. The ctor could cause other
368 // entries to be added to TheMap, invalidating our reference.
369 SL = L;
370
371 new (L) StructLayout(Ty, *this);
372 return L;
373}
374
375/// InvalidateStructLayoutInfo - TargetData speculatively caches StructLayout
376/// objects. If a TargetData object is alive when types are being refined and
377/// removed, this method must be called whenever a StructType is removed to
378/// avoid a dangling pointer in this cache.
379void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const {
380 if (!LayoutInfo.isConstructed()) return; // No cache.
381
382 LayoutInfoTy::iterator I = LayoutInfo->find(LayoutKey(this, Ty));
383 if (I != LayoutInfo->end()) {
384 I->second->~StructLayout();
385 free(I->second);
386 LayoutInfo->erase(I);
387 }
388}
389
390
391std::string TargetData::getStringRepresentation() const {
392 std::string repr;
393 repr.append(LittleEndian ? "e" : "E");
394 repr.append("-p:").append(itostr((int64_t) (PointerMemSize * 8))).
395 append(":").append(itostr((int64_t) (PointerABIAlign * 8))).
396 append(":").append(itostr((int64_t) (PointerPrefAlign * 8)));
397 for (align_const_iterator I = Alignments.begin();
398 I != Alignments.end();
399 ++I) {
400 repr.append("-").append(1, (char) I->AlignType).
401 append(utostr((int64_t) I->TypeBitWidth)).
402 append(":").append(utostr((uint64_t) (I->ABIAlign * 8))).
403 append(":").append(utostr((uint64_t) (I->PrefAlign * 8)));
404 }
405 return repr;
406}
407
408
409uint64_t TargetData::getTypeSize(const Type *Ty) const {
410 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
411 switch (Ty->getTypeID()) {
412 case Type::LabelTyID:
413 case Type::PointerTyID:
414 return getPointerSize();
415 case Type::ArrayTyID: {
416 const ArrayType *ATy = cast<ArrayType>(Ty);
417 uint64_t Size;
418 unsigned char Alignment;
419 Size = getTypeSize(ATy->getElementType());
420 Alignment = getABITypeAlignment(ATy->getElementType());
421 uint64_t AlignedSize = (Size + Alignment - 1)/Alignment*Alignment;
422 return AlignedSize*ATy->getNumElements();
423 }
424 case Type::StructTyID: {
425 // Get the layout annotation... which is lazily created on demand.
426 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
427 return Layout->getSizeInBytes();
428 }
429 case Type::IntegerTyID: {
430 unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
431 if (BitWidth <= 8) {
432 return 1;
433 } else if (BitWidth <= 16) {
434 return 2;
435 } else if (BitWidth <= 32) {
436 return 4;
437 } else if (BitWidth <= 64) {
438 return 8;
439 } else {
440 // The size of this > 64 bit type is chosen as a multiple of the
441 // preferred alignment of the largest "native" size the target supports.
442 // We first obtain the the alignment info for this type and then compute
443 // the next largest multiple of that size.
444 uint64_t size = getAlignmentInfo(INTEGER_ALIGN, BitWidth, false) * 8;
445 return (((BitWidth / (size)) + (BitWidth % size != 0)) * size) / 8;
446 }
447 break;
448 }
449 case Type::VoidTyID:
450 return 1;
451 case Type::FloatTyID:
452 return 4;
453 case Type::DoubleTyID:
454 return 8;
Dale Johannesen4c39f712007-08-03 20:20:50 +0000455 case Type::PPC_FP128TyID:
456 case Type::FP128TyID:
457 return 16;
458 // In memory objects this is always aligned to a higher boundary, but
459 // only 10 bytes contain information.
460 case Type::X86_FP80TyID:
461 return 10;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000462 case Type::VectorTyID: {
463 const VectorType *PTy = cast<VectorType>(Ty);
464 return PTy->getBitWidth() / 8;
465 }
466 default:
467 assert(0 && "TargetData::getTypeSize(): Unsupported type");
468 break;
469 }
470 return 0;
471}
472
473uint64_t TargetData::getTypeSizeInBits(const Type *Ty) const {
474 if (Ty->isInteger())
475 return cast<IntegerType>(Ty)->getBitWidth();
476 else
477 return getTypeSize(Ty) * 8;
478}
479
Dale Johannesena0082fa2007-10-01 16:03:14 +0000480uint64_t TargetData::getABITypeSizeInBits(const Type *Ty) const {
481 if (Ty->isInteger())
482 return cast<IntegerType>(Ty)->getBitWidth();
483 else
484 return getABITypeSize(Ty) * 8;
485}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000486/*!
487 \param abi_or_pref Flag that determines which alignment is returned. true
488 returns the ABI alignment, false returns the preferred alignment.
489 \param Ty The underlying type for which alignment is determined.
490
491 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
492 == false) for the requested type \a Ty.
493 */
494unsigned char TargetData::getAlignment(const Type *Ty, bool abi_or_pref) const {
495 int AlignType = -1;
496
497 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
498 switch (Ty->getTypeID()) {
499 /* Early escape for the non-numeric types */
500 case Type::LabelTyID:
501 case Type::PointerTyID:
502 return (abi_or_pref
503 ? getPointerABIAlignment()
504 : getPointerPrefAlignment());
505 case Type::ArrayTyID:
506 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
507
508 case Type::StructTyID: {
509 // Packed structure types always have an ABI alignment of one.
510 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
511 return 1;
512
513 // Get the layout annotation... which is lazily created on demand.
514 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
515 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref);
516 return std::max(Align, (unsigned)Layout->getAlignment());
517 }
518 case Type::IntegerTyID:
519 case Type::VoidTyID:
520 AlignType = INTEGER_ALIGN;
521 break;
522 case Type::FloatTyID:
523 case Type::DoubleTyID:
Dale Johannesen4c39f712007-08-03 20:20:50 +0000524 // PPC_FP128TyID and FP128TyID have different data contents, but the
525 // same size and alignment, so they look the same here.
526 case Type::PPC_FP128TyID:
527 case Type::FP128TyID:
528 case Type::X86_FP80TyID:
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000529 AlignType = FLOAT_ALIGN;
530 break;
531 case Type::VectorTyID: {
532 const VectorType *VTy = cast<VectorType>(Ty);
533 // Degenerate vectors are assumed to be scalar-ized
534 if (VTy->getNumElements() == 1)
535 return getAlignment(VTy->getElementType(), abi_or_pref);
536 else
537 AlignType = VECTOR_ALIGN;
538 break;
539 }
540 default:
541 assert(0 && "Bad type for getAlignment!!!");
542 break;
543 }
544
545 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSize(Ty) * 8,
546 abi_or_pref);
547}
548
549unsigned char TargetData::getABITypeAlignment(const Type *Ty) const {
550 return getAlignment(Ty, true);
551}
552
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000553unsigned char TargetData::getCallFrameTypeAlignment(const Type *Ty) const {
554 for (unsigned i = 0, e = Alignments.size(); i != e; ++i)
555 if (Alignments[i].AlignType == STACK_ALIGN)
556 return Alignments[i].ABIAlign;
557
558 return getABITypeAlignment(Ty);
559}
560
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000561unsigned char TargetData::getPrefTypeAlignment(const Type *Ty) const {
562 return getAlignment(Ty, false);
563}
564
565unsigned char TargetData::getPreferredTypeAlignmentShift(const Type *Ty) const {
566 unsigned Align = (unsigned) getPrefTypeAlignment(Ty);
567 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
568 return Log2_32(Align);
569}
570
571/// getIntPtrType - Return an unsigned integer type that is the same size or
572/// greater to the host pointer size.
573const Type *TargetData::getIntPtrType() const {
Dan Gohmandf0817f2007-10-08 15:16:25 +0000574 return IntegerType::get(getPointerSizeInBits());
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000575}
576
577
578uint64_t TargetData::getIndexedOffset(const Type *ptrTy, Value* const* Indices,
579 unsigned NumIndices) const {
580 const Type *Ty = ptrTy;
581 assert(isa<PointerType>(Ty) && "Illegal argument for getIndexedOffset()");
582 uint64_t Result = 0;
583
584 generic_gep_type_iterator<Value* const*>
585 TI = gep_type_begin(ptrTy, Indices, Indices+NumIndices);
586 for (unsigned CurIDX = 0; CurIDX != NumIndices; ++CurIDX, ++TI) {
587 if (const StructType *STy = dyn_cast<StructType>(*TI)) {
588 assert(Indices[CurIDX]->getType() == Type::Int32Ty &&
589 "Illegal struct idx");
590 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
591
592 // Get structure layout information...
593 const StructLayout *Layout = getStructLayout(STy);
594
595 // Add in the offset, as calculated by the structure layout info...
596 Result += Layout->getElementOffset(FieldNo);
597
598 // Update Ty to refer to current element
599 Ty = STy->getElementType(FieldNo);
600 } else {
601 // Update Ty to refer to current element
602 Ty = cast<SequentialType>(Ty)->getElementType();
603
604 // Get the array index and the size of each array element.
605 int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue();
606 Result += arrayIdx * (int64_t)getTypeSize(Ty);
607 }
608 }
609
610 return Result;
611}
612
613/// getPreferredAlignmentLog - Return the preferred alignment of the
614/// specified global, returned in log form. This includes an explicitly
615/// requested alignment (if the global has one).
616unsigned TargetData::getPreferredAlignmentLog(const GlobalVariable *GV) const {
617 const Type *ElemType = GV->getType()->getElementType();
618 unsigned Alignment = getPreferredTypeAlignmentShift(ElemType);
619 if (GV->getAlignment() > (1U << Alignment))
620 Alignment = Log2_32(GV->getAlignment());
621
622 if (GV->hasInitializer()) {
623 if (Alignment < 4) {
624 // If the global is not external, see if it is large. If so, give it a
625 // larger alignment.
626 if (getTypeSize(ElemType) > 128)
627 Alignment = 4; // 16-byte alignment.
628 }
629 }
630 return Alignment;
631}