• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- DataLayout.cpp - Data size & alignment routines ---------------------==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines layout properties related to datatype size/offset/alignment
10 // information.
11 //
12 // This structure should be created once, filled in if the defaults are not
13 // correct and then passed around by const&.  None of the members functions
14 // require modification to the object.
15 //
16 //===----------------------------------------------------------------------===//
17 
18 #include "llvm/IR/DataLayout.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/ADT/Triple.h"
22 #include "llvm/IR/Constants.h"
23 #include "llvm/IR/DerivedTypes.h"
24 #include "llvm/IR/GetElementPtrTypeIterator.h"
25 #include "llvm/IR/GlobalVariable.h"
26 #include "llvm/IR/Module.h"
27 #include "llvm/IR/Type.h"
28 #include "llvm/IR/Value.h"
29 #include "llvm/Support/Casting.h"
30 #include "llvm/Support/ErrorHandling.h"
31 #include "llvm/Support/MathExtras.h"
32 #include "llvm/Support/TypeSize.h"
33 #include <algorithm>
34 #include <cassert>
35 #include <cstdint>
36 #include <cstdlib>
37 #include <tuple>
38 #include <utility>
39 
40 using namespace llvm;
41 
42 //===----------------------------------------------------------------------===//
43 // Support for StructLayout
44 //===----------------------------------------------------------------------===//
45 
StructLayout(StructType * ST,const DataLayout & DL)46 StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
47   assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
48   StructSize = 0;
49   IsPadded = false;
50   NumElements = ST->getNumElements();
51 
52   // Loop over each of the elements, placing them in memory.
53   for (unsigned i = 0, e = NumElements; i != e; ++i) {
54     Type *Ty = ST->getElementType(i);
55     const Align TyAlign(ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty));
56 
57     // Add padding if necessary to align the data element properly.
58     if (!isAligned(TyAlign, StructSize)) {
59       IsPadded = true;
60       StructSize = alignTo(StructSize, TyAlign);
61     }
62 
63     // Keep track of maximum alignment constraint.
64     StructAlignment = std::max(TyAlign, StructAlignment);
65 
66     MemberOffsets[i] = StructSize;
67     StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
68   }
69 
70   // Add padding to the end of the struct so that it could be put in an array
71   // and all array elements would be aligned correctly.
72   if (!isAligned(StructAlignment, StructSize)) {
73     IsPadded = true;
74     StructSize = alignTo(StructSize, StructAlignment);
75   }
76 }
77 
78 /// getElementContainingOffset - Given a valid offset into the structure,
79 /// return the structure index that contains it.
getElementContainingOffset(uint64_t Offset) const80 unsigned 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 
90   // Multiple fields can have the same offset if any of them are zero sized.
91   // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
92   // at the i32 element, because it is the last element at that offset.  This is
93   // the right one to return, because anything after it will have a higher
94   // offset, implying that this element is non-empty.
95   return SI-&MemberOffsets[0];
96 }
97 
98 //===----------------------------------------------------------------------===//
99 // LayoutAlignElem, LayoutAlign support
100 //===----------------------------------------------------------------------===//
101 
get(AlignTypeEnum align_type,Align abi_align,Align pref_align,uint32_t bit_width)102 LayoutAlignElem LayoutAlignElem::get(AlignTypeEnum align_type, Align abi_align,
103                                      Align 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 //===----------------------------------------------------------------------===//
122 // PointerAlignElem, PointerAlign support
123 //===----------------------------------------------------------------------===//
124 
get(uint32_t AddressSpace,Align ABIAlign,Align PrefAlign,uint32_t TypeByteWidth,uint32_t IndexWidth)125 PointerAlignElem PointerAlignElem::get(uint32_t AddressSpace, Align ABIAlign,
126                                        Align PrefAlign, uint32_t TypeByteWidth,
127                                        uint32_t IndexWidth) {
128   assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
129   PointerAlignElem retval;
130   retval.AddressSpace = AddressSpace;
131   retval.ABIAlign = ABIAlign;
132   retval.PrefAlign = PrefAlign;
133   retval.TypeByteWidth = TypeByteWidth;
134   retval.IndexWidth = IndexWidth;
135   return retval;
136 }
137 
138 bool
operator ==(const PointerAlignElem & rhs) const139 PointerAlignElem::operator==(const PointerAlignElem &rhs) const {
140   return (ABIAlign == rhs.ABIAlign
141           && AddressSpace == rhs.AddressSpace
142           && PrefAlign == rhs.PrefAlign
143           && TypeByteWidth == rhs.TypeByteWidth
144           && IndexWidth == rhs.IndexWidth);
145 }
146 
147 //===----------------------------------------------------------------------===//
148 //                       DataLayout Class Implementation
149 //===----------------------------------------------------------------------===//
150 
getManglingComponent(const Triple & T)151 const char *DataLayout::getManglingComponent(const Triple &T) {
152   if (T.isOSBinFormatMachO())
153     return "-m:o";
154   if (T.isOSWindows() && T.isOSBinFormatCOFF())
155     return T.getArch() == Triple::x86 ? "-m:x" : "-m:w";
156   return "-m:e";
157 }
158 
159 static const LayoutAlignElem DefaultAlignments[] = {
160     {INTEGER_ALIGN, 1, Align(1), Align(1)},    // i1
161     {INTEGER_ALIGN, 8, Align(1), Align(1)},    // i8
162     {INTEGER_ALIGN, 16, Align(2), Align(2)},   // i16
163     {INTEGER_ALIGN, 32, Align(4), Align(4)},   // i32
164     {INTEGER_ALIGN, 64, Align(4), Align(8)},   // i64
165     {FLOAT_ALIGN, 16, Align(2), Align(2)},     // half
166     {FLOAT_ALIGN, 32, Align(4), Align(4)},     // float
167     {FLOAT_ALIGN, 64, Align(8), Align(8)},     // double
168     {FLOAT_ALIGN, 128, Align(16), Align(16)},  // ppcf128, quad, ...
169     {VECTOR_ALIGN, 64, Align(8), Align(8)},    // v2i32, v1i64, ...
170     {VECTOR_ALIGN, 128, Align(16), Align(16)}, // v16i8, v8i16, v4i32, ...
171     {AGGREGATE_ALIGN, 0, Align(1), Align(8)}   // struct
172 };
173 
reset(StringRef Desc)174 void DataLayout::reset(StringRef Desc) {
175   clear();
176 
177   LayoutMap = nullptr;
178   BigEndian = false;
179   AllocaAddrSpace = 0;
180   StackNaturalAlign.reset();
181   ProgramAddrSpace = 0;
182   FunctionPtrAlign.reset();
183   TheFunctionPtrAlignType = FunctionPtrAlignType::Independent;
184   ManglingMode = MM_None;
185   NonIntegralAddressSpaces.clear();
186 
187   // Default alignments
188   for (const LayoutAlignElem &E : DefaultAlignments) {
189     setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
190                  E.TypeBitWidth);
191   }
192   setPointerAlignment(0, Align(8), Align(8), 8, 8);
193 
194   parseSpecifier(Desc);
195 }
196 
197 /// Checked version of split, to ensure mandatory subparts.
split(StringRef Str,char Separator)198 static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
199   assert(!Str.empty() && "parse error, string can't be empty here");
200   std::pair<StringRef, StringRef> Split = Str.split(Separator);
201   if (Split.second.empty() && Split.first != Str)
202     report_fatal_error("Trailing separator in datalayout string");
203   if (!Split.second.empty() && Split.first.empty())
204     report_fatal_error("Expected token before separator in datalayout string");
205   return Split;
206 }
207 
208 /// Get an unsigned integer, including error checks.
getInt(StringRef R)209 static unsigned getInt(StringRef R) {
210   unsigned Result;
211   bool error = R.getAsInteger(10, Result); (void)error;
212   if (error)
213     report_fatal_error("not a number, or does not fit in an unsigned int");
214   return Result;
215 }
216 
217 /// Convert bits into bytes. Assert if not a byte width multiple.
inBytes(unsigned Bits)218 static unsigned inBytes(unsigned Bits) {
219   if (Bits % 8)
220     report_fatal_error("number of bits must be a byte width multiple");
221   return Bits / 8;
222 }
223 
getAddrSpace(StringRef R)224 static unsigned getAddrSpace(StringRef R) {
225   unsigned AddrSpace = getInt(R);
226   if (!isUInt<24>(AddrSpace))
227     report_fatal_error("Invalid address space, must be a 24-bit integer");
228   return AddrSpace;
229 }
230 
parseSpecifier(StringRef Desc)231 void DataLayout::parseSpecifier(StringRef Desc) {
232   StringRepresentation = Desc;
233   while (!Desc.empty()) {
234     // Split at '-'.
235     std::pair<StringRef, StringRef> Split = split(Desc, '-');
236     Desc = Split.second;
237 
238     // Split at ':'.
239     Split = split(Split.first, ':');
240 
241     // Aliases used below.
242     StringRef &Tok  = Split.first;  // Current token.
243     StringRef &Rest = Split.second; // The rest of the string.
244 
245     if (Tok == "ni") {
246       do {
247         Split = split(Rest, ':');
248         Rest = Split.second;
249         unsigned AS = getInt(Split.first);
250         if (AS == 0)
251           report_fatal_error("Address space 0 can never be non-integral");
252         NonIntegralAddressSpaces.push_back(AS);
253       } while (!Rest.empty());
254 
255       continue;
256     }
257 
258     char Specifier = Tok.front();
259     Tok = Tok.substr(1);
260 
261     switch (Specifier) {
262     case 's':
263       // Ignored for backward compatibility.
264       // FIXME: remove this on LLVM 4.0.
265       break;
266     case 'E':
267       BigEndian = true;
268       break;
269     case 'e':
270       BigEndian = false;
271       break;
272     case 'p': {
273       // Address space.
274       unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
275       if (!isUInt<24>(AddrSpace))
276         report_fatal_error("Invalid address space, must be a 24bit integer");
277 
278       // Size.
279       if (Rest.empty())
280         report_fatal_error(
281             "Missing size specification for pointer in datalayout string");
282       Split = split(Rest, ':');
283       unsigned PointerMemSize = inBytes(getInt(Tok));
284       if (!PointerMemSize)
285         report_fatal_error("Invalid pointer size of 0 bytes");
286 
287       // ABI alignment.
288       if (Rest.empty())
289         report_fatal_error(
290             "Missing alignment specification for pointer in datalayout string");
291       Split = split(Rest, ':');
292       unsigned PointerABIAlign = inBytes(getInt(Tok));
293       if (!isPowerOf2_64(PointerABIAlign))
294         report_fatal_error(
295             "Pointer ABI alignment must be a power of 2");
296 
297       // Size of index used in GEP for address calculation.
298       // The parameter is optional. By default it is equal to size of pointer.
299       unsigned IndexSize = PointerMemSize;
300 
301       // Preferred alignment.
302       unsigned PointerPrefAlign = PointerABIAlign;
303       if (!Rest.empty()) {
304         Split = split(Rest, ':');
305         PointerPrefAlign = inBytes(getInt(Tok));
306         if (!isPowerOf2_64(PointerPrefAlign))
307           report_fatal_error(
308             "Pointer preferred alignment must be a power of 2");
309 
310         // Now read the index. It is the second optional parameter here.
311         if (!Rest.empty()) {
312           Split = split(Rest, ':');
313           IndexSize = inBytes(getInt(Tok));
314           if (!IndexSize)
315             report_fatal_error("Invalid index size of 0 bytes");
316         }
317       }
318       setPointerAlignment(AddrSpace, assumeAligned(PointerABIAlign),
319                           assumeAligned(PointerPrefAlign), PointerMemSize,
320                           IndexSize);
321       break;
322     }
323     case 'i':
324     case 'v':
325     case 'f':
326     case 'a': {
327       AlignTypeEnum AlignType;
328       switch (Specifier) {
329       default: llvm_unreachable("Unexpected specifier!");
330       case 'i': AlignType = INTEGER_ALIGN; break;
331       case 'v': AlignType = VECTOR_ALIGN; break;
332       case 'f': AlignType = FLOAT_ALIGN; break;
333       case 'a': AlignType = AGGREGATE_ALIGN; break;
334       }
335 
336       // Bit size.
337       unsigned Size = Tok.empty() ? 0 : getInt(Tok);
338 
339       if (AlignType == AGGREGATE_ALIGN && Size != 0)
340         report_fatal_error(
341             "Sized aggregate specification in datalayout string");
342 
343       // ABI alignment.
344       if (Rest.empty())
345         report_fatal_error(
346             "Missing alignment specification in datalayout string");
347       Split = split(Rest, ':');
348       const unsigned ABIAlign = inBytes(getInt(Tok));
349       if (AlignType != AGGREGATE_ALIGN && !ABIAlign)
350         report_fatal_error(
351             "ABI alignment specification must be >0 for non-aggregate types");
352 
353       if (!isUInt<16>(ABIAlign))
354         report_fatal_error("Invalid ABI alignment, must be a 16bit integer");
355       if (ABIAlign != 0 && !isPowerOf2_64(ABIAlign))
356         report_fatal_error("Invalid ABI alignment, must be a power of 2");
357 
358       // Preferred alignment.
359       unsigned PrefAlign = ABIAlign;
360       if (!Rest.empty()) {
361         Split = split(Rest, ':');
362         PrefAlign = inBytes(getInt(Tok));
363       }
364 
365       if (!isUInt<16>(PrefAlign))
366         report_fatal_error(
367             "Invalid preferred alignment, must be a 16bit integer");
368       if (PrefAlign != 0 && !isPowerOf2_64(PrefAlign))
369         report_fatal_error("Invalid preferred alignment, must be a power of 2");
370 
371       setAlignment(AlignType, assumeAligned(ABIAlign), assumeAligned(PrefAlign),
372                    Size);
373 
374       break;
375     }
376     case 'n':  // Native integer types.
377       while (true) {
378         unsigned Width = getInt(Tok);
379         if (Width == 0)
380           report_fatal_error(
381               "Zero width native integer type in datalayout string");
382         LegalIntWidths.push_back(Width);
383         if (Rest.empty())
384           break;
385         Split = split(Rest, ':');
386       }
387       break;
388     case 'S': { // Stack natural alignment.
389       uint64_t Alignment = inBytes(getInt(Tok));
390       if (Alignment != 0 && !llvm::isPowerOf2_64(Alignment))
391         report_fatal_error("Alignment is neither 0 nor a power of 2");
392       StackNaturalAlign = MaybeAlign(Alignment);
393       break;
394     }
395     case 'F': {
396       switch (Tok.front()) {
397       case 'i':
398         TheFunctionPtrAlignType = FunctionPtrAlignType::Independent;
399         break;
400       case 'n':
401         TheFunctionPtrAlignType = FunctionPtrAlignType::MultipleOfFunctionAlign;
402         break;
403       default:
404         report_fatal_error("Unknown function pointer alignment type in "
405                            "datalayout string");
406       }
407       Tok = Tok.substr(1);
408       uint64_t Alignment = inBytes(getInt(Tok));
409       if (Alignment != 0 && !llvm::isPowerOf2_64(Alignment))
410         report_fatal_error("Alignment is neither 0 nor a power of 2");
411       FunctionPtrAlign = MaybeAlign(Alignment);
412       break;
413     }
414     case 'P': { // Function address space.
415       ProgramAddrSpace = getAddrSpace(Tok);
416       break;
417     }
418     case 'A': { // Default stack/alloca address space.
419       AllocaAddrSpace = getAddrSpace(Tok);
420       break;
421     }
422     case 'm':
423       if (!Tok.empty())
424         report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
425       if (Rest.empty())
426         report_fatal_error("Expected mangling specifier in datalayout string");
427       if (Rest.size() > 1)
428         report_fatal_error("Unknown mangling specifier in datalayout string");
429       switch(Rest[0]) {
430       default:
431         report_fatal_error("Unknown mangling in datalayout string");
432       case 'e':
433         ManglingMode = MM_ELF;
434         break;
435       case 'o':
436         ManglingMode = MM_MachO;
437         break;
438       case 'm':
439         ManglingMode = MM_Mips;
440         break;
441       case 'w':
442         ManglingMode = MM_WinCOFF;
443         break;
444       case 'x':
445         ManglingMode = MM_WinCOFFX86;
446         break;
447       }
448       break;
449     default:
450       report_fatal_error("Unknown specifier in datalayout string");
451       break;
452     }
453   }
454 }
455 
DataLayout(const Module * M)456 DataLayout::DataLayout(const Module *M) {
457   init(M);
458 }
459 
init(const Module * M)460 void DataLayout::init(const Module *M) { *this = M->getDataLayout(); }
461 
operator ==(const DataLayout & Other) const462 bool DataLayout::operator==(const DataLayout &Other) const {
463   bool Ret = BigEndian == Other.BigEndian &&
464              AllocaAddrSpace == Other.AllocaAddrSpace &&
465              StackNaturalAlign == Other.StackNaturalAlign &&
466              ProgramAddrSpace == Other.ProgramAddrSpace &&
467              FunctionPtrAlign == Other.FunctionPtrAlign &&
468              TheFunctionPtrAlignType == Other.TheFunctionPtrAlignType &&
469              ManglingMode == Other.ManglingMode &&
470              LegalIntWidths == Other.LegalIntWidths &&
471              Alignments == Other.Alignments && Pointers == Other.Pointers;
472   // Note: getStringRepresentation() might differs, it is not canonicalized
473   return Ret;
474 }
475 
476 DataLayout::AlignmentsTy::iterator
findAlignmentLowerBound(AlignTypeEnum AlignType,uint32_t BitWidth)477 DataLayout::findAlignmentLowerBound(AlignTypeEnum AlignType,
478                                     uint32_t BitWidth) {
479   auto Pair = std::make_pair((unsigned)AlignType, BitWidth);
480   return partition_point(Alignments, [=](const LayoutAlignElem &E) {
481     return std::make_pair(E.AlignType, E.TypeBitWidth) < Pair;
482   });
483 }
484 
setAlignment(AlignTypeEnum align_type,Align abi_align,Align pref_align,uint32_t bit_width)485 void DataLayout::setAlignment(AlignTypeEnum align_type, Align abi_align,
486                               Align pref_align, uint32_t bit_width) {
487   // AlignmentsTy::ABIAlign and AlignmentsTy::PrefAlign were once stored as
488   // uint16_t, it is unclear if there are requirements for alignment to be less
489   // than 2^16 other than storage. In the meantime we leave the restriction as
490   // an assert. See D67400 for context.
491   assert(Log2(abi_align) < 16 && Log2(pref_align) < 16 && "Alignment too big");
492   if (!isUInt<24>(bit_width))
493     report_fatal_error("Invalid bit width, must be a 24bit integer");
494   if (pref_align < abi_align)
495     report_fatal_error(
496         "Preferred alignment cannot be less than the ABI alignment");
497 
498   AlignmentsTy::iterator I = findAlignmentLowerBound(align_type, bit_width);
499   if (I != Alignments.end() &&
500       I->AlignType == (unsigned)align_type && I->TypeBitWidth == bit_width) {
501     // Update the abi, preferred alignments.
502     I->ABIAlign = abi_align;
503     I->PrefAlign = pref_align;
504   } else {
505     // Insert before I to keep the vector sorted.
506     Alignments.insert(I, LayoutAlignElem::get(align_type, abi_align,
507                                               pref_align, bit_width));
508   }
509 }
510 
511 DataLayout::PointersTy::iterator
findPointerLowerBound(uint32_t AddressSpace)512 DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
513   return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
514                           [](const PointerAlignElem &A, uint32_t AddressSpace) {
515     return A.AddressSpace < AddressSpace;
516   });
517 }
518 
setPointerAlignment(uint32_t AddrSpace,Align ABIAlign,Align PrefAlign,uint32_t TypeByteWidth,uint32_t IndexWidth)519 void DataLayout::setPointerAlignment(uint32_t AddrSpace, Align ABIAlign,
520                                      Align PrefAlign, uint32_t TypeByteWidth,
521                                      uint32_t IndexWidth) {
522   if (PrefAlign < ABIAlign)
523     report_fatal_error(
524         "Preferred alignment cannot be less than the ABI alignment");
525 
526   PointersTy::iterator I = findPointerLowerBound(AddrSpace);
527   if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
528     Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
529                                              TypeByteWidth, IndexWidth));
530   } else {
531     I->ABIAlign = ABIAlign;
532     I->PrefAlign = PrefAlign;
533     I->TypeByteWidth = TypeByteWidth;
534     I->IndexWidth = IndexWidth;
535   }
536 }
537 
538 /// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
539 /// preferred if ABIInfo = false) the layout wants for the specified datatype.
getAlignmentInfo(AlignTypeEnum AlignType,uint32_t BitWidth,bool ABIInfo,Type * Ty) const540 Align DataLayout::getAlignmentInfo(AlignTypeEnum AlignType, uint32_t BitWidth,
541                                    bool ABIInfo, Type *Ty) const {
542   AlignmentsTy::const_iterator I = findAlignmentLowerBound(AlignType, BitWidth);
543   // See if we found an exact match. Of if we are looking for an integer type,
544   // but don't have an exact match take the next largest integer. This is where
545   // the lower_bound will point to when it fails an exact match.
546   if (I != Alignments.end() && I->AlignType == (unsigned)AlignType &&
547       (I->TypeBitWidth == BitWidth || AlignType == INTEGER_ALIGN))
548     return ABIInfo ? I->ABIAlign : I->PrefAlign;
549 
550   if (AlignType == INTEGER_ALIGN) {
551     // If we didn't have a larger value try the largest value we have.
552     if (I != Alignments.begin()) {
553       --I; // Go to the previous entry and see if its an integer.
554       if (I->AlignType == INTEGER_ALIGN)
555         return ABIInfo ? I->ABIAlign : I->PrefAlign;
556     }
557   } else if (AlignType == VECTOR_ALIGN) {
558     // By default, use natural alignment for vector types. This is consistent
559     // with what clang and llvm-gcc do.
560     unsigned Alignment =
561         getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
562     Alignment *= cast<VectorType>(Ty)->getNumElements();
563     Alignment = PowerOf2Ceil(Alignment);
564     return Align(Alignment);
565    }
566 
567   // If we still couldn't find a reasonable default alignment, fall back
568   // to a simple heuristic that the alignment is the first power of two
569   // greater-or-equal to the store size of the type.  This is a reasonable
570   // approximation of reality, and if the user wanted something less
571   // less conservative, they should have specified it explicitly in the data
572   // layout.
573    unsigned Alignment = getTypeStoreSize(Ty);
574    Alignment = PowerOf2Ceil(Alignment);
575    return Align(Alignment);
576 }
577 
578 namespace {
579 
580 class StructLayoutMap {
581   using LayoutInfoTy = DenseMap<StructType*, StructLayout*>;
582   LayoutInfoTy LayoutInfo;
583 
584 public:
~StructLayoutMap()585   ~StructLayoutMap() {
586     // Remove any layouts.
587     for (const auto &I : LayoutInfo) {
588       StructLayout *Value = I.second;
589       Value->~StructLayout();
590       free(Value);
591     }
592   }
593 
operator [](StructType * STy)594   StructLayout *&operator[](StructType *STy) {
595     return LayoutInfo[STy];
596   }
597 };
598 
599 } // end anonymous namespace
600 
clear()601 void DataLayout::clear() {
602   LegalIntWidths.clear();
603   Alignments.clear();
604   Pointers.clear();
605   delete static_cast<StructLayoutMap *>(LayoutMap);
606   LayoutMap = nullptr;
607 }
608 
~DataLayout()609 DataLayout::~DataLayout() {
610   clear();
611 }
612 
getStructLayout(StructType * Ty) const613 const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
614   if (!LayoutMap)
615     LayoutMap = new StructLayoutMap();
616 
617   StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
618   StructLayout *&SL = (*STM)[Ty];
619   if (SL) return SL;
620 
621   // Otherwise, create the struct layout.  Because it is variable length, we
622   // malloc it, then use placement new.
623   int NumElts = Ty->getNumElements();
624   StructLayout *L = (StructLayout *)
625       safe_malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
626 
627   // Set SL before calling StructLayout's ctor.  The ctor could cause other
628   // entries to be added to TheMap, invalidating our reference.
629   SL = L;
630 
631   new (L) StructLayout(Ty, *this);
632 
633   return L;
634 }
635 
getPointerABIAlignment(unsigned AS) const636 Align DataLayout::getPointerABIAlignment(unsigned AS) const {
637   PointersTy::const_iterator I = findPointerLowerBound(AS);
638   if (I == Pointers.end() || I->AddressSpace != AS) {
639     I = findPointerLowerBound(0);
640     assert(I->AddressSpace == 0);
641   }
642   return I->ABIAlign;
643 }
644 
getPointerPrefAlignment(unsigned AS) const645 Align DataLayout::getPointerPrefAlignment(unsigned AS) const {
646   PointersTy::const_iterator I = findPointerLowerBound(AS);
647   if (I == Pointers.end() || I->AddressSpace != AS) {
648     I = findPointerLowerBound(0);
649     assert(I->AddressSpace == 0);
650   }
651   return I->PrefAlign;
652 }
653 
getPointerSize(unsigned AS) const654 unsigned DataLayout::getPointerSize(unsigned AS) const {
655   PointersTy::const_iterator I = findPointerLowerBound(AS);
656   if (I == Pointers.end() || I->AddressSpace != AS) {
657     I = findPointerLowerBound(0);
658     assert(I->AddressSpace == 0);
659   }
660   return I->TypeByteWidth;
661 }
662 
getMaxPointerSize() const663 unsigned DataLayout::getMaxPointerSize() const {
664   unsigned MaxPointerSize = 0;
665   for (auto &P : Pointers)
666     MaxPointerSize = std::max(MaxPointerSize, P.TypeByteWidth);
667 
668   return MaxPointerSize;
669 }
670 
getPointerTypeSizeInBits(Type * Ty) const671 unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
672   assert(Ty->isPtrOrPtrVectorTy() &&
673          "This should only be called with a pointer or pointer vector type");
674   Ty = Ty->getScalarType();
675   return getPointerSizeInBits(cast<PointerType>(Ty)->getAddressSpace());
676 }
677 
getIndexSize(unsigned AS) const678 unsigned DataLayout::getIndexSize(unsigned AS) const {
679   PointersTy::const_iterator I = findPointerLowerBound(AS);
680   if (I == Pointers.end() || I->AddressSpace != AS) {
681     I = findPointerLowerBound(0);
682     assert(I->AddressSpace == 0);
683   }
684   return I->IndexWidth;
685 }
686 
getIndexTypeSizeInBits(Type * Ty) const687 unsigned DataLayout::getIndexTypeSizeInBits(Type *Ty) const {
688   assert(Ty->isPtrOrPtrVectorTy() &&
689          "This should only be called with a pointer or pointer vector type");
690   Ty = Ty->getScalarType();
691   return getIndexSizeInBits(cast<PointerType>(Ty)->getAddressSpace());
692 }
693 
694 /*!
695   \param abi_or_pref Flag that determines which alignment is returned. true
696   returns the ABI alignment, false returns the preferred alignment.
697   \param Ty The underlying type for which alignment is determined.
698 
699   Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
700   == false) for the requested type \a Ty.
701  */
getAlignment(Type * Ty,bool abi_or_pref) const702 Align DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
703   AlignTypeEnum AlignType;
704 
705   assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
706   switch (Ty->getTypeID()) {
707   // Early escape for the non-numeric types.
708   case Type::LabelTyID:
709     return abi_or_pref ? getPointerABIAlignment(0) : getPointerPrefAlignment(0);
710   case Type::PointerTyID: {
711     unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
712     return abi_or_pref ? getPointerABIAlignment(AS)
713                        : getPointerPrefAlignment(AS);
714     }
715   case Type::ArrayTyID:
716     return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
717 
718   case Type::StructTyID: {
719     // Packed structure types always have an ABI alignment of one.
720     if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
721       return Align::None();
722 
723     // Get the layout annotation... which is lazily created on demand.
724     const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
725     const Align Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
726     return std::max(Align, Layout->getAlignment());
727   }
728   case Type::IntegerTyID:
729     AlignType = INTEGER_ALIGN;
730     break;
731   case Type::HalfTyID:
732   case Type::FloatTyID:
733   case Type::DoubleTyID:
734   // PPC_FP128TyID and FP128TyID have different data contents, but the
735   // same size and alignment, so they look the same here.
736   case Type::PPC_FP128TyID:
737   case Type::FP128TyID:
738   case Type::X86_FP80TyID:
739     AlignType = FLOAT_ALIGN;
740     break;
741   case Type::X86_MMXTyID:
742   case Type::VectorTyID:
743     AlignType = VECTOR_ALIGN;
744     break;
745   default:
746     llvm_unreachable("Bad type for getAlignment!!!");
747   }
748 
749   // If we're dealing with a scalable vector, we just need the known minimum
750   // size for determining alignment. If not, we'll get the exact size.
751   return getAlignmentInfo(AlignType, getTypeSizeInBits(Ty).getKnownMinSize(),
752                           abi_or_pref, Ty);
753 }
754 
getABITypeAlignment(Type * Ty) const755 unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
756   return getAlignment(Ty, true).value();
757 }
758 
759 /// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
760 /// an integer type of the specified bitwidth.
getABIIntegerTypeAlignment(unsigned BitWidth) const761 Align DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
762   return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
763 }
764 
getPrefTypeAlignment(Type * Ty) const765 unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
766   return getAlignment(Ty, false).value();
767 }
768 
getIntPtrType(LLVMContext & C,unsigned AddressSpace) const769 IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
770                                        unsigned AddressSpace) const {
771   return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
772 }
773 
getIntPtrType(Type * Ty) const774 Type *DataLayout::getIntPtrType(Type *Ty) const {
775   assert(Ty->isPtrOrPtrVectorTy() &&
776          "Expected a pointer or pointer vector type.");
777   unsigned NumBits = getPointerTypeSizeInBits(Ty);
778   IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
779   if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
780     return VectorType::get(IntTy, VecTy->getNumElements());
781   return IntTy;
782 }
783 
getSmallestLegalIntType(LLVMContext & C,unsigned Width) const784 Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
785   for (unsigned LegalIntWidth : LegalIntWidths)
786     if (Width <= LegalIntWidth)
787       return Type::getIntNTy(C, LegalIntWidth);
788   return nullptr;
789 }
790 
getLargestLegalIntTypeSizeInBits() const791 unsigned DataLayout::getLargestLegalIntTypeSizeInBits() const {
792   auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
793   return Max != LegalIntWidths.end() ? *Max : 0;
794 }
795 
getIndexType(Type * Ty) const796 Type *DataLayout::getIndexType(Type *Ty) const {
797   assert(Ty->isPtrOrPtrVectorTy() &&
798          "Expected a pointer or pointer vector type.");
799   unsigned NumBits = getIndexTypeSizeInBits(Ty);
800   IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
801   if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
802     return VectorType::get(IntTy, VecTy->getNumElements());
803   return IntTy;
804 }
805 
getIndexedOffsetInType(Type * ElemTy,ArrayRef<Value * > Indices) const806 int64_t DataLayout::getIndexedOffsetInType(Type *ElemTy,
807                                            ArrayRef<Value *> Indices) const {
808   int64_t Result = 0;
809 
810   generic_gep_type_iterator<Value* const*>
811     GTI = gep_type_begin(ElemTy, Indices),
812     GTE = gep_type_end(ElemTy, Indices);
813   for (; GTI != GTE; ++GTI) {
814     Value *Idx = GTI.getOperand();
815     if (StructType *STy = GTI.getStructTypeOrNull()) {
816       assert(Idx->getType()->isIntegerTy(32) && "Illegal struct idx");
817       unsigned FieldNo = cast<ConstantInt>(Idx)->getZExtValue();
818 
819       // Get structure layout information...
820       const StructLayout *Layout = getStructLayout(STy);
821 
822       // Add in the offset, as calculated by the structure layout info...
823       Result += Layout->getElementOffset(FieldNo);
824     } else {
825       // Get the array index and the size of each array element.
826       if (int64_t arrayIdx = cast<ConstantInt>(Idx)->getSExtValue())
827         Result += arrayIdx * getTypeAllocSize(GTI.getIndexedType());
828     }
829   }
830 
831   return Result;
832 }
833 
834 /// getPreferredAlignment - Return the preferred alignment of the specified
835 /// global.  This includes an explicitly requested alignment (if the global
836 /// has one).
getPreferredAlignment(const GlobalVariable * GV) const837 unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
838   unsigned GVAlignment = GV->getAlignment();
839   // If a section is specified, always precisely honor explicit alignment,
840   // so we don't insert padding into a section we don't control.
841   if (GVAlignment && GV->hasSection())
842     return GVAlignment;
843 
844   // If no explicit alignment is specified, compute the alignment based on
845   // the IR type. If an alignment is specified, increase it to match the ABI
846   // alignment of the IR type.
847   //
848   // FIXME: Not sure it makes sense to use the alignment of the type if
849   // there's already an explicit alignment specification.
850   Type *ElemType = GV->getValueType();
851   unsigned Alignment = getPrefTypeAlignment(ElemType);
852   if (GVAlignment >= Alignment) {
853     Alignment = GVAlignment;
854   } else if (GVAlignment != 0) {
855     Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
856   }
857 
858   // If no explicit alignment is specified, and the global is large, increase
859   // the alignment to 16.
860   // FIXME: Why 16, specifically?
861   if (GV->hasInitializer() && GVAlignment == 0) {
862     if (Alignment < 16) {
863       // If the global is not external, see if it is large.  If so, give it a
864       // larger alignment.
865       if (getTypeSizeInBits(ElemType) > 128)
866         Alignment = 16;    // 16-byte alignment.
867     }
868   }
869   return Alignment;
870 }
871 
872 /// getPreferredAlignmentLog - Return the preferred alignment of the
873 /// specified global, returned in log form.  This includes an explicitly
874 /// requested alignment (if the global has one).
getPreferredAlignmentLog(const GlobalVariable * GV) const875 unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
876   return Log2_32(getPreferredAlignment(GV));
877 }
878