blob: 69a8ca902b4285407f248670a7ea3790ee799e95 [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>
Dan Gohmanf17a25c2007-07-18 16:29:46 +000030using namespace llvm;
31
32// Handle the Pass registration stuff necessary to use TargetData's.
Dan Gohman089efff2008-05-13 00:00:25 +000033
34// Register the default SparcV9 implementation...
35static RegisterPass<TargetData> X("targetdata", "Target Data Layout", false,
36 true);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000037char TargetData::ID = 0;
38
39//===----------------------------------------------------------------------===//
40// Support for StructLayout
41//===----------------------------------------------------------------------===//
42
43StructLayout::StructLayout(const StructType *ST, const TargetData &TD) {
44 StructAlignment = 0;
45 StructSize = 0;
46 NumElements = ST->getNumElements();
47
48 // Loop over each of the elements, placing them in memory...
49 for (unsigned i = 0, e = NumElements; i != e; ++i) {
50 const Type *Ty = ST->getElementType(i);
Duncan Sandsf99fdc62007-11-01 20:53:16 +000051 unsigned TyAlign = ST->isPacked() ?
52 1 : TD.getABITypeAlignment(Ty);
53 uint64_t TySize = ST->isPacked() ?
54 TD.getTypeStoreSize(Ty) : TD.getABITypeSize(Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000055
Duncan Sandsf99fdc62007-11-01 20:53:16 +000056 // Add padding if necessary to align the data element properly...
57 StructSize = (StructSize + TyAlign - 1)/TyAlign * TyAlign;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000058
59 // Keep track of maximum alignment constraint
60 StructAlignment = std::max(TyAlign, StructAlignment);
61
62 MemberOffsets[i] = StructSize;
63 StructSize += TySize; // Consume space for this data item
64 }
65
66 // Empty structures have alignment of 1 byte.
67 if (StructAlignment == 0) StructAlignment = 1;
68
69 // Add padding to the end of the struct so that it could be put in an array
70 // and all array elements would be aligned correctly.
71 if (StructSize % StructAlignment != 0)
72 StructSize = (StructSize/StructAlignment + 1) * StructAlignment;
73}
74
75
76/// getElementContainingOffset - Given a valid offset into the structure,
77/// return the structure index that contains it.
78unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
79 const uint64_t *SI =
80 std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset);
81 assert(SI != &MemberOffsets[0] && "Offset not in structure type!");
82 --SI;
83 assert(*SI <= Offset && "upper_bound didn't work");
Chris Lattner49d6b242007-10-29 02:40:02 +000084 assert((SI == &MemberOffsets[0] || *(SI-1) <= Offset) &&
Dan Gohmanf17a25c2007-07-18 16:29:46 +000085 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
86 "Upper bound didn't work!");
Chris Lattner49d6b242007-10-29 02:40:02 +000087
88 // Multiple fields can have the same offset if any of them are zero sized.
89 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
90 // at the i32 element, because it is the last element at that offset. This is
91 // the right one to return, because anything after it will have a higher
92 // offset, implying that this element is non-empty.
Dan Gohmanf17a25c2007-07-18 16:29:46 +000093 return SI-&MemberOffsets[0];
94}
95
96//===----------------------------------------------------------------------===//
97// TargetAlignElem, TargetAlign support
98//===----------------------------------------------------------------------===//
99
100TargetAlignElem
101TargetAlignElem::get(AlignTypeEnum align_type, unsigned char abi_align,
102 unsigned char pref_align, uint32_t bit_width) {
Duncan Sands935686e2008-01-29 06:23:44 +0000103 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000104 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) {
Duncan Sands935686e2008-01-29 06:23:44 +0000245 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000246 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
247 if (Alignments[i].AlignType == align_type &&
248 Alignments[i].TypeBitWidth == bit_width) {
249 // Update the abi, preferred alignments.
250 Alignments[i].ABIAlign = abi_align;
251 Alignments[i].PrefAlign = pref_align;
252 return;
253 }
254 }
255
256 Alignments.push_back(TargetAlignElem::get(align_type, abi_align,
257 pref_align, bit_width));
258}
259
260/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
261/// preferred if ABIInfo = false) the target wants for the specified datatype.
262unsigned TargetData::getAlignmentInfo(AlignTypeEnum AlignType,
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000263 uint32_t BitWidth, bool ABIInfo,
264 const Type *Ty) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000265 // Check to see if we have an exact match and remember the best match we see.
266 int BestMatchIdx = -1;
267 int LargestInt = -1;
268 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
269 if (Alignments[i].AlignType == AlignType &&
270 Alignments[i].TypeBitWidth == BitWidth)
271 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
272
273 // The best match so far depends on what we're looking for.
Duncan Sandsb3412482007-12-21 20:18:41 +0000274 if (AlignType == VECTOR_ALIGN && Alignments[i].AlignType == VECTOR_ALIGN) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000275 // If this is a specification for a smaller vector type, we will fall back
276 // to it. This happens because <128 x double> can be implemented in terms
277 // of 64 <2 x double>.
Duncan Sandsb3412482007-12-21 20:18:41 +0000278 if (Alignments[i].TypeBitWidth < BitWidth) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000279 // Verify that we pick the biggest of the fallbacks.
280 if (BestMatchIdx == -1 ||
Duncan Sandsb3412482007-12-21 20:18:41 +0000281 Alignments[BestMatchIdx].TypeBitWidth < Alignments[i].TypeBitWidth)
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000282 BestMatchIdx = i;
283 }
284 } else if (AlignType == INTEGER_ALIGN &&
285 Alignments[i].AlignType == INTEGER_ALIGN) {
286 // The "best match" for integers is the smallest size that is larger than
287 // the BitWidth requested.
288 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
289 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
290 BestMatchIdx = i;
291 // However, if there isn't one that's larger, then we must use the
292 // largest one we have (see below)
293 if (LargestInt == -1 ||
294 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
295 LargestInt = i;
296 }
297 }
298
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000299 // Okay, we didn't find an exact solution. Fall back here depending on what
300 // is being looked for.
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000301 if (BestMatchIdx == -1) {
302 // If we didn't find an integer alignment, fall back on most conservative.
303 if (AlignType == INTEGER_ALIGN) {
304 BestMatchIdx = LargestInt;
305 } else {
306 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
307
308 // If we didn't find a vector size that is smaller or equal to this type,
309 // then we will end up scalarizing this to its element type. Just return
310 // the alignment of the element.
311 return getAlignment(cast<VectorType>(Ty)->getElementType(), ABIInfo);
312 }
313 }
314
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000315 // Since we got a "best match" index, just return it.
316 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
317 : Alignments[BestMatchIdx].PrefAlign;
318}
319
Dan Gohman089efff2008-05-13 00:00:25 +0000320namespace {
321
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000322/// LayoutInfo - The lazy cache of structure layout information maintained by
323/// TargetData. Note that the struct types must have been free'd before
324/// llvm_shutdown is called (and thus this is deallocated) because all the
325/// targets with cached elements should have been destroyed.
326///
327typedef std::pair<const TargetData*,const StructType*> LayoutKey;
328
329struct DenseMapLayoutKeyInfo {
330 static inline LayoutKey getEmptyKey() { return LayoutKey(0, 0); }
331 static inline LayoutKey getTombstoneKey() {
332 return LayoutKey((TargetData*)(intptr_t)-1, 0);
333 }
334 static unsigned getHashValue(const LayoutKey &Val) {
Chris Lattner92eea072007-09-17 18:34:04 +0000335 return DenseMapInfo<void*>::getHashValue(Val.first) ^
336 DenseMapInfo<void*>::getHashValue(Val.second);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000337 }
Chris Lattner92eea072007-09-17 18:34:04 +0000338 static bool isEqual(const LayoutKey &LHS, const LayoutKey &RHS) {
339 return LHS == RHS;
340 }
341
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000342 static bool isPod() { return true; }
343};
344
345typedef DenseMap<LayoutKey, StructLayout*, DenseMapLayoutKeyInfo> LayoutInfoTy;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000346
Dan Gohman089efff2008-05-13 00:00:25 +0000347}
348
349static ManagedStatic<LayoutInfoTy> LayoutInfo;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000350
351TargetData::~TargetData() {
352 if (LayoutInfo.isConstructed()) {
353 // Remove any layouts for this TD.
354 LayoutInfoTy &TheMap = *LayoutInfo;
355 for (LayoutInfoTy::iterator I = TheMap.begin(), E = TheMap.end();
356 I != E; ) {
357 if (I->first.first == this) {
358 I->second->~StructLayout();
359 free(I->second);
360 TheMap.erase(I++);
361 } else {
362 ++I;
363 }
364 }
365 }
366}
367
368const StructLayout *TargetData::getStructLayout(const StructType *Ty) const {
369 LayoutInfoTy &TheMap = *LayoutInfo;
370
371 StructLayout *&SL = TheMap[LayoutKey(this, Ty)];
372 if (SL) return SL;
373
374 // Otherwise, create the struct layout. Because it is variable length, we
375 // malloc it, then use placement new.
376 int NumElts = Ty->getNumElements();
377 StructLayout *L =
378 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1)*sizeof(uint64_t));
379
380 // Set SL before calling StructLayout's ctor. The ctor could cause other
381 // entries to be added to TheMap, invalidating our reference.
382 SL = L;
383
384 new (L) StructLayout(Ty, *this);
385 return L;
386}
387
388/// InvalidateStructLayoutInfo - TargetData speculatively caches StructLayout
389/// objects. If a TargetData object is alive when types are being refined and
390/// removed, this method must be called whenever a StructType is removed to
391/// avoid a dangling pointer in this cache.
392void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const {
393 if (!LayoutInfo.isConstructed()) return; // No cache.
394
395 LayoutInfoTy::iterator I = LayoutInfo->find(LayoutKey(this, Ty));
396 if (I != LayoutInfo->end()) {
397 I->second->~StructLayout();
398 free(I->second);
399 LayoutInfo->erase(I);
400 }
401}
402
403
404std::string TargetData::getStringRepresentation() const {
405 std::string repr;
406 repr.append(LittleEndian ? "e" : "E");
407 repr.append("-p:").append(itostr((int64_t) (PointerMemSize * 8))).
408 append(":").append(itostr((int64_t) (PointerABIAlign * 8))).
409 append(":").append(itostr((int64_t) (PointerPrefAlign * 8)));
410 for (align_const_iterator I = Alignments.begin();
411 I != Alignments.end();
412 ++I) {
413 repr.append("-").append(1, (char) I->AlignType).
414 append(utostr((int64_t) I->TypeBitWidth)).
415 append(":").append(utostr((uint64_t) (I->ABIAlign * 8))).
416 append(":").append(utostr((uint64_t) (I->PrefAlign * 8)));
417 }
418 return repr;
419}
420
421
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000422uint64_t TargetData::getTypeSizeInBits(const Type *Ty) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000423 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
424 switch (Ty->getTypeID()) {
425 case Type::LabelTyID:
426 case Type::PointerTyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000427 return getPointerSizeInBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000428 case Type::ArrayTyID: {
429 const ArrayType *ATy = cast<ArrayType>(Ty);
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000430 return getABITypeSizeInBits(ATy->getElementType())*ATy->getNumElements();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000431 }
432 case Type::StructTyID: {
433 // Get the layout annotation... which is lazily created on demand.
434 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000435 return Layout->getSizeInBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000436 }
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000437 case Type::IntegerTyID:
438 return cast<IntegerType>(Ty)->getBitWidth();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000439 case Type::VoidTyID:
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000440 return 8;
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000441 case Type::FloatTyID:
442 return 32;
443 case Type::DoubleTyID:
444 return 64;
Dale Johannesen4c39f712007-08-03 20:20:50 +0000445 case Type::PPC_FP128TyID:
446 case Type::FP128TyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000447 return 128;
Dale Johannesen4c39f712007-08-03 20:20:50 +0000448 // In memory objects this is always aligned to a higher boundary, but
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000449 // only 80 bits contain information.
Dale Johannesen4c39f712007-08-03 20:20:50 +0000450 case Type::X86_FP80TyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000451 return 80;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000452 case Type::VectorTyID: {
453 const VectorType *PTy = cast<VectorType>(Ty);
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000454 return PTy->getBitWidth();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000455 }
456 default:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000457 assert(0 && "TargetData::getTypeSizeInBits(): Unsupported type");
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000458 break;
459 }
460 return 0;
461}
462
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000463/*!
464 \param abi_or_pref Flag that determines which alignment is returned. true
465 returns the ABI alignment, false returns the preferred alignment.
466 \param Ty The underlying type for which alignment is determined.
467
468 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
469 == false) for the requested type \a Ty.
470 */
471unsigned char TargetData::getAlignment(const Type *Ty, bool abi_or_pref) const {
472 int AlignType = -1;
473
474 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
475 switch (Ty->getTypeID()) {
476 /* Early escape for the non-numeric types */
477 case Type::LabelTyID:
478 case Type::PointerTyID:
479 return (abi_or_pref
480 ? getPointerABIAlignment()
481 : getPointerPrefAlignment());
482 case Type::ArrayTyID:
483 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
484
485 case Type::StructTyID: {
486 // Packed structure types always have an ABI alignment of one.
487 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
488 return 1;
489
490 // Get the layout annotation... which is lazily created on demand.
491 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000492 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000493 return std::max(Align, (unsigned)Layout->getAlignment());
494 }
495 case Type::IntegerTyID:
496 case Type::VoidTyID:
497 AlignType = INTEGER_ALIGN;
498 break;
499 case Type::FloatTyID:
500 case Type::DoubleTyID:
Dale Johannesen4c39f712007-08-03 20:20:50 +0000501 // PPC_FP128TyID and FP128TyID have different data contents, but the
502 // same size and alignment, so they look the same here.
503 case Type::PPC_FP128TyID:
504 case Type::FP128TyID:
505 case Type::X86_FP80TyID:
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000506 AlignType = FLOAT_ALIGN;
507 break;
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000508 case Type::VectorTyID:
509 AlignType = VECTOR_ALIGN;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000510 break;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000511 default:
512 assert(0 && "Bad type for getAlignment!!!");
513 break;
514 }
515
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000516 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000517 abi_or_pref, Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000518}
519
520unsigned char TargetData::getABITypeAlignment(const Type *Ty) const {
521 return getAlignment(Ty, true);
522}
523
Rafael Espindolab5c5df42007-09-07 14:52:14 +0000524unsigned char TargetData::getCallFrameTypeAlignment(const Type *Ty) const {
525 for (unsigned i = 0, e = Alignments.size(); i != e; ++i)
526 if (Alignments[i].AlignType == STACK_ALIGN)
527 return Alignments[i].ABIAlign;
528
529 return getABITypeAlignment(Ty);
530}
531
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000532unsigned char TargetData::getPrefTypeAlignment(const Type *Ty) const {
533 return getAlignment(Ty, false);
534}
535
536unsigned char TargetData::getPreferredTypeAlignmentShift(const Type *Ty) const {
537 unsigned Align = (unsigned) getPrefTypeAlignment(Ty);
538 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
539 return Log2_32(Align);
540}
541
542/// getIntPtrType - Return an unsigned integer type that is the same size or
543/// greater to the host pointer size.
544const Type *TargetData::getIntPtrType() const {
Dan Gohmandf0817f2007-10-08 15:16:25 +0000545 return IntegerType::get(getPointerSizeInBits());
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000546}
547
548
549uint64_t TargetData::getIndexedOffset(const Type *ptrTy, Value* const* Indices,
550 unsigned NumIndices) const {
551 const Type *Ty = ptrTy;
552 assert(isa<PointerType>(Ty) && "Illegal argument for getIndexedOffset()");
553 uint64_t Result = 0;
554
555 generic_gep_type_iterator<Value* const*>
556 TI = gep_type_begin(ptrTy, Indices, Indices+NumIndices);
557 for (unsigned CurIDX = 0; CurIDX != NumIndices; ++CurIDX, ++TI) {
558 if (const StructType *STy = dyn_cast<StructType>(*TI)) {
559 assert(Indices[CurIDX]->getType() == Type::Int32Ty &&
560 "Illegal struct idx");
561 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
562
563 // Get structure layout information...
564 const StructLayout *Layout = getStructLayout(STy);
565
566 // Add in the offset, as calculated by the structure layout info...
567 Result += Layout->getElementOffset(FieldNo);
568
569 // Update Ty to refer to current element
570 Ty = STy->getElementType(FieldNo);
571 } else {
572 // Update Ty to refer to current element
573 Ty = cast<SequentialType>(Ty)->getElementType();
574
575 // Get the array index and the size of each array element.
576 int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue();
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000577 Result += arrayIdx * (int64_t)getABITypeSize(Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000578 }
579 }
580
581 return Result;
582}
583
Duncan Sands935686e2008-01-29 06:23:44 +0000584/// getPreferredAlignment - Return the preferred alignment of the specified
585/// global. This includes an explicitly requested alignment (if the global
586/// has one).
587unsigned TargetData::getPreferredAlignment(const GlobalVariable *GV) const {
588 const Type *ElemType = GV->getType()->getElementType();
589 unsigned Alignment = getPrefTypeAlignment(ElemType);
590 if (GV->getAlignment() > Alignment)
591 Alignment = GV->getAlignment();
592
593 if (GV->hasInitializer()) {
594 if (Alignment < 16) {
595 // If the global is not external, see if it is large. If so, give it a
596 // larger alignment.
597 if (getTypeSizeInBits(ElemType) > 128)
598 Alignment = 16; // 16-byte alignment.
599 }
600 }
601 return Alignment;
602}
603
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000604/// getPreferredAlignmentLog - Return the preferred alignment of the
605/// specified global, returned in log form. This includes an explicitly
606/// requested alignment (if the global has one).
607unsigned TargetData::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Duncan Sands935686e2008-01-29 06:23:44 +0000608 return Log2_32(getPreferredAlignment(GV));
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000609}