blob: b2d76d841807ce48b46e6b4e720b0e9daada67d4 [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");
86 assert((SI == &MemberOffsets[0] || *(SI-1) < Offset) &&
87 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
88 "Upper bound didn't work!");
89 return SI-&MemberOffsets[0];
90}
91
92//===----------------------------------------------------------------------===//
93// TargetAlignElem, TargetAlign support
94//===----------------------------------------------------------------------===//
95
96TargetAlignElem
97TargetAlignElem::get(AlignTypeEnum align_type, unsigned char abi_align,
98 unsigned char pref_align, uint32_t bit_width) {
99 TargetAlignElem retval;
100 retval.AlignType = align_type;
101 retval.ABIAlign = abi_align;
102 retval.PrefAlign = pref_align;
103 retval.TypeBitWidth = bit_width;
104 return retval;
105}
106
107bool
108TargetAlignElem::operator==(const TargetAlignElem &rhs) const {
109 return (AlignType == rhs.AlignType
110 && ABIAlign == rhs.ABIAlign
111 && PrefAlign == rhs.PrefAlign
112 && TypeBitWidth == rhs.TypeBitWidth);
113}
114
115std::ostream &
116TargetAlignElem::dump(std::ostream &os) const {
117 return os << AlignType
118 << TypeBitWidth
119 << ":" << (int) (ABIAlign * 8)
120 << ":" << (int) (PrefAlign * 8);
121}
122
123const TargetAlignElem TargetData::InvalidAlignmentElem =
124 TargetAlignElem::get((AlignTypeEnum) -1, 0, 0, 0);
125
126//===----------------------------------------------------------------------===//
127// TargetData Class Implementation
128//===----------------------------------------------------------------------===//
129
130/*!
131 A TargetDescription string consists of a sequence of hyphen-delimited
132 specifiers for target endianness, pointer size and alignments, and various
133 primitive type sizes and alignments. A typical string looks something like:
134 <br><br>
135 "E-p:32:32:32-i1:8:8-i8:8:8-i32:32:32-i64:32:64-f32:32:32-f64:32:64"
136 <br><br>
137 (note: this string is not fully specified and is only an example.)
138 \p
139 Alignments come in two flavors: ABI and preferred. ABI alignment (abi_align,
140 below) dictates how a type will be aligned within an aggregate and when used
141 as an argument. Preferred alignment (pref_align, below) determines a type's
142 alignment when emitted as a global.
143 \p
144 Specifier string details:
145 <br><br>
146 <i>[E|e]</i>: Endianness. "E" specifies a big-endian target data model, "e"
147 specifies a little-endian target data model.
148 <br><br>
Reid Spencer37c7cea2007-08-05 20:06:04 +0000149 <i>p:@verbatim<size>:<abi_align>:<pref_align>@endverbatim</i>: Pointer size,
150 ABI and preferred alignment.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000151 <br><br>
Reid Spencer37c7cea2007-08-05 20:06:04 +0000152 <i>@verbatim<type><size>:<abi_align>:<pref_align>@endverbatim</i>: Numeric type alignment. Type is
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000153 one of <i>i|f|v|a</i>, corresponding to integer, floating point, vector (aka
154 packed) or aggregate. Size indicates the size, e.g., 32 or 64 bits.
155 \p
156 The default string, fully specified is:
157 <br><br>
158 "E-p:64:64:64-a0:0:0-f32:32:32-f64:0:64"
159 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:0:64"
160 "-v64:64:64-v128:128:128"
161 <br><br>
162 Note that in the case of aggregates, 0 is the default ABI and preferred
163 alignment. This is a special case, where the aggregate's computed worst-case
164 alignment will be used.
165 */
166void TargetData::init(const std::string &TargetDescription) {
167 std::string temp = TargetDescription;
168
169 LittleEndian = false;
170 PointerMemSize = 8;
171 PointerABIAlign = 8;
172 PointerPrefAlign = PointerABIAlign;
173
174 // Default alignments
175 setAlignment(INTEGER_ALIGN, 1, 1, 1); // Bool
176 setAlignment(INTEGER_ALIGN, 1, 1, 8); // Byte
177 setAlignment(INTEGER_ALIGN, 2, 2, 16); // short
178 setAlignment(INTEGER_ALIGN, 4, 4, 32); // int
179 setAlignment(INTEGER_ALIGN, 4, 8, 64); // long
180 setAlignment(FLOAT_ALIGN, 4, 4, 32); // float
181 setAlignment(FLOAT_ALIGN, 8, 8, 64); // double
182 setAlignment(VECTOR_ALIGN, 8, 8, 64); // v2i32
183 setAlignment(VECTOR_ALIGN, 16, 16, 128); // v16i8, v8i16, v4i32, ...
184 setAlignment(AGGREGATE_ALIGN, 0, 8, 0); // struct, union, class, ...
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000185
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000186 while (!temp.empty()) {
187 std::string token = getToken(temp, "-");
188 std::string arg0 = getToken(token, ":");
189 const char *p = arg0.c_str();
190 switch(*p) {
191 case 'E':
192 LittleEndian = false;
193 break;
194 case 'e':
195 LittleEndian = true;
196 break;
197 case 'p':
198 PointerMemSize = atoi(getToken(token,":").c_str()) / 8;
199 PointerABIAlign = atoi(getToken(token,":").c_str()) / 8;
200 PointerPrefAlign = atoi(getToken(token,":").c_str()) / 8;
201 if (PointerPrefAlign == 0)
202 PointerPrefAlign = PointerABIAlign;
203 break;
204 case 'i':
205 case 'v':
206 case 'f':
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000207 case 'a':
208 case 's': {
209 AlignTypeEnum align_type;
210 switch(*p) {
211 case 'i': align_type = INTEGER_ALIGN; break;
212 case 'v': align_type = VECTOR_ALIGN; break;
213 case 'f': align_type = FLOAT_ALIGN; break;
214 case 'a': align_type = AGGREGATE_ALIGN; break;
215 case 's': align_type = STACK_ALIGN; break;
216 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000217 uint32_t size = (uint32_t) atoi(++p);
218 unsigned char abi_align = atoi(getToken(token, ":").c_str()) / 8;
219 unsigned char pref_align = atoi(getToken(token, ":").c_str()) / 8;
220 if (pref_align == 0)
221 pref_align = abi_align;
222 setAlignment(align_type, abi_align, pref_align, size);
223 break;
224 }
225 default:
226 break;
227 }
228 }
229}
230
231TargetData::TargetData(const Module *M)
232 : ImmutablePass((intptr_t)&ID) {
233 init(M->getDataLayout());
234}
235
236void
237TargetData::setAlignment(AlignTypeEnum align_type, unsigned char abi_align,
238 unsigned char pref_align, uint32_t bit_width) {
239 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
240 if (Alignments[i].AlignType == align_type &&
241 Alignments[i].TypeBitWidth == bit_width) {
242 // Update the abi, preferred alignments.
243 Alignments[i].ABIAlign = abi_align;
244 Alignments[i].PrefAlign = pref_align;
245 return;
246 }
247 }
248
249 Alignments.push_back(TargetAlignElem::get(align_type, abi_align,
250 pref_align, bit_width));
251}
252
253/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
254/// preferred if ABIInfo = false) the target wants for the specified datatype.
255unsigned TargetData::getAlignmentInfo(AlignTypeEnum AlignType,
256 uint32_t BitWidth, bool ABIInfo) const {
257 // Check to see if we have an exact match and remember the best match we see.
258 int BestMatchIdx = -1;
259 int LargestInt = -1;
260 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
261 if (Alignments[i].AlignType == AlignType &&
262 Alignments[i].TypeBitWidth == BitWidth)
263 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
264
265 // The best match so far depends on what we're looking for.
266 if (AlignType == VECTOR_ALIGN) {
267 // If this is a specification for a smaller vector type, we will fall back
268 // to it. This happens because <128 x double> can be implemented in terms
269 // of 64 <2 x double>.
270 if (Alignments[i].AlignType == VECTOR_ALIGN &&
271 Alignments[i].TypeBitWidth < BitWidth) {
272 // Verify that we pick the biggest of the fallbacks.
273 if (BestMatchIdx == -1 ||
274 Alignments[BestMatchIdx].TypeBitWidth < BitWidth)
275 BestMatchIdx = i;
276 }
277 } else if (AlignType == INTEGER_ALIGN &&
278 Alignments[i].AlignType == INTEGER_ALIGN) {
279 // The "best match" for integers is the smallest size that is larger than
280 // the BitWidth requested.
281 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
282 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
283 BestMatchIdx = i;
284 // However, if there isn't one that's larger, then we must use the
285 // largest one we have (see below)
286 if (LargestInt == -1 ||
287 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
288 LargestInt = i;
289 }
290 }
291
292 // For integers, if we didn't find a best match, use the largest one found.
293 if (BestMatchIdx == -1)
294 BestMatchIdx = LargestInt;
295
296 // Okay, we didn't find an exact solution. Fall back here depending on what
297 // is being looked for.
298 assert(BestMatchIdx != -1 && "Didn't find alignment info for this datatype!");
299
300 // Since we got a "best match" index, just return it.
301 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
302 : Alignments[BestMatchIdx].PrefAlign;
303}
304
305/// LayoutInfo - The lazy cache of structure layout information maintained by
306/// TargetData. Note that the struct types must have been free'd before
307/// llvm_shutdown is called (and thus this is deallocated) because all the
308/// targets with cached elements should have been destroyed.
309///
310typedef std::pair<const TargetData*,const StructType*> LayoutKey;
311
312struct DenseMapLayoutKeyInfo {
313 static inline LayoutKey getEmptyKey() { return LayoutKey(0, 0); }
314 static inline LayoutKey getTombstoneKey() {
315 return LayoutKey((TargetData*)(intptr_t)-1, 0);
316 }
317 static unsigned getHashValue(const LayoutKey &Val) {
Chris Lattner92eea072007-09-17 18:34:04 +0000318 return DenseMapInfo<void*>::getHashValue(Val.first) ^
319 DenseMapInfo<void*>::getHashValue(Val.second);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000320 }
Chris Lattner92eea072007-09-17 18:34:04 +0000321 static bool isEqual(const LayoutKey &LHS, const LayoutKey &RHS) {
322 return LHS == RHS;
323 }
324
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000325 static bool isPod() { return true; }
326};
327
328typedef DenseMap<LayoutKey, StructLayout*, DenseMapLayoutKeyInfo> LayoutInfoTy;
329static ManagedStatic<LayoutInfoTy> LayoutInfo;
330
331
332TargetData::~TargetData() {
333 if (LayoutInfo.isConstructed()) {
334 // Remove any layouts for this TD.
335 LayoutInfoTy &TheMap = *LayoutInfo;
336 for (LayoutInfoTy::iterator I = TheMap.begin(), E = TheMap.end();
337 I != E; ) {
338 if (I->first.first == this) {
339 I->second->~StructLayout();
340 free(I->second);
341 TheMap.erase(I++);
342 } else {
343 ++I;
344 }
345 }
346 }
347}
348
349const StructLayout *TargetData::getStructLayout(const StructType *Ty) const {
350 LayoutInfoTy &TheMap = *LayoutInfo;
351
352 StructLayout *&SL = TheMap[LayoutKey(this, Ty)];
353 if (SL) return SL;
354
355 // Otherwise, create the struct layout. Because it is variable length, we
356 // malloc it, then use placement new.
357 int NumElts = Ty->getNumElements();
358 StructLayout *L =
359 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1)*sizeof(uint64_t));
360
361 // Set SL before calling StructLayout's ctor. The ctor could cause other
362 // entries to be added to TheMap, invalidating our reference.
363 SL = L;
364
365 new (L) StructLayout(Ty, *this);
366 return L;
367}
368
369/// InvalidateStructLayoutInfo - TargetData speculatively caches StructLayout
370/// objects. If a TargetData object is alive when types are being refined and
371/// removed, this method must be called whenever a StructType is removed to
372/// avoid a dangling pointer in this cache.
373void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const {
374 if (!LayoutInfo.isConstructed()) return; // No cache.
375
376 LayoutInfoTy::iterator I = LayoutInfo->find(LayoutKey(this, Ty));
377 if (I != LayoutInfo->end()) {
378 I->second->~StructLayout();
379 free(I->second);
380 LayoutInfo->erase(I);
381 }
382}
383
384
385std::string TargetData::getStringRepresentation() const {
386 std::string repr;
387 repr.append(LittleEndian ? "e" : "E");
388 repr.append("-p:").append(itostr((int64_t) (PointerMemSize * 8))).
389 append(":").append(itostr((int64_t) (PointerABIAlign * 8))).
390 append(":").append(itostr((int64_t) (PointerPrefAlign * 8)));
391 for (align_const_iterator I = Alignments.begin();
392 I != Alignments.end();
393 ++I) {
394 repr.append("-").append(1, (char) I->AlignType).
395 append(utostr((int64_t) I->TypeBitWidth)).
396 append(":").append(utostr((uint64_t) (I->ABIAlign * 8))).
397 append(":").append(utostr((uint64_t) (I->PrefAlign * 8)));
398 }
399 return repr;
400}
401
402
403uint64_t TargetData::getTypeSize(const Type *Ty) const {
404 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
405 switch (Ty->getTypeID()) {
406 case Type::LabelTyID:
407 case Type::PointerTyID:
408 return getPointerSize();
409 case Type::ArrayTyID: {
410 const ArrayType *ATy = cast<ArrayType>(Ty);
411 uint64_t Size;
412 unsigned char Alignment;
413 Size = getTypeSize(ATy->getElementType());
414 Alignment = getABITypeAlignment(ATy->getElementType());
415 uint64_t AlignedSize = (Size + Alignment - 1)/Alignment*Alignment;
416 return AlignedSize*ATy->getNumElements();
417 }
418 case Type::StructTyID: {
419 // Get the layout annotation... which is lazily created on demand.
420 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
421 return Layout->getSizeInBytes();
422 }
423 case Type::IntegerTyID: {
424 unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
425 if (BitWidth <= 8) {
426 return 1;
427 } else if (BitWidth <= 16) {
428 return 2;
429 } else if (BitWidth <= 32) {
430 return 4;
431 } else if (BitWidth <= 64) {
432 return 8;
433 } else {
434 // The size of this > 64 bit type is chosen as a multiple of the
435 // preferred alignment of the largest "native" size the target supports.
436 // We first obtain the the alignment info for this type and then compute
437 // the next largest multiple of that size.
438 uint64_t size = getAlignmentInfo(INTEGER_ALIGN, BitWidth, false) * 8;
439 return (((BitWidth / (size)) + (BitWidth % size != 0)) * size) / 8;
440 }
441 break;
442 }
443 case Type::VoidTyID:
444 return 1;
445 case Type::FloatTyID:
446 return 4;
447 case Type::DoubleTyID:
448 return 8;
Dale Johannesen4c39f712007-08-03 20:20:50 +0000449 case Type::PPC_FP128TyID:
450 case Type::FP128TyID:
451 return 16;
452 // In memory objects this is always aligned to a higher boundary, but
453 // only 10 bytes contain information.
454 case Type::X86_FP80TyID:
455 return 10;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000456 case Type::VectorTyID: {
457 const VectorType *PTy = cast<VectorType>(Ty);
458 return PTy->getBitWidth() / 8;
459 }
460 default:
461 assert(0 && "TargetData::getTypeSize(): Unsupported type");
462 break;
463 }
464 return 0;
465}
466
467uint64_t TargetData::getTypeSizeInBits(const Type *Ty) const {
468 if (Ty->isInteger())
469 return cast<IntegerType>(Ty)->getBitWidth();
470 else
471 return getTypeSize(Ty) * 8;
472}
473
Dale Johannesena0082fa2007-10-01 16:03:14 +0000474uint64_t TargetData::getABITypeSizeInBits(const Type *Ty) const {
475 if (Ty->isInteger())
476 return cast<IntegerType>(Ty)->getBitWidth();
477 else
478 return getABITypeSize(Ty) * 8;
479}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000480/*!
481 \param abi_or_pref Flag that determines which alignment is returned. true
482 returns the ABI alignment, false returns the preferred alignment.
483 \param Ty The underlying type for which alignment is determined.
484
485 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
486 == false) for the requested type \a Ty.
487 */
488unsigned char TargetData::getAlignment(const Type *Ty, bool abi_or_pref) const {
489 int AlignType = -1;
490
491 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
492 switch (Ty->getTypeID()) {
493 /* Early escape for the non-numeric types */
494 case Type::LabelTyID:
495 case Type::PointerTyID:
496 return (abi_or_pref
497 ? getPointerABIAlignment()
498 : getPointerPrefAlignment());
499 case Type::ArrayTyID:
500 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
501
502 case Type::StructTyID: {
503 // Packed structure types always have an ABI alignment of one.
504 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
505 return 1;
506
507 // Get the layout annotation... which is lazily created on demand.
508 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
509 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref);
510 return std::max(Align, (unsigned)Layout->getAlignment());
511 }
512 case Type::IntegerTyID:
513 case Type::VoidTyID:
514 AlignType = INTEGER_ALIGN;
515 break;
516 case Type::FloatTyID:
517 case Type::DoubleTyID:
Dale Johannesen4c39f712007-08-03 20:20:50 +0000518 // PPC_FP128TyID and FP128TyID have different data contents, but the
519 // same size and alignment, so they look the same here.
520 case Type::PPC_FP128TyID:
521 case Type::FP128TyID:
522 case Type::X86_FP80TyID:
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000523 AlignType = FLOAT_ALIGN;
524 break;
525 case Type::VectorTyID: {
526 const VectorType *VTy = cast<VectorType>(Ty);
527 // Degenerate vectors are assumed to be scalar-ized
528 if (VTy->getNumElements() == 1)
529 return getAlignment(VTy->getElementType(), abi_or_pref);
530 else
531 AlignType = VECTOR_ALIGN;
532 break;
533 }
534 default:
535 assert(0 && "Bad type for getAlignment!!!");
536 break;
537 }
538
539 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSize(Ty) * 8,
540 abi_or_pref);
541}
542
543unsigned char TargetData::getABITypeAlignment(const Type *Ty) const {
544 return getAlignment(Ty, true);
545}
546
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000547unsigned char TargetData::getCallFrameTypeAlignment(const Type *Ty) const {
548 for (unsigned i = 0, e = Alignments.size(); i != e; ++i)
549 if (Alignments[i].AlignType == STACK_ALIGN)
550 return Alignments[i].ABIAlign;
551
552 return getABITypeAlignment(Ty);
553}
554
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000555unsigned char TargetData::getPrefTypeAlignment(const Type *Ty) const {
556 return getAlignment(Ty, false);
557}
558
559unsigned char TargetData::getPreferredTypeAlignmentShift(const Type *Ty) const {
560 unsigned Align = (unsigned) getPrefTypeAlignment(Ty);
561 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
562 return Log2_32(Align);
563}
564
565/// getIntPtrType - Return an unsigned integer type that is the same size or
566/// greater to the host pointer size.
567const Type *TargetData::getIntPtrType() const {
Dan Gohmandf0817f2007-10-08 15:16:25 +0000568 return IntegerType::get(getPointerSizeInBits());
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000569}
570
571
572uint64_t TargetData::getIndexedOffset(const Type *ptrTy, Value* const* Indices,
573 unsigned NumIndices) const {
574 const Type *Ty = ptrTy;
575 assert(isa<PointerType>(Ty) && "Illegal argument for getIndexedOffset()");
576 uint64_t Result = 0;
577
578 generic_gep_type_iterator<Value* const*>
579 TI = gep_type_begin(ptrTy, Indices, Indices+NumIndices);
580 for (unsigned CurIDX = 0; CurIDX != NumIndices; ++CurIDX, ++TI) {
581 if (const StructType *STy = dyn_cast<StructType>(*TI)) {
582 assert(Indices[CurIDX]->getType() == Type::Int32Ty &&
583 "Illegal struct idx");
584 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
585
586 // Get structure layout information...
587 const StructLayout *Layout = getStructLayout(STy);
588
589 // Add in the offset, as calculated by the structure layout info...
590 Result += Layout->getElementOffset(FieldNo);
591
592 // Update Ty to refer to current element
593 Ty = STy->getElementType(FieldNo);
594 } else {
595 // Update Ty to refer to current element
596 Ty = cast<SequentialType>(Ty)->getElementType();
597
598 // Get the array index and the size of each array element.
599 int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue();
600 Result += arrayIdx * (int64_t)getTypeSize(Ty);
601 }
602 }
603
604 return Result;
605}
606
607/// getPreferredAlignmentLog - Return the preferred alignment of the
608/// specified global, returned in log form. This includes an explicitly
609/// requested alignment (if the global has one).
610unsigned TargetData::getPreferredAlignmentLog(const GlobalVariable *GV) const {
611 const Type *ElemType = GV->getType()->getElementType();
612 unsigned Alignment = getPreferredTypeAlignmentShift(ElemType);
613 if (GV->getAlignment() > (1U << Alignment))
614 Alignment = Log2_32(GV->getAlignment());
615
616 if (GV->hasInitializer()) {
617 if (Alignment < 4) {
618 // If the global is not external, see if it is large. If so, give it a
619 // larger alignment.
620 if (getTypeSize(ElemType) > 128)
621 Alignment = 4; // 16-byte alignment.
622 }
623 }
624 return Alignment;
625}