LLVM 22.0.0git
DataLayout.cpp
Go to the documentation of this file.
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"
21#include "llvm/ADT/StringRef.h"
22#include "llvm/IR/Constants.h"
26#include "llvm/IR/Type.h"
27#include "llvm/IR/Value.h"
29#include "llvm/Support/Error.h"
35#include <algorithm>
36#include <cassert>
37#include <cstdint>
38#include <cstdlib>
39#include <new>
40#include <utility>
41
42using namespace llvm;
43
44//===----------------------------------------------------------------------===//
45// Support for StructLayout
46//===----------------------------------------------------------------------===//
47
48StructLayout::StructLayout(StructType *ST, const DataLayout &DL)
49 : StructSize(TypeSize::getFixed(0)) {
50 assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
51 IsPadded = false;
52 NumElements = ST->getNumElements();
53
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);
59
60 const Align TyAlign = ST->isPacked() ? Align(1) : DL.getABITypeAlign(Ty);
61
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)) {
70 IsPadded = true;
71 StructSize = TypeSize::getFixed(alignTo(StructSize, TyAlign));
72 }
73
74 // Keep track of maximum alignment constraint.
75 StructAlignment = std::max(TyAlign, StructAlignment);
76
77 getMemberOffsets()[i] = StructSize;
78 // Consume space for this data item
79 StructSize += DL.getTypeAllocSize(Ty);
80 }
81
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)) {
85 IsPadded = true;
86 StructSize = TypeSize::getFixed(alignTo(StructSize, StructAlignment));
87 }
88}
89
90/// getElementContainingOffset - Given a valid offset into the structure,
91/// return the structure index that contains it.
93 assert(!StructSize.isScalable() &&
94 "Cannot get element at offset for structure containing scalable "
95 "vector types");
96 TypeSize Offset = TypeSize::getFixed(FixedOffset);
97 ArrayRef<TypeSize> MemberOffsets = getMemberOffsets();
98
99 const auto *SI = llvm::upper_bound(MemberOffsets, Offset,
100 [](TypeSize LHS, TypeSize RHS) -> bool {
101 return TypeSize::isKnownLT(LHS, RHS);
102 });
103 assert(SI != MemberOffsets.begin() && "Offset not in structure type!");
104 --SI;
105 assert(TypeSize::isKnownLE(*SI, Offset) && "upper_bound didn't work");
106 assert(
107 (SI == MemberOffsets.begin() || TypeSize::isKnownLE(*(SI - 1), Offset)) &&
108 (SI + 1 == MemberOffsets.end() ||
109 TypeSize::isKnownGT(*(SI + 1), Offset)) &&
110 "Upper bound didn't work!");
111
112 // Multiple fields can have the same offset if any of them are zero sized.
113 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
114 // at the i32 element, because it is the last element at that offset. This is
115 // the right one to return, because anything after it will have a higher
116 // offset, implying that this element is non-empty.
117 return SI - MemberOffsets.begin();
118}
119
120namespace {
121
122class StructLayoutMap {
123 using LayoutInfoTy = DenseMap<StructType *, StructLayout *>;
124 LayoutInfoTy LayoutInfo;
125
126public:
127 ~StructLayoutMap() {
128 // Remove any layouts.
129 for (const auto &I : LayoutInfo) {
130 StructLayout *Value = I.second;
131 Value->~StructLayout();
132 free(Value);
133 }
134 }
135
136 StructLayout *&operator[](StructType *STy) { return LayoutInfo[STy]; }
137};
138
139} // end anonymous namespace
140
141//===----------------------------------------------------------------------===//
142// DataLayout Class Implementation
143//===----------------------------------------------------------------------===//
144
146 return BitWidth == Other.BitWidth && ABIAlign == Other.ABIAlign &&
147 PrefAlign == Other.PrefAlign;
148}
149
151 return AddrSpace == Other.AddrSpace && BitWidth == Other.BitWidth &&
152 ABIAlign == Other.ABIAlign && PrefAlign == Other.PrefAlign &&
153 IndexBitWidth == Other.IndexBitWidth &&
154 IsNonIntegral == Other.IsNonIntegral;
155}
156
157namespace {
158/// Predicate to sort primitive specs by bit width.
159struct LessPrimitiveBitWidth {
160 bool operator()(const DataLayout::PrimitiveSpec &LHS,
161 unsigned RHSBitWidth) const {
162 return LHS.BitWidth < RHSBitWidth;
163 }
164};
165
166/// Predicate to sort pointer specs by address space number.
167struct LessPointerAddrSpace {
168 bool operator()(const DataLayout::PointerSpec &LHS,
169 unsigned RHSAddrSpace) const {
170 return LHS.AddrSpace < RHSAddrSpace;
171 }
172};
173} // namespace
174
175// Default primitive type specifications.
176// NOTE: These arrays must be sorted by type bit width.
178 {8, Align::Constant<1>(), Align::Constant<1>()}, // i8:8:8
179 {16, Align::Constant<2>(), Align::Constant<2>()}, // i16:16:16
180 {32, Align::Constant<4>(), Align::Constant<4>()}, // i32:32:32
181 {64, Align::Constant<4>(), Align::Constant<8>()}, // i64:32:64
182};
184 {16, Align::Constant<2>(), Align::Constant<2>()}, // f16:16:16
185 {32, Align::Constant<4>(), Align::Constant<4>()}, // f32:32:32
186 {64, Align::Constant<8>(), Align::Constant<8>()}, // f64:64:64
187 {128, Align::Constant<16>(), Align::Constant<16>()}, // f128:128:128
188};
190 {64, Align::Constant<8>(), Align::Constant<8>()}, // v64:64:64
191 {128, Align::Constant<16>(), Align::Constant<16>()}, // v128:128:128
192};
193
194// Default pointer type specifications.
196 // p0:64:64:64:64
197 {0, 64, Align::Constant<8>(), Align::Constant<8>(), 64, false},
198};
199
201 : IntSpecs(ArrayRef(DefaultIntSpecs)),
202 FloatSpecs(ArrayRef(DefaultFloatSpecs)),
203 VectorSpecs(ArrayRef(DefaultVectorSpecs)),
204 PointerSpecs(ArrayRef(DefaultPointerSpecs)) {}
205
207 if (Error Err = parseLayoutString(LayoutString))
208 report_fatal_error(std::move(Err));
209}
210
212 delete static_cast<StructLayoutMap *>(LayoutMap);
213 LayoutMap = nullptr;
214 StringRepresentation = Other.StringRepresentation;
215 BigEndian = Other.BigEndian;
216 AllocaAddrSpace = Other.AllocaAddrSpace;
217 ProgramAddrSpace = Other.ProgramAddrSpace;
218 DefaultGlobalsAddrSpace = Other.DefaultGlobalsAddrSpace;
219 StackNaturalAlign = Other.StackNaturalAlign;
220 FunctionPtrAlign = Other.FunctionPtrAlign;
221 TheFunctionPtrAlignType = Other.TheFunctionPtrAlignType;
222 ManglingMode = Other.ManglingMode;
223 LegalIntWidths = Other.LegalIntWidths;
224 IntSpecs = Other.IntSpecs;
225 FloatSpecs = Other.FloatSpecs;
226 VectorSpecs = Other.VectorSpecs;
227 PointerSpecs = Other.PointerSpecs;
228 StructABIAlignment = Other.StructABIAlignment;
229 StructPrefAlignment = Other.StructPrefAlignment;
230 return *this;
231}
232
234 // NOTE: StringRepresentation might differ, it is not canonicalized.
235 return BigEndian == Other.BigEndian &&
236 AllocaAddrSpace == Other.AllocaAddrSpace &&
237 ProgramAddrSpace == Other.ProgramAddrSpace &&
238 DefaultGlobalsAddrSpace == Other.DefaultGlobalsAddrSpace &&
239 StackNaturalAlign == Other.StackNaturalAlign &&
240 FunctionPtrAlign == Other.FunctionPtrAlign &&
241 TheFunctionPtrAlignType == Other.TheFunctionPtrAlignType &&
242 ManglingMode == Other.ManglingMode &&
243 LegalIntWidths == Other.LegalIntWidths && IntSpecs == Other.IntSpecs &&
244 FloatSpecs == Other.FloatSpecs && VectorSpecs == Other.VectorSpecs &&
245 PointerSpecs == Other.PointerSpecs &&
246 StructABIAlignment == Other.StructABIAlignment &&
247 StructPrefAlignment == Other.StructPrefAlignment;
248}
249
251 DataLayout Layout;
252 if (Error Err = Layout.parseLayoutString(LayoutString))
253 return std::move(Err);
254 return Layout;
255}
256
258 return createStringError("malformed specification, must be of the form \"" +
259 Format + "\"");
260}
261
262/// Attempts to parse an address space component of a specification.
263static Error parseAddrSpace(StringRef Str, unsigned &AddrSpace) {
264 if (Str.empty())
265 return createStringError("address space component cannot be empty");
266
267 if (!to_integer(Str, AddrSpace, 10) || !isUInt<24>(AddrSpace))
268 return createStringError("address space must be a 24-bit integer");
269
270 return Error::success();
271}
272
273/// Attempts to parse a size component of a specification.
274static Error parseSize(StringRef Str, unsigned &BitWidth,
275 StringRef Name = "size") {
276 if (Str.empty())
277 return createStringError(Name + " component cannot be empty");
278
279 if (!to_integer(Str, BitWidth, 10) || BitWidth == 0 || !isUInt<24>(BitWidth))
280 return createStringError(Name + " must be a non-zero 24-bit integer");
281
282 return Error::success();
283}
284
285/// Attempts to parse an alignment component of a specification.
286///
287/// On success, returns the value converted to byte amount in \p Alignment.
288/// If the value is zero and \p AllowZero is true, \p Alignment is set to one.
289///
290/// Return an error in a number of cases:
291/// - \p Str is empty or contains characters other than decimal digits;
292/// - the value is zero and \p AllowZero is false;
293/// - the value is too large;
294/// - the value is not a multiple of the byte width;
295/// - the value converted to byte amount is not not a power of two.
296static Error parseAlignment(StringRef Str, Align &Alignment, StringRef Name,
297 bool AllowZero = false) {
298 if (Str.empty())
299 return createStringError(Name + " alignment component cannot be empty");
300
301 unsigned Value;
302 if (!to_integer(Str, Value, 10) || !isUInt<16>(Value))
303 return createStringError(Name + " alignment must be a 16-bit integer");
304
305 if (Value == 0) {
306 if (!AllowZero)
307 return createStringError(Name + " alignment must be non-zero");
308 Alignment = Align(1);
309 return Error::success();
310 }
311
312 constexpr unsigned ByteWidth = 8;
313 if (Value % ByteWidth || !isPowerOf2_32(Value / ByteWidth))
314 return createStringError(
315 Name + " alignment must be a power of two times the byte width");
316
317 Alignment = Align(Value / ByteWidth);
318 return Error::success();
319}
320
321Error DataLayout::parsePrimitiveSpec(StringRef Spec) {
322 // [ifv]<size>:<abi>[:<pref>]
323 SmallVector<StringRef, 3> Components;
324 char Specifier = Spec.front();
325 assert(Specifier == 'i' || Specifier == 'f' || Specifier == 'v');
326 Spec.drop_front().split(Components, ':');
327
328 if (Components.size() < 2 || Components.size() > 3)
329 return createSpecFormatError(Twine(Specifier) + "<size>:<abi>[:<pref>]");
330
331 // Size. Required, cannot be zero.
332 unsigned BitWidth;
333 if (Error Err = parseSize(Components[0], BitWidth))
334 return Err;
335
336 // ABI alignment.
337 Align ABIAlign;
338 if (Error Err = parseAlignment(Components[1], ABIAlign, "ABI"))
339 return Err;
340
341 if (Specifier == 'i' && BitWidth == 8 && ABIAlign != 1)
342 return createStringError("i8 must be 8-bit aligned");
343
344 // Preferred alignment. Optional, defaults to the ABI alignment.
345 Align PrefAlign = ABIAlign;
346 if (Components.size() > 2)
347 if (Error Err = parseAlignment(Components[2], PrefAlign, "preferred"))
348 return Err;
349
350 if (PrefAlign < ABIAlign)
351 return createStringError(
352 "preferred alignment cannot be less than the ABI alignment");
353
354 setPrimitiveSpec(Specifier, BitWidth, ABIAlign, PrefAlign);
355 return Error::success();
356}
357
358Error DataLayout::parseAggregateSpec(StringRef Spec) {
359 // a<size>:<abi>[:<pref>]
360 SmallVector<StringRef, 3> Components;
361 assert(Spec.front() == 'a');
362 Spec.drop_front().split(Components, ':');
363
364 if (Components.size() < 2 || Components.size() > 3)
365 return createSpecFormatError("a:<abi>[:<pref>]");
366
367 // According to LangRef, <size> component must be absent altogether.
368 // For backward compatibility, allow it to be specified, but require
369 // it to be zero.
370 if (!Components[0].empty()) {
371 unsigned BitWidth;
372 if (!to_integer(Components[0], BitWidth, 10) || BitWidth != 0)
373 return createStringError("size must be zero");
374 }
375
376 // ABI alignment. Required. Can be zero, meaning use one byte alignment.
377 Align ABIAlign;
378 if (Error Err =
379 parseAlignment(Components[1], ABIAlign, "ABI", /*AllowZero=*/true))
380 return Err;
381
382 // Preferred alignment. Optional, defaults to the ABI alignment.
383 Align PrefAlign = ABIAlign;
384 if (Components.size() > 2)
385 if (Error Err = parseAlignment(Components[2], PrefAlign, "preferred"))
386 return Err;
387
388 if (PrefAlign < ABIAlign)
389 return createStringError(
390 "preferred alignment cannot be less than the ABI alignment");
391
392 StructABIAlignment = ABIAlign;
393 StructPrefAlignment = PrefAlign;
394 return Error::success();
395}
396
397Error DataLayout::parsePointerSpec(StringRef Spec) {
398 // p[<n>]:<size>:<abi>[:<pref>[:<idx>]]
399 SmallVector<StringRef, 5> Components;
400 assert(Spec.front() == 'p');
401 Spec.drop_front().split(Components, ':');
402
403 if (Components.size() < 3 || Components.size() > 5)
404 return createSpecFormatError("p[<n>]:<size>:<abi>[:<pref>[:<idx>]]");
405
406 // Address space. Optional, defaults to 0.
407 unsigned AddrSpace = 0;
408 if (!Components[0].empty())
409 if (Error Err = parseAddrSpace(Components[0], AddrSpace))
410 return Err;
411
412 // Size. Required, cannot be zero.
413 unsigned BitWidth;
414 if (Error Err = parseSize(Components[1], BitWidth, "pointer size"))
415 return Err;
416
417 // ABI alignment. Required, cannot be zero.
418 Align ABIAlign;
419 if (Error Err = parseAlignment(Components[2], ABIAlign, "ABI"))
420 return Err;
421
422 // Preferred alignment. Optional, defaults to the ABI alignment.
423 // Cannot be zero.
424 Align PrefAlign = ABIAlign;
425 if (Components.size() > 3)
426 if (Error Err = parseAlignment(Components[3], PrefAlign, "preferred"))
427 return Err;
428
429 if (PrefAlign < ABIAlign)
430 return createStringError(
431 "preferred alignment cannot be less than the ABI alignment");
432
433 // Index size. Optional, defaults to pointer size. Cannot be zero.
434 unsigned IndexBitWidth = BitWidth;
435 if (Components.size() > 4)
436 if (Error Err = parseSize(Components[4], IndexBitWidth, "index size"))
437 return Err;
438
439 if (IndexBitWidth > BitWidth)
440 return createStringError(
441 "index size cannot be larger than the pointer size");
442
443 setPointerSpec(AddrSpace, BitWidth, ABIAlign, PrefAlign, IndexBitWidth,
444 false);
445 return Error::success();
446}
447
448Error DataLayout::parseSpecification(
449 StringRef Spec, SmallVectorImpl<unsigned> &NonIntegralAddressSpaces) {
450 // The "ni" specifier is the only two-character specifier. Handle it first.
451 if (Spec.starts_with("ni")) {
452 // ni:<address space>[:<address space>]...
453 StringRef Rest = Spec.drop_front(2);
454
455 // Drop the first ':', then split the rest of the string the usual way.
456 if (!Rest.consume_front(":"))
457 return createSpecFormatError("ni:<address space>[:<address space>]...");
458
459 for (StringRef Str : split(Rest, ':')) {
460 unsigned AddrSpace;
461 if (Error Err = parseAddrSpace(Str, AddrSpace))
462 return Err;
463 if (AddrSpace == 0)
464 return createStringError("address space 0 cannot be non-integral");
465 NonIntegralAddressSpaces.push_back(AddrSpace);
466 }
467 return Error::success();
468 }
469
470 // The rest of the specifiers are single-character.
471 assert(!Spec.empty() && "Empty specification is handled by the caller");
472 char Specifier = Spec.front();
473
474 if (Specifier == 'i' || Specifier == 'f' || Specifier == 'v')
475 return parsePrimitiveSpec(Spec);
476
477 if (Specifier == 'a')
478 return parseAggregateSpec(Spec);
479
480 if (Specifier == 'p')
481 return parsePointerSpec(Spec);
482
483 StringRef Rest = Spec.drop_front();
484 switch (Specifier) {
485 case 's':
486 // Deprecated, but ignoring here to preserve loading older textual llvm
487 // ASM file
488 break;
489 case 'e':
490 case 'E':
491 if (!Rest.empty())
492 return createStringError(
493 "malformed specification, must be just 'e' or 'E'");
494 BigEndian = Specifier == 'E';
495 break;
496 case 'n': // Native integer types.
497 // n<size>[:<size>]...
498 for (StringRef Str : split(Rest, ':')) {
499 unsigned BitWidth;
500 if (Error Err = parseSize(Str, BitWidth))
501 return Err;
502 LegalIntWidths.push_back(BitWidth);
503 }
504 break;
505 case 'S': { // Stack natural alignment.
506 // S<size>
507 if (Rest.empty())
508 return createSpecFormatError("S<size>");
509 Align Alignment;
510 if (Error Err = parseAlignment(Rest, Alignment, "stack natural"))
511 return Err;
512 StackNaturalAlign = Alignment;
513 break;
514 }
515 case 'F': {
516 // F<type><abi>
517 if (Rest.empty())
518 return createSpecFormatError("F<type><abi>");
519 char Type = Rest.front();
520 Rest = Rest.drop_front();
521 switch (Type) {
522 case 'i':
523 TheFunctionPtrAlignType = FunctionPtrAlignType::Independent;
524 break;
525 case 'n':
526 TheFunctionPtrAlignType = FunctionPtrAlignType::MultipleOfFunctionAlign;
527 break;
528 default:
529 return createStringError("unknown function pointer alignment type '" +
530 Twine(Type) + "'");
531 }
532 Align Alignment;
533 if (Error Err = parseAlignment(Rest, Alignment, "ABI"))
534 return Err;
535 FunctionPtrAlign = Alignment;
536 break;
537 }
538 case 'P': { // Function address space.
539 if (Rest.empty())
540 return createSpecFormatError("P<address space>");
541 if (Error Err = parseAddrSpace(Rest, ProgramAddrSpace))
542 return Err;
543 break;
544 }
545 case 'A': { // Default stack/alloca address space.
546 if (Rest.empty())
547 return createSpecFormatError("A<address space>");
548 if (Error Err = parseAddrSpace(Rest, AllocaAddrSpace))
549 return Err;
550 break;
551 }
552 case 'G': { // Default address space for global variables.
553 if (Rest.empty())
554 return createSpecFormatError("G<address space>");
555 if (Error Err = parseAddrSpace(Rest, DefaultGlobalsAddrSpace))
556 return Err;
557 break;
558 }
559 case 'm':
560 if (!Rest.consume_front(":") || Rest.empty())
561 return createSpecFormatError("m:<mangling>");
562 if (Rest.size() > 1)
563 return createStringError("unknown mangling mode");
564 switch (Rest[0]) {
565 default:
566 return createStringError("unknown mangling mode");
567 case 'e':
568 ManglingMode = MM_ELF;
569 break;
570 case 'l':
571 ManglingMode = MM_GOFF;
572 break;
573 case 'o':
574 ManglingMode = MM_MachO;
575 break;
576 case 'm':
577 ManglingMode = MM_Mips;
578 break;
579 case 'w':
580 ManglingMode = MM_WinCOFF;
581 break;
582 case 'x':
583 ManglingMode = MM_WinCOFFX86;
584 break;
585 case 'a':
586 ManglingMode = MM_XCOFF;
587 break;
588 }
589 break;
590 default:
591 return createStringError("unknown specifier '" + Twine(Specifier) + "'");
592 }
593
594 return Error::success();
595}
596
597Error DataLayout::parseLayoutString(StringRef LayoutString) {
598 StringRepresentation = std::string(LayoutString);
599
600 if (LayoutString.empty())
601 return Error::success();
602
603 // Split the data layout string into specifications separated by '-' and
604 // parse each specification individually, updating internal data structures.
605 SmallVector<unsigned, 8> NonIntegralAddressSpaces;
606 for (StringRef Spec : split(LayoutString, '-')) {
607 if (Spec.empty())
608 return createStringError("empty specification is not allowed");
609 if (Error Err = parseSpecification(Spec, NonIntegralAddressSpaces))
610 return Err;
611 }
612 // Mark all address spaces that were qualified as non-integral now. This has
613 // to be done later since the non-integral property is not part of the data
614 // layout pointer specification.
615 for (unsigned AS : NonIntegralAddressSpaces) {
616 // If there is no special spec for a given AS, getPointerSpec(AS) returns
617 // the spec for AS0, and we then update that to mark it non-integral.
618 const PointerSpec &PS = getPointerSpec(AS);
619 setPointerSpec(AS, PS.BitWidth, PS.ABIAlign, PS.PrefAlign, PS.IndexBitWidth,
620 true);
621 }
622
623 return Error::success();
624}
625
626void DataLayout::setPrimitiveSpec(char Specifier, uint32_t BitWidth,
627 Align ABIAlign, Align PrefAlign) {
628 SmallVectorImpl<PrimitiveSpec> *Specs;
629 switch (Specifier) {
630 default:
631 llvm_unreachable("Unexpected specifier");
632 case 'i':
633 Specs = &IntSpecs;
634 break;
635 case 'f':
636 Specs = &FloatSpecs;
637 break;
638 case 'v':
639 Specs = &VectorSpecs;
640 break;
641 }
642
643 auto I = lower_bound(*Specs, BitWidth, LessPrimitiveBitWidth());
644 if (I != Specs->end() && I->BitWidth == BitWidth) {
645 // Update the abi, preferred alignments.
646 I->ABIAlign = ABIAlign;
647 I->PrefAlign = PrefAlign;
648 } else {
649 // Insert before I to keep the vector sorted.
650 Specs->insert(I, PrimitiveSpec{BitWidth, ABIAlign, PrefAlign});
651 }
652}
653
655DataLayout::getPointerSpec(uint32_t AddrSpace) const {
656 if (AddrSpace != 0) {
657 auto I = lower_bound(PointerSpecs, AddrSpace, LessPointerAddrSpace());
658 if (I != PointerSpecs.end() && I->AddrSpace == AddrSpace)
659 return *I;
660 }
661
662 assert(PointerSpecs[0].AddrSpace == 0);
663 return PointerSpecs[0];
664}
665
666void DataLayout::setPointerSpec(uint32_t AddrSpace, uint32_t BitWidth,
667 Align ABIAlign, Align PrefAlign,
668 uint32_t IndexBitWidth, bool IsNonIntegral) {
669 auto I = lower_bound(PointerSpecs, AddrSpace, LessPointerAddrSpace());
670 if (I == PointerSpecs.end() || I->AddrSpace != AddrSpace) {
671 PointerSpecs.insert(I, PointerSpec{AddrSpace, BitWidth, ABIAlign, PrefAlign,
672 IndexBitWidth, IsNonIntegral});
673 } else {
674 I->BitWidth = BitWidth;
675 I->ABIAlign = ABIAlign;
676 I->PrefAlign = PrefAlign;
677 I->IndexBitWidth = IndexBitWidth;
678 I->IsNonIntegral = IsNonIntegral;
679 }
680}
681
682Align DataLayout::getIntegerAlignment(uint32_t BitWidth,
683 bool abi_or_pref) const {
684 auto I = IntSpecs.begin();
685 for (; I != IntSpecs.end(); ++I) {
686 if (I->BitWidth >= BitWidth)
687 break;
688 }
689
690 // If we don't have an exact match, use alignment of next larger integer
691 // type. If there is none, use alignment of largest integer type by going
692 // back one element.
693 if (I == IntSpecs.end())
694 --I;
695 return abi_or_pref ? I->ABIAlign : I->PrefAlign;
696}
697
698DataLayout::~DataLayout() { delete static_cast<StructLayoutMap *>(LayoutMap); }
699
701 if (!LayoutMap)
702 LayoutMap = new StructLayoutMap();
703
704 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
705 StructLayout *&SL = (*STM)[Ty];
706 if (SL) return SL;
707
708 // Otherwise, create the struct layout. Because it is variable length, we
709 // malloc it, then use placement new.
711 StructLayout::totalSizeToAlloc<TypeSize>(Ty->getNumElements()));
712
713 // Set SL before calling StructLayout's ctor. The ctor could cause other
714 // entries to be added to TheMap, invalidating our reference.
715 SL = L;
716
717 new (L) StructLayout(Ty, *this);
718
719 return L;
720}
721
723 return getPointerSpec(AS).ABIAlign;
724}
725
727 return getPointerSpec(AS).PrefAlign;
728}
729
730unsigned DataLayout::getPointerSize(unsigned AS) const {
731 return divideCeil(getPointerSpec(AS).BitWidth, 8);
732}
733
735 assert(Ty->isPtrOrPtrVectorTy() &&
736 "This should only be called with a pointer or pointer vector type");
737 Ty = Ty->getScalarType();
739}
740
741unsigned DataLayout::getIndexSize(unsigned AS) const {
742 return divideCeil(getPointerSpec(AS).IndexBitWidth, 8);
743}
744
746 assert(Ty->isPtrOrPtrVectorTy() &&
747 "This should only be called with a pointer or pointer vector type");
748 Ty = Ty->getScalarType();
750}
751
752/*!
753 \param abi_or_pref Flag that determines which alignment is returned. true
754 returns the ABI alignment, false returns the preferred alignment.
755 \param Ty The underlying type for which alignment is determined.
756
757 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
758 == false) for the requested type \a Ty.
759 */
760Align DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
761 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
762 switch (Ty->getTypeID()) {
763 // Early escape for the non-numeric types.
764 case Type::LabelTyID:
765 return abi_or_pref ? getPointerABIAlignment(0) : getPointerPrefAlignment(0);
766 case Type::PointerTyID: {
767 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
768 return abi_or_pref ? getPointerABIAlignment(AS)
770 }
771 case Type::ArrayTyID:
772 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
773
774 case Type::StructTyID: {
775 // Packed structure types always have an ABI alignment of one.
776 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
777 return Align(1);
778
779 // Get the layout annotation... which is lazily created on demand.
780 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
781 const Align Align = abi_or_pref ? StructABIAlignment : StructPrefAlignment;
782 return std::max(Align, Layout->getAlignment());
783 }
785 return getIntegerAlignment(Ty->getIntegerBitWidth(), abi_or_pref);
786 case Type::HalfTyID:
787 case Type::BFloatTyID:
788 case Type::FloatTyID:
789 case Type::DoubleTyID:
790 // PPC_FP128TyID and FP128TyID have different data contents, but the
791 // same size and alignment, so they look the same here.
793 case Type::FP128TyID:
794 case Type::X86_FP80TyID: {
796 auto I = lower_bound(FloatSpecs, BitWidth, LessPrimitiveBitWidth());
797 if (I != FloatSpecs.end() && I->BitWidth == BitWidth)
798 return abi_or_pref ? I->ABIAlign : I->PrefAlign;
799
800 // If we still couldn't find a reasonable default alignment, fall back
801 // to a simple heuristic that the alignment is the first power of two
802 // greater-or-equal to the store size of the type. This is a reasonable
803 // approximation of reality, and if the user wanted something less
804 // less conservative, they should have specified it explicitly in the data
805 // layout.
806 return Align(PowerOf2Ceil(BitWidth / 8));
807 }
811 auto I = lower_bound(VectorSpecs, BitWidth, LessPrimitiveBitWidth());
812 if (I != VectorSpecs.end() && I->BitWidth == BitWidth)
813 return abi_or_pref ? I->ABIAlign : I->PrefAlign;
814
815 // By default, use natural alignment for vector types. This is consistent
816 // with what clang and llvm-gcc do.
817 //
818 // We're only calculating a natural alignment, so it doesn't have to be
819 // based on the full size for scalable vectors. Using the minimum element
820 // count should be enough here.
821 return Align(PowerOf2Ceil(getTypeStoreSize(Ty).getKnownMinValue()));
822 }
824 return Align(64);
825 case Type::TargetExtTyID: {
826 Type *LayoutTy = cast<TargetExtType>(Ty)->getLayoutType();
827 return getAlignment(LayoutTy, abi_or_pref);
828 }
829 default:
830 llvm_unreachable("Bad type for getAlignment!!!");
831 }
832}
833
835 switch (Ty->getTypeID()) {
836 case Type::ArrayTyID: {
837 // The alignment of the array is the alignment of the element, so there
838 // is no need for further adjustment.
839 auto *ATy = cast<ArrayType>(Ty);
840 return ATy->getNumElements() * getTypeAllocSize(ATy->getElementType());
841 }
842 case Type::StructTyID: {
843 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
844 TypeSize Size = Layout->getSizeInBytes();
845
846 if (cast<StructType>(Ty)->isPacked())
847 return Size;
848
849 Align A = std::max(StructABIAlignment, Layout->getAlignment());
850 return alignTo(Size, A.value());
851 }
852 case Type::IntegerTyID: {
853 unsigned BitWidth = Ty->getIntegerBitWidth();
855 Align A = getIntegerAlignment(BitWidth, /*ABI=*/true);
856 return alignTo(Size, A.value());
857 }
858 case Type::PointerTyID: {
859 unsigned AS = Ty->getPointerAddressSpace();
861 return alignTo(Size, getPointerABIAlignment(AS).value());
862 }
863 case Type::TargetExtTyID: {
864 Type *LayoutTy = cast<TargetExtType>(Ty)->getLayoutType();
865 return getTypeAllocSize(LayoutTy);
866 }
867 default:
868 return alignTo(getTypeStoreSize(Ty), getABITypeAlign(Ty).value());
869 }
870}
871
873 return getAlignment(Ty, true);
874}
875
877 return getAlignment(Ty, false);
878}
879
884
886 assert(Ty->isPtrOrPtrVectorTy() &&
887 "Expected a pointer or pointer vector type.");
888 unsigned NumBits = getPointerTypeSizeInBits(Ty);
889 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
890 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
891 return VectorType::get(IntTy, VecTy);
892 return IntTy;
893}
894
896 for (unsigned LegalIntWidth : LegalIntWidths)
897 if (Width <= LegalIntWidth)
898 return Type::getIntNTy(C, LegalIntWidth);
899 return nullptr;
900}
901
903 auto Max = llvm::max_element(LegalIntWidths);
904 return Max != LegalIntWidths.end() ? *Max : 0;
905}
906
911
913 assert(Ty->isPtrOrPtrVectorTy() &&
914 "Expected a pointer or pointer vector type.");
915 unsigned NumBits = getIndexTypeSizeInBits(Ty);
916 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
917 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
918 return VectorType::get(IntTy, VecTy);
919 return IntTy;
920}
921
923 ArrayRef<Value *> Indices) const {
924 int64_t Result = 0;
925
927 GTI = gep_type_begin(ElemTy, Indices),
928 GTE = gep_type_end(ElemTy, Indices);
929 for (; GTI != GTE; ++GTI) {
930 Value *Idx = GTI.getOperand();
931 if (StructType *STy = GTI.getStructTypeOrNull()) {
932 assert(Idx->getType()->isIntegerTy(32) && "Illegal struct idx");
933 unsigned FieldNo = cast<ConstantInt>(Idx)->getZExtValue();
934
935 // Get structure layout information...
936 const StructLayout *Layout = getStructLayout(STy);
937
938 // Add in the offset, as calculated by the structure layout info...
939 Result += Layout->getElementOffset(FieldNo);
940 } else {
941 if (int64_t ArrayIdx = cast<ConstantInt>(Idx)->getSExtValue())
942 Result += ArrayIdx * GTI.getSequentialElementStride(*this);
943 }
944 }
945
946 return Result;
947}
948
950 // Skip over scalable or zero size elements. Also skip element sizes larger
951 // than the positive index space, because the arithmetic below may not be
952 // correct in that case.
953 unsigned BitWidth = Offset.getBitWidth();
954 if (ElemSize.isScalable() || ElemSize == 0 ||
955 !isUIntN(BitWidth - 1, ElemSize)) {
956 return APInt::getZero(BitWidth);
957 }
958
959 uint64_t FixedElemSize = ElemSize.getFixedValue();
960 APInt Index = Offset.sdiv(FixedElemSize);
961 Offset -= Index * FixedElemSize;
962 if (Offset.isNegative()) {
963 // Prefer a positive remaining offset to allow struct indexing.
964 --Index;
965 Offset += FixedElemSize;
966 assert(Offset.isNonNegative() && "Remaining offset shouldn't be negative");
967 }
968 return Index;
969}
970
971std::optional<APInt> DataLayout::getGEPIndexForOffset(Type *&ElemTy,
972 APInt &Offset) const {
973 if (auto *ArrTy = dyn_cast<ArrayType>(ElemTy)) {
974 ElemTy = ArrTy->getElementType();
975 return getElementIndex(getTypeAllocSize(ElemTy), Offset);
976 }
977
978 if (isa<VectorType>(ElemTy)) {
979 // Vector GEPs are partially broken (e.g. for overaligned element types),
980 // and may be forbidden in the future, so avoid generating GEPs into
981 // vectors. See https://discourse.llvm.org/t/67497
982 return std::nullopt;
983 }
984
985 if (auto *STy = dyn_cast<StructType>(ElemTy)) {
986 const StructLayout *SL = getStructLayout(STy);
987 uint64_t IntOffset = Offset.getZExtValue();
988 if (IntOffset >= SL->getSizeInBytes())
989 return std::nullopt;
990
991 unsigned Index = SL->getElementContainingOffset(IntOffset);
992 Offset -= SL->getElementOffset(Index);
993 ElemTy = STy->getElementType(Index);
994 return APInt(32, Index);
995 }
996
997 // Non-aggregate type.
998 return std::nullopt;
999}
1000
1002 APInt &Offset) const {
1003 assert(ElemTy->isSized() && "Element type must be sized");
1004 SmallVector<APInt> Indices;
1006 while (Offset != 0) {
1007 std::optional<APInt> Index = getGEPIndexForOffset(ElemTy, Offset);
1008 if (!Index)
1009 break;
1010 Indices.push_back(*Index);
1011 }
1012
1013 return Indices;
1014}
1015
1016/// getPreferredAlign - Return the preferred alignment of the specified global.
1017/// This includes an explicitly requested alignment (if the global has one).
1019 MaybeAlign GVAlignment = GV->getAlign();
1020 // If a section is specified, always precisely honor explicit alignment,
1021 // so we don't insert padding into a section we don't control.
1022 if (GVAlignment && GV->hasSection())
1023 return *GVAlignment;
1024
1025 // If no explicit alignment is specified, compute the alignment based on
1026 // the IR type. If an alignment is specified, increase it to match the ABI
1027 // alignment of the IR type.
1028 //
1029 // FIXME: Not sure it makes sense to use the alignment of the type if
1030 // there's already an explicit alignment specification.
1031 Type *ElemType = GV->getValueType();
1032 Align Alignment = getPrefTypeAlign(ElemType);
1033 if (GVAlignment) {
1034 if (*GVAlignment >= Alignment)
1035 Alignment = *GVAlignment;
1036 else
1037 Alignment = std::max(*GVAlignment, getABITypeAlign(ElemType));
1038 }
1039
1040 // If no explicit alignment is specified, and the global is large, increase
1041 // the alignment to 16.
1042 // FIXME: Why 16, specifically?
1043 if (GV->hasInitializer() && !GVAlignment) {
1044 if (Alignment < Align(16)) {
1045 // If the global is not external, see if it is large. If so, give it a
1046 // larger alignment.
1047 if (getTypeSizeInBits(ElemType) > 128)
1048 Alignment = Align(16); // 16-byte alignment.
1049 }
1050 }
1051 return Alignment;
1052}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static Error parseSize(StringRef Str, unsigned &BitWidth, StringRef Name="size")
Attempts to parse a size component of a specification.
static APInt getElementIndex(TypeSize ElemSize, APInt &Offset)
static Error parseAddrSpace(StringRef Str, unsigned &AddrSpace)
Attempts to parse an address space component of a specification.
static Error createSpecFormatError(Twine Format)
static Error parseAlignment(StringRef Str, Align &Alignment, StringRef Name, bool AllowZero=false)
Attempts to parse an alignment component of a specification.
constexpr DataLayout::PrimitiveSpec DefaultFloatSpecs[]
constexpr DataLayout::PrimitiveSpec DefaultVectorSpecs[]
constexpr DataLayout::PointerSpec DefaultPointerSpecs[]
constexpr DataLayout::PrimitiveSpec DefaultIntSpecs[]
This file defines the DenseMap class.
#define I(x, y, z)
Definition MD5.cpp:58
This file defines counterparts of C library allocation functions defined in the namespace 'std'.
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
This file contains some functions that are useful when dealing with strings.
static uint32_t getAlignment(const MCSectionCOFF &Sec)
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:200
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
iterator end() const
Definition ArrayRef.h:136
iterator begin() const
Definition ArrayRef.h:135
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
unsigned getPointerSizeInBits(unsigned AS=0) const
The size in bits of the pointer representation in a given address space.
Definition DataLayout.h:388
@ MultipleOfFunctionAlign
The function pointer alignment is a multiple of the function alignment.
Definition DataLayout.h:93
@ Independent
The function pointer alignment is independent of the function alignment.
Definition DataLayout.h:91
LLVM_ABI SmallVector< APInt > getGEPIndicesForOffset(Type *&ElemTy, APInt &Offset) const
Get GEP indices to access Offset inside ElemTy.
LLVM_ABI unsigned getLargestLegalIntTypeSizeInBits() const
Returns the size of largest legal integer type size, or 0 if none are set.
LLVM_ABI unsigned getIndexSize(unsigned AS) const
The index size in bytes used for address calculation, rounded up to a whole number of bytes.
LLVM_ABI const StructLayout * getStructLayout(StructType *Ty) const
Returns a StructLayout object, indicating the alignment of the struct, its size, and the offsets of i...
LLVM_ABI DataLayout()
Constructs a DataLayout with default values.
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI unsigned getIndexTypeSizeInBits(Type *Ty) const
The size in bits of the index used in GEP calculation for this type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
LLVM_ABI DataLayout & operator=(const DataLayout &Other)
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
LLVM_ABI std::optional< APInt > getGEPIndexForOffset(Type *&ElemTy, APInt &Offset) const
Get single GEP index to access Offset inside ElemTy.
LLVM_ABI Type * getSmallestLegalIntType(LLVMContext &C, unsigned Width=0) const
Returns the smallest integer type with size at least as big as Width bits.
LLVM_ABI Align getPreferredAlign(const GlobalVariable *GV) const
Returns the preferred alignment of the specified global.
LLVM_ABI ~DataLayout()
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
LLVM_ABI Align getPointerPrefAlignment(unsigned AS=0) const
Return target's alignment for stack-based pointers FIXME: The defaults need to be removed once all of...
unsigned getIndexSizeInBits(unsigned AS) const
The size in bits of indices used for address calculation in getelementptr and for addresses in the gi...
Definition DataLayout.h:396
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Definition DataLayout.h:669
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition DataLayout.h:466
LLVM_ABI bool operator==(const DataLayout &Other) const
LLVM_ABI int64_t getIndexedOffsetInType(Type *ElemTy, ArrayRef< Value * > Indices) const
Returns the offset from the beginning of the type for the specified indices.
LLVM_ABI Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
bool hasSection() const
Check if this global has a custom object file section.
Type * getValueType() const
bool hasInitializer() const
Definitions have initializers, declarations don't.
MaybeAlign getAlign() const
Returns the alignment of the given variable.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:319
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:710
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:269
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:151
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
Definition StringRef.h:619
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:154
char front() const
front - Get the first character in the string.
Definition StringRef.h:157
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition StringRef.h:645
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:621
TypeSize getSizeInBytes() const
Definition DataLayout.h:630
MutableArrayRef< TypeSize > getMemberOffsets()
Definition DataLayout.h:644
LLVM_ABI unsigned getElementContainingOffset(uint64_t FixedOffset) const
Given a valid byte offset into the structure, returns the structure index that contains it.
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:652
Align getAlignment() const
Definition DataLayout.h:634
Class to represent struct types.
static constexpr std::enable_if_t< std::is_same_v< Foo< TrailingTys... >, Foo< Tys... > >, size_t > totalSizeToAlloc(typename trailing_objects_internal::ExtractSecondType< TrailingTys, size_t >::type... Counts)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
static constexpr TypeSize getScalable(ScalarTy MinimumSize)
Definition TypeSize.h:346
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI unsigned getIntegerBitWidth() const
@ X86_AMXTyID
AMX vectors (8192 bits, X86 specific)
Definition Type.h:66
@ ArrayTyID
Arrays.
Definition Type.h:74
@ HalfTyID
16-bit floating point type
Definition Type.h:56
@ TargetExtTyID
Target extension type.
Definition Type.h:78
@ ScalableVectorTyID
Scalable SIMD vector type.
Definition Type.h:76
@ LabelTyID
Labels.
Definition Type.h:64
@ FloatTyID
32-bit floating point type
Definition Type.h:58
@ StructTyID
Structures.
Definition Type.h:73
@ IntegerTyID
Arbitrary bit width integers.
Definition Type.h:70
@ FixedVectorTyID
Fixed width SIMD vector type.
Definition Type.h:75
@ BFloatTyID
16-bit floating point type (7-bit significand)
Definition Type.h:57
@ DoubleTyID
64-bit floating point type
Definition Type.h:59
@ X86_FP80TyID
80-bit floating point type (X87)
Definition Type.h:60
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
Definition Type.h:62
@ PointerTyID
Pointers.
Definition Type.h:72
@ FP128TyID
128-bit floating point type (112-bit significand)
Definition Type.h:61
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:301
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
Base class of all SIMD vector types.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:216
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:169
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:166
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:223
TypeSize getSequentialElementStride(const DataLayout &DL) const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
constexpr double e
Definition MathExtras.h:47
bool empty() const
Definition BasicBlock.h:101
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
bool isAligned(Align Lhs, uint64_t SizeInBytes)
Checks that SizeInBytes is a multiple of the alignment.
Definition Alignment.h:145
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:252
gep_type_iterator gep_type_end(const User *GEP)
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:1989
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition Error.h:1305
uint64_t PowerOf2Ceil(uint64_t A)
Returns the power of two which is greater than or equal to the given value.
Definition MathExtras.h:396
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:288
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:198
LLVM_ATTRIBUTE_RETURNS_NONNULL void * safe_malloc(size_t Sz)
Definition MemAlloc.h:25
iterator_range< SplittingIterator > split(StringRef Str, StringRef Separator)
Split the specified string over a separator and return a range-compatible iterable over its partition...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:548
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:405
@ Other
Any other memory.
Definition ModRef.h:68
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:1976
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:155
auto max_element(R &&Range)
Provide wrappers to std::max_element which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:2012
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
gep_type_iterator gep_type_begin(const User *GEP)
bool to_integer(StringRef S, N &Num, unsigned Base=0)
Convert the string S to an integer of the specified type using the radix Base. If Base is 0,...
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
static constexpr Align Constant()
Allow constructions of constexpr Align.
Definition Alignment.h:96
Pointer type specification.
Definition DataLayout.h:75
LLVM_ABI bool operator==(const PointerSpec &Other) const
bool IsNonIntegral
Pointers in this address space don't have a well-defined bitwise representation (e....
Definition DataLayout.h:85
Primitive type specification.
Definition DataLayout.h:66
LLVM_ABI bool operator==(const PrimitiveSpec &Other) const
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:117