blob: b3f2e98f63fa568a5bf15804580f45a3d32d895f [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"
Edwin Török675d5622009-07-11 20:10:48 +000026#include "llvm/Support/ErrorHandling.h"
Owen Andersond446e5e2009-06-23 00:21:15 +000027#include "llvm/System/Mutex.h"
Dan Gohmanf17a25c2007-07-18 16:29:46 +000028#include "llvm/ADT/DenseMap.h"
29#include "llvm/ADT/StringExtras.h"
30#include <algorithm>
31#include <cstdlib>
Dan Gohmanf17a25c2007-07-18 16:29:46 +000032using namespace llvm;
33
34// Handle the Pass registration stuff necessary to use TargetData's.
Dan Gohman089efff2008-05-13 00:00:25 +000035
36// Register the default SparcV9 implementation...
37static RegisterPass<TargetData> X("targetdata", "Target Data Layout", false,
38 true);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000039char TargetData::ID = 0;
40
41//===----------------------------------------------------------------------===//
42// Support for StructLayout
43//===----------------------------------------------------------------------===//
44
45StructLayout::StructLayout(const StructType *ST, const TargetData &TD) {
46 StructAlignment = 0;
47 StructSize = 0;
48 NumElements = ST->getNumElements();
49
Chris Lattner97c1e142008-12-08 07:11:56 +000050 // Loop over each of the elements, placing them in memory.
Dan Gohmanf17a25c2007-07-18 16:29:46 +000051 for (unsigned i = 0, e = NumElements; i != e; ++i) {
52 const Type *Ty = ST->getElementType(i);
Duncan Sands4afc5752008-06-04 08:21:45 +000053 unsigned TyAlign = ST->isPacked() ? 1 : TD.getABITypeAlignment(Ty);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000054
Chris Lattner97c1e142008-12-08 07:11:56 +000055 // Add padding if necessary to align the data element properly.
Duncan Sands79c36992008-12-09 09:58:11 +000056 if ((StructSize & (TyAlign-1)) != 0)
Chris Lattner97c1e142008-12-08 07:11:56 +000057 StructSize = TargetData::RoundUpAlignment(StructSize, TyAlign);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000058
Chris Lattner97c1e142008-12-08 07:11:56 +000059 // Keep track of maximum alignment constraint.
Dan Gohmanf17a25c2007-07-18 16:29:46 +000060 StructAlignment = std::max(TyAlign, StructAlignment);
61
62 MemberOffsets[i] = StructSize;
Duncan Sandsec4f97d2009-05-09 07:06:46 +000063 StructSize += TD.getTypeAllocSize(Ty); // Consume space for this data item
Dan Gohmanf17a25c2007-07-18 16:29:46 +000064 }
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.
Chris Lattner700a35b2008-12-08 07:21:39 +000071 if ((StructSize & (StructAlignment-1)) != 0)
Chris Lattner97c1e142008-12-08 07:11:56 +000072 StructSize = TargetData::RoundUpAlignment(StructSize, StructAlignment);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000073}
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
Dan Gohman02b1d022009-04-01 18:10:16 +0000181 setAlignment(INTEGER_ALIGN, 1, 1, 1); // i1
182 setAlignment(INTEGER_ALIGN, 1, 1, 8); // i8
183 setAlignment(INTEGER_ALIGN, 2, 2, 16); // i16
184 setAlignment(INTEGER_ALIGN, 4, 4, 32); // i32
185 setAlignment(INTEGER_ALIGN, 4, 8, 64); // i64
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000186 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)
Dan Gohman26f8c272008-09-04 17:05:41 +0000238 : ImmutablePass(&ID) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000239 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!");
Dan Gohmand7138742009-02-16 23:14:14 +0000307
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000308 // 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);
Dan Gohmand7138742009-02-16 23:14:14 +0000312 }
Chris Lattner6fdfffb2008-01-10 00:30:57 +0000313 }
Dan Gohmand7138742009-02-16 23:14:14 +0000314
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;
Owen Andersond446e5e2009-06-23 00:21:15 +0000350static ManagedStatic<sys::SmartMutex<true> > LayoutLock;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000351
352TargetData::~TargetData() {
Chris Lattner97c1e142008-12-08 07:11:56 +0000353 if (!LayoutInfo.isConstructed())
354 return;
355
Owen Andersonbe44bed2009-07-07 18:33:04 +0000356 sys::SmartScopedLock<true> Lock(*LayoutLock);
Chris Lattner97c1e142008-12-08 07:11:56 +0000357 // Remove any layouts for this TD.
358 LayoutInfoTy &TheMap = *LayoutInfo;
359 for (LayoutInfoTy::iterator I = TheMap.begin(), E = TheMap.end(); I != E; ) {
360 if (I->first.first == this) {
361 I->second->~StructLayout();
362 free(I->second);
363 TheMap.erase(I++);
364 } else {
365 ++I;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000366 }
367 }
368}
369
370const StructLayout *TargetData::getStructLayout(const StructType *Ty) const {
371 LayoutInfoTy &TheMap = *LayoutInfo;
372
Owen Andersonbe44bed2009-07-07 18:33:04 +0000373 sys::SmartScopedLock<true> Lock(*LayoutLock);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000374 StructLayout *&SL = TheMap[LayoutKey(this, Ty)];
375 if (SL) return SL;
376
377 // Otherwise, create the struct layout. Because it is variable length, we
378 // malloc it, then use placement new.
379 int NumElts = Ty->getNumElements();
380 StructLayout *L =
381 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1)*sizeof(uint64_t));
382
383 // Set SL before calling StructLayout's ctor. The ctor could cause other
384 // entries to be added to TheMap, invalidating our reference.
385 SL = L;
386
387 new (L) StructLayout(Ty, *this);
388 return L;
389}
390
391/// InvalidateStructLayoutInfo - TargetData speculatively caches StructLayout
392/// objects. If a TargetData object is alive when types are being refined and
393/// removed, this method must be called whenever a StructType is removed to
394/// avoid a dangling pointer in this cache.
395void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const {
396 if (!LayoutInfo.isConstructed()) return; // No cache.
397
Owen Andersonbe44bed2009-07-07 18:33:04 +0000398 sys::SmartScopedLock<true> Lock(*LayoutLock);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000399 LayoutInfoTy::iterator I = LayoutInfo->find(LayoutKey(this, Ty));
Chris Lattner97c1e142008-12-08 07:11:56 +0000400 if (I == LayoutInfo->end()) return;
401
402 I->second->~StructLayout();
403 free(I->second);
404 LayoutInfo->erase(I);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000405}
406
407
408std::string TargetData::getStringRepresentation() const {
409 std::string repr;
410 repr.append(LittleEndian ? "e" : "E");
411 repr.append("-p:").append(itostr((int64_t) (PointerMemSize * 8))).
412 append(":").append(itostr((int64_t) (PointerABIAlign * 8))).
413 append(":").append(itostr((int64_t) (PointerPrefAlign * 8)));
414 for (align_const_iterator I = Alignments.begin();
415 I != Alignments.end();
416 ++I) {
417 repr.append("-").append(1, (char) I->AlignType).
418 append(utostr((int64_t) I->TypeBitWidth)).
419 append(":").append(utostr((uint64_t) (I->ABIAlign * 8))).
420 append(":").append(utostr((uint64_t) (I->PrefAlign * 8)));
421 }
422 return repr;
423}
424
425
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000426uint64_t TargetData::getTypeSizeInBits(const Type *Ty) const {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000427 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
428 switch (Ty->getTypeID()) {
429 case Type::LabelTyID:
430 case Type::PointerTyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000431 return getPointerSizeInBits();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000432 case Type::ArrayTyID: {
433 const ArrayType *ATy = cast<ArrayType>(Ty);
Duncan Sandsec4f97d2009-05-09 07:06:46 +0000434 return getTypeAllocSizeInBits(ATy->getElementType())*ATy->getNumElements();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000435 }
Chris Lattner97c1e142008-12-08 07:11:56 +0000436 case Type::StructTyID:
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000437 // Get the layout annotation... which is lazily created on demand.
Chris Lattner97c1e142008-12-08 07:11:56 +0000438 return getStructLayout(cast<StructType>(Ty))->getSizeInBits();
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000439 case Type::IntegerTyID:
440 return cast<IntegerType>(Ty)->getBitWidth();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000441 case Type::VoidTyID:
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000442 return 8;
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000443 case Type::FloatTyID:
444 return 32;
445 case Type::DoubleTyID:
446 return 64;
Dale Johannesen4c39f712007-08-03 20:20:50 +0000447 case Type::PPC_FP128TyID:
448 case Type::FP128TyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000449 return 128;
Dale Johannesen4c39f712007-08-03 20:20:50 +0000450 // In memory objects this is always aligned to a higher boundary, but
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000451 // only 80 bits contain information.
Dale Johannesen4c39f712007-08-03 20:20:50 +0000452 case Type::X86_FP80TyID:
Duncan Sandsf99fdc62007-11-01 20:53:16 +0000453 return 80;
Chris Lattner97c1e142008-12-08 07:11:56 +0000454 case Type::VectorTyID:
455 return cast<VectorType>(Ty)->getBitWidth();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000456 default:
Edwin Török675d5622009-07-11 20:10:48 +0000457 LLVM_UNREACHABLE("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()) {
Chris Lattner97c1e142008-12-08 07:11:56 +0000476 // Early escape for the non-numeric types.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000477 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);
Dan Gohmand7138742009-02-16 23:14:14 +0000484
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000485 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;
Dan Gohmand7138742009-02-16 23:14:14 +0000489
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000490 // 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:
Edwin Török675d5622009-07-11 20:10:48 +0000512 LLVM_UNREACHABLE("Bad type for getAlignment!!!");
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000513 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.
Jay Foadbad23f82009-05-11 11:13:47 +0000544const IntegerType *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 Sandsec4f97d2009-05-09 07:06:46 +0000577 Result += arrayIdx * (int64_t)getTypeAllocSize(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}