LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DataLayout.cpp
Go to the documentation of this file.
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/IR/Constants.h"
22 #include "llvm/IR/DerivedTypes.h"
23 #include "llvm/IR/Module.h"
28 #include "llvm/Support/Mutex.h"
30 #include <algorithm>
31 #include <cstdlib>
32 using namespace llvm;
33 
34 // Handle the Pass registration stuff necessary to use DataLayout's.
35 
36 // Register the default SparcV9 implementation...
37 INITIALIZE_PASS(DataLayout, "datalayout", "Data Layout", false, true)
38 char DataLayout::ID = 0;
39 
40 //===----------------------------------------------------------------------===//
41 // Support for StructLayout
42 //===----------------------------------------------------------------------===//
43 
45  assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
46  StructAlignment = 0;
47  StructSize = 0;
48  NumElements = ST->getNumElements();
49 
50  // Loop over each of the elements, placing them in memory.
51  for (unsigned i = 0, e = NumElements; i != e; ++i) {
52  Type *Ty = ST->getElementType(i);
53  unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
54 
55  // Add padding if necessary to align the data element properly.
56  if ((StructSize & (TyAlign-1)) != 0)
57  StructSize = DataLayout::RoundUpAlignment(StructSize, TyAlign);
58 
59  // Keep track of maximum alignment constraint.
60  StructAlignment = std::max(TyAlign, StructAlignment);
61 
62  MemberOffsets[i] = StructSize;
63  StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
64  }
65 
66  // Empty structures have alignment of 1 byte.
67  if (StructAlignment == 0) StructAlignment = 1;
68 
69  // Add padding to the end of the struct so that it could be put in an array
70  // and all array elements would be aligned correctly.
71  if ((StructSize & (StructAlignment-1)) != 0)
72  StructSize = DataLayout::RoundUpAlignment(StructSize, StructAlignment);
73 }
74 
75 
76 /// getElementContainingOffset - Given a valid offset into the structure,
77 /// return the structure index that contains it.
78 unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
79  const uint64_t *SI =
80  std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset);
81  assert(SI != &MemberOffsets[0] && "Offset not in structure type!");
82  --SI;
83  assert(*SI <= Offset && "upper_bound didn't work");
84  assert((SI == &MemberOffsets[0] || *(SI-1) <= Offset) &&
85  (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
86  "Upper bound didn't work!");
87 
88  // Multiple fields can have the same offset if any of them are zero sized.
89  // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
90  // at the i32 element, because it is the last element at that offset. This is
91  // the right one to return, because anything after it will have a higher
92  // offset, implying that this element is non-empty.
93  return SI-&MemberOffsets[0];
94 }
95 
96 //===----------------------------------------------------------------------===//
97 // LayoutAlignElem, LayoutAlign support
98 //===----------------------------------------------------------------------===//
99 
101 LayoutAlignElem::get(AlignTypeEnum align_type, unsigned abi_align,
102  unsigned pref_align, uint32_t bit_width) {
103  assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
104  LayoutAlignElem retval;
105  retval.AlignType = align_type;
106  retval.ABIAlign = abi_align;
107  retval.PrefAlign = pref_align;
108  retval.TypeBitWidth = bit_width;
109  return retval;
110 }
111 
112 bool
114  return (AlignType == rhs.AlignType
115  && ABIAlign == rhs.ABIAlign
116  && PrefAlign == rhs.PrefAlign
117  && TypeBitWidth == rhs.TypeBitWidth);
118 }
119 
120 const LayoutAlignElem
121 DataLayout::InvalidAlignmentElem = LayoutAlignElem::get(INVALID_ALIGN, 0, 0, 0);
122 
123 //===----------------------------------------------------------------------===//
124 // PointerAlignElem, PointerAlign support
125 //===----------------------------------------------------------------------===//
126 
128 PointerAlignElem::get(uint32_t addr_space, unsigned abi_align,
129  unsigned pref_align, uint32_t bit_width) {
130  assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
131  PointerAlignElem retval;
132  retval.AddressSpace = addr_space;
133  retval.ABIAlign = abi_align;
134  retval.PrefAlign = pref_align;
135  retval.TypeBitWidth = bit_width;
136  return retval;
137 }
138 
139 bool
141  return (ABIAlign == rhs.ABIAlign
142  && AddressSpace == rhs.AddressSpace
143  && PrefAlign == rhs.PrefAlign
144  && TypeBitWidth == rhs.TypeBitWidth);
145 }
146 
147 const PointerAlignElem
148 DataLayout::InvalidPointerElem = PointerAlignElem::get(~0U, 0U, 0U, 0U);
149 
150 //===----------------------------------------------------------------------===//
151 // DataLayout Class Implementation
152 //===----------------------------------------------------------------------===//
153 
156 
157  LayoutMap = 0;
158  LittleEndian = false;
159  StackNaturalAlign = 0;
160 
161  // Default alignments
162  setAlignment(INTEGER_ALIGN, 1, 1, 1); // i1
163  setAlignment(INTEGER_ALIGN, 1, 1, 8); // i8
164  setAlignment(INTEGER_ALIGN, 2, 2, 16); // i16
165  setAlignment(INTEGER_ALIGN, 4, 4, 32); // i32
166  setAlignment(INTEGER_ALIGN, 4, 8, 64); // i64
167  setAlignment(FLOAT_ALIGN, 2, 2, 16); // half
168  setAlignment(FLOAT_ALIGN, 4, 4, 32); // float
169  setAlignment(FLOAT_ALIGN, 8, 8, 64); // double
170  setAlignment(FLOAT_ALIGN, 16, 16, 128); // ppcf128, quad, ...
171  setAlignment(VECTOR_ALIGN, 8, 8, 64); // v2i32, v1i64, ...
172  setAlignment(VECTOR_ALIGN, 16, 16, 128); // v16i8, v8i16, v4i32, ...
173  setAlignment(AGGREGATE_ALIGN, 0, 8, 0); // struct
174  setPointerAlignment(0, 8, 8, 8);
175 
176  parseSpecifier(Desc);
177 }
178 
179 /// Checked version of split, to ensure mandatory subparts.
180 static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
181  assert(!Str.empty() && "parse error, string can't be empty here");
182  std::pair<StringRef, StringRef> Split = Str.split(Separator);
183  assert((!Split.second.empty() || Split.first == Str) &&
184  "a trailing separator is not allowed");
185  return Split;
186 }
187 
188 /// Get an unsinged integer, including error checks.
189 static unsigned getInt(StringRef R) {
190  unsigned Result;
191  bool error = R.getAsInteger(10, Result); (void)error;
192  assert(!error && "not a number, or does not fit in an unsigned int");
193  return Result;
194 }
195 
196 /// Convert bits into bytes. Assert if not a byte width multiple.
197 static unsigned inBytes(unsigned Bits) {
198  assert(Bits % 8 == 0 && "number of bits must be a byte width multiple");
199  return Bits / 8;
200 }
201 
202 void DataLayout::parseSpecifier(StringRef Desc) {
203  while (!Desc.empty()) {
204  // Split at '-'.
205  std::pair<StringRef, StringRef> Split = split(Desc, '-');
206  Desc = Split.second;
207 
208  // Split at ':'.
209  Split = split(Split.first, ':');
210 
211  // Aliases used below.
212  StringRef &Tok = Split.first; // Current token.
213  StringRef &Rest = Split.second; // The rest of the string.
214 
215  char Specifier = Tok.front();
216  Tok = Tok.substr(1);
217 
218  switch (Specifier) {
219  case 'E':
220  LittleEndian = false;
221  break;
222  case 'e':
223  LittleEndian = true;
224  break;
225  case 'p': {
226  // Address space.
227  unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
228  assert(AddrSpace < 1 << 24 &&
229  "Invalid address space, must be a 24bit integer");
230 
231  // Size.
232  Split = split(Rest, ':');
233  unsigned PointerMemSize = inBytes(getInt(Tok));
234 
235  // ABI alignment.
236  Split = split(Rest, ':');
237  unsigned PointerABIAlign = inBytes(getInt(Tok));
238 
239  // Preferred alignment.
240  unsigned PointerPrefAlign = PointerABIAlign;
241  if (!Rest.empty()) {
242  Split = split(Rest, ':');
243  PointerPrefAlign = inBytes(getInt(Tok));
244  }
245 
246  setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
247  PointerMemSize);
248  break;
249  }
250  case 'i':
251  case 'v':
252  case 'f':
253  case 'a':
254  case 's': {
255  AlignTypeEnum AlignType;
256  switch (Specifier) {
257  default:
258  case 'i': AlignType = INTEGER_ALIGN; break;
259  case 'v': AlignType = VECTOR_ALIGN; break;
260  case 'f': AlignType = FLOAT_ALIGN; break;
261  case 'a': AlignType = AGGREGATE_ALIGN; break;
262  case 's': AlignType = STACK_ALIGN; break;
263  }
264 
265  // Bit size.
266  unsigned Size = Tok.empty() ? 0 : getInt(Tok);
267 
268  // ABI alignment.
269  Split = split(Rest, ':');
270  unsigned ABIAlign = inBytes(getInt(Tok));
271 
272  // Preferred alignment.
273  unsigned PrefAlign = ABIAlign;
274  if (!Rest.empty()) {
275  Split = split(Rest, ':');
276  PrefAlign = inBytes(getInt(Tok));
277  }
278 
279  setAlignment(AlignType, ABIAlign, PrefAlign, Size);
280 
281  break;
282  }
283  case 'n': // Native integer types.
284  for (;;) {
285  unsigned Width = getInt(Tok);
286  assert(Width != 0 && "width must be non-zero");
287  LegalIntWidths.push_back(Width);
288  if (Rest.empty())
289  break;
290  Split = split(Rest, ':');
291  }
292  break;
293  case 'S': { // Stack natural alignment.
294  StackNaturalAlign = inBytes(getInt(Tok));
295  break;
296  }
297  default:
298  llvm_unreachable("Unknown specifier in datalayout string");
299  break;
300  }
301  }
302 }
303 
304 /// Default ctor.
305 ///
306 /// @note This has to exist, because this is a pass, but it should never be
307 /// used.
309  report_fatal_error("Bad DataLayout ctor used. "
310  "Tool did not specify a DataLayout to use?");
311 }
312 
314  : ImmutablePass(ID) {
315  init(M->getDataLayout());
316 }
317 
318 void
319 DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
320  unsigned pref_align, uint32_t bit_width) {
321  assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
322  assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
323  assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
324  for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
325  if (Alignments[i].AlignType == (unsigned)align_type &&
326  Alignments[i].TypeBitWidth == bit_width) {
327  // Update the abi, preferred alignments.
328  Alignments[i].ABIAlign = abi_align;
329  Alignments[i].PrefAlign = pref_align;
330  return;
331  }
332  }
333 
334  Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
335  pref_align, bit_width));
336 }
337 
338 void
339 DataLayout::setPointerAlignment(uint32_t addr_space, unsigned abi_align,
340  unsigned pref_align, uint32_t bit_width) {
341  assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
342  DenseMap<unsigned,PointerAlignElem>::iterator val = Pointers.find(addr_space);
343  if (val == Pointers.end()) {
344  Pointers[addr_space] = PointerAlignElem::get(addr_space,
345  abi_align, pref_align, bit_width);
346  } else {
347  val->second.ABIAlign = abi_align;
348  val->second.PrefAlign = pref_align;
349  val->second.TypeBitWidth = bit_width;
350  }
351 }
352 
353 /// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
354 /// preferred if ABIInfo = false) the layout wants for the specified datatype.
355 unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
356  uint32_t BitWidth, bool ABIInfo,
357  Type *Ty) const {
358  // Check to see if we have an exact match and remember the best match we see.
359  int BestMatchIdx = -1;
360  int LargestInt = -1;
361  for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
362  if (Alignments[i].AlignType == (unsigned)AlignType &&
363  Alignments[i].TypeBitWidth == BitWidth)
364  return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
365 
366  // The best match so far depends on what we're looking for.
367  if (AlignType == INTEGER_ALIGN &&
368  Alignments[i].AlignType == INTEGER_ALIGN) {
369  // The "best match" for integers is the smallest size that is larger than
370  // the BitWidth requested.
371  if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
372  Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
373  BestMatchIdx = i;
374  // However, if there isn't one that's larger, then we must use the
375  // largest one we have (see below)
376  if (LargestInt == -1 ||
377  Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
378  LargestInt = i;
379  }
380  }
381 
382  // Okay, we didn't find an exact solution. Fall back here depending on what
383  // is being looked for.
384  if (BestMatchIdx == -1) {
385  // If we didn't find an integer alignment, fall back on most conservative.
386  if (AlignType == INTEGER_ALIGN) {
387  BestMatchIdx = LargestInt;
388  } else {
389  assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
390 
391  // By default, use natural alignment for vector types. This is consistent
392  // with what clang and llvm-gcc do.
393  unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
394  Align *= cast<VectorType>(Ty)->getNumElements();
395  // If the alignment is not a power of 2, round up to the next power of 2.
396  // This happens for non-power-of-2 length vectors.
397  if (Align & (Align-1))
398  Align = NextPowerOf2(Align);
399  return Align;
400  }
401  }
402 
403  // Since we got a "best match" index, just return it.
404  return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
405  : Alignments[BestMatchIdx].PrefAlign;
406 }
407 
408 namespace {
409 
410 class StructLayoutMap {
411  typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
412  LayoutInfoTy LayoutInfo;
413 
414 public:
415  virtual ~StructLayoutMap() {
416  // Remove any layouts.
417  for (LayoutInfoTy::iterator I = LayoutInfo.begin(), E = LayoutInfo.end();
418  I != E; ++I) {
419  StructLayout *Value = I->second;
420  Value->~StructLayout();
421  free(Value);
422  }
423  }
424 
425  StructLayout *&operator[](StructType *STy) {
426  return LayoutInfo[STy];
427  }
428 
429  // for debugging...
430  virtual void dump() const {}
431 };
432 
433 } // end anonymous namespace
434 
436  delete static_cast<StructLayoutMap*>(LayoutMap);
437 }
438 
440  delete static_cast<StructLayoutMap*>(LayoutMap);
441  LayoutMap = 0;
442  return false;
443 }
444 
446  if (!LayoutMap)
447  LayoutMap = new StructLayoutMap();
448 
449  StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
450  StructLayout *&SL = (*STM)[Ty];
451  if (SL) return SL;
452 
453  // Otherwise, create the struct layout. Because it is variable length, we
454  // malloc it, then use placement new.
455  int NumElts = Ty->getNumElements();
456  StructLayout *L =
457  (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
458 
459  // Set SL before calling StructLayout's ctor. The ctor could cause other
460  // entries to be added to TheMap, invalidating our reference.
461  SL = L;
462 
463  new (L) StructLayout(Ty, *this);
464 
465  return L;
466 }
467 
469  std::string Result;
470  raw_string_ostream OS(Result);
471 
472  OS << (LittleEndian ? "e" : "E");
473  SmallVector<unsigned, 8> addrSpaces;
474  // Lets get all of the known address spaces and sort them
475  // into increasing order so that we can emit the string
476  // in a cleaner format.
478  pib = Pointers.begin(), pie = Pointers.end();
479  pib != pie; ++pib) {
480  addrSpaces.push_back(pib->first);
481  }
482  std::sort(addrSpaces.begin(), addrSpaces.end());
483  for (SmallVectorImpl<unsigned>::iterator asb = addrSpaces.begin(),
484  ase = addrSpaces.end(); asb != ase; ++asb) {
485  const PointerAlignElem &PI = Pointers.find(*asb)->second;
486  OS << "-p";
487  if (PI.AddressSpace) {
488  OS << PI.AddressSpace;
489  }
490  OS << ":" << PI.TypeBitWidth*8 << ':' << PI.ABIAlign*8
491  << ':' << PI.PrefAlign*8;
492  }
493  OS << "-S" << StackNaturalAlign*8;
494 
495  for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
496  const LayoutAlignElem &AI = Alignments[i];
497  OS << '-' << (char)AI.AlignType << AI.TypeBitWidth << ':'
498  << AI.ABIAlign*8 << ':' << AI.PrefAlign*8;
499  }
500 
501  if (!LegalIntWidths.empty()) {
502  OS << "-n" << (unsigned)LegalIntWidths[0];
503 
504  for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
505  OS << ':' << (unsigned)LegalIntWidths[i];
506  }
507  return OS.str();
508 }
509 
511  assert(Ty->isPtrOrPtrVectorTy() &&
512  "This should only be called with a pointer or pointer vector type");
513 
514  if (Ty->isPointerTy())
515  return getTypeSizeInBits(Ty);
516 
517  return getTypeSizeInBits(Ty->getScalarType());
518 }
519 
520 /*!
521  \param abi_or_pref Flag that determines which alignment is returned. true
522  returns the ABI alignment, false returns the preferred alignment.
523  \param Ty The underlying type for which alignment is determined.
524 
525  Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
526  == false) for the requested type \a Ty.
527  */
528 unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
529  int AlignType = -1;
530 
531  assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
532  switch (Ty->getTypeID()) {
533  // Early escape for the non-numeric types.
534  case Type::LabelTyID:
535  return (abi_or_pref
538  case Type::PointerTyID: {
539  unsigned AS = dyn_cast<PointerType>(Ty)->getAddressSpace();
540  return (abi_or_pref
543  }
544  case Type::ArrayTyID:
545  return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
546 
547  case Type::StructTyID: {
548  // Packed structure types always have an ABI alignment of one.
549  if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
550  return 1;
551 
552  // Get the layout annotation... which is lazily created on demand.
553  const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
554  unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
555  return std::max(Align, Layout->getAlignment());
556  }
557  case Type::IntegerTyID:
558  AlignType = INTEGER_ALIGN;
559  break;
560  case Type::HalfTyID:
561  case Type::FloatTyID:
562  case Type::DoubleTyID:
563  // PPC_FP128TyID and FP128TyID have different data contents, but the
564  // same size and alignment, so they look the same here.
565  case Type::PPC_FP128TyID:
566  case Type::FP128TyID:
567  case Type::X86_FP80TyID:
568  AlignType = FLOAT_ALIGN;
569  break;
570  case Type::X86_MMXTyID:
571  case Type::VectorTyID:
572  AlignType = VECTOR_ALIGN;
573  break;
574  default:
575  llvm_unreachable("Bad type for getAlignment!!!");
576  }
577 
578  return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
579  abi_or_pref, Ty);
580 }
581 
583  return getAlignment(Ty, true);
584 }
585 
586 /// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
587 /// an integer type of the specified bitwidth.
588 unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
589  return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, 0);
590 }
591 
593  for (unsigned i = 0, e = Alignments.size(); i != e; ++i)
594  if (Alignments[i].AlignType == STACK_ALIGN)
595  return Alignments[i].ABIAlign;
596 
597  return getABITypeAlignment(Ty);
598 }
599 
601  return getAlignment(Ty, false);
602 }
603 
605  unsigned Align = getPrefTypeAlignment(Ty);
606  assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
607  return Log2_32(Align);
608 }
609 
611  unsigned AddressSpace) const {
612  return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
613 }
614 
616  assert(Ty->isPtrOrPtrVectorTy() &&
617  "Expected a pointer or pointer vector type.");
618  unsigned NumBits = getTypeSizeInBits(Ty->getScalarType());
619  IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
620  if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
621  return VectorType::get(IntTy, VecTy->getNumElements());
622  return IntTy;
623 }
624 
626  for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
627  if (Width <= LegalIntWidths[i])
628  return Type::getIntNTy(C, LegalIntWidths[i]);
629  return 0;
630 }
631 
633  unsigned MaxWidth = 0;
634  for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
635  MaxWidth = std::max<unsigned>(MaxWidth, LegalIntWidths[i]);
636  return MaxWidth;
637 }
638 
640  ArrayRef<Value *> Indices) const {
641  Type *Ty = ptrTy;
642  assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
643  uint64_t Result = 0;
644 
646  TI = gep_type_begin(ptrTy, Indices);
647  for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
648  ++CurIDX, ++TI) {
649  if (StructType *STy = dyn_cast<StructType>(*TI)) {
650  assert(Indices[CurIDX]->getType() ==
651  Type::getInt32Ty(ptrTy->getContext()) &&
652  "Illegal struct idx");
653  unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
654 
655  // Get structure layout information...
656  const StructLayout *Layout = getStructLayout(STy);
657 
658  // Add in the offset, as calculated by the structure layout info...
659  Result += Layout->getElementOffset(FieldNo);
660 
661  // Update Ty to refer to current element
662  Ty = STy->getElementType(FieldNo);
663  } else {
664  // Update Ty to refer to current element
665  Ty = cast<SequentialType>(Ty)->getElementType();
666 
667  // Get the array index and the size of each array element.
668  if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
669  Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
670  }
671  }
672 
673  return Result;
674 }
675 
676 /// getPreferredAlignment - Return the preferred alignment of the specified
677 /// global. This includes an explicitly requested alignment (if the global
678 /// has one).
680  Type *ElemType = GV->getType()->getElementType();
681  unsigned Alignment = getPrefTypeAlignment(ElemType);
682  unsigned GVAlignment = GV->getAlignment();
683  if (GVAlignment >= Alignment) {
684  Alignment = GVAlignment;
685  } else if (GVAlignment != 0) {
686  Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
687  }
688 
689  if (GV->hasInitializer() && GVAlignment == 0) {
690  if (Alignment < 16) {
691  // If the global is not external, see if it is large. If so, give it a
692  // larger alignment.
693  if (getTypeSizeInBits(ElemType) > 128)
694  Alignment = 16; // 16-byte alignment.
695  }
696  }
697  return Alignment;
698 }
699 
700 /// getPreferredAlignmentLog - Return the preferred alignment of the
701 /// specified global, returned in log form. This includes an explicitly
702 /// requested alignment (if the global has one).
704  return Log2_32(getPreferredAlignment(GV));
705 }
unsigned PrefAlign
Pref. alignment for this type/bitw.
Definition: DataLayout.h:80
std::string getStringRepresentation() const
Definition: DataLayout.cpp:468
void push_back(const T &Elt)
Definition: SmallVector.h:236
7: Labels
Definition: Type.h:62
static PassRegistry * getPassRegistry()
unsigned getPointerPrefAlignment(unsigned AS=0) const
Definition: DataLayout.h:251
AlignTypeEnum
Enum used to categorize the alignment types stored by LayoutAlignElem.
Definition: DataLayout.h:43
unsigned TypeBitWidth
Type bit width.
Definition: DataLayout.h:61
The main container class for the LLVM Intermediate Representation.
Definition: Module.h:112
2: 32-bit floating point type
Definition: Type.h:57
unsigned getAlignment() const
Definition: GlobalValue.h:79
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:266
unsigned getPointerTypeSizeInBits(Type *) const
Definition: DataLayout.cpp:510
Stack objects alignment.
Definition: DataLayout.h:49
unsigned getPrefTypeAlignment(Type *Ty) const
Definition: DataLayout.cpp:600
std::pair< StringRef, StringRef > split(char Separator) const
Definition: StringRef.h:437
StringRef substr(size_t Start, size_t N=npos) const
Definition: StringRef.h:392
bool isPtrOrPtrVectorTy() const
Definition: Type.h:225
unsigned getAlignment() const
Definition: DataLayout.h:433
12: Structures
Definition: Type.h:70
static std::pair< StringRef, StringRef > split(StringRef Str, char Separator)
Checked version of split, to ensure mandatory subparts.
Definition: DataLayout.cpp:180
4: 80-bit floating point type (X87)
Definition: Type.h:59
1: 16-bit floating point type
Definition: Type.h:56
FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys=None)
Definition: Function.cpp:657
14: Pointers
Definition: Type.h:72
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
unsigned getPointerABIAlignment(unsigned AS=0) const
Definition: DataLayout.h:240
const StructLayout * getStructLayout(StructType *Ty) const
Definition: DataLayout.cpp:445
unsigned getPreferredTypeAlignmentShift(Type *Ty) const
Definition: DataLayout.cpp:604
static unsigned getInt(StringRef R)
Get an unsinged integer, including error checks.
Definition: DataLayout.cpp:189
#define llvm_unreachable(msg)
unsigned ABIAlign
ABI alignment for this type/bitw.
Definition: DataLayout.h:62
uint64_t getIndexedOffset(Type *Ty, ArrayRef< Value * > Indices) const
Definition: DataLayout.cpp:639
ID
LLVM Calling Convention Representation.
Definition: CallingConv.h:26
Type * getSmallestLegalIntType(LLVMContext &C, unsigned Width=0) const
Definition: DataLayout.cpp:625
LLVMContext & getContext() const
getContext - Return the LLVMContext in which this type was uniqued.
Definition: Type.h:128
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
Definition: SmallVector.h:56
static UIntTy RoundUpAlignment(UIntTy Val, unsigned Alignment)
Definition: DataLayout.h:407
TypeID getTypeID() const
Definition: Type.h:137
unsigned PrefAlign
Pref. alignment for this type/bitw.
Definition: DataLayout.h:63
static LayoutAlignElem get(AlignTypeEnum align_type, unsigned abi_align, unsigned pref_align, uint32_t bit_width)
Initializer.
Definition: DataLayout.cpp:101
bool doFinalization(Module &M)
Definition: DataLayout.cpp:439
Type * getElementType() const
Definition: DerivedTypes.h:319
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:109
Integer type alignment.
Definition: DataLayout.h:45
uint64_t getElementOffset(unsigned Idx) const
Definition: DataLayout.h:442
10: Arbitrary bit width integers
Definition: Type.h:68
unsigned getABIIntegerTypeAlignment(unsigned BitWidth) const
Definition: DataLayout.cpp:588
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
* if(!EatIfPresent(lltok::kw_thread_local)) return false
An invalid alignment.
Definition: DataLayout.h:44
Floating point type alignment.
Definition: DataLayout.h:47
void free(void *ptr);
6: 128-bit floating point type (two 64-bits, PowerPC)
Definition: Type.h:61
uint32_t AddressSpace
Address space for the pointer type.
Definition: DataLayout.h:82
Integer representation type.
Definition: DerivedTypes.h:37
enable_if_c< std::numeric_limits< T >::is_signed, bool >::type getAsInteger(unsigned Radix, T &Result) const
Definition: StringRef.h:337
bool isPointerTy() const
Definition: Type.h:220
uint64_t NextPowerOf2(uint64_t A)
Definition: MathExtras.h:546
bool operator==(const LayoutAlignElem &rhs) const
Equality predicate.
Definition: DataLayout.cpp:113
std::string & str()
Definition: raw_ostream.h:441
unsigned getPreferredAlignment(const GlobalVariable *GV) const
Definition: DataLayout.cpp:679
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:153
unsigned getPreferredAlignmentLog(const GlobalVariable *GV) const
Definition: DataLayout.cpp:703
13: Arrays
Definition: Type.h:71
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Definition: DataLayout.cpp:610
unsigned getABITypeAlignment(Type *Ty) const
Definition: DataLayout.cpp:582
static IntegerType * get(LLVMContext &C, unsigned NumBits)
Get or create an IntegerType instance.
Definition: Type.cpp:305
static void Split(std::vector< std::string > &V, const StringRef S)
15: SIMD 'packed' format, or other vector type
Definition: Type.h:73
Vector type alignment.
Definition: DataLayout.h:46
uint64_t getTypeAllocSize(Type *Ty) const
Definition: DataLayout.h:326
const std::string & getDataLayout() const
Definition: Module.h:233
uint32_t TypeBitWidth
Type bit width.
Definition: DataLayout.h:81
AddressSpace
Definition: NVPTXBaseInfo.h:22
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition: Type.cpp:244
unsigned getElementContainingOffset(uint64_t Offset) const
Definition: DataLayout.cpp:78
void initializeDataLayoutPass(PassRegistry &)
unsigned Log2_32(uint32_t Value)
Definition: MathExtras.h:443
bool hasInitializer() const
unsigned getLargestLegalIntTypeSize() const
Definition: DataLayout.cpp:632
static cl::opt< AlignMode > Align(cl::desc("Load/store alignment support"), cl::Hidden, cl::init(DefaultAlign), cl::values(clEnumValN(DefaultAlign,"arm-default-align","Generate unaligned accesses only on hardware/OS ""combinations that are known to support them"), clEnumValN(StrictAlign,"arm-strict-align","Disallow all unaligned memory accesses"), clEnumValN(NoStrictAlign,"arm-no-strict-align","Allow unaligned memory accesses"), clEnumValEnd))
bool operator==(const PointerAlignElem &rhs) const
Equality predicate.
Definition: DataLayout.cpp:140
Aggregate alignment.
Definition: DataLayout.h:48
void init(StringRef LayoutDescription)
Definition: DataLayout.cpp:154
unsigned getCallFrameTypeAlignment(Type *Ty) const
Definition: DataLayout.cpp:592
unsigned ABIAlign
ABI alignment for this type/bitw.
Definition: DataLayout.h:79
PointerType * getType() const
getType - Global values are always pointers.
Definition: GlobalValue.h:107
void *malloc(size_t size);
static IntegerType * getInt32Ty(LLVMContext &C)
Definition: Type.cpp:241
#define I(x, y, z)
Definition: MD5.cpp:54
unsigned getPointerSizeInBits(unsigned AS=0) const
Definition: DataLayout.h:271
const Type * getScalarType() const
Definition: Type.cpp:51
unsigned AlignType
Alignment type (AlignTypeEnum)
Definition: DataLayout.h:60
static unsigned inBytes(unsigned Bits)
Convert bits into bytes. Assert if not a byte width multiple.
Definition: DataLayout.cpp:197
3: 64-bit floating point type
Definition: Type.h:58
char front() const
front - Get the first character in the string.
Definition: StringRef.h:116
LLVM Value Representation.
Definition: Value.h:66
static VectorType * get(Type *ElementType, unsigned NumElements)
Definition: Type.cpp:706
bool isSized() const
Definition: Type.h:278
uint64_t getTypeSizeInBits(Type *Ty) const
Definition: DataLayout.h:459
static PointerAlignElem get(uint32_t addr_space, unsigned abi_align, unsigned pref_align, uint32_t bit_width)
Initializer.
Definition: DataLayout.cpp:128
9: MMX vectors (64 bits, X86 specific)
Definition: Type.h:64
unsigned getNumElements() const
Random access to the elements.
Definition: DerivedTypes.h:286
bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:110
5: 128-bit floating point type (112-bit mantissa)
Definition: Type.h:60
gep_type_iterator gep_type_begin(const User *GEP)