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