1 //===-- DataLayout.cpp - Data size & alignment routines --------------------==//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines layout 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/IR/DataLayout.h"
20 #include "llvm/ADT/DenseMap.h"
21 #include "llvm/ADT/STLExtras.h"
22 #include "llvm/ADT/Triple.h"
23 #include "llvm/IR/Constants.h"
24 #include "llvm/IR/DerivedTypes.h"
25 #include "llvm/IR/GetElementPtrTypeIterator.h"
26 #include "llvm/IR/Module.h"
27 #include "llvm/Support/ErrorHandling.h"
28 #include "llvm/Support/ManagedStatic.h"
29 #include "llvm/Support/MathExtras.h"
30 #include "llvm/Support/Mutex.h"
31 #include "llvm/Support/raw_ostream.h"
32 #include <algorithm>
33 #include <cstdlib>
34 using namespace llvm;
35
36 //===----------------------------------------------------------------------===//
37 // Support for StructLayout
38 //===----------------------------------------------------------------------===//
39
StructLayout(StructType * ST,const DataLayout & DL)40 StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
41 assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
42 StructAlignment = 0;
43 StructSize = 0;
44 IsPadded = false;
45 NumElements = ST->getNumElements();
46
47 // Loop over each of the elements, placing them in memory.
48 for (unsigned i = 0, e = NumElements; i != e; ++i) {
49 Type *Ty = ST->getElementType(i);
50 unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
51
52 // Add padding if necessary to align the data element properly.
53 if ((StructSize & (TyAlign-1)) != 0) {
54 IsPadded = true;
55 StructSize = RoundUpToAlignment(StructSize, TyAlign);
56 }
57
58 // Keep track of maximum alignment constraint.
59 StructAlignment = std::max(TyAlign, StructAlignment);
60
61 MemberOffsets[i] = StructSize;
62 StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
63 }
64
65 // Empty structures have alignment of 1 byte.
66 if (StructAlignment == 0) StructAlignment = 1;
67
68 // Add padding to the end of the struct so that it could be put in an array
69 // and all array elements would be aligned correctly.
70 if ((StructSize & (StructAlignment-1)) != 0) {
71 IsPadded = true;
72 StructSize = RoundUpToAlignment(StructSize, StructAlignment);
73 }
74 }
75
76
77 /// getElementContainingOffset - Given a valid offset into the structure,
78 /// return the structure index that contains it.
getElementContainingOffset(uint64_t Offset) const79 unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
80 const uint64_t *SI =
81 std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset);
82 assert(SI != &MemberOffsets[0] && "Offset not in structure type!");
83 --SI;
84 assert(*SI <= Offset && "upper_bound didn't work");
85 assert((SI == &MemberOffsets[0] || *(SI-1) <= Offset) &&
86 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
87 "Upper bound didn't work!");
88
89 // Multiple fields can have the same offset if any of them are zero sized.
90 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
91 // at the i32 element, because it is the last element at that offset. This is
92 // the right one to return, because anything after it will have a higher
93 // offset, implying that this element is non-empty.
94 return SI-&MemberOffsets[0];
95 }
96
97 //===----------------------------------------------------------------------===//
98 // LayoutAlignElem, LayoutAlign support
99 //===----------------------------------------------------------------------===//
100
101 LayoutAlignElem
get(AlignTypeEnum align_type,unsigned abi_align,unsigned pref_align,uint32_t bit_width)102 LayoutAlignElem::get(AlignTypeEnum align_type, unsigned abi_align,
103 unsigned pref_align, uint32_t bit_width) {
104 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
105 LayoutAlignElem 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
113 bool
operator ==(const LayoutAlignElem & rhs) const114 LayoutAlignElem::operator==(const LayoutAlignElem &rhs) const {
115 return (AlignType == rhs.AlignType
116 && ABIAlign == rhs.ABIAlign
117 && PrefAlign == rhs.PrefAlign
118 && TypeBitWidth == rhs.TypeBitWidth);
119 }
120
121 const LayoutAlignElem
122 DataLayout::InvalidAlignmentElem = { INVALID_ALIGN, 0, 0, 0 };
123
124 //===----------------------------------------------------------------------===//
125 // PointerAlignElem, PointerAlign support
126 //===----------------------------------------------------------------------===//
127
128 PointerAlignElem
get(uint32_t AddressSpace,unsigned ABIAlign,unsigned PrefAlign,uint32_t TypeByteWidth)129 PointerAlignElem::get(uint32_t AddressSpace, unsigned ABIAlign,
130 unsigned PrefAlign, uint32_t TypeByteWidth) {
131 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
132 PointerAlignElem retval;
133 retval.AddressSpace = AddressSpace;
134 retval.ABIAlign = ABIAlign;
135 retval.PrefAlign = PrefAlign;
136 retval.TypeByteWidth = TypeByteWidth;
137 return retval;
138 }
139
140 bool
operator ==(const PointerAlignElem & rhs) const141 PointerAlignElem::operator==(const PointerAlignElem &rhs) const {
142 return (ABIAlign == rhs.ABIAlign
143 && AddressSpace == rhs.AddressSpace
144 && PrefAlign == rhs.PrefAlign
145 && TypeByteWidth == rhs.TypeByteWidth);
146 }
147
148 const PointerAlignElem
149 DataLayout::InvalidPointerElem = { 0U, 0U, 0U, ~0U };
150
151 //===----------------------------------------------------------------------===//
152 // DataLayout Class Implementation
153 //===----------------------------------------------------------------------===//
154
getManglingComponent(const Triple & T)155 const char *DataLayout::getManglingComponent(const Triple &T) {
156 if (T.isOSBinFormatMachO())
157 return "-m:o";
158 if (T.isOSWindows() && T.isOSBinFormatCOFF())
159 return T.getArch() == Triple::x86 ? "-m:x" : "-m:w";
160 return "-m:e";
161 }
162
163 static const LayoutAlignElem DefaultAlignments[] = {
164 { INTEGER_ALIGN, 1, 1, 1 }, // i1
165 { INTEGER_ALIGN, 8, 1, 1 }, // i8
166 { INTEGER_ALIGN, 16, 2, 2 }, // i16
167 { INTEGER_ALIGN, 32, 4, 4 }, // i32
168 { INTEGER_ALIGN, 64, 4, 8 }, // i64
169 { FLOAT_ALIGN, 16, 2, 2 }, // half
170 { FLOAT_ALIGN, 32, 4, 4 }, // float
171 { FLOAT_ALIGN, 64, 8, 8 }, // double
172 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
173 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
174 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
175 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
176 };
177
reset(StringRef Desc)178 void DataLayout::reset(StringRef Desc) {
179 clear();
180
181 LayoutMap = nullptr;
182 BigEndian = false;
183 StackNaturalAlign = 0;
184 ManglingMode = MM_None;
185
186 // Default alignments
187 for (const LayoutAlignElem &E : DefaultAlignments) {
188 setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
189 E.TypeBitWidth);
190 }
191 setPointerAlignment(0, 8, 8, 8);
192
193 parseSpecifier(Desc);
194 }
195
196 /// Checked version of split, to ensure mandatory subparts.
split(StringRef Str,char Separator)197 static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
198 assert(!Str.empty() && "parse error, string can't be empty here");
199 std::pair<StringRef, StringRef> Split = Str.split(Separator);
200 if (Split.second.empty() && Split.first != Str)
201 report_fatal_error("Trailing separator in datalayout string");
202 if (!Split.second.empty() && Split.first.empty())
203 report_fatal_error("Expected token before separator in datalayout string");
204 return Split;
205 }
206
207 /// Get an unsigned integer, including error checks.
getInt(StringRef R)208 static unsigned getInt(StringRef R) {
209 unsigned Result;
210 bool error = R.getAsInteger(10, Result); (void)error;
211 if (error)
212 report_fatal_error("not a number, or does not fit in an unsigned int");
213 return Result;
214 }
215
216 /// Convert bits into bytes. Assert if not a byte width multiple.
inBytes(unsigned Bits)217 static unsigned inBytes(unsigned Bits) {
218 if (Bits % 8)
219 report_fatal_error("number of bits must be a byte width multiple");
220 return Bits / 8;
221 }
222
parseSpecifier(StringRef Desc)223 void DataLayout::parseSpecifier(StringRef Desc) {
224 StringRepresentation = Desc;
225 while (!Desc.empty()) {
226 // Split at '-'.
227 std::pair<StringRef, StringRef> Split = split(Desc, '-');
228 Desc = Split.second;
229
230 // Split at ':'.
231 Split = split(Split.first, ':');
232
233 // Aliases used below.
234 StringRef &Tok = Split.first; // Current token.
235 StringRef &Rest = Split.second; // The rest of the string.
236
237 char Specifier = Tok.front();
238 Tok = Tok.substr(1);
239
240 switch (Specifier) {
241 case 's':
242 // Ignored for backward compatibility.
243 // FIXME: remove this on LLVM 4.0.
244 break;
245 case 'E':
246 BigEndian = true;
247 break;
248 case 'e':
249 BigEndian = false;
250 break;
251 case 'p': {
252 // Address space.
253 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
254 if (!isUInt<24>(AddrSpace))
255 report_fatal_error("Invalid address space, must be a 24bit integer");
256
257 // Size.
258 if (Rest.empty())
259 report_fatal_error(
260 "Missing size specification for pointer in datalayout string");
261 Split = split(Rest, ':');
262 unsigned PointerMemSize = inBytes(getInt(Tok));
263 if (!PointerMemSize)
264 report_fatal_error("Invalid pointer size of 0 bytes");
265
266 // ABI alignment.
267 if (Rest.empty())
268 report_fatal_error(
269 "Missing alignment specification for pointer in datalayout string");
270 Split = split(Rest, ':');
271 unsigned PointerABIAlign = inBytes(getInt(Tok));
272 if (!isPowerOf2_64(PointerABIAlign))
273 report_fatal_error(
274 "Pointer ABI alignment must be a power of 2");
275
276 // Preferred alignment.
277 unsigned PointerPrefAlign = PointerABIAlign;
278 if (!Rest.empty()) {
279 Split = split(Rest, ':');
280 PointerPrefAlign = inBytes(getInt(Tok));
281 if (!isPowerOf2_64(PointerPrefAlign))
282 report_fatal_error(
283 "Pointer preferred alignment must be a power of 2");
284 }
285
286 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
287 PointerMemSize);
288 break;
289 }
290 case 'i':
291 case 'v':
292 case 'f':
293 case 'a': {
294 AlignTypeEnum AlignType;
295 switch (Specifier) {
296 default:
297 case 'i': AlignType = INTEGER_ALIGN; break;
298 case 'v': AlignType = VECTOR_ALIGN; break;
299 case 'f': AlignType = FLOAT_ALIGN; break;
300 case 'a': AlignType = AGGREGATE_ALIGN; break;
301 }
302
303 // Bit size.
304 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
305
306 if (AlignType == AGGREGATE_ALIGN && Size != 0)
307 report_fatal_error(
308 "Sized aggregate specification in datalayout string");
309
310 // ABI alignment.
311 if (Rest.empty())
312 report_fatal_error(
313 "Missing alignment specification in datalayout string");
314 Split = split(Rest, ':');
315 unsigned ABIAlign = inBytes(getInt(Tok));
316 if (AlignType != AGGREGATE_ALIGN && !ABIAlign)
317 report_fatal_error(
318 "ABI alignment specification must be >0 for non-aggregate types");
319
320 // Preferred alignment.
321 unsigned PrefAlign = ABIAlign;
322 if (!Rest.empty()) {
323 Split = split(Rest, ':');
324 PrefAlign = inBytes(getInt(Tok));
325 }
326
327 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
328
329 break;
330 }
331 case 'n': // Native integer types.
332 for (;;) {
333 unsigned Width = getInt(Tok);
334 if (Width == 0)
335 report_fatal_error(
336 "Zero width native integer type in datalayout string");
337 LegalIntWidths.push_back(Width);
338 if (Rest.empty())
339 break;
340 Split = split(Rest, ':');
341 }
342 break;
343 case 'S': { // Stack natural alignment.
344 StackNaturalAlign = inBytes(getInt(Tok));
345 break;
346 }
347 case 'm':
348 if (!Tok.empty())
349 report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
350 if (Rest.empty())
351 report_fatal_error("Expected mangling specifier in datalayout string");
352 if (Rest.size() > 1)
353 report_fatal_error("Unknown mangling specifier in datalayout string");
354 switch(Rest[0]) {
355 default:
356 report_fatal_error("Unknown mangling in datalayout string");
357 case 'e':
358 ManglingMode = MM_ELF;
359 break;
360 case 'o':
361 ManglingMode = MM_MachO;
362 break;
363 case 'm':
364 ManglingMode = MM_Mips;
365 break;
366 case 'w':
367 ManglingMode = MM_WinCOFF;
368 break;
369 case 'x':
370 ManglingMode = MM_WinCOFFX86;
371 break;
372 }
373 break;
374 default:
375 report_fatal_error("Unknown specifier in datalayout string");
376 break;
377 }
378 }
379 }
380
DataLayout(const Module * M)381 DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) {
382 init(M);
383 }
384
init(const Module * M)385 void DataLayout::init(const Module *M) { *this = M->getDataLayout(); }
386
operator ==(const DataLayout & Other) const387 bool DataLayout::operator==(const DataLayout &Other) const {
388 bool Ret = BigEndian == Other.BigEndian &&
389 StackNaturalAlign == Other.StackNaturalAlign &&
390 ManglingMode == Other.ManglingMode &&
391 LegalIntWidths == Other.LegalIntWidths &&
392 Alignments == Other.Alignments && Pointers == Other.Pointers;
393 // Note: getStringRepresentation() might differs, it is not canonicalized
394 return Ret;
395 }
396
397 void
setAlignment(AlignTypeEnum align_type,unsigned abi_align,unsigned pref_align,uint32_t bit_width)398 DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
399 unsigned pref_align, uint32_t bit_width) {
400 if (!isUInt<24>(bit_width))
401 report_fatal_error("Invalid bit width, must be a 24bit integer");
402 if (!isUInt<16>(abi_align))
403 report_fatal_error("Invalid ABI alignment, must be a 16bit integer");
404 if (!isUInt<16>(pref_align))
405 report_fatal_error("Invalid preferred alignment, must be a 16bit integer");
406 if (abi_align != 0 && !isPowerOf2_64(abi_align))
407 report_fatal_error("Invalid ABI alignment, must be a power of 2");
408 if (pref_align != 0 && !isPowerOf2_64(pref_align))
409 report_fatal_error("Invalid preferred alignment, must be a power of 2");
410
411 if (pref_align < abi_align)
412 report_fatal_error(
413 "Preferred alignment cannot be less than the ABI alignment");
414
415 for (LayoutAlignElem &Elem : Alignments) {
416 if (Elem.AlignType == (unsigned)align_type &&
417 Elem.TypeBitWidth == bit_width) {
418 // Update the abi, preferred alignments.
419 Elem.ABIAlign = abi_align;
420 Elem.PrefAlign = pref_align;
421 return;
422 }
423 }
424
425 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
426 pref_align, bit_width));
427 }
428
429 DataLayout::PointersTy::iterator
findPointerLowerBound(uint32_t AddressSpace)430 DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
431 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
432 [](const PointerAlignElem &A, uint32_t AddressSpace) {
433 return A.AddressSpace < AddressSpace;
434 });
435 }
436
setPointerAlignment(uint32_t AddrSpace,unsigned ABIAlign,unsigned PrefAlign,uint32_t TypeByteWidth)437 void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
438 unsigned PrefAlign,
439 uint32_t TypeByteWidth) {
440 if (PrefAlign < ABIAlign)
441 report_fatal_error(
442 "Preferred alignment cannot be less than the ABI alignment");
443
444 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
445 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
446 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
447 TypeByteWidth));
448 } else {
449 I->ABIAlign = ABIAlign;
450 I->PrefAlign = PrefAlign;
451 I->TypeByteWidth = TypeByteWidth;
452 }
453 }
454
455 /// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
456 /// preferred if ABIInfo = false) the layout wants for the specified datatype.
getAlignmentInfo(AlignTypeEnum AlignType,uint32_t BitWidth,bool ABIInfo,Type * Ty) const457 unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
458 uint32_t BitWidth, bool ABIInfo,
459 Type *Ty) const {
460 // Check to see if we have an exact match and remember the best match we see.
461 int BestMatchIdx = -1;
462 int LargestInt = -1;
463 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
464 if (Alignments[i].AlignType == (unsigned)AlignType &&
465 Alignments[i].TypeBitWidth == BitWidth)
466 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
467
468 // The best match so far depends on what we're looking for.
469 if (AlignType == INTEGER_ALIGN &&
470 Alignments[i].AlignType == INTEGER_ALIGN) {
471 // The "best match" for integers is the smallest size that is larger than
472 // the BitWidth requested.
473 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
474 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
475 BestMatchIdx = i;
476 // However, if there isn't one that's larger, then we must use the
477 // largest one we have (see below)
478 if (LargestInt == -1 ||
479 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
480 LargestInt = i;
481 }
482 }
483
484 // Okay, we didn't find an exact solution. Fall back here depending on what
485 // is being looked for.
486 if (BestMatchIdx == -1) {
487 // If we didn't find an integer alignment, fall back on most conservative.
488 if (AlignType == INTEGER_ALIGN) {
489 BestMatchIdx = LargestInt;
490 } else if (AlignType == VECTOR_ALIGN) {
491 // By default, use natural alignment for vector types. This is consistent
492 // with what clang and llvm-gcc do.
493 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
494 Align *= cast<VectorType>(Ty)->getNumElements();
495 // If the alignment is not a power of 2, round up to the next power of 2.
496 // This happens for non-power-of-2 length vectors.
497 if (Align & (Align-1))
498 Align = NextPowerOf2(Align);
499 return Align;
500 }
501 }
502
503 // If we still couldn't find a reasonable default alignment, fall back
504 // to a simple heuristic that the alignment is the first power of two
505 // greater-or-equal to the store size of the type. This is a reasonable
506 // approximation of reality, and if the user wanted something less
507 // less conservative, they should have specified it explicitly in the data
508 // layout.
509 if (BestMatchIdx == -1) {
510 unsigned Align = getTypeStoreSize(Ty);
511 if (Align & (Align-1))
512 Align = NextPowerOf2(Align);
513 return Align;
514 }
515
516 // Since we got a "best match" index, just return it.
517 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
518 : Alignments[BestMatchIdx].PrefAlign;
519 }
520
521 namespace {
522
523 class StructLayoutMap {
524 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
525 LayoutInfoTy LayoutInfo;
526
527 public:
~StructLayoutMap()528 ~StructLayoutMap() {
529 // Remove any layouts.
530 for (const auto &I : LayoutInfo) {
531 StructLayout *Value = I.second;
532 Value->~StructLayout();
533 free(Value);
534 }
535 }
536
operator [](StructType * STy)537 StructLayout *&operator[](StructType *STy) {
538 return LayoutInfo[STy];
539 }
540 };
541
542 } // end anonymous namespace
543
clear()544 void DataLayout::clear() {
545 LegalIntWidths.clear();
546 Alignments.clear();
547 Pointers.clear();
548 delete static_cast<StructLayoutMap *>(LayoutMap);
549 LayoutMap = nullptr;
550 }
551
~DataLayout()552 DataLayout::~DataLayout() {
553 clear();
554 }
555
getStructLayout(StructType * Ty) const556 const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
557 if (!LayoutMap)
558 LayoutMap = new StructLayoutMap();
559
560 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
561 StructLayout *&SL = (*STM)[Ty];
562 if (SL) return SL;
563
564 // Otherwise, create the struct layout. Because it is variable length, we
565 // malloc it, then use placement new.
566 int NumElts = Ty->getNumElements();
567 StructLayout *L =
568 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
569
570 // Set SL before calling StructLayout's ctor. The ctor could cause other
571 // entries to be added to TheMap, invalidating our reference.
572 SL = L;
573
574 new (L) StructLayout(Ty, *this);
575
576 return L;
577 }
578
579
getPointerABIAlignment(unsigned AS) const580 unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
581 PointersTy::const_iterator I = findPointerLowerBound(AS);
582 if (I == Pointers.end() || I->AddressSpace != AS) {
583 I = findPointerLowerBound(0);
584 assert(I->AddressSpace == 0);
585 }
586 return I->ABIAlign;
587 }
588
getPointerPrefAlignment(unsigned AS) const589 unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
590 PointersTy::const_iterator I = findPointerLowerBound(AS);
591 if (I == Pointers.end() || I->AddressSpace != AS) {
592 I = findPointerLowerBound(0);
593 assert(I->AddressSpace == 0);
594 }
595 return I->PrefAlign;
596 }
597
getPointerSize(unsigned AS) const598 unsigned DataLayout::getPointerSize(unsigned AS) const {
599 PointersTy::const_iterator I = findPointerLowerBound(AS);
600 if (I == Pointers.end() || I->AddressSpace != AS) {
601 I = findPointerLowerBound(0);
602 assert(I->AddressSpace == 0);
603 }
604 return I->TypeByteWidth;
605 }
606
getPointerTypeSizeInBits(Type * Ty) const607 unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
608 assert(Ty->isPtrOrPtrVectorTy() &&
609 "This should only be called with a pointer or pointer vector type");
610
611 if (Ty->isPointerTy())
612 return getTypeSizeInBits(Ty);
613
614 return getTypeSizeInBits(Ty->getScalarType());
615 }
616
617 /*!
618 \param abi_or_pref Flag that determines which alignment is returned. true
619 returns the ABI alignment, false returns the preferred alignment.
620 \param Ty The underlying type for which alignment is determined.
621
622 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
623 == false) for the requested type \a Ty.
624 */
getAlignment(Type * Ty,bool abi_or_pref) const625 unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
626 int AlignType = -1;
627
628 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
629 switch (Ty->getTypeID()) {
630 // Early escape for the non-numeric types.
631 case Type::LabelTyID:
632 return (abi_or_pref
633 ? getPointerABIAlignment(0)
634 : getPointerPrefAlignment(0));
635 case Type::PointerTyID: {
636 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
637 return (abi_or_pref
638 ? getPointerABIAlignment(AS)
639 : getPointerPrefAlignment(AS));
640 }
641 case Type::ArrayTyID:
642 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
643
644 case Type::StructTyID: {
645 // Packed structure types always have an ABI alignment of one.
646 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
647 return 1;
648
649 // Get the layout annotation... which is lazily created on demand.
650 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
651 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
652 return std::max(Align, Layout->getAlignment());
653 }
654 case Type::IntegerTyID:
655 AlignType = INTEGER_ALIGN;
656 break;
657 case Type::HalfTyID:
658 case Type::FloatTyID:
659 case Type::DoubleTyID:
660 // PPC_FP128TyID and FP128TyID have different data contents, but the
661 // same size and alignment, so they look the same here.
662 case Type::PPC_FP128TyID:
663 case Type::FP128TyID:
664 case Type::X86_FP80TyID:
665 AlignType = FLOAT_ALIGN;
666 break;
667 case Type::X86_MMXTyID:
668 case Type::VectorTyID:
669 AlignType = VECTOR_ALIGN;
670 break;
671 default:
672 llvm_unreachable("Bad type for getAlignment!!!");
673 }
674
675 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
676 abi_or_pref, Ty);
677 }
678
getABITypeAlignment(Type * Ty) const679 unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
680 return getAlignment(Ty, true);
681 }
682
683 /// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
684 /// an integer type of the specified bitwidth.
getABIIntegerTypeAlignment(unsigned BitWidth) const685 unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
686 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
687 }
688
getPrefTypeAlignment(Type * Ty) const689 unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
690 return getAlignment(Ty, false);
691 }
692
getPreferredTypeAlignmentShift(Type * Ty) const693 unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
694 unsigned Align = getPrefTypeAlignment(Ty);
695 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
696 return Log2_32(Align);
697 }
698
getIntPtrType(LLVMContext & C,unsigned AddressSpace) const699 IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
700 unsigned AddressSpace) const {
701 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
702 }
703
getIntPtrType(Type * Ty) const704 Type *DataLayout::getIntPtrType(Type *Ty) const {
705 assert(Ty->isPtrOrPtrVectorTy() &&
706 "Expected a pointer or pointer vector type.");
707 unsigned NumBits = getPointerTypeSizeInBits(Ty);
708 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
709 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
710 return VectorType::get(IntTy, VecTy->getNumElements());
711 return IntTy;
712 }
713
getSmallestLegalIntType(LLVMContext & C,unsigned Width) const714 Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
715 for (unsigned LegalIntWidth : LegalIntWidths)
716 if (Width <= LegalIntWidth)
717 return Type::getIntNTy(C, LegalIntWidth);
718 return nullptr;
719 }
720
getLargestLegalIntTypeSize() const721 unsigned DataLayout::getLargestLegalIntTypeSize() const {
722 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
723 return Max != LegalIntWidths.end() ? *Max : 0;
724 }
725
getIndexedOffset(Type * ptrTy,ArrayRef<Value * > Indices) const726 uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
727 ArrayRef<Value *> Indices) const {
728 Type *Ty = ptrTy;
729 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
730 uint64_t Result = 0;
731
732 generic_gep_type_iterator<Value* const*>
733 TI = gep_type_begin(ptrTy, Indices);
734 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
735 ++CurIDX, ++TI) {
736 if (StructType *STy = dyn_cast<StructType>(*TI)) {
737 assert(Indices[CurIDX]->getType() ==
738 Type::getInt32Ty(ptrTy->getContext()) &&
739 "Illegal struct idx");
740 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
741
742 // Get structure layout information...
743 const StructLayout *Layout = getStructLayout(STy);
744
745 // Add in the offset, as calculated by the structure layout info...
746 Result += Layout->getElementOffset(FieldNo);
747
748 // Update Ty to refer to current element
749 Ty = STy->getElementType(FieldNo);
750 } else {
751 // Update Ty to refer to current element
752 Ty = cast<SequentialType>(Ty)->getElementType();
753
754 // Get the array index and the size of each array element.
755 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
756 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
757 }
758 }
759
760 return Result;
761 }
762
763 /// getPreferredAlignment - Return the preferred alignment of the specified
764 /// global. This includes an explicitly requested alignment (if the global
765 /// has one).
getPreferredAlignment(const GlobalVariable * GV) const766 unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
767 Type *ElemType = GV->getType()->getElementType();
768 unsigned Alignment = getPrefTypeAlignment(ElemType);
769 unsigned GVAlignment = GV->getAlignment();
770 if (GVAlignment >= Alignment) {
771 Alignment = GVAlignment;
772 } else if (GVAlignment != 0) {
773 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
774 }
775
776 if (GV->hasInitializer() && GVAlignment == 0) {
777 if (Alignment < 16) {
778 // If the global is not external, see if it is large. If so, give it a
779 // larger alignment.
780 if (getTypeSizeInBits(ElemType) > 128)
781 Alignment = 16; // 16-byte alignment.
782 }
783 }
784 return Alignment;
785 }
786
787 /// getPreferredAlignmentLog - Return the preferred alignment of the
788 /// specified global, returned in log form. This includes an explicitly
789 /// requested alignment (if the global has one).
getPreferredAlignmentLog(const GlobalVariable * GV) const790 unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
791 return Log2_32(getPreferredAlignment(GV));
792 }
793
794