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