1 //===- DataLayout.cpp - Data size & alignment routines ---------------------==//
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
7 //===----------------------------------------------------------------------===//
9 // This file defines layout properties related to datatype size/offset/alignment
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.
16 //===----------------------------------------------------------------------===//
18 #include "llvm/IR/DataLayout.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/IR/Constants.h"
22 #include "llvm/IR/DerivedTypes.h"
23 #include "llvm/IR/GetElementPtrTypeIterator.h"
24 #include "llvm/IR/GlobalVariable.h"
25 #include "llvm/IR/Module.h"
26 #include "llvm/IR/Type.h"
27 #include "llvm/IR/Value.h"
28 #include "llvm/Support/Casting.h"
29 #include "llvm/Support/Error.h"
30 #include "llvm/Support/ErrorHandling.h"
31 #include "llvm/Support/MathExtras.h"
32 #include "llvm/Support/MemAlloc.h"
33 #include "llvm/Support/TypeSize.h"
34 #include "llvm/TargetParser/Triple.h"
44 //===----------------------------------------------------------------------===//
45 // Support for StructLayout
46 //===----------------------------------------------------------------------===//
48 StructLayout::StructLayout(StructType
*ST
, const DataLayout
&DL
)
49 : StructSize(TypeSize::getFixed(0)) {
50 assert(!ST
->isOpaque() && "Cannot get layout of opaque structs");
52 NumElements
= ST
->getNumElements();
54 // Loop over each of the elements, placing them in memory.
55 for (unsigned i
= 0, e
= NumElements
; i
!= e
; ++i
) {
56 Type
*Ty
= ST
->getElementType(i
);
57 if (i
== 0 && Ty
->isScalableTy())
58 StructSize
= TypeSize::getScalable(0);
60 const Align TyAlign
= ST
->isPacked() ? Align(1) : DL
.getABITypeAlign(Ty
);
62 // Add padding if necessary to align the data element properly.
63 // Currently the only structure with scalable size will be the homogeneous
64 // scalable vector types. Homogeneous scalable vector types have members of
65 // the same data type so no alignment issue will happen. The condition here
66 // assumes so and needs to be adjusted if this assumption changes (e.g. we
67 // support structures with arbitrary scalable data type, or structure that
68 // contains both fixed size and scalable size data type members).
69 if (!StructSize
.isScalable() && !isAligned(TyAlign
, StructSize
)) {
71 StructSize
= TypeSize::getFixed(alignTo(StructSize
, TyAlign
));
74 // Keep track of maximum alignment constraint.
75 StructAlignment
= std::max(TyAlign
, StructAlignment
);
77 getMemberOffsets()[i
] = StructSize
;
78 // Consume space for this data item
79 StructSize
+= DL
.getTypeAllocSize(Ty
);
82 // Add padding to the end of the struct so that it could be put in an array
83 // and all array elements would be aligned correctly.
84 if (!StructSize
.isScalable() && !isAligned(StructAlignment
, StructSize
)) {
86 StructSize
= TypeSize::getFixed(alignTo(StructSize
, StructAlignment
));
90 /// getElementContainingOffset - Given a valid offset into the structure,
91 /// return the structure index that contains it.
92 unsigned StructLayout::getElementContainingOffset(uint64_t FixedOffset
) const {
93 assert(!StructSize
.isScalable() &&
94 "Cannot get element at offset for structure containing scalable "
96 TypeSize Offset
= TypeSize::getFixed(FixedOffset
);
97 ArrayRef
<TypeSize
> MemberOffsets
= getMemberOffsets();
100 std::upper_bound(MemberOffsets
.begin(), MemberOffsets
.end(), Offset
,
101 [](TypeSize LHS
, TypeSize RHS
) -> bool {
102 return TypeSize::isKnownLT(LHS
, RHS
);
104 assert(SI
!= MemberOffsets
.begin() && "Offset not in structure type!");
106 assert(TypeSize::isKnownLE(*SI
, Offset
) && "upper_bound didn't work");
108 (SI
== MemberOffsets
.begin() || TypeSize::isKnownLE(*(SI
- 1), Offset
)) &&
109 (SI
+ 1 == MemberOffsets
.end() ||
110 TypeSize::isKnownGT(*(SI
+ 1), Offset
)) &&
111 "Upper bound didn't work!");
113 // Multiple fields can have the same offset if any of them are zero sized.
114 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
115 // at the i32 element, because it is the last element at that offset. This is
116 // the right one to return, because anything after it will have a higher
117 // offset, implying that this element is non-empty.
118 return SI
- MemberOffsets
.begin();
121 //===----------------------------------------------------------------------===//
122 // LayoutAlignElem, LayoutAlign support
123 //===----------------------------------------------------------------------===//
125 LayoutAlignElem
LayoutAlignElem::get(Align ABIAlign
, Align PrefAlign
,
127 assert(ABIAlign
<= PrefAlign
&& "Preferred alignment worse than ABI!");
128 LayoutAlignElem retval
;
129 retval
.ABIAlign
= ABIAlign
;
130 retval
.PrefAlign
= PrefAlign
;
131 retval
.TypeBitWidth
= BitWidth
;
135 bool LayoutAlignElem::operator==(const LayoutAlignElem
&rhs
) const {
136 return ABIAlign
== rhs
.ABIAlign
&& PrefAlign
== rhs
.PrefAlign
&&
137 TypeBitWidth
== rhs
.TypeBitWidth
;
140 //===----------------------------------------------------------------------===//
141 // PointerAlignElem, PointerAlign support
142 //===----------------------------------------------------------------------===//
144 PointerAlignElem
PointerAlignElem::getInBits(uint32_t AddressSpace
,
145 Align ABIAlign
, Align PrefAlign
,
146 uint32_t TypeBitWidth
,
147 uint32_t IndexBitWidth
) {
148 assert(ABIAlign
<= PrefAlign
&& "Preferred alignment worse than ABI!");
149 PointerAlignElem retval
;
150 retval
.AddressSpace
= AddressSpace
;
151 retval
.ABIAlign
= ABIAlign
;
152 retval
.PrefAlign
= PrefAlign
;
153 retval
.TypeBitWidth
= TypeBitWidth
;
154 retval
.IndexBitWidth
= IndexBitWidth
;
159 PointerAlignElem::operator==(const PointerAlignElem
&rhs
) const {
160 return (ABIAlign
== rhs
.ABIAlign
&& AddressSpace
== rhs
.AddressSpace
&&
161 PrefAlign
== rhs
.PrefAlign
&& TypeBitWidth
== rhs
.TypeBitWidth
&&
162 IndexBitWidth
== rhs
.IndexBitWidth
);
165 //===----------------------------------------------------------------------===//
166 // DataLayout Class Implementation
167 //===----------------------------------------------------------------------===//
169 const char *DataLayout::getManglingComponent(const Triple
&T
) {
170 if (T
.isOSBinFormatGOFF())
172 if (T
.isOSBinFormatMachO())
174 if ((T
.isOSWindows() || T
.isUEFI()) && T
.isOSBinFormatCOFF())
175 return T
.getArch() == Triple::x86
? "-m:x" : "-m:w";
176 if (T
.isOSBinFormatXCOFF())
181 static const std::pair
<AlignTypeEnum
, LayoutAlignElem
> DefaultAlignments
[] = {
182 {INTEGER_ALIGN
, {1, Align(1), Align(1)}}, // i1
183 {INTEGER_ALIGN
, {8, Align(1), Align(1)}}, // i8
184 {INTEGER_ALIGN
, {16, Align(2), Align(2)}}, // i16
185 {INTEGER_ALIGN
, {32, Align(4), Align(4)}}, // i32
186 {INTEGER_ALIGN
, {64, Align(4), Align(8)}}, // i64
187 {FLOAT_ALIGN
, {16, Align(2), Align(2)}}, // half, bfloat
188 {FLOAT_ALIGN
, {32, Align(4), Align(4)}}, // float
189 {FLOAT_ALIGN
, {64, Align(8), Align(8)}}, // double
190 {FLOAT_ALIGN
, {128, Align(16), Align(16)}}, // ppcf128, quad, ...
191 {VECTOR_ALIGN
, {64, Align(8), Align(8)}}, // v2i32, v1i64, ...
192 {VECTOR_ALIGN
, {128, Align(16), Align(16)}}, // v16i8, v8i16, v4i32, ...
195 void DataLayout::reset(StringRef Desc
) {
201 StackNaturalAlign
.reset();
202 ProgramAddrSpace
= 0;
203 DefaultGlobalsAddrSpace
= 0;
204 FunctionPtrAlign
.reset();
205 TheFunctionPtrAlignType
= FunctionPtrAlignType::Independent
;
206 ManglingMode
= MM_None
;
207 NonIntegralAddressSpaces
.clear();
208 StructAlignment
= LayoutAlignElem::get(Align(1), Align(8), 0);
210 // Default alignments
211 for (const auto &[Kind
, Layout
] : DefaultAlignments
) {
212 if (Error Err
= setAlignment(Kind
, Layout
.ABIAlign
, Layout
.PrefAlign
,
213 Layout
.TypeBitWidth
))
214 return report_fatal_error(std::move(Err
));
216 if (Error Err
= setPointerAlignmentInBits(0, Align(8), Align(8), 64, 64))
217 return report_fatal_error(std::move(Err
));
219 if (Error Err
= parseSpecifier(Desc
))
220 return report_fatal_error(std::move(Err
));
223 Expected
<DataLayout
> DataLayout::parse(StringRef LayoutDescription
) {
224 DataLayout
Layout("");
225 if (Error Err
= Layout
.parseSpecifier(LayoutDescription
))
226 return std::move(Err
);
230 static Error
reportError(const Twine
&Message
) {
231 return createStringError(inconvertibleErrorCode(), Message
);
234 /// Checked version of split, to ensure mandatory subparts.
235 static Error
split(StringRef Str
, char Separator
,
236 std::pair
<StringRef
, StringRef
> &Split
) {
237 assert(!Str
.empty() && "parse error, string can't be empty here");
238 Split
= Str
.split(Separator
);
239 if (Split
.second
.empty() && Split
.first
!= Str
)
240 return reportError("Trailing separator in datalayout string");
241 if (!Split
.second
.empty() && Split
.first
.empty())
242 return reportError("Expected token before separator in datalayout string");
243 return Error::success();
246 /// Get an unsigned integer, including error checks.
247 template <typename IntTy
> static Error
getInt(StringRef R
, IntTy
&Result
) {
248 bool error
= R
.getAsInteger(10, Result
); (void)error
;
250 return reportError("not a number, or does not fit in an unsigned int");
251 return Error::success();
254 /// Get an unsigned integer representing the number of bits and convert it into
255 /// bytes. Error out of not a byte width multiple.
256 template <typename IntTy
>
257 static Error
getIntInBytes(StringRef R
, IntTy
&Result
) {
258 if (Error Err
= getInt
<IntTy
>(R
, Result
))
261 return reportError("number of bits must be a byte width multiple");
263 return Error::success();
266 static Error
getAddrSpace(StringRef R
, unsigned &AddrSpace
) {
267 if (Error Err
= getInt(R
, AddrSpace
))
269 if (!isUInt
<24>(AddrSpace
))
270 return reportError("Invalid address space, must be a 24-bit integer");
271 return Error::success();
274 Error
DataLayout::parseSpecifier(StringRef Desc
) {
275 StringRepresentation
= std::string(Desc
);
276 while (!Desc
.empty()) {
278 std::pair
<StringRef
, StringRef
> Split
;
279 if (Error Err
= ::split(Desc
, '-', Split
))
284 if (Error Err
= ::split(Split
.first
, ':', Split
))
287 // Aliases used below.
288 StringRef
&Tok
= Split
.first
; // Current token.
289 StringRef
&Rest
= Split
.second
; // The rest of the string.
293 if (Error Err
= ::split(Rest
, ':', Split
))
297 if (Error Err
= getInt(Split
.first
, AS
))
300 return reportError("Address space 0 can never be non-integral");
301 NonIntegralAddressSpaces
.push_back(AS
);
302 } while (!Rest
.empty());
307 char Specifier
= Tok
.front();
312 // Deprecated, but ignoring here to preserve loading older textual llvm
323 unsigned AddrSpace
= 0;
325 if (Error Err
= getInt(Tok
, AddrSpace
))
327 if (!isUInt
<24>(AddrSpace
))
328 return reportError("Invalid address space, must be a 24-bit integer");
333 "Missing size specification for pointer in datalayout string");
334 if (Error Err
= ::split(Rest
, ':', Split
))
336 unsigned PointerMemSize
;
337 if (Error Err
= getInt(Tok
, PointerMemSize
))
340 return reportError("Invalid pointer size of 0 bytes");
345 "Missing alignment specification for pointer in datalayout string");
346 if (Error Err
= ::split(Rest
, ':', Split
))
348 unsigned PointerABIAlign
;
349 if (Error Err
= getIntInBytes(Tok
, PointerABIAlign
))
351 if (!isPowerOf2_64(PointerABIAlign
))
352 return reportError("Pointer ABI alignment must be a power of 2");
354 // Size of index used in GEP for address calculation.
355 // The parameter is optional. By default it is equal to size of pointer.
356 unsigned IndexSize
= PointerMemSize
;
358 // Preferred alignment.
359 unsigned PointerPrefAlign
= PointerABIAlign
;
361 if (Error Err
= ::split(Rest
, ':', Split
))
363 if (Error Err
= getIntInBytes(Tok
, PointerPrefAlign
))
365 if (!isPowerOf2_64(PointerPrefAlign
))
367 "Pointer preferred alignment must be a power of 2");
369 // Now read the index. It is the second optional parameter here.
371 if (Error Err
= ::split(Rest
, ':', Split
))
373 if (Error Err
= getInt(Tok
, IndexSize
))
376 return reportError("Invalid index size of 0 bytes");
379 if (Error Err
= setPointerAlignmentInBits(
380 AddrSpace
, assumeAligned(PointerABIAlign
),
381 assumeAligned(PointerPrefAlign
), PointerMemSize
, IndexSize
))
389 AlignTypeEnum AlignType
;
391 default: llvm_unreachable("Unexpected specifier!");
392 case 'i': AlignType
= INTEGER_ALIGN
; break;
393 case 'v': AlignType
= VECTOR_ALIGN
; break;
394 case 'f': AlignType
= FLOAT_ALIGN
; break;
395 case 'a': AlignType
= AGGREGATE_ALIGN
; break;
401 if (Error Err
= getInt(Tok
, Size
))
404 if (AlignType
== AGGREGATE_ALIGN
&& Size
!= 0)
406 "Sized aggregate specification in datalayout string");
411 "Missing alignment specification in datalayout string");
412 if (Error Err
= ::split(Rest
, ':', Split
))
415 if (Error Err
= getIntInBytes(Tok
, ABIAlign
))
417 if (AlignType
!= AGGREGATE_ALIGN
&& !ABIAlign
)
419 "ABI alignment specification must be >0 for non-aggregate types");
421 if (!isUInt
<16>(ABIAlign
))
422 return reportError("Invalid ABI alignment, must be a 16bit integer");
423 if (ABIAlign
!= 0 && !isPowerOf2_64(ABIAlign
))
424 return reportError("Invalid ABI alignment, must be a power of 2");
425 if (AlignType
== INTEGER_ALIGN
&& Size
== 8 && ABIAlign
!= 1)
427 "Invalid ABI alignment, i8 must be naturally aligned");
429 // Preferred alignment.
430 unsigned PrefAlign
= ABIAlign
;
432 if (Error Err
= ::split(Rest
, ':', Split
))
434 if (Error Err
= getIntInBytes(Tok
, PrefAlign
))
438 if (!isUInt
<16>(PrefAlign
))
440 "Invalid preferred alignment, must be a 16bit integer");
441 if (PrefAlign
!= 0 && !isPowerOf2_64(PrefAlign
))
442 return reportError("Invalid preferred alignment, must be a power of 2");
444 if (Error Err
= setAlignment(AlignType
, assumeAligned(ABIAlign
),
445 assumeAligned(PrefAlign
), Size
))
450 case 'n': // Native integer types.
453 if (Error Err
= getInt(Tok
, Width
))
457 "Zero width native integer type in datalayout string");
458 LegalIntWidths
.push_back(Width
);
461 if (Error Err
= ::split(Rest
, ':', Split
))
465 case 'S': { // Stack natural alignment.
467 if (Error Err
= getIntInBytes(Tok
, Alignment
))
469 if (Alignment
!= 0 && !llvm::isPowerOf2_64(Alignment
))
470 return reportError("Alignment is neither 0 nor a power of 2");
471 StackNaturalAlign
= MaybeAlign(Alignment
);
475 switch (Tok
.front()) {
477 TheFunctionPtrAlignType
= FunctionPtrAlignType::Independent
;
480 TheFunctionPtrAlignType
= FunctionPtrAlignType::MultipleOfFunctionAlign
;
483 return reportError("Unknown function pointer alignment type in "
484 "datalayout string");
488 if (Error Err
= getIntInBytes(Tok
, Alignment
))
490 if (Alignment
!= 0 && !llvm::isPowerOf2_64(Alignment
))
491 return reportError("Alignment is neither 0 nor a power of 2");
492 FunctionPtrAlign
= MaybeAlign(Alignment
);
495 case 'P': { // Function address space.
496 if (Error Err
= getAddrSpace(Tok
, ProgramAddrSpace
))
500 case 'A': { // Default stack/alloca address space.
501 if (Error Err
= getAddrSpace(Tok
, AllocaAddrSpace
))
505 case 'G': { // Default address space for global variables.
506 if (Error Err
= getAddrSpace(Tok
, DefaultGlobalsAddrSpace
))
512 return reportError("Unexpected trailing characters after mangling "
513 "specifier in datalayout string");
515 return reportError("Expected mangling specifier in datalayout string");
517 return reportError("Unknown mangling specifier in datalayout string");
520 return reportError("Unknown mangling in datalayout string");
522 ManglingMode
= MM_ELF
;
525 ManglingMode
= MM_GOFF
;
528 ManglingMode
= MM_MachO
;
531 ManglingMode
= MM_Mips
;
534 ManglingMode
= MM_WinCOFF
;
537 ManglingMode
= MM_WinCOFFX86
;
540 ManglingMode
= MM_XCOFF
;
545 return reportError("Unknown specifier in datalayout string");
550 return Error::success();
553 DataLayout::DataLayout(const Module
*M
) {
557 void DataLayout::init(const Module
*M
) { *this = M
->getDataLayout(); }
559 bool DataLayout::operator==(const DataLayout
&Other
) const {
560 bool Ret
= BigEndian
== Other
.BigEndian
&&
561 AllocaAddrSpace
== Other
.AllocaAddrSpace
&&
562 StackNaturalAlign
== Other
.StackNaturalAlign
&&
563 ProgramAddrSpace
== Other
.ProgramAddrSpace
&&
564 DefaultGlobalsAddrSpace
== Other
.DefaultGlobalsAddrSpace
&&
565 FunctionPtrAlign
== Other
.FunctionPtrAlign
&&
566 TheFunctionPtrAlignType
== Other
.TheFunctionPtrAlignType
&&
567 ManglingMode
== Other
.ManglingMode
&&
568 LegalIntWidths
== Other
.LegalIntWidths
&&
569 IntAlignments
== Other
.IntAlignments
&&
570 FloatAlignments
== Other
.FloatAlignments
&&
571 VectorAlignments
== Other
.VectorAlignments
&&
572 StructAlignment
== Other
.StructAlignment
&&
573 Pointers
== Other
.Pointers
;
574 // Note: getStringRepresentation() might differs, it is not canonicalized
578 static SmallVectorImpl
<LayoutAlignElem
>::const_iterator
579 findAlignmentLowerBound(const SmallVectorImpl
<LayoutAlignElem
> &Alignments
,
581 return partition_point(Alignments
, [BitWidth
](const LayoutAlignElem
&E
) {
582 return E
.TypeBitWidth
< BitWidth
;
586 Error
DataLayout::setAlignment(AlignTypeEnum AlignType
, Align ABIAlign
,
587 Align PrefAlign
, uint32_t BitWidth
) {
588 // AlignmentsTy::ABIAlign and AlignmentsTy::PrefAlign were once stored as
589 // uint16_t, it is unclear if there are requirements for alignment to be less
590 // than 2^16 other than storage. In the meantime we leave the restriction as
591 // an assert. See D67400 for context.
592 assert(Log2(ABIAlign
) < 16 && Log2(PrefAlign
) < 16 && "Alignment too big");
593 if (!isUInt
<24>(BitWidth
))
594 return reportError("Invalid bit width, must be a 24-bit integer");
595 if (PrefAlign
< ABIAlign
)
597 "Preferred alignment cannot be less than the ABI alignment");
599 SmallVectorImpl
<LayoutAlignElem
> *Alignments
;
601 case AGGREGATE_ALIGN
:
602 StructAlignment
.ABIAlign
= ABIAlign
;
603 StructAlignment
.PrefAlign
= PrefAlign
;
604 return Error::success();
606 Alignments
= &IntAlignments
;
609 Alignments
= &FloatAlignments
;
612 Alignments
= &VectorAlignments
;
616 auto I
= partition_point(*Alignments
, [BitWidth
](const LayoutAlignElem
&E
) {
617 return E
.TypeBitWidth
< BitWidth
;
619 if (I
!= Alignments
->end() && I
->TypeBitWidth
== BitWidth
) {
620 // Update the abi, preferred alignments.
621 I
->ABIAlign
= ABIAlign
;
622 I
->PrefAlign
= PrefAlign
;
624 // Insert before I to keep the vector sorted.
625 Alignments
->insert(I
, LayoutAlignElem::get(ABIAlign
, PrefAlign
, BitWidth
));
627 return Error::success();
630 const PointerAlignElem
&
631 DataLayout::getPointerAlignElem(uint32_t AddressSpace
) const {
632 if (AddressSpace
!= 0) {
633 auto I
= lower_bound(Pointers
, AddressSpace
,
634 [](const PointerAlignElem
&A
, uint32_t AddressSpace
) {
635 return A
.AddressSpace
< AddressSpace
;
637 if (I
!= Pointers
.end() && I
->AddressSpace
== AddressSpace
)
641 assert(Pointers
[0].AddressSpace
== 0);
645 Error
DataLayout::setPointerAlignmentInBits(uint32_t AddrSpace
, Align ABIAlign
,
647 uint32_t TypeBitWidth
,
648 uint32_t IndexBitWidth
) {
649 if (PrefAlign
< ABIAlign
)
651 "Preferred alignment cannot be less than the ABI alignment");
652 if (IndexBitWidth
> TypeBitWidth
)
653 return reportError("Index width cannot be larger than pointer width");
655 auto I
= lower_bound(Pointers
, AddrSpace
,
656 [](const PointerAlignElem
&A
, uint32_t AddressSpace
) {
657 return A
.AddressSpace
< AddressSpace
;
659 if (I
== Pointers
.end() || I
->AddressSpace
!= AddrSpace
) {
661 PointerAlignElem::getInBits(AddrSpace
, ABIAlign
, PrefAlign
,
662 TypeBitWidth
, IndexBitWidth
));
664 I
->ABIAlign
= ABIAlign
;
665 I
->PrefAlign
= PrefAlign
;
666 I
->TypeBitWidth
= TypeBitWidth
;
667 I
->IndexBitWidth
= IndexBitWidth
;
669 return Error::success();
672 Align
DataLayout::getIntegerAlignment(uint32_t BitWidth
,
673 bool abi_or_pref
) const {
674 auto I
= findAlignmentLowerBound(IntAlignments
, BitWidth
);
675 // If we don't have an exact match, use alignment of next larger integer
676 // type. If there is none, use alignment of largest integer type by going
678 if (I
== IntAlignments
.end())
680 return abi_or_pref
? I
->ABIAlign
: I
->PrefAlign
;
685 class StructLayoutMap
{
686 using LayoutInfoTy
= DenseMap
<StructType
*, StructLayout
*>;
687 LayoutInfoTy LayoutInfo
;
691 // Remove any layouts.
692 for (const auto &I
: LayoutInfo
) {
693 StructLayout
*Value
= I
.second
;
694 Value
->~StructLayout();
699 StructLayout
*&operator[](StructType
*STy
) {
700 return LayoutInfo
[STy
];
704 } // end anonymous namespace
706 void DataLayout::clear() {
707 LegalIntWidths
.clear();
708 IntAlignments
.clear();
709 FloatAlignments
.clear();
710 VectorAlignments
.clear();
712 delete static_cast<StructLayoutMap
*>(LayoutMap
);
716 DataLayout::~DataLayout() {
720 const StructLayout
*DataLayout::getStructLayout(StructType
*Ty
) const {
722 LayoutMap
= new StructLayoutMap();
724 StructLayoutMap
*STM
= static_cast<StructLayoutMap
*>(LayoutMap
);
725 StructLayout
*&SL
= (*STM
)[Ty
];
728 // Otherwise, create the struct layout. Because it is variable length, we
729 // malloc it, then use placement new.
730 StructLayout
*L
= (StructLayout
*)safe_malloc(
731 StructLayout::totalSizeToAlloc
<TypeSize
>(Ty
->getNumElements()));
733 // Set SL before calling StructLayout's ctor. The ctor could cause other
734 // entries to be added to TheMap, invalidating our reference.
737 new (L
) StructLayout(Ty
, *this);
742 Align
DataLayout::getPointerABIAlignment(unsigned AS
) const {
743 return getPointerAlignElem(AS
).ABIAlign
;
746 Align
DataLayout::getPointerPrefAlignment(unsigned AS
) const {
747 return getPointerAlignElem(AS
).PrefAlign
;
750 unsigned DataLayout::getPointerSize(unsigned AS
) const {
751 return divideCeil(getPointerAlignElem(AS
).TypeBitWidth
, 8);
754 unsigned DataLayout::getMaxIndexSize() const {
755 unsigned MaxIndexSize
= 0;
756 for (auto &P
: Pointers
)
758 std::max(MaxIndexSize
, (unsigned)divideCeil(P
.TypeBitWidth
, 8));
763 unsigned DataLayout::getPointerTypeSizeInBits(Type
*Ty
) const {
764 assert(Ty
->isPtrOrPtrVectorTy() &&
765 "This should only be called with a pointer or pointer vector type");
766 Ty
= Ty
->getScalarType();
767 return getPointerSizeInBits(cast
<PointerType
>(Ty
)->getAddressSpace());
770 unsigned DataLayout::getIndexSize(unsigned AS
) const {
771 return divideCeil(getPointerAlignElem(AS
).IndexBitWidth
, 8);
774 unsigned DataLayout::getIndexTypeSizeInBits(Type
*Ty
) const {
775 assert(Ty
->isPtrOrPtrVectorTy() &&
776 "This should only be called with a pointer or pointer vector type");
777 Ty
= Ty
->getScalarType();
778 return getIndexSizeInBits(cast
<PointerType
>(Ty
)->getAddressSpace());
782 \param abi_or_pref Flag that determines which alignment is returned. true
783 returns the ABI alignment, false returns the preferred alignment.
784 \param Ty The underlying type for which alignment is determined.
786 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
787 == false) for the requested type \a Ty.
789 Align
DataLayout::getAlignment(Type
*Ty
, bool abi_or_pref
) const {
790 assert(Ty
->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
791 switch (Ty
->getTypeID()) {
792 // Early escape for the non-numeric types.
793 case Type::LabelTyID
:
794 return abi_or_pref
? getPointerABIAlignment(0) : getPointerPrefAlignment(0);
795 case Type::PointerTyID
: {
796 unsigned AS
= cast
<PointerType
>(Ty
)->getAddressSpace();
797 return abi_or_pref
? getPointerABIAlignment(AS
)
798 : getPointerPrefAlignment(AS
);
800 case Type::ArrayTyID
:
801 return getAlignment(cast
<ArrayType
>(Ty
)->getElementType(), abi_or_pref
);
803 case Type::StructTyID
: {
804 // Packed structure types always have an ABI alignment of one.
805 if (cast
<StructType
>(Ty
)->isPacked() && abi_or_pref
)
808 // Get the layout annotation... which is lazily created on demand.
809 const StructLayout
*Layout
= getStructLayout(cast
<StructType
>(Ty
));
811 abi_or_pref
? StructAlignment
.ABIAlign
: StructAlignment
.PrefAlign
;
812 return std::max(Align
, Layout
->getAlignment());
814 case Type::IntegerTyID
:
815 return getIntegerAlignment(Ty
->getIntegerBitWidth(), abi_or_pref
);
817 case Type::BFloatTyID
:
818 case Type::FloatTyID
:
819 case Type::DoubleTyID
:
820 // PPC_FP128TyID and FP128TyID have different data contents, but the
821 // same size and alignment, so they look the same here.
822 case Type::PPC_FP128TyID
:
823 case Type::FP128TyID
:
824 case Type::X86_FP80TyID
: {
825 unsigned BitWidth
= getTypeSizeInBits(Ty
).getFixedValue();
826 auto I
= findAlignmentLowerBound(FloatAlignments
, BitWidth
);
827 if (I
!= FloatAlignments
.end() && I
->TypeBitWidth
== BitWidth
)
828 return abi_or_pref
? I
->ABIAlign
: I
->PrefAlign
;
830 // If we still couldn't find a reasonable default alignment, fall back
831 // to a simple heuristic that the alignment is the first power of two
832 // greater-or-equal to the store size of the type. This is a reasonable
833 // approximation of reality, and if the user wanted something less
834 // less conservative, they should have specified it explicitly in the data
836 return Align(PowerOf2Ceil(BitWidth
/ 8));
838 case Type::X86_MMXTyID
:
839 case Type::FixedVectorTyID
:
840 case Type::ScalableVectorTyID
: {
841 unsigned BitWidth
= getTypeSizeInBits(Ty
).getKnownMinValue();
842 auto I
= findAlignmentLowerBound(VectorAlignments
, BitWidth
);
843 if (I
!= VectorAlignments
.end() && I
->TypeBitWidth
== BitWidth
)
844 return abi_or_pref
? I
->ABIAlign
: I
->PrefAlign
;
846 // By default, use natural alignment for vector types. This is consistent
847 // with what clang and llvm-gcc do.
849 // We're only calculating a natural alignment, so it doesn't have to be
850 // based on the full size for scalable vectors. Using the minimum element
851 // count should be enough here.
852 return Align(PowerOf2Ceil(getTypeStoreSize(Ty
).getKnownMinValue()));
854 case Type::X86_AMXTyID
:
856 case Type::TargetExtTyID
: {
857 Type
*LayoutTy
= cast
<TargetExtType
>(Ty
)->getLayoutType();
858 return getAlignment(LayoutTy
, abi_or_pref
);
861 llvm_unreachable("Bad type for getAlignment!!!");
865 Align
DataLayout::getABITypeAlign(Type
*Ty
) const {
866 return getAlignment(Ty
, true);
869 /// TODO: Remove this function once the transition to Align is over.
870 uint64_t DataLayout::getPrefTypeAlignment(Type
*Ty
) const {
871 return getPrefTypeAlign(Ty
).value();
874 Align
DataLayout::getPrefTypeAlign(Type
*Ty
) const {
875 return getAlignment(Ty
, false);
878 IntegerType
*DataLayout::getIntPtrType(LLVMContext
&C
,
879 unsigned AddressSpace
) const {
880 return IntegerType::get(C
, getPointerSizeInBits(AddressSpace
));
883 Type
*DataLayout::getIntPtrType(Type
*Ty
) const {
884 assert(Ty
->isPtrOrPtrVectorTy() &&
885 "Expected a pointer or pointer vector type.");
886 unsigned NumBits
= getPointerTypeSizeInBits(Ty
);
887 IntegerType
*IntTy
= IntegerType::get(Ty
->getContext(), NumBits
);
888 if (VectorType
*VecTy
= dyn_cast
<VectorType
>(Ty
))
889 return VectorType::get(IntTy
, VecTy
);
893 Type
*DataLayout::getSmallestLegalIntType(LLVMContext
&C
, unsigned Width
) const {
894 for (unsigned LegalIntWidth
: LegalIntWidths
)
895 if (Width
<= LegalIntWidth
)
896 return Type::getIntNTy(C
, LegalIntWidth
);
900 unsigned DataLayout::getLargestLegalIntTypeSizeInBits() const {
901 auto Max
= llvm::max_element(LegalIntWidths
);
902 return Max
!= LegalIntWidths
.end() ? *Max
: 0;
905 IntegerType
*DataLayout::getIndexType(LLVMContext
&C
,
906 unsigned AddressSpace
) const {
907 return IntegerType::get(C
, getIndexSizeInBits(AddressSpace
));
910 Type
*DataLayout::getIndexType(Type
*Ty
) const {
911 assert(Ty
->isPtrOrPtrVectorTy() &&
912 "Expected a pointer or pointer vector type.");
913 unsigned NumBits
= getIndexTypeSizeInBits(Ty
);
914 IntegerType
*IntTy
= IntegerType::get(Ty
->getContext(), NumBits
);
915 if (VectorType
*VecTy
= dyn_cast
<VectorType
>(Ty
))
916 return VectorType::get(IntTy
, VecTy
);
920 int64_t DataLayout::getIndexedOffsetInType(Type
*ElemTy
,
921 ArrayRef
<Value
*> Indices
) const {
924 generic_gep_type_iterator
<Value
* const*>
925 GTI
= gep_type_begin(ElemTy
, Indices
),
926 GTE
= gep_type_end(ElemTy
, Indices
);
927 for (; GTI
!= GTE
; ++GTI
) {
928 Value
*Idx
= GTI
.getOperand();
929 if (StructType
*STy
= GTI
.getStructTypeOrNull()) {
930 assert(Idx
->getType()->isIntegerTy(32) && "Illegal struct idx");
931 unsigned FieldNo
= cast
<ConstantInt
>(Idx
)->getZExtValue();
933 // Get structure layout information...
934 const StructLayout
*Layout
= getStructLayout(STy
);
936 // Add in the offset, as calculated by the structure layout info...
937 Result
+= Layout
->getElementOffset(FieldNo
);
939 if (int64_t ArrayIdx
= cast
<ConstantInt
>(Idx
)->getSExtValue())
940 Result
+= ArrayIdx
* GTI
.getSequentialElementStride(*this);
947 static APInt
getElementIndex(TypeSize ElemSize
, APInt
&Offset
) {
948 // Skip over scalable or zero size elements. Also skip element sizes larger
949 // than the positive index space, because the arithmetic below may not be
950 // correct in that case.
951 unsigned BitWidth
= Offset
.getBitWidth();
952 if (ElemSize
.isScalable() || ElemSize
== 0 ||
953 !isUIntN(BitWidth
- 1, ElemSize
)) {
954 return APInt::getZero(BitWidth
);
957 APInt Index
= Offset
.sdiv(ElemSize
);
958 Offset
-= Index
* ElemSize
;
959 if (Offset
.isNegative()) {
960 // Prefer a positive remaining offset to allow struct indexing.
963 assert(Offset
.isNonNegative() && "Remaining offset shouldn't be negative");
968 std::optional
<APInt
> DataLayout::getGEPIndexForOffset(Type
*&ElemTy
,
969 APInt
&Offset
) const {
970 if (auto *ArrTy
= dyn_cast
<ArrayType
>(ElemTy
)) {
971 ElemTy
= ArrTy
->getElementType();
972 return getElementIndex(getTypeAllocSize(ElemTy
), Offset
);
975 if (isa
<VectorType
>(ElemTy
)) {
976 // Vector GEPs are partially broken (e.g. for overaligned element types),
977 // and may be forbidden in the future, so avoid generating GEPs into
978 // vectors. See https://discourse.llvm.org/t/67497
982 if (auto *STy
= dyn_cast
<StructType
>(ElemTy
)) {
983 const StructLayout
*SL
= getStructLayout(STy
);
984 uint64_t IntOffset
= Offset
.getZExtValue();
985 if (IntOffset
>= SL
->getSizeInBytes())
988 unsigned Index
= SL
->getElementContainingOffset(IntOffset
);
989 Offset
-= SL
->getElementOffset(Index
);
990 ElemTy
= STy
->getElementType(Index
);
991 return APInt(32, Index
);
994 // Non-aggregate type.
998 SmallVector
<APInt
> DataLayout::getGEPIndicesForOffset(Type
*&ElemTy
,
999 APInt
&Offset
) const {
1000 assert(ElemTy
->isSized() && "Element type must be sized");
1001 SmallVector
<APInt
> Indices
;
1002 Indices
.push_back(getElementIndex(getTypeAllocSize(ElemTy
), Offset
));
1003 while (Offset
!= 0) {
1004 std::optional
<APInt
> Index
= getGEPIndexForOffset(ElemTy
, Offset
);
1007 Indices
.push_back(*Index
);
1013 /// getPreferredAlign - Return the preferred alignment of the specified global.
1014 /// This includes an explicitly requested alignment (if the global has one).
1015 Align
DataLayout::getPreferredAlign(const GlobalVariable
*GV
) const {
1016 MaybeAlign GVAlignment
= GV
->getAlign();
1017 // If a section is specified, always precisely honor explicit alignment,
1018 // so we don't insert padding into a section we don't control.
1019 if (GVAlignment
&& GV
->hasSection())
1020 return *GVAlignment
;
1022 // If no explicit alignment is specified, compute the alignment based on
1023 // the IR type. If an alignment is specified, increase it to match the ABI
1024 // alignment of the IR type.
1026 // FIXME: Not sure it makes sense to use the alignment of the type if
1027 // there's already an explicit alignment specification.
1028 Type
*ElemType
= GV
->getValueType();
1029 Align Alignment
= getPrefTypeAlign(ElemType
);
1031 if (*GVAlignment
>= Alignment
)
1032 Alignment
= *GVAlignment
;
1034 Alignment
= std::max(*GVAlignment
, getABITypeAlign(ElemType
));
1037 // If no explicit alignment is specified, and the global is large, increase
1038 // the alignment to 16.
1039 // FIXME: Why 16, specifically?
1040 if (GV
->hasInitializer() && !GVAlignment
) {
1041 if (Alignment
< Align(16)) {
1042 // If the global is not external, see if it is large. If so, give it a
1043 // larger alignment.
1044 if (getTypeSizeInBits(ElemType
) > 128)
1045 Alignment
= Align(16); // 16-byte alignment.