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 // Handle the Pass registration stuff necessary to use DataLayout's.
37 
38 INITIALIZE_PASS(DataLayoutPass, "datalayout", "Data Layout", false, true)
39 char DataLayoutPass::ID = 0;
40 
41 //===----------------------------------------------------------------------===//
42 // Support for StructLayout
43 //===----------------------------------------------------------------------===//
44 
45 StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
46   assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
47   StructAlignment = 0;
48   StructSize = 0;
49   NumElements = ST->getNumElements();
50 
51   // Loop over each of the elements, placing them in memory.
52   for (unsigned i = 0, e = NumElements; i != e; ++i) {
53     Type *Ty = ST->getElementType(i);
54     unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
55 
56     // Add padding if necessary to align the data element properly.
57     if ((StructSize & (TyAlign-1)) != 0)
58       StructSize = RoundUpToAlignment(StructSize, TyAlign);
59 
60     // Keep track of maximum alignment constraint.
61     StructAlignment = std::max(TyAlign, StructAlignment);
62 
63     MemberOffsets[i] = StructSize;
64     StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
65   }
66 
67   // Empty structures have alignment of 1 byte.
68   if (StructAlignment == 0) StructAlignment = 1;
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 ((StructSize & (StructAlignment-1)) != 0)
73     StructSize = RoundUpToAlignment(StructSize, StructAlignment);
74 }
75 
76 
77 /// getElementContainingOffset - Given a valid offset into the structure,
78 /// return the structure index that contains it.
79 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
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
114 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
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
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 }
147 
148 const PointerAlignElem
149 DataLayout::InvalidPointerElem = { 0U, 0U, 0U, ~0U };
150 
151 //===----------------------------------------------------------------------===//
152 //                       DataLayout Class Implementation
153 //===----------------------------------------------------------------------===//
154 
155 const char *DataLayout::getManglingComponent(const Triple &T) {
156   if (T.isOSBinFormatMachO())
157     return "-m:o";
158   if (T.isOSWindows() && T.getArch() == Triple::x86 && T.isOSBinFormatCOFF())
159     return "-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 
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.
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.
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.
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 
223 void DataLayout::parseSpecifier(StringRef Desc) {
224   while (!Desc.empty()) {
225     // Split at '-'.
226     std::pair<StringRef, StringRef> Split = split(Desc, '-');
227     Desc = Split.second;
228 
229     // Split at ':'.
230     Split = split(Split.first, ':');
231 
232     // Aliases used below.
233     StringRef &Tok  = Split.first;  // Current token.
234     StringRef &Rest = Split.second; // The rest of the string.
235 
236     char Specifier = Tok.front();
237     Tok = Tok.substr(1);
238 
239     switch (Specifier) {
240     case 's':
241       // Ignored for backward compatibility.
242       // FIXME: remove this on LLVM 4.0.
243       break;
244     case 'E':
245       BigEndian = true;
246       break;
247     case 'e':
248       BigEndian = false;
249       break;
250     case 'p': {
251       // Address space.
252       unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
253       if (!isUInt<24>(AddrSpace))
254         report_fatal_error("Invalid address space, must be a 24bit integer");
255 
256       // Size.
257       if (Rest.empty())
258         report_fatal_error(
259             "Missing size specification for pointer in datalayout string");
260       Split = split(Rest, ':');
261       unsigned PointerMemSize = inBytes(getInt(Tok));
262 
263       // ABI alignment.
264       if (Rest.empty())
265         report_fatal_error(
266             "Missing alignment specification for pointer in datalayout string");
267       Split = split(Rest, ':');
268       unsigned PointerABIAlign = inBytes(getInt(Tok));
269 
270       // Preferred alignment.
271       unsigned PointerPrefAlign = PointerABIAlign;
272       if (!Rest.empty()) {
273         Split = split(Rest, ':');
274         PointerPrefAlign = inBytes(getInt(Tok));
275       }
276 
277       setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
278                           PointerMemSize);
279       break;
280     }
281     case 'i':
282     case 'v':
283     case 'f':
284     case 'a': {
285       AlignTypeEnum AlignType;
286       switch (Specifier) {
287       default:
288       case 'i': AlignType = INTEGER_ALIGN; break;
289       case 'v': AlignType = VECTOR_ALIGN; break;
290       case 'f': AlignType = FLOAT_ALIGN; break;
291       case 'a': AlignType = AGGREGATE_ALIGN; break;
292       }
293 
294       // Bit size.
295       unsigned Size = Tok.empty() ? 0 : getInt(Tok);
296 
297       if (AlignType == AGGREGATE_ALIGN && Size != 0)
298         report_fatal_error(
299             "Sized aggregate specification in datalayout string");
300 
301       // ABI alignment.
302       if (Rest.empty())
303         report_fatal_error(
304             "Missing alignment specification in datalayout string");
305       Split = split(Rest, ':');
306       unsigned ABIAlign = inBytes(getInt(Tok));
307 
308       // Preferred alignment.
309       unsigned PrefAlign = ABIAlign;
310       if (!Rest.empty()) {
311         Split = split(Rest, ':');
312         PrefAlign = inBytes(getInt(Tok));
313       }
314 
315       if (ABIAlign > PrefAlign)
316         report_fatal_error(
317             "Preferred alignment cannot be less than the ABI alignment");
318       setAlignment(AlignType, ABIAlign, PrefAlign, Size);
319 
320       break;
321     }
322     case 'n':  // Native integer types.
323       for (;;) {
324         unsigned Width = getInt(Tok);
325         if (Width == 0)
326           report_fatal_error(
327               "Zero width native integer type in datalayout string");
328         LegalIntWidths.push_back(Width);
329         if (Rest.empty())
330           break;
331         Split = split(Rest, ':');
332       }
333       break;
334     case 'S': { // Stack natural alignment.
335       StackNaturalAlign = inBytes(getInt(Tok));
336       break;
337     }
338     case 'm':
339       if (!Tok.empty())
340         report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
341       if (Rest.empty())
342         report_fatal_error("Expected mangling specifier in datalayout string");
343       if (Rest.size() > 1)
344         report_fatal_error("Unknown mangling specifier in datalayout string");
345       switch(Rest[0]) {
346       default:
347         report_fatal_error("Unknown mangling in datalayout string");
348       case 'e':
349         ManglingMode = MM_ELF;
350         break;
351       case 'o':
352         ManglingMode = MM_MachO;
353         break;
354       case 'm':
355         ManglingMode = MM_Mips;
356         break;
357       case 'w':
358         ManglingMode = MM_WINCOFF;
359         break;
360       }
361       break;
362     default:
363       report_fatal_error("Unknown specifier in datalayout string");
364       break;
365     }
366   }
367 }
368 
369 DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) {
370   init(M);
371 }
372 
373 void DataLayout::init(const Module *M) {
374   const DataLayout *Other = M->getDataLayout();
375   if (Other)
376     *this = *Other;
377   else
378     reset("");
379 }
380 
381 bool DataLayout::operator==(const DataLayout &Other) const {
382   bool Ret = BigEndian == Other.BigEndian &&
383              StackNaturalAlign == Other.StackNaturalAlign &&
384              ManglingMode == Other.ManglingMode &&
385              LegalIntWidths == Other.LegalIntWidths &&
386              Alignments == Other.Alignments && Pointers == Other.Pointers;
387   assert(Ret == (getStringRepresentation() == Other.getStringRepresentation()));
388   return Ret;
389 }
390 
391 void
392 DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
393                          unsigned pref_align, uint32_t bit_width) {
394   assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
395   assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
396   assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
397   for (LayoutAlignElem &Elem : Alignments) {
398     if (Elem.AlignType == (unsigned)align_type &&
399         Elem.TypeBitWidth == bit_width) {
400       // Update the abi, preferred alignments.
401       Elem.ABIAlign = abi_align;
402       Elem.PrefAlign = pref_align;
403       return;
404     }
405   }
406 
407   Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
408                                             pref_align, bit_width));
409 }
410 
411 DataLayout::PointersTy::iterator
412 DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
413   return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
414                           [](const PointerAlignElem &A, uint32_t AddressSpace) {
415     return A.AddressSpace < AddressSpace;
416   });
417 }
418 
419 void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
420                                      unsigned PrefAlign,
421                                      uint32_t TypeByteWidth) {
422   assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
423   PointersTy::iterator I = findPointerLowerBound(AddrSpace);
424   if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
425     Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
426                                              TypeByteWidth));
427   } else {
428     I->ABIAlign = ABIAlign;
429     I->PrefAlign = PrefAlign;
430     I->TypeByteWidth = TypeByteWidth;
431   }
432 }
433 
434 /// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
435 /// preferred if ABIInfo = false) the layout wants for the specified datatype.
436 unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
437                                       uint32_t BitWidth, bool ABIInfo,
438                                       Type *Ty) const {
439   // Check to see if we have an exact match and remember the best match we see.
440   int BestMatchIdx = -1;
441   int LargestInt = -1;
442   for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
443     if (Alignments[i].AlignType == (unsigned)AlignType &&
444         Alignments[i].TypeBitWidth == BitWidth)
445       return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
446 
447     // The best match so far depends on what we're looking for.
448      if (AlignType == INTEGER_ALIGN &&
449          Alignments[i].AlignType == INTEGER_ALIGN) {
450       // The "best match" for integers is the smallest size that is larger than
451       // the BitWidth requested.
452       if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
453           Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
454         BestMatchIdx = i;
455       // However, if there isn't one that's larger, then we must use the
456       // largest one we have (see below)
457       if (LargestInt == -1 ||
458           Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
459         LargestInt = i;
460     }
461   }
462 
463   // Okay, we didn't find an exact solution.  Fall back here depending on what
464   // is being looked for.
465   if (BestMatchIdx == -1) {
466     // If we didn't find an integer alignment, fall back on most conservative.
467     if (AlignType == INTEGER_ALIGN) {
468       BestMatchIdx = LargestInt;
469     } else {
470       assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
471 
472       // By default, use natural alignment for vector types. This is consistent
473       // with what clang and llvm-gcc do.
474       unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
475       Align *= cast<VectorType>(Ty)->getNumElements();
476       // If the alignment is not a power of 2, round up to the next power of 2.
477       // This happens for non-power-of-2 length vectors.
478       if (Align & (Align-1))
479         Align = NextPowerOf2(Align);
480       return Align;
481     }
482   }
483 
484   // Since we got a "best match" index, just return it.
485   return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
486                  : Alignments[BestMatchIdx].PrefAlign;
487 }
488 
489 namespace {
490 
491 class StructLayoutMap {
492   typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
493   LayoutInfoTy LayoutInfo;
494 
495 public:
496   ~StructLayoutMap() {
497     // Remove any layouts.
498     for (const auto &I : LayoutInfo) {
499       StructLayout *Value = I.second;
500       Value->~StructLayout();
501       free(Value);
502     }
503   }
504 
505   StructLayout *&operator[](StructType *STy) {
506     return LayoutInfo[STy];
507   }
508 };
509 
510 } // end anonymous namespace
511 
512 void DataLayout::clear() {
513   LegalIntWidths.clear();
514   Alignments.clear();
515   Pointers.clear();
516   delete static_cast<StructLayoutMap *>(LayoutMap);
517   LayoutMap = nullptr;
518 }
519 
520 DataLayout::~DataLayout() {
521   clear();
522 }
523 
524 const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
525   if (!LayoutMap)
526     LayoutMap = new StructLayoutMap();
527 
528   StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
529   StructLayout *&SL = (*STM)[Ty];
530   if (SL) return SL;
531 
532   // Otherwise, create the struct layout.  Because it is variable length, we
533   // malloc it, then use placement new.
534   int NumElts = Ty->getNumElements();
535   StructLayout *L =
536     (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
537 
538   // Set SL before calling StructLayout's ctor.  The ctor could cause other
539   // entries to be added to TheMap, invalidating our reference.
540   SL = L;
541 
542   new (L) StructLayout(Ty, *this);
543 
544   return L;
545 }
546 
547 std::string DataLayout::getStringRepresentation() const {
548   std::string Result;
549   raw_string_ostream OS(Result);
550 
551   OS << (BigEndian ? "E" : "e");
552 
553   switch (ManglingMode) {
554   case MM_None:
555     break;
556   case MM_ELF:
557     OS << "-m:e";
558     break;
559   case MM_MachO:
560     OS << "-m:o";
561     break;
562   case MM_WINCOFF:
563     OS << "-m:w";
564     break;
565   case MM_Mips:
566     OS << "-m:m";
567     break;
568   }
569 
570   for (const PointerAlignElem &PI : Pointers) {
571     // Skip default.
572     if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
573         PI.TypeByteWidth == 8)
574       continue;
575 
576     OS << "-p";
577     if (PI.AddressSpace) {
578       OS << PI.AddressSpace;
579     }
580     OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
581     if (PI.PrefAlign != PI.ABIAlign)
582       OS << ':' << PI.PrefAlign*8;
583   }
584 
585   for (const LayoutAlignElem &AI : Alignments) {
586     if (std::find(std::begin(DefaultAlignments), std::end(DefaultAlignments),
587                   AI) != std::end(DefaultAlignments))
588       continue;
589     OS << '-' << (char)AI.AlignType;
590     if (AI.TypeBitWidth)
591       OS << AI.TypeBitWidth;
592     OS << ':' << AI.ABIAlign*8;
593     if (AI.ABIAlign != AI.PrefAlign)
594       OS << ':' << AI.PrefAlign*8;
595   }
596 
597   if (!LegalIntWidths.empty()) {
598     OS << "-n" << (unsigned)LegalIntWidths[0];
599 
600     for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
601       OS << ':' << (unsigned)LegalIntWidths[i];
602   }
603 
604   if (StackNaturalAlign)
605     OS << "-S" << StackNaturalAlign*8;
606 
607   return OS.str();
608 }
609 
610 unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
611   PointersTy::const_iterator I = findPointerLowerBound(AS);
612   if (I == Pointers.end() || I->AddressSpace != AS) {
613     I = findPointerLowerBound(0);
614     assert(I->AddressSpace == 0);
615   }
616   return I->ABIAlign;
617 }
618 
619 unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
620   PointersTy::const_iterator I = findPointerLowerBound(AS);
621   if (I == Pointers.end() || I->AddressSpace != AS) {
622     I = findPointerLowerBound(0);
623     assert(I->AddressSpace == 0);
624   }
625   return I->PrefAlign;
626 }
627 
628 unsigned DataLayout::getPointerSize(unsigned AS) const {
629   PointersTy::const_iterator I = findPointerLowerBound(AS);
630   if (I == Pointers.end() || I->AddressSpace != AS) {
631     I = findPointerLowerBound(0);
632     assert(I->AddressSpace == 0);
633   }
634   return I->TypeByteWidth;
635 }
636 
637 unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
638   assert(Ty->isPtrOrPtrVectorTy() &&
639          "This should only be called with a pointer or pointer vector type");
640 
641   if (Ty->isPointerTy())
642     return getTypeSizeInBits(Ty);
643 
644   return getTypeSizeInBits(Ty->getScalarType());
645 }
646 
647 /*!
648   \param abi_or_pref Flag that determines which alignment is returned. true
649   returns the ABI alignment, false returns the preferred alignment.
650   \param Ty The underlying type for which alignment is determined.
651 
652   Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
653   == false) for the requested type \a Ty.
654  */
655 unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
656   int AlignType = -1;
657 
658   assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
659   switch (Ty->getTypeID()) {
660   // Early escape for the non-numeric types.
661   case Type::LabelTyID:
662     return (abi_or_pref
663             ? getPointerABIAlignment(0)
664             : getPointerPrefAlignment(0));
665   case Type::PointerTyID: {
666     unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
667     return (abi_or_pref
668             ? getPointerABIAlignment(AS)
669             : getPointerPrefAlignment(AS));
670     }
671   case Type::ArrayTyID:
672     return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
673 
674   case Type::StructTyID: {
675     // Packed structure types always have an ABI alignment of one.
676     if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
677       return 1;
678 
679     // Get the layout annotation... which is lazily created on demand.
680     const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
681     unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
682     return std::max(Align, Layout->getAlignment());
683   }
684   case Type::IntegerTyID:
685     AlignType = INTEGER_ALIGN;
686     break;
687   case Type::HalfTyID:
688   case Type::FloatTyID:
689   case Type::DoubleTyID:
690   // PPC_FP128TyID and FP128TyID have different data contents, but the
691   // same size and alignment, so they look the same here.
692   case Type::PPC_FP128TyID:
693   case Type::FP128TyID:
694   case Type::X86_FP80TyID:
695     AlignType = FLOAT_ALIGN;
696     break;
697   case Type::X86_MMXTyID:
698   case Type::VectorTyID:
699     AlignType = VECTOR_ALIGN;
700     break;
701   default:
702     llvm_unreachable("Bad type for getAlignment!!!");
703   }
704 
705   return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
706                           abi_or_pref, Ty);
707 }
708 
709 unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
710   return getAlignment(Ty, true);
711 }
712 
713 /// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
714 /// an integer type of the specified bitwidth.
715 unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
716   return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
717 }
718 
719 unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
720   return getAlignment(Ty, false);
721 }
722 
723 unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
724   unsigned Align = getPrefTypeAlignment(Ty);
725   assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
726   return Log2_32(Align);
727 }
728 
729 IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
730                                        unsigned AddressSpace) const {
731   return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
732 }
733 
734 Type *DataLayout::getIntPtrType(Type *Ty) const {
735   assert(Ty->isPtrOrPtrVectorTy() &&
736          "Expected a pointer or pointer vector type.");
737   unsigned NumBits = getPointerTypeSizeInBits(Ty);
738   IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
739   if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
740     return VectorType::get(IntTy, VecTy->getNumElements());
741   return IntTy;
742 }
743 
744 Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
745   for (unsigned LegalIntWidth : LegalIntWidths)
746     if (Width <= LegalIntWidth)
747       return Type::getIntNTy(C, LegalIntWidth);
748   return nullptr;
749 }
750 
751 unsigned DataLayout::getLargestLegalIntTypeSize() const {
752   auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
753   return Max != LegalIntWidths.end() ? *Max : 0;
754 }
755 
756 uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
757                                       ArrayRef<Value *> Indices) const {
758   Type *Ty = ptrTy;
759   assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
760   uint64_t Result = 0;
761 
762   generic_gep_type_iterator<Value* const*>
763     TI = gep_type_begin(ptrTy, Indices);
764   for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
765        ++CurIDX, ++TI) {
766     if (StructType *STy = dyn_cast<StructType>(*TI)) {
767       assert(Indices[CurIDX]->getType() ==
768              Type::getInt32Ty(ptrTy->getContext()) &&
769              "Illegal struct idx");
770       unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
771 
772       // Get structure layout information...
773       const StructLayout *Layout = getStructLayout(STy);
774 
775       // Add in the offset, as calculated by the structure layout info...
776       Result += Layout->getElementOffset(FieldNo);
777 
778       // Update Ty to refer to current element
779       Ty = STy->getElementType(FieldNo);
780     } else {
781       // Update Ty to refer to current element
782       Ty = cast<SequentialType>(Ty)->getElementType();
783 
784       // Get the array index and the size of each array element.
785       if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
786         Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
787     }
788   }
789 
790   return Result;
791 }
792 
793 /// getPreferredAlignment - Return the preferred alignment of the specified
794 /// global.  This includes an explicitly requested alignment (if the global
795 /// has one).
796 unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
797   Type *ElemType = GV->getType()->getElementType();
798   unsigned Alignment = getPrefTypeAlignment(ElemType);
799   unsigned GVAlignment = GV->getAlignment();
800   if (GVAlignment >= Alignment) {
801     Alignment = GVAlignment;
802   } else if (GVAlignment != 0) {
803     Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
804   }
805 
806   if (GV->hasInitializer() && GVAlignment == 0) {
807     if (Alignment < 16) {
808       // If the global is not external, see if it is large.  If so, give it a
809       // larger alignment.
810       if (getTypeSizeInBits(ElemType) > 128)
811         Alignment = 16;    // 16-byte alignment.
812     }
813   }
814   return Alignment;
815 }
816 
817 /// getPreferredAlignmentLog - Return the preferred alignment of the
818 /// specified global, returned in log form.  This includes an explicitly
819 /// requested alignment (if the global has one).
820 unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
821   return Log2_32(getPreferredAlignment(GV));
822 }
823 
824 DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
825   initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
826 }
827 
828 DataLayoutPass::~DataLayoutPass() {}
829 
830 bool DataLayoutPass::doInitialization(Module &M) {
831   DL.init(&M);
832   return false;
833 }
834 
835 bool DataLayoutPass::doFinalization(Module &M) {
836   DL.reset("");
837   return false;
838 }
839