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 HasUnstableRepresentation == Other.HasUnstableRepresentation &&
155 HasExternalState == Other.HasExternalState &&
156 AddrSpaceName == Other.AddrSpaceName;
157}
158
159namespace {
160/// Predicate to sort primitive specs by bit width.
161struct LessPrimitiveBitWidth {
162 bool operator()(const DataLayout::PrimitiveSpec &LHS,
163 unsigned RHSBitWidth) const {
164 return LHS.BitWidth < RHSBitWidth;
165 }
166};
167
168/// Predicate to sort pointer specs by address space number.
169struct LessPointerAddrSpace {
170 bool operator()(const DataLayout::PointerSpec &LHS,
171 unsigned RHSAddrSpace) const {
172 return LHS.AddrSpace < RHSAddrSpace;
173 }
174};
175} // namespace
176
177// Default primitive type specifications.
178// NOTE: These arrays must be sorted by type bit width.
180 {8, Align::Constant<1>(), Align::Constant<1>()}, // i8:8:8
181 {16, Align::Constant<2>(), Align::Constant<2>()}, // i16:16:16
182 {32, Align::Constant<4>(), Align::Constant<4>()}, // i32:32:32
183 {64, Align::Constant<4>(), Align::Constant<8>()}, // i64:32:64
184};
186 {16, Align::Constant<2>(), Align::Constant<2>()}, // f16:16:16
187 {32, Align::Constant<4>(), Align::Constant<4>()}, // f32:32:32
188 {64, Align::Constant<8>(), Align::Constant<8>()}, // f64:64:64
189 {128, Align::Constant<16>(), Align::Constant<16>()}, // f128:128:128
190};
192 {64, Align::Constant<8>(), Align::Constant<8>()}, // v64:64:64
193 {128, Align::Constant<16>(), Align::Constant<16>()}, // v128:128:128
194};
195
197 : IntSpecs(ArrayRef(DefaultIntSpecs)),
198 FloatSpecs(ArrayRef(DefaultFloatSpecs)),
199 VectorSpecs(ArrayRef(DefaultVectorSpecs)) {
200 // Default pointer type specifications.
201 setPointerSpec(0, 64, Align::Constant<8>(), Align::Constant<8>(), 64, false,
202 false, "");
203}
204
206 if (Error Err = parseLayoutString(LayoutString))
207 report_fatal_error(std::move(Err));
208}
209
211 delete static_cast<StructLayoutMap *>(LayoutMap);
212 LayoutMap = nullptr;
213 StringRepresentation = Other.StringRepresentation;
214 BigEndian = Other.BigEndian;
215 AllocaAddrSpace = Other.AllocaAddrSpace;
216 ProgramAddrSpace = Other.ProgramAddrSpace;
217 DefaultGlobalsAddrSpace = Other.DefaultGlobalsAddrSpace;
218 StackNaturalAlign = Other.StackNaturalAlign;
219 FunctionPtrAlign = Other.FunctionPtrAlign;
220 TheFunctionPtrAlignType = Other.TheFunctionPtrAlignType;
221 ManglingMode = Other.ManglingMode;
222 LegalIntWidths = Other.LegalIntWidths;
223 IntSpecs = Other.IntSpecs;
224 FloatSpecs = Other.FloatSpecs;
225 VectorSpecs = Other.VectorSpecs;
226 PointerSpecs = Other.PointerSpecs;
227 StructABIAlignment = Other.StructABIAlignment;
228 StructPrefAlignment = Other.StructPrefAlignment;
229 return *this;
230}
231
233 // NOTE: StringRepresentation might differ, it is not canonicalized.
234 return BigEndian == Other.BigEndian &&
235 AllocaAddrSpace == Other.AllocaAddrSpace &&
236 ProgramAddrSpace == Other.ProgramAddrSpace &&
237 DefaultGlobalsAddrSpace == Other.DefaultGlobalsAddrSpace &&
238 StackNaturalAlign == Other.StackNaturalAlign &&
239 FunctionPtrAlign == Other.FunctionPtrAlign &&
240 TheFunctionPtrAlignType == Other.TheFunctionPtrAlignType &&
241 ManglingMode == Other.ManglingMode &&
242 LegalIntWidths == Other.LegalIntWidths && IntSpecs == Other.IntSpecs &&
243 FloatSpecs == Other.FloatSpecs && VectorSpecs == Other.VectorSpecs &&
244 PointerSpecs == Other.PointerSpecs &&
245 StructABIAlignment == Other.StructABIAlignment &&
246 StructPrefAlignment == Other.StructPrefAlignment;
247}
248
250 DataLayout Layout;
251 if (Error Err = Layout.parseLayoutString(LayoutString))
252 return std::move(Err);
253 return Layout;
254}
255
257 return createStringError("malformed specification, must be of the form \"" +
258 Format + "\"");
259}
260
261/// Attempts to parse an address space component of a specification.
262static Error parseAddrSpace(StringRef Str, unsigned &AddrSpace) {
263 if (Str.empty())
264 return createStringError("address space component cannot be empty");
265
266 if (!to_integer(Str, AddrSpace, 10) || !isUInt<24>(AddrSpace))
267 return createStringError("address space must be a 24-bit integer");
268
269 return Error::success();
270}
271
272/// Attempts to parse an address space component of a specification allowing
273/// name to be specified as well. The input is expected to be of the form
274/// <number> '(' name ' )', with the name otional and the number is optional as
275/// well.
276static Error parseAddrSpaceAndName(StringRef Str, unsigned &AddrSpace,
277 StringRef &AddrSpaceName) {
278 if (Str.empty())
279 return createStringError("address space component cannot be empty");
280
281 if (isDigit(Str.front())) {
282 if (Str.consumeInteger(10, AddrSpace) || !isUInt<24>(AddrSpace))
283 return createStringError("address space must be a 24-bit integer");
284 }
285
286 if (Str.empty())
287 return Error::success();
288
289 if (Str.front() != '(')
290 return createStringError("address space must be a 24-bit integer");
291
292 // Expect atleast one character in between the ( and ).
293 if (Str.back() != ')' || Str.size() == 2)
294 return createStringError("Expected `( address space name )`");
295
296 AddrSpaceName = Str.drop_front().drop_back();
297 // TODO: Do we need any additional verification for address space name? Like
298 // should be a valid identifier of some sort? Its not strictly needed.
299
300 // LLVM's assembly parser used names "P", "G" and "A" to represent the
301 // program, default global, and alloca address space. This mapping is not 1:1
302 // in the sense that all of them can map to the same numberic address space.
303 // Diallow using these predefined symbolic address space names as address
304 // space names specified in the data layout.
305 if (AddrSpaceName.size() == 1) {
306 char C = AddrSpaceName.front();
307 if (C == 'P' || C == 'G' || C == 'A')
308 return createStringError(
309 "Cannot use predefined address space names P/G/A in data layout");
310 }
311 return Error::success();
312}
313
314/// Attempts to parse a size component of a specification.
315static Error parseSize(StringRef Str, unsigned &BitWidth,
316 StringRef Name = "size") {
317 if (Str.empty())
318 return createStringError(Name + " component cannot be empty");
319
320 if (!to_integer(Str, BitWidth, 10) || BitWidth == 0 || !isUInt<24>(BitWidth))
321 return createStringError(Name + " must be a non-zero 24-bit integer");
322
323 return Error::success();
324}
325
326/// Attempts to parse an alignment component of a specification.
327///
328/// On success, returns the value converted to byte amount in \p Alignment.
329/// If the value is zero and \p AllowZero is true, \p Alignment is set to one.
330///
331/// Return an error in a number of cases:
332/// - \p Str is empty or contains characters other than decimal digits;
333/// - the value is zero and \p AllowZero is false;
334/// - the value is too large;
335/// - the value is not a multiple of the byte width;
336/// - the value converted to byte amount is not not a power of two.
337static Error parseAlignment(StringRef Str, Align &Alignment, StringRef Name,
338 bool AllowZero = false) {
339 if (Str.empty())
340 return createStringError(Name + " alignment component cannot be empty");
341
342 unsigned Value;
343 if (!to_integer(Str, Value, 10) || !isUInt<16>(Value))
344 return createStringError(Name + " alignment must be a 16-bit integer");
345
346 if (Value == 0) {
347 if (!AllowZero)
348 return createStringError(Name + " alignment must be non-zero");
349 Alignment = Align(1);
350 return Error::success();
351 }
352
353 constexpr unsigned ByteWidth = 8;
354 if (Value % ByteWidth || !isPowerOf2_32(Value / ByteWidth))
355 return createStringError(
356 Name + " alignment must be a power of two times the byte width");
357
358 Alignment = Align(Value / ByteWidth);
359 return Error::success();
360}
361
362Error DataLayout::parsePrimitiveSpec(StringRef Spec) {
363 // [ifv]<size>:<abi>[:<pref>]
364 SmallVector<StringRef, 3> Components;
365 char Specifier = Spec.front();
366 assert(Specifier == 'i' || Specifier == 'f' || Specifier == 'v');
367 Spec.drop_front().split(Components, ':');
368
369 if (Components.size() < 2 || Components.size() > 3)
370 return createSpecFormatError(Twine(Specifier) + "<size>:<abi>[:<pref>]");
371
372 // Size. Required, cannot be zero.
373 unsigned BitWidth;
374 if (Error Err = parseSize(Components[0], BitWidth))
375 return Err;
376
377 // ABI alignment.
378 Align ABIAlign;
379 if (Error Err = parseAlignment(Components[1], ABIAlign, "ABI"))
380 return Err;
381
382 if (Specifier == 'i' && BitWidth == 8 && ABIAlign != 1)
383 return createStringError("i8 must be 8-bit aligned");
384
385 // Preferred alignment. Optional, defaults to the ABI alignment.
386 Align PrefAlign = ABIAlign;
387 if (Components.size() > 2)
388 if (Error Err = parseAlignment(Components[2], PrefAlign, "preferred"))
389 return Err;
390
391 if (PrefAlign < ABIAlign)
392 return createStringError(
393 "preferred alignment cannot be less than the ABI alignment");
394
395 setPrimitiveSpec(Specifier, BitWidth, ABIAlign, PrefAlign);
396 return Error::success();
397}
398
399Error DataLayout::parseAggregateSpec(StringRef Spec) {
400 // a<size>:<abi>[:<pref>]
401 SmallVector<StringRef, 3> Components;
402 assert(Spec.front() == 'a');
403 Spec.drop_front().split(Components, ':');
404
405 if (Components.size() < 2 || Components.size() > 3)
406 return createSpecFormatError("a:<abi>[:<pref>]");
407
408 // According to LangRef, <size> component must be absent altogether.
409 // For backward compatibility, allow it to be specified, but require
410 // it to be zero.
411 if (!Components[0].empty()) {
412 unsigned BitWidth;
413 if (!to_integer(Components[0], BitWidth, 10) || BitWidth != 0)
414 return createStringError("size must be zero");
415 }
416
417 // ABI alignment. Required. Can be zero, meaning use one byte alignment.
418 Align ABIAlign;
419 if (Error Err =
420 parseAlignment(Components[1], ABIAlign, "ABI", /*AllowZero=*/true))
421 return Err;
422
423 // Preferred alignment. Optional, defaults to the ABI alignment.
424 Align PrefAlign = ABIAlign;
425 if (Components.size() > 2)
426 if (Error Err = parseAlignment(Components[2], 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 StructABIAlignment = ABIAlign;
434 StructPrefAlignment = PrefAlign;
435 return Error::success();
436}
437
438Error DataLayout::parsePointerSpec(
439 StringRef Spec, SmallDenseSet<StringRef, 8> &AddrSpaceNames) {
440 // p[<n>]:<size>:<abi>[:<pref>[:<idx>]]
441 SmallVector<StringRef, 5> Components;
442 assert(Spec.front() == 'p');
443 Spec.drop_front().split(Components, ':');
444
445 if (Components.size() < 3 || Components.size() > 5)
446 return createSpecFormatError("p[<n>]:<size>:<abi>[:<pref>[:<idx>]]");
447
448 // Address space. Optional, defaults to 0.
449 unsigned AddrSpace = 0;
450 bool ExternalState = false;
451 bool UnstableRepr = false;
452 StringRef AddrSpaceName;
453 StringRef AddrSpaceStr = Components[0];
454 while (!AddrSpaceStr.empty()) {
455 char C = AddrSpaceStr.front();
456 if (C == 'e') {
457 ExternalState = true;
458 } else if (C == 'u') {
459 UnstableRepr = true;
460 } else if (isAlpha(C)) {
461 return createStringError("'%c' is not a valid pointer specification flag",
462 C);
463 } else {
464 break; // not a valid flag, remaining must be the address space number.
465 }
466 AddrSpaceStr = AddrSpaceStr.drop_front(1);
467 }
468 if (!AddrSpaceStr.empty())
469 if (Error Err =
470 parseAddrSpaceAndName(AddrSpaceStr, AddrSpace, AddrSpaceName))
471 return Err; // Failed to parse the remaining characters as a number
472 if (AddrSpace == 0 && (ExternalState || UnstableRepr))
473 return createStringError(
474 "address space 0 cannot be unstable or have external state");
475
476 // Check for duplicate address space names.
477 if (!AddrSpaceName.empty() && !AddrSpaceNames.insert(AddrSpaceName).second)
478 return createStringError("address space name `" + AddrSpaceName +
479 "` already used");
480
481 // Size. Required, cannot be zero.
482 unsigned BitWidth;
483 if (Error Err = parseSize(Components[1], BitWidth, "pointer size"))
484 return Err;
485
486 // ABI alignment. Required, cannot be zero.
487 Align ABIAlign;
488 if (Error Err = parseAlignment(Components[2], ABIAlign, "ABI"))
489 return Err;
490
491 // Preferred alignment. Optional, defaults to the ABI alignment.
492 // Cannot be zero.
493 Align PrefAlign = ABIAlign;
494 if (Components.size() > 3)
495 if (Error Err = parseAlignment(Components[3], PrefAlign, "preferred"))
496 return Err;
497
498 if (PrefAlign < ABIAlign)
499 return createStringError(
500 "preferred alignment cannot be less than the ABI alignment");
501
502 // Index size. Optional, defaults to pointer size. Cannot be zero.
503 unsigned IndexBitWidth = BitWidth;
504 if (Components.size() > 4)
505 if (Error Err = parseSize(Components[4], IndexBitWidth, "index size"))
506 return Err;
507
508 if (IndexBitWidth > BitWidth)
509 return createStringError(
510 "index size cannot be larger than the pointer size");
511
512 setPointerSpec(AddrSpace, BitWidth, ABIAlign, PrefAlign, IndexBitWidth,
513 UnstableRepr, ExternalState, AddrSpaceName);
514 return Error::success();
515}
516
517Error DataLayout::parseSpecification(
518 StringRef Spec, SmallVectorImpl<unsigned> &NonIntegralAddressSpaces,
519 SmallDenseSet<StringRef, 8> &AddrSpaceNames) {
520 // The "ni" specifier is the only two-character specifier. Handle it first.
521 if (Spec.starts_with("ni")) {
522 // ni:<address space>[:<address space>]...
523 StringRef Rest = Spec.drop_front(2);
524
525 // Drop the first ':', then split the rest of the string the usual way.
526 if (!Rest.consume_front(":"))
527 return createSpecFormatError("ni:<address space>[:<address space>]...");
528
529 for (StringRef Str : split(Rest, ':')) {
530 unsigned AddrSpace;
531 if (Error Err = parseAddrSpace(Str, AddrSpace))
532 return Err;
533 if (AddrSpace == 0)
534 return createStringError("address space 0 cannot be non-integral");
535 NonIntegralAddressSpaces.push_back(AddrSpace);
536 }
537 return Error::success();
538 }
539
540 // The rest of the specifiers are single-character.
541 assert(!Spec.empty() && "Empty specification is handled by the caller");
542 char Specifier = Spec.front();
543
544 if (Specifier == 'i' || Specifier == 'f' || Specifier == 'v')
545 return parsePrimitiveSpec(Spec);
546
547 if (Specifier == 'a')
548 return parseAggregateSpec(Spec);
549
550 if (Specifier == 'p')
551 return parsePointerSpec(Spec, AddrSpaceNames);
552
553 StringRef Rest = Spec.drop_front();
554 switch (Specifier) {
555 case 's':
556 // Deprecated, but ignoring here to preserve loading older textual llvm
557 // ASM file
558 break;
559 case 'e':
560 case 'E':
561 if (!Rest.empty())
562 return createStringError(
563 "malformed specification, must be just 'e' or 'E'");
564 BigEndian = Specifier == 'E';
565 break;
566 case 'n': // Native integer types.
567 // n<size>[:<size>]...
568 for (StringRef Str : split(Rest, ':')) {
569 unsigned BitWidth;
570 if (Error Err = parseSize(Str, BitWidth))
571 return Err;
572 LegalIntWidths.push_back(BitWidth);
573 }
574 break;
575 case 'S': { // Stack natural alignment.
576 // S<size>
577 if (Rest.empty())
578 return createSpecFormatError("S<size>");
579 Align Alignment;
580 if (Error Err = parseAlignment(Rest, Alignment, "stack natural"))
581 return Err;
582 StackNaturalAlign = Alignment;
583 break;
584 }
585 case 'F': {
586 // F<type><abi>
587 if (Rest.empty())
588 return createSpecFormatError("F<type><abi>");
589 char Type = Rest.front();
590 Rest = Rest.drop_front();
591 switch (Type) {
592 case 'i':
593 TheFunctionPtrAlignType = FunctionPtrAlignType::Independent;
594 break;
595 case 'n':
596 TheFunctionPtrAlignType = FunctionPtrAlignType::MultipleOfFunctionAlign;
597 break;
598 default:
599 return createStringError("unknown function pointer alignment type '" +
600 Twine(Type) + "'");
601 }
602 Align Alignment;
603 if (Error Err = parseAlignment(Rest, Alignment, "ABI"))
604 return Err;
605 FunctionPtrAlign = Alignment;
606 break;
607 }
608 case 'P': { // Function address space.
609 if (Rest.empty())
610 return createSpecFormatError("P<address space>");
611 if (Error Err = parseAddrSpace(Rest, ProgramAddrSpace))
612 return Err;
613 break;
614 }
615 case 'A': { // Default stack/alloca address space.
616 if (Rest.empty())
617 return createSpecFormatError("A<address space>");
618 if (Error Err = parseAddrSpace(Rest, AllocaAddrSpace))
619 return Err;
620 break;
621 }
622 case 'G': { // Default address space for global variables.
623 if (Rest.empty())
624 return createSpecFormatError("G<address space>");
625 if (Error Err = parseAddrSpace(Rest, DefaultGlobalsAddrSpace))
626 return Err;
627 break;
628 }
629 case 'm':
630 if (!Rest.consume_front(":") || Rest.empty())
631 return createSpecFormatError("m:<mangling>");
632 if (Rest.size() > 1)
633 return createStringError("unknown mangling mode");
634 switch (Rest[0]) {
635 default:
636 return createStringError("unknown mangling mode");
637 case 'e':
638 ManglingMode = MM_ELF;
639 break;
640 case 'l':
641 ManglingMode = MM_GOFF;
642 break;
643 case 'o':
644 ManglingMode = MM_MachO;
645 break;
646 case 'm':
647 ManglingMode = MM_Mips;
648 break;
649 case 'w':
650 ManglingMode = MM_WinCOFF;
651 break;
652 case 'x':
653 ManglingMode = MM_WinCOFFX86;
654 break;
655 case 'a':
656 ManglingMode = MM_XCOFF;
657 break;
658 }
659 break;
660 default:
661 return createStringError("unknown specifier '" + Twine(Specifier) + "'");
662 }
663
664 return Error::success();
665}
666
667Error DataLayout::parseLayoutString(StringRef LayoutString) {
668 StringRepresentation = LayoutString.str();
669
670 if (LayoutString.empty())
671 return Error::success();
672
673 // Split the data layout string into specifications separated by '-' and
674 // parse each specification individually, updating internal data structures.
675 SmallVector<unsigned, 8> NonIntegralAddressSpaces;
676 SmallDenseSet<StringRef, 8> AddessSpaceNames;
677 for (StringRef Spec : split(StringRepresentation, '-')) {
678 if (Spec.empty())
679 return createStringError("empty specification is not allowed");
680 if (Error Err = parseSpecification(Spec, NonIntegralAddressSpaces,
681 AddessSpaceNames))
682 return Err;
683 }
684 // Mark all address spaces that were qualified as non-integral now. This has
685 // to be done later since the non-integral property is not part of the data
686 // layout pointer specification.
687 for (unsigned AS : NonIntegralAddressSpaces) {
688 // If there is no special spec for a given AS, getPointerSpec(AS) returns
689 // the spec for AS0, and we then update that to mark it non-integral.
690 const PointerSpec &PS = getPointerSpec(AS);
691 setPointerSpec(AS, PS.BitWidth, PS.ABIAlign, PS.PrefAlign, PS.IndexBitWidth,
692 /*HasUnstableRepr=*/true, /*HasExternalState=*/false,
694 }
695
696 return Error::success();
697}
698
699void DataLayout::setPrimitiveSpec(char Specifier, uint32_t BitWidth,
700 Align ABIAlign, Align PrefAlign) {
701 SmallVectorImpl<PrimitiveSpec> *Specs;
702 switch (Specifier) {
703 default:
704 llvm_unreachable("Unexpected specifier");
705 case 'i':
706 Specs = &IntSpecs;
707 break;
708 case 'f':
709 Specs = &FloatSpecs;
710 break;
711 case 'v':
712 Specs = &VectorSpecs;
713 break;
714 }
715
716 auto I = lower_bound(*Specs, BitWidth, LessPrimitiveBitWidth());
717 if (I != Specs->end() && I->BitWidth == BitWidth) {
718 // Update the abi, preferred alignments.
719 I->ABIAlign = ABIAlign;
720 I->PrefAlign = PrefAlign;
721 } else {
722 // Insert before I to keep the vector sorted.
723 Specs->insert(I, PrimitiveSpec{BitWidth, ABIAlign, PrefAlign});
724 }
725}
726
728DataLayout::getPointerSpec(uint32_t AddrSpace) const {
729 if (AddrSpace != 0) {
730 auto I = lower_bound(PointerSpecs, AddrSpace, LessPointerAddrSpace());
731 if (I != PointerSpecs.end() && I->AddrSpace == AddrSpace)
732 return *I;
733 }
734
735 assert(PointerSpecs[0].AddrSpace == 0);
736 return PointerSpecs[0];
737}
738
739void DataLayout::setPointerSpec(uint32_t AddrSpace, uint32_t BitWidth,
740 Align ABIAlign, Align PrefAlign,
741 uint32_t IndexBitWidth, bool HasUnstableRepr,
742 bool HasExternalState,
743 StringRef AddrSpaceName) {
744 auto I = lower_bound(PointerSpecs, AddrSpace, LessPointerAddrSpace());
745 if (I == PointerSpecs.end() || I->AddrSpace != AddrSpace) {
746 PointerSpecs.insert(I, PointerSpec{AddrSpace, BitWidth, ABIAlign, PrefAlign,
747 IndexBitWidth, HasUnstableRepr,
748 HasExternalState, AddrSpaceName.str()});
749 } else {
750 I->BitWidth = BitWidth;
751 I->ABIAlign = ABIAlign;
752 I->PrefAlign = PrefAlign;
753 I->IndexBitWidth = IndexBitWidth;
754 I->HasUnstableRepresentation = HasUnstableRepr;
755 I->HasExternalState = HasExternalState;
756 I->AddrSpaceName = AddrSpaceName.str();
757 }
758}
759
760Align DataLayout::getIntegerAlignment(uint32_t BitWidth,
761 bool abi_or_pref) const {
762 auto I = IntSpecs.begin();
763 for (; I != IntSpecs.end(); ++I) {
764 if (I->BitWidth >= BitWidth)
765 break;
766 }
767
768 // If we don't have an exact match, use alignment of next larger integer
769 // type. If there is none, use alignment of largest integer type by going
770 // back one element.
771 if (I == IntSpecs.end())
772 --I;
773 return abi_or_pref ? I->ABIAlign : I->PrefAlign;
774}
775
776DataLayout::~DataLayout() { delete static_cast<StructLayoutMap *>(LayoutMap); }
777
779 if (!LayoutMap)
780 LayoutMap = new StructLayoutMap();
781
782 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
783 StructLayout *&SL = (*STM)[Ty];
784 if (SL) return SL;
785
786 // Otherwise, create the struct layout. Because it is variable length, we
787 // malloc it, then use placement new.
789 StructLayout::totalSizeToAlloc<TypeSize>(Ty->getNumElements()));
790
791 // Set SL before calling StructLayout's ctor. The ctor could cause other
792 // entries to be added to TheMap, invalidating our reference.
793 SL = L;
794
795 new (L) StructLayout(Ty, *this);
796
797 return L;
798}
799
801 return getPointerSpec(AS).ABIAlign;
802}
803
805 return getPointerSpec(AS).AddrSpaceName;
806}
807
808std::optional<unsigned> DataLayout::getNamedAddressSpace(StringRef Name) const {
809 auto II = llvm::find_if(PointerSpecs, [Name](const PointerSpec &PS) {
810 return PS.AddrSpaceName == Name;
811 });
812 if (II != PointerSpecs.end())
813 return II->AddrSpace;
814 return std::nullopt;
815}
816
818 return getPointerSpec(AS).PrefAlign;
819}
820
821unsigned DataLayout::getPointerSize(unsigned AS) const {
822 return divideCeil(getPointerSpec(AS).BitWidth, 8);
823}
824
826 assert(Ty->isPtrOrPtrVectorTy() &&
827 "This should only be called with a pointer or pointer vector type");
828 Ty = Ty->getScalarType();
830}
831
832unsigned DataLayout::getIndexSize(unsigned AS) const {
833 return divideCeil(getPointerSpec(AS).IndexBitWidth, 8);
834}
835
837 assert(Ty->isPtrOrPtrVectorTy() &&
838 "This should only be called with a pointer or pointer vector type");
839 Ty = Ty->getScalarType();
841}
842
843/*!
844 \param abi_or_pref Flag that determines which alignment is returned. true
845 returns the ABI alignment, false returns the preferred alignment.
846 \param Ty The underlying type for which alignment is determined.
847
848 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
849 == false) for the requested type \a Ty.
850 */
851Align DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
852 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
853 switch (Ty->getTypeID()) {
854 // Early escape for the non-numeric types.
855 case Type::LabelTyID:
856 return abi_or_pref ? getPointerABIAlignment(0) : getPointerPrefAlignment(0);
857 case Type::PointerTyID: {
858 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
859 return abi_or_pref ? getPointerABIAlignment(AS)
861 }
862 case Type::ArrayTyID:
863 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
864
865 case Type::StructTyID: {
866 // Packed structure types always have an ABI alignment of one.
867 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
868 return Align(1);
869
870 // Get the layout annotation... which is lazily created on demand.
871 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
872 const Align Align = abi_or_pref ? StructABIAlignment : StructPrefAlignment;
873 return std::max(Align, Layout->getAlignment());
874 }
876 return getIntegerAlignment(Ty->getIntegerBitWidth(), abi_or_pref);
877 case Type::HalfTyID:
878 case Type::BFloatTyID:
879 case Type::FloatTyID:
880 case Type::DoubleTyID:
881 // PPC_FP128TyID and FP128TyID have different data contents, but the
882 // same size and alignment, so they look the same here.
884 case Type::FP128TyID:
885 case Type::X86_FP80TyID: {
887 auto I = lower_bound(FloatSpecs, BitWidth, LessPrimitiveBitWidth());
888 if (I != FloatSpecs.end() && I->BitWidth == BitWidth)
889 return abi_or_pref ? I->ABIAlign : I->PrefAlign;
890
891 // If we still couldn't find a reasonable default alignment, fall back
892 // to a simple heuristic that the alignment is the first power of two
893 // greater-or-equal to the store size of the type. This is a reasonable
894 // approximation of reality, and if the user wanted something less
895 // less conservative, they should have specified it explicitly in the data
896 // layout.
897 return Align(PowerOf2Ceil(BitWidth / 8));
898 }
902 auto I = lower_bound(VectorSpecs, BitWidth, LessPrimitiveBitWidth());
903 if (I != VectorSpecs.end() && I->BitWidth == BitWidth)
904 return abi_or_pref ? I->ABIAlign : I->PrefAlign;
905
906 // By default, use natural alignment for vector types. This is consistent
907 // with what clang and llvm-gcc do.
908 //
909 // We're only calculating a natural alignment, so it doesn't have to be
910 // based on the full size for scalable vectors. Using the minimum element
911 // count should be enough here.
912 return Align(PowerOf2Ceil(getTypeStoreSize(Ty).getKnownMinValue()));
913 }
915 return Align(64);
916 case Type::TargetExtTyID: {
917 Type *LayoutTy = cast<TargetExtType>(Ty)->getLayoutType();
918 return getAlignment(LayoutTy, abi_or_pref);
919 }
920 default:
921 llvm_unreachable("Bad type for getAlignment!!!");
922 }
923}
924
926 switch (Ty->getTypeID()) {
927 case Type::ArrayTyID: {
928 // The alignment of the array is the alignment of the element, so there
929 // is no need for further adjustment.
930 auto *ATy = cast<ArrayType>(Ty);
931 return ATy->getNumElements() * getTypeAllocSize(ATy->getElementType());
932 }
933 case Type::StructTyID: {
934 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
935 TypeSize Size = Layout->getSizeInBytes();
936
937 if (cast<StructType>(Ty)->isPacked())
938 return Size;
939
940 Align A = std::max(StructABIAlignment, Layout->getAlignment());
941 return alignTo(Size, A.value());
942 }
943 case Type::IntegerTyID: {
944 unsigned BitWidth = Ty->getIntegerBitWidth();
946 Align A = getIntegerAlignment(BitWidth, /*ABI=*/true);
947 return alignTo(Size, A.value());
948 }
949 case Type::PointerTyID: {
950 unsigned AS = Ty->getPointerAddressSpace();
952 return alignTo(Size, getPointerABIAlignment(AS).value());
953 }
954 case Type::TargetExtTyID: {
955 Type *LayoutTy = cast<TargetExtType>(Ty)->getLayoutType();
956 return getTypeAllocSize(LayoutTy);
957 }
958 default:
959 return alignTo(getTypeStoreSize(Ty), getABITypeAlign(Ty).value());
960 }
961}
962
964 return getAlignment(Ty, true);
965}
966
968 return getAlignment(Ty, false);
969}
970
975
977 assert(Ty->isPtrOrPtrVectorTy() &&
978 "Expected a pointer or pointer vector type.");
979 unsigned NumBits = getPointerTypeSizeInBits(Ty);
980 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
981 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
982 return VectorType::get(IntTy, VecTy);
983 return IntTy;
984}
985
987 for (unsigned LegalIntWidth : LegalIntWidths)
988 if (Width <= LegalIntWidth)
989 return Type::getIntNTy(C, LegalIntWidth);
990 return nullptr;
991}
992
994 auto Max = llvm::max_element(LegalIntWidths);
995 return Max != LegalIntWidths.end() ? *Max : 0;
996}
997
1002
1004 assert(Ty->isPtrOrPtrVectorTy() &&
1005 "Expected a pointer or pointer vector type.");
1006 unsigned NumBits = getIndexTypeSizeInBits(Ty);
1007 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
1008 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
1009 return VectorType::get(IntTy, VecTy);
1010 return IntTy;
1011}
1012
1014 ArrayRef<Value *> Indices) const {
1015 int64_t Result = 0;
1016
1018 GTI = gep_type_begin(ElemTy, Indices),
1019 GTE = gep_type_end(ElemTy, Indices);
1020 for (; GTI != GTE; ++GTI) {
1021 Value *Idx = GTI.getOperand();
1022 if (StructType *STy = GTI.getStructTypeOrNull()) {
1023 assert(Idx->getType()->isIntegerTy(32) && "Illegal struct idx");
1024 unsigned FieldNo = cast<ConstantInt>(Idx)->getZExtValue();
1025
1026 // Get structure layout information...
1027 const StructLayout *Layout = getStructLayout(STy);
1028
1029 // Add in the offset, as calculated by the structure layout info...
1030 Result += Layout->getElementOffset(FieldNo);
1031 } else {
1032 if (int64_t ArrayIdx = cast<ConstantInt>(Idx)->getSExtValue())
1033 Result += ArrayIdx * GTI.getSequentialElementStride(*this);
1034 }
1035 }
1036
1037 return Result;
1038}
1039
1041 // Skip over scalable or zero size elements. Also skip element sizes larger
1042 // than the positive index space, because the arithmetic below may not be
1043 // correct in that case.
1044 unsigned BitWidth = Offset.getBitWidth();
1045 if (ElemSize.isScalable() || ElemSize == 0 ||
1046 !isUIntN(BitWidth - 1, ElemSize)) {
1047 return APInt::getZero(BitWidth);
1048 }
1049
1050 uint64_t FixedElemSize = ElemSize.getFixedValue();
1051 APInt Index = Offset.sdiv(FixedElemSize);
1052 Offset -= Index * FixedElemSize;
1053 if (Offset.isNegative()) {
1054 // Prefer a positive remaining offset to allow struct indexing.
1055 --Index;
1056 Offset += FixedElemSize;
1057 assert(Offset.isNonNegative() && "Remaining offset shouldn't be negative");
1058 }
1059 return Index;
1060}
1061
1062std::optional<APInt> DataLayout::getGEPIndexForOffset(Type *&ElemTy,
1063 APInt &Offset) const {
1064 if (auto *ArrTy = dyn_cast<ArrayType>(ElemTy)) {
1065 ElemTy = ArrTy->getElementType();
1066 return getElementIndex(getTypeAllocSize(ElemTy), Offset);
1067 }
1068
1069 if (isa<VectorType>(ElemTy)) {
1070 // Vector GEPs are partially broken (e.g. for overaligned element types),
1071 // and may be forbidden in the future, so avoid generating GEPs into
1072 // vectors. See https://discourse.llvm.org/t/67497
1073 return std::nullopt;
1074 }
1075
1076 if (auto *STy = dyn_cast<StructType>(ElemTy)) {
1077 const StructLayout *SL = getStructLayout(STy);
1078 uint64_t IntOffset = Offset.getZExtValue();
1079 if (IntOffset >= SL->getSizeInBytes())
1080 return std::nullopt;
1081
1082 unsigned Index = SL->getElementContainingOffset(IntOffset);
1083 Offset -= SL->getElementOffset(Index);
1084 ElemTy = STy->getElementType(Index);
1085 return APInt(32, Index);
1086 }
1087
1088 // Non-aggregate type.
1089 return std::nullopt;
1090}
1091
1093 APInt &Offset) const {
1094 assert(ElemTy->isSized() && "Element type must be sized");
1095 SmallVector<APInt> Indices;
1097 while (Offset != 0) {
1098 std::optional<APInt> Index = getGEPIndexForOffset(ElemTy, Offset);
1099 if (!Index)
1100 break;
1101 Indices.push_back(*Index);
1102 }
1103
1104 return Indices;
1105}
1106
1107/// getPreferredAlign - Return the preferred alignment of the specified global.
1108/// This includes an explicitly requested alignment (if the global has one).
1110 MaybeAlign GVAlignment = GV->getAlign();
1111 // If a section is specified, always precisely honor explicit alignment,
1112 // so we don't insert padding into a section we don't control.
1113 if (GVAlignment && GV->hasSection())
1114 return *GVAlignment;
1115
1116 // If no explicit alignment is specified, compute the alignment based on
1117 // the IR type. If an alignment is specified, increase it to match the ABI
1118 // alignment of the IR type.
1119 //
1120 // FIXME: Not sure it makes sense to use the alignment of the type if
1121 // there's already an explicit alignment specification.
1122 Type *ElemType = GV->getValueType();
1123 Align Alignment = getPrefTypeAlign(ElemType);
1124 if (GVAlignment) {
1125 if (*GVAlignment >= Alignment)
1126 Alignment = *GVAlignment;
1127 else
1128 Alignment = std::max(*GVAlignment, getABITypeAlign(ElemType));
1129 }
1130
1131 // If no explicit alignment is specified, and the global is large, increase
1132 // the alignment to 16.
1133 // FIXME: Why 16, specifically?
1134 if (GV->hasInitializer() && !GVAlignment) {
1135 if (Alignment < Align(16)) {
1136 // If the global is not external, see if it is large. If so, give it a
1137 // larger alignment.
1138 if (getTypeSizeInBits(ElemType) > 128)
1139 Alignment = Align(16); // 16-byte alignment.
1140 }
1141 }
1142 return Alignment;
1143}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static SmallVector< size_t > getMemberOffsets(const DataLayout &DL, GlobalVariable *Handle, llvm::function_ref< bool(Type *)> IsPadding)
Definition CBuffer.cpp:19
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::PrimitiveSpec DefaultIntSpecs[]
static Error parseAddrSpaceAndName(StringRef Str, unsigned &AddrSpace, StringRef &AddrSpaceName)
Attempts to parse an address space component of a specification allowing name to be specified as well...
This file defines the DenseMap class.
#define I(x, y, z)
Definition MD5.cpp:57
This file defines counterparts of C library allocation functions defined in the namespace 'std'.
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
uint64_t IntrinsicInst * II
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:201
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
iterator begin() const
Definition ArrayRef.h:130
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI std::optional< unsigned > getNamedAddressSpace(StringRef Name) const
LLVM_ABI StringRef getAddressSpaceName(unsigned AS) const
unsigned getPointerSizeInBits(unsigned AS=0) const
The size in bits of the pointer representation in a given address space.
Definition DataLayout.h:490
@ MultipleOfFunctionAlign
The function pointer alignment is a multiple of the function alignment.
Definition DataLayout.h:106
@ Independent
The function pointer alignment is independent of the function alignment.
Definition DataLayout.h:104
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.
LLVM_ABI 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:498
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Definition DataLayout.h:771
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition DataLayout.h:568
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:318
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:291
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:702
std::string str() const
str - Get the contents as an std::string.
Definition StringRef.h:225
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:261
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
Definition StringRef.h:611
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:146
char front() const
front - Get the first character in the string.
Definition StringRef.h:149
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
Definition StringRef.h:637
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
Definition StringRef.h:618
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:723
TypeSize getSizeInBytes() const
Definition DataLayout.h:732
MutableArrayRef< TypeSize > getMemberOffsets()
Definition DataLayout.h:746
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:754
Align getAlignment() const
Definition DataLayout.h:736
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:300
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.
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
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:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
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
bool empty() const
Definition BasicBlock.h:101
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool isAligned(Align Lhs, uint64_t SizeInBytes)
Checks that SizeInBytes is a multiple of the alignment.
Definition Alignment.h:134
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
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:2019
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:385
bool isAlpha(char C)
Checks if character C is a valid letter as classified by "C" locale.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
bool isDigit(char C)
Checks if character C is one of the 10 decimal digits.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:189
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:547
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:394
@ 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:2006
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
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:2042
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1770
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:88
Pointer type specification.
Definition DataLayout.h:76
bool HasUnstableRepresentation
Pointers in this address space don't have a well-defined bitwise representation (e....
Definition DataLayout.h:90
LLVM_ABI bool operator==(const PointerSpec &Other) const
bool HasExternalState
Pointers in this address space have additional state bits that are located at a target-defined locati...
Definition DataLayout.h:95
uint32_t IndexBitWidth
The index bit width also defines the address size in this address space.
Definition DataLayout.h:86
Primitive type specification.
Definition DataLayout.h:67
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:106