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