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