LLVM 24.0.0git
Attributes.h
Go to the documentation of this file.
1//===- llvm/Attributes.h - Container for Attributes -------------*- C++ -*-===//
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/// \file
10/// This file contains the simple types necessary to represent the
11/// attributes associated with functions and their calls.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_IR_ATTRIBUTES_H
16#define LLVM_IR_ATTRIBUTES_H
17
18#include "llvm-c/Types.h"
19#include "llvm/ADT/ArrayRef.h"
21#include "llvm/ADT/Hashing.h"
22#include "llvm/ADT/StringRef.h"
23#include "llvm/Config/llvm-config.h"
27#include "llvm/Support/ModRef.h"
29#include <cassert>
30#include <cstdint>
31#include <optional>
32#include <string>
33#include <type_traits>
34#include <utility>
35
36namespace llvm {
37
38class AttrBuilder;
39class AttributeMask;
40class AttributeImpl;
43class ConstantRange;
45class Function;
46class LLVMContext;
47class Instruction;
48class Type;
49class raw_ostream;
50enum FPClassTest : unsigned;
51struct DenormalFPEnv;
52struct DenormalMode;
53
54enum class AllocFnKind : uint64_t {
56 Alloc = 1 << 0, // Allocator function returns a new allocation
57 Realloc = 1 << 1, // Allocator function resizes the `allocptr` argument
58 Free = 1 << 2, // Allocator function frees the `allocptr` argument
59 Uninitialized = 1 << 3, // Allocator function returns uninitialized memory
60 Zeroed = 1 << 4, // Allocator function returns zeroed memory
61 Aligned = 1 << 5, // Allocator function aligns allocations per the
62 // `allocalign` argument
63 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ Aligned)
64};
65
67public:
68 DeadOnReturnInfo() : DeadBytes(std::nullopt) {}
69 DeadOnReturnInfo(uint64_t DeadOnReturnBytes) : DeadBytes(DeadOnReturnBytes) {}
70
72 assert(DeadBytes.has_value() &&
73 "This attribute does not specify a byte count. Did you forget to "
74 "check if the attribute covers all reachable memory?");
75 return DeadBytes.value();
76 }
77
78 bool coversAllReachableMemory() const { return !DeadBytes.has_value(); }
79
81 if (Data == std::numeric_limits<uint64_t>::max())
82 return DeadOnReturnInfo();
83 return DeadOnReturnInfo(Data);
84 }
85
87 if (DeadBytes.has_value())
88 return DeadBytes.value();
89 return std::numeric_limits<uint64_t>::max();
90 }
91
92 bool isZeroSized() const {
93 return DeadBytes.has_value() && DeadBytes.value() == 0;
94 }
95
96private:
97 std::optional<uint64_t> DeadBytes;
98};
99
100//===----------------------------------------------------------------------===//
101/// \class
102/// Functions, function parameters, and return types can have attributes
103/// to indicate how they should be treated by optimizations and code
104/// generation. This class represents one of those attributes. It's light-weight
105/// and should be passed around by-value.
106class Attribute {
107public:
108 /// This enumeration lists the attributes that can be associated with
109 /// parameters, function results, or the function itself.
110 ///
111 /// Note: The `uwtable' attribute is about the ABI or the user mandating an
112 /// entry in the unwind table. The `nounwind' attribute is about an exception
113 /// passing by the function.
114 ///
115 /// In a theoretical system that uses tables for profiling and SjLj for
116 /// exceptions, they would be fully independent. In a normal system that uses
117 /// tables for both, the semantics are:
118 ///
119 /// nil = Needs an entry because an exception might pass by.
120 /// nounwind = No need for an entry
121 /// uwtable = Needs an entry because the ABI says so and because
122 /// an exception might pass by.
123 /// uwtable + nounwind = Needs an entry because the ABI says so.
124
125 enum AttrKind {
126 // IR-Level Attributes
127 None, ///< No attributes have been set
128 #define GET_ATTR_ENUM
129 #include "llvm/IR/Attributes.inc"
130 EndAttrKinds, ///< Sentinel value useful for loops
131 EmptyKey, ///< Use as Empty key for DenseMap of AttrKind
132 TombstoneKey, ///< Use as Tombstone key for DenseMap of AttrKind
133 };
134
135 static const unsigned NumEnumAttrKinds = LastEnumAttr - FirstEnumAttr + 1;
136 static const unsigned NumIntAttrKinds = LastIntAttr - FirstIntAttr + 1;
137 static const unsigned NumTypeAttrKinds = LastTypeAttr - FirstTypeAttr + 1;
138
139 static bool isEnumAttrKind(AttrKind Kind) {
140 return Kind >= FirstEnumAttr && Kind <= LastEnumAttr;
141 }
142 static bool isIntAttrKind(AttrKind Kind) {
143 return Kind >= FirstIntAttr && Kind <= LastIntAttr;
144 }
145 static bool isTypeAttrKind(AttrKind Kind) {
146 return Kind >= FirstTypeAttr && Kind <= LastTypeAttr;
147 }
149 return Kind >= FirstConstantRangeAttr && Kind <= LastConstantRangeAttr;
150 }
152 return Kind >= FirstConstantRangeListAttr &&
153 Kind <= LastConstantRangeListAttr;
154 }
155
156 LLVM_ABI static bool canUseAsFnAttr(AttrKind Kind);
157 LLVM_ABI static bool canUseAsParamAttr(AttrKind Kind);
158 LLVM_ABI static bool canUseAsRetAttr(AttrKind Kind);
159
160 LLVM_ABI static bool intersectMustPreserve(AttrKind Kind);
161 LLVM_ABI static bool intersectWithAnd(AttrKind Kind);
162 LLVM_ABI static bool intersectWithMin(AttrKind Kind);
163 LLVM_ABI static bool intersectWithCustom(AttrKind Kind);
164
165 /// Whether this is an ABI attribute (for returns or arguments).
166 LLVM_ABI static bool isABIAttr(AttrKind Kind);
167
168private:
169 AttributeImpl *pImpl = nullptr;
170
171 Attribute(AttributeImpl *A) : pImpl(A) {}
172
173public:
174 Attribute() = default;
175
176 //===--------------------------------------------------------------------===//
177 // Attribute Construction
178 //===--------------------------------------------------------------------===//
179
180 /// Return a uniquified Attribute object.
181 LLVM_ABI static Attribute get(LLVMContext &Context, AttrKind Kind,
182 uint64_t Val = 0);
183 LLVM_ABI static Attribute get(LLVMContext &Context, StringRef Kind,
184 StringRef Val = StringRef());
185 LLVM_ABI static Attribute get(LLVMContext &Context, AttrKind Kind, Type *Ty);
186 LLVM_ABI static Attribute get(LLVMContext &Context, AttrKind Kind,
187 const ConstantRange &CR);
188 LLVM_ABI static Attribute get(LLVMContext &Context, AttrKind Kind,
190
191 /// Return a uniquified Attribute object that has the specific
192 /// alignment set.
193 LLVM_ABI static Attribute getWithAlignment(LLVMContext &Context,
194 Align Alignment);
195 LLVM_ABI static Attribute getWithStackAlignment(LLVMContext &Context,
196 Align Alignment);
197 LLVM_ABI static Attribute getWithDereferenceableBytes(LLVMContext &Context,
198 uint64_t Bytes);
199 LLVM_ABI static Attribute
201 LLVM_ABI static Attribute
202 getWithAllocSizeArgs(LLVMContext &Context, unsigned ElemSizeArg,
203 const std::optional<unsigned> &NumElemsArg);
204 LLVM_ABI static Attribute getWithAllocKind(LLVMContext &Context,
205 AllocFnKind Kind);
206 LLVM_ABI static Attribute getWithVScaleRangeArgs(LLVMContext &Context,
207 unsigned MinValue,
208 unsigned MaxValue);
209 LLVM_ABI static Attribute getWithByValType(LLVMContext &Context, Type *Ty);
210 LLVM_ABI static Attribute getWithStructRetType(LLVMContext &Context,
211 Type *Ty);
212 LLVM_ABI static Attribute getWithByRefType(LLVMContext &Context, Type *Ty);
213 LLVM_ABI static Attribute getWithPreallocatedType(LLVMContext &Context,
214 Type *Ty);
215 LLVM_ABI static Attribute getWithInAllocaType(LLVMContext &Context, Type *Ty);
216 LLVM_ABI static Attribute getWithUWTableKind(LLVMContext &Context,
217 UWTableKind Kind);
218 LLVM_ABI static Attribute getWithMemoryEffects(LLVMContext &Context,
219 MemoryEffects ME);
220 LLVM_ABI static Attribute getWithNoFPClass(LLVMContext &Context,
221 FPClassTest Mask);
222 LLVM_ABI static Attribute getWithDeadOnReturnInfo(LLVMContext &Context,
224 LLVM_ABI static Attribute getWithCaptureInfo(LLVMContext &Context,
225 CaptureInfo CI);
226
227 /// For a typed attribute, return the equivalent attribute with the type
228 /// changed to \p ReplacementTy.
229 Attribute getWithNewType(LLVMContext &Context, Type *ReplacementTy) {
230 assert(isTypeAttribute() && "this requires a typed attribute");
231 return get(Context, getKindAsEnum(), ReplacementTy);
232 }
233
235
237
238 //===--------------------------------------------------------------------===//
239 // Attribute Accessors
240 //===--------------------------------------------------------------------===//
241
242 /// Return true if the attribute is an Attribute::AttrKind type.
243 LLVM_ABI bool isEnumAttribute() const;
244
245 /// Return true if the attribute is an integer attribute.
246 LLVM_ABI bool isIntAttribute() const;
247
248 /// Return true if the attribute is a string (target-dependent)
249 /// attribute.
250 LLVM_ABI bool isStringAttribute() const;
251
252 /// Return true if the attribute is a type attribute.
253 LLVM_ABI bool isTypeAttribute() const;
254
255 /// Return true if the attribute is a ConstantRange attribute.
257
258 /// Return true if the attribute is a ConstantRangeList attribute.
260
261 /// Return true if the attribute is any kind of attribute.
262 bool isValid() const { return pImpl; }
263
264 /// Return true if the attribute is present.
265 LLVM_ABI bool hasAttribute(AttrKind Val) const;
266
267 /// Return true if the target-dependent attribute is present.
268 LLVM_ABI bool hasAttribute(StringRef Val) const;
269
270 /// Returns true if the attribute's kind can be represented as an enum (Enum,
271 /// Integer, Type, ConstantRange, or ConstantRangeList attribute).
272 bool hasKindAsEnum() const { return !isStringAttribute(); }
273
274 /// Return the attribute's kind as an enum (Attribute::AttrKind). This
275 /// requires the attribute be representable as an enum (see: `hasKindAsEnum`).
277
278 /// Return the attribute's value as an integer. This requires that the
279 /// attribute be an integer attribute.
281
282 /// Return the attribute's value as a boolean. This requires that the
283 /// attribute be a string attribute.
284 LLVM_ABI bool getValueAsBool() const;
285
286 /// Return the attribute's kind as a string. This requires the
287 /// attribute to be a string attribute.
289
290 /// Return the attribute's value as a string. This requires the
291 /// attribute to be a string attribute.
293
294 /// Return the attribute's value as a Type. This requires the attribute to be
295 /// a type attribute.
297
298 /// Return the attribute's value as a ConstantRange. This requires the
299 /// attribute to be a ConstantRange attribute.
301
302 /// Return the attribute's value as a ConstantRange array. This requires the
303 /// attribute to be a ConstantRangeList attribute.
305
306 /// Returns the alignment field of an attribute as a byte alignment
307 /// value.
309
310 /// Returns the stack alignment field of an attribute as a byte
311 /// alignment value.
313
314 /// Returns the number of dereferenceable bytes from the
315 /// dereferenceable attribute.
317
318 /// Returns the number of dead_on_return bytes from the dead_on_return
319 /// attribute, or std::nullopt if all memory reachable through the pointer is
320 /// marked dead on return.
322
323 /// Returns the number of dereferenceable_or_null bytes from the
324 /// dereferenceable_or_null attribute.
326
327 /// Returns the argument numbers for the allocsize attribute.
328 LLVM_ABI std::pair<unsigned, std::optional<unsigned>>
329 getAllocSizeArgs() const;
330
331 /// Returns the minimum value for the vscale_range attribute.
332 LLVM_ABI unsigned getVScaleRangeMin() const;
333
334 /// Returns the maximum value for the vscale_range attribute or std::nullopt
335 /// when unknown.
336 LLVM_ABI std::optional<unsigned> getVScaleRangeMax() const;
337
338 // Returns the unwind table kind.
340
341 // Returns the allocator function kind.
343
344 /// Returns memory effects.
346
347 /// Returns denormal_fpenv.
349
350 /// Returns information from captures attribute.
352
353 /// Return the FPClassTest for nofpclass
355
356 /// Returns the value of the range attribute.
357 LLVM_ABI const ConstantRange &getRange() const;
358
359 /// Returns the value of the initializes attribute.
361
362 /// The Attribute is converted to a string of equivalent mnemonic. This
363 /// is, presumably, for writing out the mnemonics for the assembly writer.
364 LLVM_ABI std::string getAsString(bool InAttrGrp = false) const;
365
366 /// Return true if this attribute belongs to the LLVMContext.
368
369 /// Equality and non-equality operators.
370 bool operator==(Attribute A) const { return pImpl == A.pImpl; }
371 bool operator!=(Attribute A) const { return pImpl != A.pImpl; }
372
373 /// Used to sort attribute by kind.
374 LLVM_ABI int cmpKind(Attribute A) const;
375
376 /// Less-than operator. Useful for sorting the attributes list.
377 LLVM_ABI bool operator<(Attribute A) const;
378
379 /// Return a raw pointer that uniquely identifies this attribute.
380 void *getRawPointer() const {
381 return pImpl;
382 }
383
384 /// Get an attribute from a raw pointer created by getRawPointer.
385 static Attribute fromRawPointer(void *RawPtr) {
386 return Attribute(reinterpret_cast<AttributeImpl*>(RawPtr));
387 }
388};
389
390// Specialized opaque value conversions.
392 return reinterpret_cast<LLVMAttributeRef>(Attr.getRawPointer());
393}
394
395// Specialized opaque value conversions.
397 return Attribute::fromRawPointer(Attr);
398}
399
400//===----------------------------------------------------------------------===//
401/// \class
402/// This class holds the attributes for a particular argument, parameter,
403/// function, or return value. It is an immutable value type that is cheap to
404/// copy. Adding and removing enum attributes is intended to be fast, but adding
405/// and removing string or integer attributes involves a FoldingSet lookup.
406class AttributeSet {
407 friend AttributeListImpl;
408 template <typename Ty, typename Enable> friend struct DenseMapInfo;
409
410 // TODO: Extract AvailableAttrs from AttributeSetNode and store them here.
411 // This will allow an efficient implementation of addAttribute and
412 // removeAttribute for enum attrs.
413
414 /// Private implementation pointer.
415 AttributeSetNode *SetNode = nullptr;
416
417private:
418 explicit AttributeSet(AttributeSetNode *ASN) : SetNode(ASN) {}
419
420public:
421 /// AttributeSet is a trivially copyable value type.
422 AttributeSet() = default;
423 AttributeSet(const AttributeSet &) = default;
424 ~AttributeSet() = default;
425
426 LLVM_ABI static AttributeSet get(LLVMContext &C, const AttrBuilder &B);
427 LLVM_ABI static AttributeSet get(LLVMContext &C, ArrayRef<Attribute> Attrs);
428
429 bool operator==(const AttributeSet &O) const { return SetNode == O.SetNode; }
430 bool operator!=(const AttributeSet &O) const { return !(*this == O); }
431
432 /// Add an argument attribute. Returns a new set because attribute sets are
433 /// immutable.
434 [[nodiscard]] LLVM_ABI AttributeSet
436
437 /// Add a target-dependent attribute. Returns a new set because attribute sets
438 /// are immutable.
439 [[nodiscard]] LLVM_ABI AttributeSet addAttribute(
440 LLVMContext &C, StringRef Kind, StringRef Value = StringRef()) const;
441
442 /// Add attributes to the attribute set. Returns a new set because attribute
443 /// sets are immutable.
445 AttributeSet AS) const;
446
447 /// Add attributes to the attribute set. Returns a new set because attribute
448 /// sets are immutable.
450 const AttrBuilder &B) const;
451
452 /// Add attributes to the attribute set, replacing attributes of the same
453 /// kind. \p Attrs must be sorted like an attribute set, with at most one
454 /// attribute of each kind. Returns a new set because attribute sets are
455 /// immutable.
456 [[nodiscard]] LLVM_ABI AttributeSet
458
459 /// Remove the specified attribute from this set. Returns a new set because
460 /// attribute sets are immutable.
461 [[nodiscard]] LLVM_ABI AttributeSet
463
464 /// Remove the specified attribute from this set. Returns a new set because
465 /// attribute sets are immutable.
467 StringRef Kind) const;
468
469 /// Remove the specified attributes from this set. Returns a new set because
470 /// attribute sets are immutable.
471 [[nodiscard]] LLVM_ABI AttributeSet
472 removeAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const;
473
474 /// Try to intersect this AttributeSet with Other. Returns std::nullopt if
475 /// the two lists are inherently incompatible (imply different behavior, not
476 /// just analysis).
477 [[nodiscard]] LLVM_ABI std::optional<AttributeSet>
479
480 /// Return the number of attributes in this set.
481 LLVM_ABI unsigned getNumAttributes() const;
482
483 /// Return true if attributes exists in this set.
484 bool hasAttributes() const { return SetNode != nullptr; }
485
486 /// Return true if the attribute exists in this set.
488
489 /// Return true if the attribute exists in this set.
490 LLVM_ABI bool hasAttribute(StringRef Kind) const;
491
492 /// Return the attribute object.
494
495 /// Return the target-dependent attribute object.
497
503 LLVM_ABI Type *getByValType() const;
505 LLVM_ABI Type *getByRefType() const;
509 LLVM_ABI std::optional<std::pair<unsigned, std::optional<unsigned>>>
510 getAllocSizeArgs() const;
511 LLVM_ABI unsigned getVScaleRangeMin() const;
512 LLVM_ABI std::optional<unsigned> getVScaleRangeMax() const;
518 LLVM_ABI std::string getAsString(bool InAttrGrp = false) const;
519
520 /// Return true if this attribute set belongs to the LLVMContext.
522
523 using iterator = const Attribute *;
524
525 LLVM_ABI iterator begin() const;
526 LLVM_ABI iterator end() const;
527#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
528 void dump() const;
529#endif
530};
531
532//===----------------------------------------------------------------------===//
533/// \class
534/// Provide DenseMapInfo for AttributeSet.
535template <> struct DenseMapInfo<AttributeSet, void> {
536 static unsigned getHashValue(AttributeSet AS) {
538 }
539
540 static bool isEqual(AttributeSet LHS, AttributeSet RHS) { return LHS == RHS; }
541};
542
543namespace hashing::detail {
544// Attribute and AttributeSet are trivial wrappers whose operator== is pointer
545// equality, so hashing the bytes is equivalent to hashing the values. Define
546// is_hashable_data to pick the contiguous hash_combine_range path.
547template <> struct is_hashable_data<Attribute> : std::true_type {};
548template <> struct is_hashable_data<AttributeSet> : std::true_type {};
549static_assert(std::has_unique_object_representations_v<Attribute> &&
550 std::has_unique_object_representations_v<AttributeSet>,
551 "hashing the bytes requires unique object representations");
552} // namespace hashing::detail
553
554//===----------------------------------------------------------------------===//
555/// \class
556/// This class holds the attributes for a function, its return value, and
557/// its parameters. You access the attributes for each of them via an index into
558/// the AttributeList object. The function attributes are at index
559/// `AttributeList::FunctionIndex', the return value is at index
560/// `AttributeList::ReturnIndex', and the attributes for the parameters start at
561/// index `AttributeList::FirstArgIndex'.
562class AttributeList {
563public:
564 enum AttrIndex : unsigned {
565 ReturnIndex = 0U,
566 FunctionIndex = ~0U,
567 FirstArgIndex = 1,
568 };
569
570private:
571 friend class AttrBuilder;
572 friend class AttributeListImpl;
573 friend class AttributeSet;
574 friend class AttributeSetNode;
575 template <typename Ty, typename Enable> friend struct DenseMapInfo;
576
577 /// The attributes that we are managing. This can be null to represent
578 /// the empty attributes list.
579 AttributeListImpl *pImpl = nullptr;
580
581public:
582 /// Create an AttributeList with the specified parameters in it.
584 get(LLVMContext &C, ArrayRef<std::pair<unsigned, Attribute>> Attrs);
586 get(LLVMContext &C, ArrayRef<std::pair<unsigned, AttributeSet>> Attrs);
587
588 /// Create an AttributeList from attribute sets for a function, its
589 /// return value, and all of its arguments.
591 AttributeSet RetAttrs,
592 ArrayRef<AttributeSet> ArgAttrs);
593
594private:
595 explicit AttributeList(AttributeListImpl *LI) : pImpl(LI) {}
596
597 static AttributeList getImpl(LLVMContext &C, ArrayRef<AttributeSet> AttrSets);
598
599public:
600 AttributeList() = default;
601
602 //===--------------------------------------------------------------------===//
603 // AttributeList Construction and Mutation
604 //===--------------------------------------------------------------------===//
605
606 /// Return an AttributeList with the specified parameters in it.
607 LLVM_ABI static AttributeList get(LLVMContext &C,
608 ArrayRef<AttributeList> Attrs);
609 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
610 ArrayRef<Attribute::AttrKind> Kinds);
611 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
612 ArrayRef<Attribute::AttrKind> Kinds,
613 ArrayRef<uint64_t> Values);
614 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
615 ArrayRef<StringRef> Kind);
616 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
617 AttributeSet Attrs);
618 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
619 const AttrBuilder &B);
620
621 /// Set the attribute set at the given index.
622 /// Returns a new list because attribute lists are immutable.
623 [[nodiscard]] LLVM_ABI AttributeList setAttributesAtIndex(
624 LLVMContext &C, unsigned Index, AttributeSet Attrs) const;
625
626 // TODO: remove non-AtIndex versions of these methods.
627 /// Add an attribute to the attribute set at the given index.
628 /// Returns a new list because attribute lists are immutable.
629 [[nodiscard]] LLVM_ABI AttributeList addAttributeAtIndex(
630 LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const;
631
632 /// Add an attribute to the attribute set at the given index.
633 /// Returns a new list because attribute lists are immutable.
634 [[nodiscard]] LLVM_ABI AttributeList
635 addAttributeAtIndex(LLVMContext &C, unsigned Index, StringRef Kind,
636 StringRef Value = StringRef()) const;
637
638 /// Add an attribute to the attribute set at the given index.
639 /// Returns a new list because attribute lists are immutable.
640 [[nodiscard]] LLVM_ABI AttributeList addAttributeAtIndex(LLVMContext &C,
641 unsigned Index,
642 Attribute A) const;
643
644 /// Add attributes to the attribute set at the given index.
645 /// Returns a new list because attribute lists are immutable.
646 [[nodiscard]] LLVM_ABI AttributeList addAttributesAtIndex(
647 LLVMContext &C, unsigned Index, const AttrBuilder &B) const;
648
649 /// Add attributes to the attribute set at the given index, as
650 /// AttributeSet::addAttributes does. Returns a new list because attribute
651 /// lists are immutable.
652 [[nodiscard]] LLVM_ABI AttributeList addSortedAttributesAtIndex(
653 LLVMContext &C, unsigned Index, ArrayRef<Attribute> Attrs) const;
654
655 /// Add a function attribute to the list. Returns a new list because
656 /// attribute lists are immutable.
657 [[nodiscard]] AttributeList addFnAttribute(LLVMContext &C,
658 Attribute::AttrKind Kind) const {
659 return addAttributeAtIndex(C, FunctionIndex, Kind);
660 }
661
662 /// Add a function attribute to the list. Returns a new list because
663 /// attribute lists are immutable.
664 [[nodiscard]] AttributeList addFnAttribute(LLVMContext &C,
665 Attribute Attr) const {
666 return addAttributeAtIndex(C, FunctionIndex, Attr);
667 }
668
669 /// Add a function attribute to the list. Returns a new list because
670 /// attribute lists are immutable.
671 [[nodiscard]] AttributeList
672 addFnAttribute(LLVMContext &C, StringRef Kind,
673 StringRef Value = StringRef()) const {
674 return addAttributeAtIndex(C, FunctionIndex, Kind, Value);
675 }
676
677 /// Add function attribute to the list. Returns a new list because
678 /// attribute lists are immutable.
679 [[nodiscard]] AttributeList addFnAttributes(LLVMContext &C,
680 const AttrBuilder &B) const {
681 return addAttributesAtIndex(C, FunctionIndex, B);
682 }
683
684 /// Add a return value attribute to the list. Returns a new list because
685 /// attribute lists are immutable.
686 [[nodiscard]] AttributeList addRetAttribute(LLVMContext &C,
687 Attribute::AttrKind Kind) const {
688 return addAttributeAtIndex(C, ReturnIndex, Kind);
689 }
690
691 /// Add a return value attribute to the list. Returns a new list because
692 /// attribute lists are immutable.
693 [[nodiscard]] AttributeList addRetAttribute(LLVMContext &C,
694 Attribute Attr) const {
695 return addAttributeAtIndex(C, ReturnIndex, Attr);
696 }
697
698 /// Add a return value attribute to the list. Returns a new list because
699 /// attribute lists are immutable.
700 [[nodiscard]] AttributeList addRetAttributes(LLVMContext &C,
701 const AttrBuilder &B) const {
702 return addAttributesAtIndex(C, ReturnIndex, B);
703 }
704
705 /// Add a return value attribute to the list. Returns a new list because
706 /// attribute lists are immutable.
707 [[nodiscard]] AttributeList
708 maybeAddRetAttribute(LLVMContext &C, Attribute::AttrKind Kind) const {
709 if (Kind != Attribute::AttrKind::None)
710 return addAttributeAtIndex(C, ReturnIndex, Kind);
711 return *this;
712 }
713
714 /// Add an argument attribute to the list. Returns a new list because
715 /// attribute lists are immutable.
716 [[nodiscard]] AttributeList
717 addParamAttribute(LLVMContext &C, unsigned ArgNo,
718 Attribute::AttrKind Kind) const {
719 return addAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
720 }
721
722 /// Add an argument attribute to the list. Returns a new list because
723 /// attribute lists are immutable.
724 [[nodiscard]] AttributeList
725 addParamAttribute(LLVMContext &C, unsigned ArgNo, StringRef Kind,
726 StringRef Value = StringRef()) const {
727 return addAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind, Value);
728 }
729
730 /// Add an attribute to the attribute list at the given arg indices. Returns a
731 /// new list because attribute lists are immutable.
732 [[nodiscard]] LLVM_ABI AttributeList addParamAttribute(
733 LLVMContext &C, ArrayRef<unsigned> ArgNos, Attribute A) const;
734
735 /// Add an argument attribute to the list. Returns a new list because
736 /// attribute lists are immutable.
737 [[nodiscard]] AttributeList addParamAttributes(LLVMContext &C, unsigned ArgNo,
738 const AttrBuilder &B) const {
739 return addAttributesAtIndex(C, ArgNo + FirstArgIndex, B);
740 }
741
742 /// Add an argument attribute to the list. Returns a new list because
743 /// attribute lists are immutable.
744 [[nodiscard]] AttributeList
745 maybeAddParamAttribute(LLVMContext &C, unsigned ArgNo,
746 Attribute::AttrKind Kind) const {
747 if (Kind != Attribute::AttrKind::None)
748 return addParamAttribute(C, ArgNo, Kind);
749 return *this;
750 }
751
752 /// Remove the specified attribute at the specified index from this
753 /// attribute list. Returns a new list because attribute lists are immutable.
754 [[nodiscard]] LLVM_ABI AttributeList removeAttributeAtIndex(
755 LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const;
756
757 /// Remove the specified attribute at the specified index from this
758 /// attribute list. Returns a new list because attribute lists are immutable.
759 [[nodiscard]] LLVM_ABI AttributeList
760 removeAttributeAtIndex(LLVMContext &C, unsigned Index, StringRef Kind) const;
761 [[nodiscard]] AttributeList removeAttribute(LLVMContext &C, unsigned Index,
762 StringRef Kind) const {
763 return removeAttributeAtIndex(C, Index, Kind);
764 }
765
766 /// Remove the specified attributes at the specified index from this
767 /// attribute list. Returns a new list because attribute lists are immutable.
768 [[nodiscard]] LLVM_ABI AttributeList removeAttributesAtIndex(
769 LLVMContext &C, unsigned Index, const AttributeMask &AttrsToRemove) const;
770
771 /// Remove all attributes at the specified index from this
772 /// attribute list. Returns a new list because attribute lists are immutable.
773 [[nodiscard]] LLVM_ABI AttributeList
774 removeAttributesAtIndex(LLVMContext &C, unsigned Index) const;
775
776 /// Remove the specified attribute at the function index from this
777 /// attribute list. Returns a new list because attribute lists are immutable.
778 [[nodiscard]] AttributeList
779 removeFnAttribute(LLVMContext &C, Attribute::AttrKind Kind) const {
780 return removeAttributeAtIndex(C, FunctionIndex, Kind);
781 }
782
783 /// Remove the specified attribute at the function index from this
784 /// attribute list. Returns a new list because attribute lists are immutable.
785 [[nodiscard]] AttributeList removeFnAttribute(LLVMContext &C,
786 StringRef Kind) const {
787 return removeAttributeAtIndex(C, FunctionIndex, Kind);
788 }
789
790 /// Remove the specified attribute at the function index from this
791 /// attribute list. Returns a new list because attribute lists are immutable.
792 [[nodiscard]] AttributeList
793 removeFnAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const {
794 return removeAttributesAtIndex(C, FunctionIndex, AttrsToRemove);
795 }
796
797 /// Remove the attributes at the function index from this
798 /// attribute list. Returns a new list because attribute lists are immutable.
799 [[nodiscard]] AttributeList removeFnAttributes(LLVMContext &C) const {
800 return removeAttributesAtIndex(C, FunctionIndex);
801 }
802
803 /// Remove the specified attribute at the return value index from this
804 /// attribute list. Returns a new list because attribute lists are immutable.
805 [[nodiscard]] AttributeList
806 removeRetAttribute(LLVMContext &C, Attribute::AttrKind Kind) const {
807 return removeAttributeAtIndex(C, ReturnIndex, Kind);
808 }
809
810 /// Remove the specified attribute at the return value index from this
811 /// attribute list. Returns a new list because attribute lists are immutable.
812 [[nodiscard]] AttributeList removeRetAttribute(LLVMContext &C,
813 StringRef Kind) const {
814 return removeAttributeAtIndex(C, ReturnIndex, Kind);
815 }
816
817 /// Remove the specified attribute at the return value index from this
818 /// attribute list. Returns a new list because attribute lists are immutable.
819 [[nodiscard]] AttributeList
820 removeRetAttributes(LLVMContext &C,
821 const AttributeMask &AttrsToRemove) const {
822 return removeAttributesAtIndex(C, ReturnIndex, AttrsToRemove);
823 }
824
825 /// Remove the specified attribute at the specified arg index from this
826 /// attribute list. Returns a new list because attribute lists are immutable.
827 [[nodiscard]] AttributeList
828 removeParamAttribute(LLVMContext &C, unsigned ArgNo,
829 Attribute::AttrKind Kind) const {
830 return removeAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
831 }
832
833 /// Remove the specified attribute at the specified arg index from this
834 /// attribute list. Returns a new list because attribute lists are immutable.
835 [[nodiscard]] AttributeList
836 removeParamAttribute(LLVMContext &C, unsigned ArgNo, StringRef Kind) const {
837 return removeAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
838 }
839
840 /// Remove the specified attribute at the specified arg index from this
841 /// attribute list. Returns a new list because attribute lists are immutable.
842 [[nodiscard]] AttributeList
843 removeParamAttributes(LLVMContext &C, unsigned ArgNo,
844 const AttributeMask &AttrsToRemove) const {
845 return removeAttributesAtIndex(C, ArgNo + FirstArgIndex, AttrsToRemove);
846 }
847
848 /// Remove all attributes at the specified arg index from this
849 /// attribute list. Returns a new list because attribute lists are immutable.
850 [[nodiscard]] AttributeList removeParamAttributes(LLVMContext &C,
851 unsigned ArgNo) const {
852 return removeAttributesAtIndex(C, ArgNo + FirstArgIndex);
853 }
854
855 /// Replace the type contained by attribute \p AttrKind at index \p ArgNo wih
856 /// \p ReplacementTy, preserving all other attributes.
857 [[nodiscard]] AttributeList
858 replaceAttributeTypeAtIndex(LLVMContext &C, unsigned ArgNo,
859 Attribute::AttrKind Kind,
860 Type *ReplacementTy) const {
861 Attribute Attr = getAttributeAtIndex(ArgNo, Kind);
862 auto Attrs = removeAttributeAtIndex(C, ArgNo, Kind);
863 return Attrs.addAttributeAtIndex(C, ArgNo,
864 Attr.getWithNewType(C, ReplacementTy));
865 }
866
867 /// \brief Add the dereferenceable attribute to the attribute set at the given
868 /// index. Returns a new list because attribute lists are immutable.
869 [[nodiscard]] LLVM_ABI AttributeList
870 addDereferenceableRetAttr(LLVMContext &C, uint64_t Bytes) const;
871
872 /// \brief Add the dereferenceable attribute to the attribute set at the given
873 /// arg index. Returns a new list because attribute lists are immutable.
874 [[nodiscard]] LLVM_ABI AttributeList addDereferenceableParamAttr(
875 LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const;
876
877 /// Add the dereferenceable_or_null attribute to the attribute set at
878 /// the given arg index. Returns a new list because attribute lists are
879 /// immutable.
880 [[nodiscard]] LLVM_ABI AttributeList addDereferenceableOrNullParamAttr(
881 LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const;
882
883 /// Add the range attribute to the attribute set at the return value index.
884 /// Returns a new list because attribute lists are immutable.
885 [[nodiscard]] LLVM_ABI AttributeList
886 addRangeRetAttr(LLVMContext &C, const ConstantRange &CR) const;
887
888 /// Add the allocsize attribute to the attribute set at the given arg index.
889 /// Returns a new list because attribute lists are immutable.
890 [[nodiscard]] LLVM_ABI AttributeList
891 addAllocSizeParamAttr(LLVMContext &C, unsigned ArgNo, unsigned ElemSizeArg,
892 const std::optional<unsigned> &NumElemsArg) const;
893
894 /// Try to intersect this AttributeList with Other. Returns std::nullopt if
895 /// the two lists are inherently incompatible (imply different behavior, not
896 /// just analysis).
897 [[nodiscard]] LLVM_ABI std::optional<AttributeList>
898 intersectWith(LLVMContext &C, AttributeList Other) const;
899
900 //===--------------------------------------------------------------------===//
901 // AttributeList Accessors
902 //===--------------------------------------------------------------------===//
903
904 /// The attributes for the specified index are returned.
905 LLVM_ABI AttributeSet getAttributes(unsigned Index) const;
906
907 /// The attributes for the argument or parameter at the given index are
908 /// returned.
909 LLVM_ABI AttributeSet getParamAttrs(unsigned ArgNo) const;
910
911 /// The attributes for the ret value are returned.
912 LLVM_ABI AttributeSet getRetAttrs() const;
913
914 /// The function attributes are returned.
915 LLVM_ABI AttributeSet getFnAttrs() const;
916
917 /// Return true if the attribute exists at the given index.
918 LLVM_ABI bool hasAttributeAtIndex(unsigned Index,
919 Attribute::AttrKind Kind) const;
920
921 /// Return true if the attribute exists at the given index.
922 LLVM_ABI bool hasAttributeAtIndex(unsigned Index, StringRef Kind) const;
923
924 /// Return true if attribute exists at the given index.
925 LLVM_ABI bool hasAttributesAtIndex(unsigned Index) const;
926
927 /// Return true if the attribute exists for the given argument
928 bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
929 return hasAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
930 }
931
932 /// Return true if the attribute exists for the given argument
933 bool hasParamAttr(unsigned ArgNo, StringRef Kind) const {
934 return hasAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
935 }
936
937 /// Return true if attributes exists for the given argument
938 bool hasParamAttrs(unsigned ArgNo) const {
939 return hasAttributesAtIndex(ArgNo + FirstArgIndex);
940 }
941
942 /// Return true if the attribute exists for the return value.
943 bool hasRetAttr(Attribute::AttrKind Kind) const {
944 return hasAttributeAtIndex(ReturnIndex, Kind);
945 }
946
947 /// Return true if the attribute exists for the return value.
948 bool hasRetAttr(StringRef Kind) const {
949 return hasAttributeAtIndex(ReturnIndex, Kind);
950 }
951
952 /// Return true if attributes exist for the return value.
953 bool hasRetAttrs() const { return hasAttributesAtIndex(ReturnIndex); }
954
955 /// Return true if the attribute exists for the function.
956 LLVM_ABI bool hasFnAttr(Attribute::AttrKind Kind) const;
957
958 /// Return true if the attribute exists for the function.
959 LLVM_ABI bool hasFnAttr(StringRef Kind) const;
960
961 /// Return true the attributes exist for the function.
962 bool hasFnAttrs() const { return hasAttributesAtIndex(FunctionIndex); }
963
964 /// Return true if the specified attribute is set for at least one
965 /// parameter or for the return value. If Index is not nullptr, the index
966 /// of a parameter with the specified attribute is provided.
967 LLVM_ABI bool hasAttrSomewhere(Attribute::AttrKind Kind,
968 unsigned *Index = nullptr) const;
969
970 /// Return the attribute object that exists at the given index.
971 LLVM_ABI Attribute getAttributeAtIndex(unsigned Index,
972 Attribute::AttrKind Kind) const;
973
974 /// Return the attribute object that exists at the given index.
975 LLVM_ABI Attribute getAttributeAtIndex(unsigned Index, StringRef Kind) const;
976
977 /// Return the attribute object that exists at the arg index.
978 Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
979 return getAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
980 }
981
982 /// Return the attribute object that exists at the given index.
983 Attribute getParamAttr(unsigned ArgNo, StringRef Kind) const {
984 return getAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
985 }
986
987 /// Return the attribute object that exists for the function.
988 Attribute getFnAttr(Attribute::AttrKind Kind) const {
989 return getAttributeAtIndex(FunctionIndex, Kind);
990 }
991
992 /// Return the attribute object that exists for the function.
993 Attribute getFnAttr(StringRef Kind) const {
994 return getAttributeAtIndex(FunctionIndex, Kind);
995 }
996
997 /// Return the attribute for the given attribute kind for the return value.
998 Attribute getRetAttr(Attribute::AttrKind Kind) const {
999 return getAttributeAtIndex(ReturnIndex, Kind);
1000 }
1001
1002 /// Return the alignment of the return value.
1003 LLVM_ABI MaybeAlign getRetAlignment() const;
1004
1005 /// Return the alignment for the specified function parameter.
1006 LLVM_ABI MaybeAlign getParamAlignment(unsigned ArgNo) const;
1007
1008 /// Return the stack alignment for the specified function parameter.
1009 LLVM_ABI MaybeAlign getParamStackAlignment(unsigned ArgNo) const;
1010
1011 /// Return the byval type for the specified function parameter.
1012 LLVM_ABI Type *getParamByValType(unsigned ArgNo) const;
1013
1014 /// Return the sret type for the specified function parameter.
1015 LLVM_ABI Type *getParamStructRetType(unsigned ArgNo) const;
1016
1017 /// Return the byref type for the specified function parameter.
1018 LLVM_ABI Type *getParamByRefType(unsigned ArgNo) const;
1019
1020 /// Return the preallocated type for the specified function parameter.
1021 LLVM_ABI Type *getParamPreallocatedType(unsigned ArgNo) const;
1022
1023 /// Return the inalloca type for the specified function parameter.
1024 LLVM_ABI Type *getParamInAllocaType(unsigned ArgNo) const;
1025
1026 /// Return the elementtype type for the specified function parameter.
1027 LLVM_ABI Type *getParamElementType(unsigned ArgNo) const;
1028
1029 /// Get the stack alignment of the function.
1030 LLVM_ABI MaybeAlign getFnStackAlignment() const;
1031
1032 /// Get the stack alignment of the return value.
1033 LLVM_ABI MaybeAlign getRetStackAlignment() const;
1034
1035 /// Get the number of dereferenceable bytes (or zero if unknown) of the return
1036 /// value.
1037 LLVM_ABI uint64_t getRetDereferenceableBytes() const;
1038
1039 /// Get the number of dereferenceable bytes (or zero if unknown) of an arg.
1040 LLVM_ABI uint64_t getParamDereferenceableBytes(unsigned Index) const;
1041
1042 /// Get the number of dereferenceable_or_null bytes (or zero if unknown) of
1043 /// the return value.
1044 LLVM_ABI uint64_t getRetDereferenceableOrNullBytes() const;
1045
1046 /// Get the number of dead_on_return bytes (or zero if unknown) of an arg.
1047 LLVM_ABI DeadOnReturnInfo getDeadOnReturnInfo(unsigned Index) const;
1048
1049 /// Get the number of dereferenceable_or_null bytes (or zero if unknown) of an
1050 /// arg.
1051 LLVM_ABI uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const;
1052
1053 /// Get range (or std::nullopt if unknown) of an arg.
1054 LLVM_ABI std::optional<ConstantRange> getParamRange(unsigned ArgNo) const;
1055
1056 /// Get the disallowed floating-point classes of the return value.
1057 LLVM_ABI FPClassTest getRetNoFPClass() const;
1058
1059 /// Get the disallowed floating-point classes of the argument value.
1060 LLVM_ABI FPClassTest getParamNoFPClass(unsigned ArgNo) const;
1061
1062 /// Get the unwind table kind requested for the function.
1063 LLVM_ABI UWTableKind getUWTableKind() const;
1064
1065 LLVM_ABI AllocFnKind getAllocKind() const;
1066
1067 /// Returns memory effects of the function.
1068 LLVM_ABI MemoryEffects getMemoryEffects() const;
1069
1070 /// Return the attributes at the index as a string.
1071 LLVM_ABI std::string getAsString(unsigned Index,
1072 bool InAttrGrp = false) const;
1073
1074 /// Return true if this attribute list belongs to the LLVMContext.
1075 LLVM_ABI bool hasParentContext(LLVMContext &C) const;
1076
1077 //===--------------------------------------------------------------------===//
1078 // AttributeList Introspection
1079 //===--------------------------------------------------------------------===//
1080
1081 using iterator = const AttributeSet *;
1082
1083 LLVM_ABI iterator begin() const;
1084 LLVM_ABI iterator end() const;
1085
1086 LLVM_ABI unsigned getNumAttrSets() const;
1087
1088 // Implementation of indexes(). Produces iterators that wrap an index. Mostly
1089 // to hide the awkwardness of unsigned wrapping when iterating over valid
1090 // indexes.
1091 struct index_iterator {
1092 unsigned NumAttrSets;
1093 index_iterator(int NumAttrSets) : NumAttrSets(NumAttrSets) {}
1094 struct int_wrapper {
1095 int_wrapper(unsigned i) : i(i) {}
1096 unsigned i;
1097 unsigned operator*() { return i; }
1098 bool operator!=(const int_wrapper &Other) { return i != Other.i; }
1099 int_wrapper &operator++() {
1100 // This is expected to undergo unsigned wrapping since FunctionIndex is
1101 // ~0 and that's where we start.
1102 ++i;
1103 return *this;
1104 }
1105 };
1106
1107 int_wrapper begin() { return int_wrapper(AttributeList::FunctionIndex); }
1108
1109 int_wrapper end() { return int_wrapper(NumAttrSets - 1); }
1110 };
1111
1112 /// Use this to iterate over the valid attribute indexes.
1113 index_iterator indexes() const { return index_iterator(getNumAttrSets()); }
1114
1115 /// operator==/!= - Provide equality predicates.
1116 bool operator==(const AttributeList &RHS) const { return pImpl == RHS.pImpl; }
1117 bool operator!=(const AttributeList &RHS) const { return pImpl != RHS.pImpl; }
1118
1119 /// Return a raw pointer that uniquely identifies this attribute list.
1120 void *getRawPointer() const {
1121 return pImpl;
1122 }
1123
1124 /// Return true if there are no attributes.
1125 bool isEmpty() const { return pImpl == nullptr; }
1126
1127 LLVM_ABI void print(raw_ostream &O) const;
1128
1129 LLVM_ABI void dump() const;
1130};
1131
1132//===----------------------------------------------------------------------===//
1133/// \class
1134/// Provide DenseMapInfo for AttributeList.
1135template <> struct DenseMapInfo<AttributeList, void> {
1136 static unsigned getHashValue(AttributeList AS) {
1137 return DenseMapInfo<const void *>::getHashValue(AS.pImpl);
1138 }
1139
1140 static bool isEqual(AttributeList LHS, AttributeList RHS) {
1141 return LHS == RHS;
1142 }
1143};
1144
1145//===----------------------------------------------------------------------===//
1146/// \class
1147/// This class is used in conjunction with the Attribute::get method to
1148/// create an Attribute object. The object itself is uniquified. The Builder's
1149/// value, however, is not. So this can be used as a quick way to test for
1150/// equality, presence of attributes, etc.
1151class AttrBuilder {
1152 LLVMContext &Ctx;
1153 SmallVector<Attribute, 8> Attrs;
1154
1155public:
1156 AttrBuilder(LLVMContext &Ctx) : Ctx(Ctx) {}
1157 AttrBuilder(const AttrBuilder &) = delete;
1158 AttrBuilder(AttrBuilder &&) = default;
1159
1160 AttrBuilder(LLVMContext &Ctx, const Attribute &A) : Ctx(Ctx) {
1161 addAttribute(A);
1162 }
1163
1164 LLVM_ABI AttrBuilder(LLVMContext &Ctx, AttributeSet AS);
1165
1166 LLVM_ABI void clear();
1167
1168 /// Add an attribute to the builder.
1169 LLVM_ABI AttrBuilder &addAttribute(Attribute::AttrKind Val);
1170
1171 /// Add the Attribute object to the builder.
1172 LLVM_ABI AttrBuilder &addAttribute(Attribute A);
1173
1174 /// Add the target-dependent attribute to the builder.
1175 LLVM_ABI AttrBuilder &addAttribute(StringRef A, StringRef V = StringRef());
1176
1177 /// Remove an attribute from the builder.
1178 LLVM_ABI AttrBuilder &removeAttribute(Attribute::AttrKind Val);
1179
1180 /// Remove the target-dependent attribute from the builder.
1181 LLVM_ABI AttrBuilder &removeAttribute(StringRef A);
1182
1183 /// Remove the target-dependent attribute from the builder.
1184 AttrBuilder &removeAttribute(Attribute A) {
1185 if (A.isStringAttribute())
1186 return removeAttribute(A.getKindAsString());
1187 else
1188 return removeAttribute(A.getKindAsEnum());
1189 }
1190
1191 /// Add the attributes from the builder. Attributes in the passed builder
1192 /// overwrite attributes in this builder if they have the same key.
1193 LLVM_ABI AttrBuilder &merge(const AttrBuilder &B);
1194
1195 /// Remove the attributes from the builder.
1196 LLVM_ABI AttrBuilder &remove(const AttributeMask &AM);
1197
1198 /// Return true if the builder has any attribute that's in the
1199 /// specified builder.
1200 LLVM_ABI bool overlaps(const AttributeMask &AM) const;
1201
1202 /// Return true if the builder has the specified attribute.
1203 LLVM_ABI bool contains(Attribute::AttrKind A) const;
1204
1205 /// Return true if the builder has the specified target-dependent
1206 /// attribute.
1207 LLVM_ABI bool contains(StringRef A) const;
1208
1209 /// Return true if the builder has IR-level attributes.
1210 bool hasAttributes() const { return !Attrs.empty(); }
1211
1212 /// Return Attribute with the given Kind. The returned attribute will be
1213 /// invalid if the Kind is not present in the builder.
1214 LLVM_ABI Attribute getAttribute(Attribute::AttrKind Kind) const;
1215
1216 /// Return Attribute with the given Kind. The returned attribute will be
1217 /// invalid if the Kind is not present in the builder.
1218 LLVM_ABI Attribute getAttribute(StringRef Kind) const;
1219
1220 /// Retrieve the range if the attribute exists (std::nullopt is returned
1221 /// otherwise).
1222 LLVM_ABI std::optional<ConstantRange> getRange() const;
1223
1224 /// Return raw (possibly packed/encoded) value of integer attribute or
1225 /// std::nullopt if not set.
1226 LLVM_ABI std::optional<uint64_t>
1227 getRawIntAttr(Attribute::AttrKind Kind) const;
1228
1229 /// Retrieve the alignment attribute, if it exists.
1230 MaybeAlign getAlignment() const {
1231 return MaybeAlign(getRawIntAttr(Attribute::Alignment).value_or(0));
1232 }
1233
1234 /// Retrieve the stack alignment attribute, if it exists.
1235 MaybeAlign getStackAlignment() const {
1236 return MaybeAlign(getRawIntAttr(Attribute::StackAlignment).value_or(0));
1237 }
1238
1239 /// Retrieve the number of dereferenceable bytes, if the
1240 /// dereferenceable attribute exists (zero is returned otherwise).
1241 uint64_t getDereferenceableBytes() const {
1242 return getRawIntAttr(Attribute::Dereferenceable).value_or(0);
1243 }
1244
1245 /// Retrieve the number of dereferenceable_or_null bytes, if the
1246 /// dereferenceable_or_null attribute exists (zero is returned otherwise).
1247 uint64_t getDereferenceableOrNullBytes() const {
1248 return getRawIntAttr(Attribute::DereferenceableOrNull).value_or(0);
1249 }
1250
1251 /// Retrieve the bitmask for nofpclass, if the nofpclass attribute exists
1252 /// (fcNone is returned otherwise).
1253 FPClassTest getNoFPClass() const {
1254 std::optional<uint64_t> Raw = getRawIntAttr(Attribute::NoFPClass);
1255 return static_cast<FPClassTest>(Raw.value_or(0));
1256 }
1257
1258 /// Retrieve type for the given type attribute.
1259 LLVM_ABI Type *getTypeAttr(Attribute::AttrKind Kind) const;
1260
1261 /// Retrieve the byval type.
1262 Type *getByValType() const { return getTypeAttr(Attribute::ByVal); }
1263
1264 /// Retrieve the sret type.
1265 Type *getStructRetType() const { return getTypeAttr(Attribute::StructRet); }
1266
1267 /// Retrieve the byref type.
1268 Type *getByRefType() const { return getTypeAttr(Attribute::ByRef); }
1269
1270 /// Retrieve the preallocated type.
1271 Type *getPreallocatedType() const {
1272 return getTypeAttr(Attribute::Preallocated);
1273 }
1274
1275 /// Retrieve the inalloca type.
1276 Type *getInAllocaType() const { return getTypeAttr(Attribute::InAlloca); }
1277
1278 /// Retrieve the allocsize args, or std::nullopt if the attribute does not
1279 /// exist.
1280 LLVM_ABI std::optional<std::pair<unsigned, std::optional<unsigned>>>
1281 getAllocSizeArgs() const;
1282
1283 /// Add integer attribute with raw value (packed/encoded if necessary).
1284 LLVM_ABI AttrBuilder &addRawIntAttr(Attribute::AttrKind Kind, uint64_t Value);
1285
1286 /// This turns an alignment into the form used internally in Attribute.
1287 /// This call has no effect if Align is not set.
1288 LLVM_ABI AttrBuilder &addAlignmentAttr(MaybeAlign Align);
1289
1290 /// This turns an int alignment (which must be a power of 2) into the
1291 /// form used internally in Attribute.
1292 /// This call has no effect if Align is 0.
1293 /// Deprecated, use the version using a MaybeAlign.
1294 inline AttrBuilder &addAlignmentAttr(unsigned Align) {
1295 return addAlignmentAttr(MaybeAlign(Align));
1296 }
1297
1298 /// This turns a stack alignment into the form used internally in Attribute.
1299 /// This call has no effect if Align is not set.
1300 LLVM_ABI AttrBuilder &addStackAlignmentAttr(MaybeAlign Align);
1301
1302 /// This turns an int stack alignment (which must be a power of 2) into
1303 /// the form used internally in Attribute.
1304 /// This call has no effect if Align is 0.
1305 /// Deprecated, use the version using a MaybeAlign.
1306 inline AttrBuilder &addStackAlignmentAttr(unsigned Align) {
1307 return addStackAlignmentAttr(MaybeAlign(Align));
1308 }
1309
1310 /// This turns the number of dereferenceable bytes into the form used
1311 /// internally in Attribute.
1312 LLVM_ABI AttrBuilder &addDereferenceableAttr(uint64_t Bytes);
1313
1314 /// This turns the number of dead_on_return bytes into the form used
1315 /// internally in Attribute.
1316 LLVM_ABI AttrBuilder &addDeadOnReturnAttr(DeadOnReturnInfo Info);
1317
1318 /// This turns the number of dereferenceable_or_null bytes into the
1319 /// form used internally in Attribute.
1320 LLVM_ABI AttrBuilder &addDereferenceableOrNullAttr(uint64_t Bytes);
1321
1322 /// This turns one (or two) ints into the form used internally in Attribute.
1323 LLVM_ABI AttrBuilder &
1324 addAllocSizeAttr(unsigned ElemSizeArg,
1325 const std::optional<unsigned> &NumElemsArg);
1326
1327 /// This turns two ints into the form used internally in Attribute.
1328 LLVM_ABI AttrBuilder &addVScaleRangeAttr(unsigned MinValue,
1329 std::optional<unsigned> MaxValue);
1330
1331 /// Add a type attribute with the given type.
1332 LLVM_ABI AttrBuilder &addTypeAttr(Attribute::AttrKind Kind, Type *Ty);
1333
1334 /// This turns a byval type into the form used internally in Attribute.
1335 LLVM_ABI AttrBuilder &addByValAttr(Type *Ty);
1336
1337 /// This turns a sret type into the form used internally in Attribute.
1338 LLVM_ABI AttrBuilder &addStructRetAttr(Type *Ty);
1339
1340 /// This turns a byref type into the form used internally in Attribute.
1341 LLVM_ABI AttrBuilder &addByRefAttr(Type *Ty);
1342
1343 /// This turns a preallocated type into the form used internally in Attribute.
1344 LLVM_ABI AttrBuilder &addPreallocatedAttr(Type *Ty);
1345
1346 /// This turns an inalloca type into the form used internally in Attribute.
1347 LLVM_ABI AttrBuilder &addInAllocaAttr(Type *Ty);
1348
1349 /// Add an allocsize attribute, using the representation returned by
1350 /// Attribute.getIntValue().
1351 LLVM_ABI AttrBuilder &addAllocSizeAttrFromRawRepr(uint64_t RawAllocSizeRepr);
1352
1353 /// Add a vscale_range attribute, using the representation returned by
1354 /// Attribute.getIntValue().
1355 LLVM_ABI AttrBuilder &
1356 addVScaleRangeAttrFromRawRepr(uint64_t RawVScaleRangeRepr);
1357
1358 /// This turns the unwind table kind into the form used internally in
1359 /// Attribute.
1360 LLVM_ABI AttrBuilder &addUWTableAttr(UWTableKind Kind);
1361
1362 // This turns the allocator kind into the form used internally in Attribute.
1363 LLVM_ABI AttrBuilder &addAllocKindAttr(AllocFnKind Kind);
1364
1365 /// Add memory effect attribute.
1366 LLVM_ABI AttrBuilder &addMemoryAttr(MemoryEffects ME);
1367
1368 /// Add captures attribute.
1369 LLVM_ABI AttrBuilder &addCapturesAttr(CaptureInfo CI);
1370
1371 /// Add denormal_fpenv attribute.
1372 LLVM_ABI AttrBuilder &addDenormalFPEnvAttr(DenormalFPEnv Mode);
1373
1374 // Add nofpclass attribute
1375 LLVM_ABI AttrBuilder &addNoFPClassAttr(FPClassTest NoFPClassMask);
1376
1377 /// Add a ConstantRange attribute with the given range.
1378 LLVM_ABI AttrBuilder &addConstantRangeAttr(Attribute::AttrKind Kind,
1379 const ConstantRange &CR);
1380
1381 /// Add range attribute.
1382 LLVM_ABI AttrBuilder &addRangeAttr(const ConstantRange &CR);
1383
1384 /// Add a ConstantRangeList attribute with the given ranges.
1385 LLVM_ABI AttrBuilder &addConstantRangeListAttr(Attribute::AttrKind Kind,
1386 ArrayRef<ConstantRange> Val);
1387
1388 /// Add initializes attribute.
1389 LLVM_ABI AttrBuilder &addInitializesAttr(const ConstantRangeList &CRL);
1390
1391 /// Add 0 or more parameter attributes which are equivalent to metadata
1392 /// attached to \p I. e.g. !align -> align. This assumes the argument type is
1393 /// the same as the original instruction and the attribute is compatible.
1394 LLVM_ABI AttrBuilder &addFromEquivalentMetadata(const Instruction &I);
1395
1396 ArrayRef<Attribute> attrs() const { return Attrs; }
1397
1398 LLVM_ABI bool operator==(const AttrBuilder &B) const;
1399 bool operator!=(const AttrBuilder &B) const { return !(*this == B); }
1400};
1401
1402namespace AttributeFuncs {
1403
1404enum AttributeSafetyKind : uint8_t {
1405 ASK_SAFE_TO_DROP = 1,
1406 ASK_UNSAFE_TO_DROP = 2,
1407 ASK_ALL = ASK_SAFE_TO_DROP | ASK_UNSAFE_TO_DROP,
1408};
1409
1410/// Returns true if this is a type legal for the 'nofpclass' attribute. This
1411/// follows the same type rules as FPMathOperator.
1412LLVM_ABI bool isNoFPClassCompatibleType(Type *Ty);
1413
1414/// Which attributes cannot be applied to a type. The argument \p AS
1415/// is used as a hint for the attributes whose compatibility is being
1416/// checked against \p Ty. This does not mean the return will be a
1417/// subset of \p AS, just that attributes that have specific dynamic
1418/// type compatibilities (i.e `range`) will be checked against what is
1419/// contained in \p AS. The argument \p ASK indicates, if only
1420/// attributes that are known to be safely droppable are contained in
1421/// the mask; only attributes that might be unsafe to drop (e.g.,
1422/// ABI-related attributes) are in the mask; or both.
1423LLVM_ABI AttributeMask typeIncompatible(Type *Ty, AttributeSet AS,
1424 AttributeSafetyKind ASK = ASK_ALL);
1425
1426/// Get param/return attributes which imply immediate undefined behavior if an
1427/// invalid value is passed. For example, this includes noundef (where undef
1428/// implies UB), but not nonnull (where null implies poison). It also does not
1429/// include attributes like nocapture, which constrain the function
1430/// implementation rather than the passed value.
1431LLVM_ABI AttributeMask getUBImplyingAttributes();
1432
1433/// \returns Return true if the two functions have compatible target-independent
1434/// attributes for inlining purposes.
1436 const Function &Callee);
1437
1438/// \returns Return false if callee is strictfp and caller is not. Return true
1439/// otherwise.
1441 const Function &Callee);
1442
1443/// Checks if there are any incompatible function attributes between
1444/// \p A and \p B.
1445///
1446/// \param [in] A - The first function to be compared with.
1447/// \param [in] B - The second function to be compared with.
1448/// \returns true if the functions have compatible attributes.
1449LLVM_ABI bool areOutlineCompatible(const Function &A, const Function &B);
1450
1451/// Merge caller's and callee's attributes.
1453 const Function &Callee);
1454
1455/// Merges the functions attributes from \p ToMerge into function \p Base.
1456///
1457/// \param [in,out] Base - The function being merged into.
1458/// \param [in] ToMerge - The function to merge attributes from.
1460 const Function &ToMerge);
1461
1462/// Update min-legal-vector-width if it is in Attribute and less than Width.
1464
1465} // end namespace AttributeFuncs
1466
1467} // end namespace llvm
1468
1469#endif // LLVM_IR_ATTRIBUTES_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
uint64_t uint64_t
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:211
static std::optional< ConstantRange > getRange(Value *V, const InstrInfoQuery &IIQ)
Helper method to get range from metadata or attribute.
static LoopDeletionResult merge(LoopDeletionResult A, LoopDeletionResult B)
#define I(x, y, z)
Definition MD5.cpp:57
static Align getFnStackAlignment(const TargetSubtargetInfo &STI, const Function &F)
bool operator==(const MergedFunctionsInfo &LHS, const MergedFunctionsInfo &RHS)
return !CalleeAttrs getByValType()||CalleeAttrs.getAlignment()
II addRangeRetAttr(Range)
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
static DenormalFPEnv getDenormalFPEnv(const MachineFunction &MF)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Definition Value.cpp:480
static FPClassTest getNoFPClass(const Instruction &I)
static uint32_t getAlignment(const MCSectionCOFF &Sec)
Value * RHS
Value * LHS
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
This class represents a single, uniqued attribute.
This class represents a set of attributes that apply to the function, return type,...
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
This class represents a group of attributes that apply to one element: function, return type,...
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:406
LLVM_ABI AllocFnKind getAllocKind() const
bool hasAttributes() const
Return true if attributes exists in this set.
Definition Attributes.h:484
const Attribute * iterator
Definition Attributes.h:523
LLVM_ABI AttributeSet removeAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Remove the specified attribute from this set.
LLVM_ABI Type * getInAllocaType() const
LLVM_ABI Type * getByValType() const
LLVM_ABI DeadOnReturnInfo getDeadOnReturnInfo() const
bool operator!=(const AttributeSet &O) const
Definition Attributes.h:430
LLVM_ABI AttributeSet addAttributes(LLVMContext &C, AttributeSet AS) const
Add attributes to the attribute set.
LLVM_ABI MemoryEffects getMemoryEffects() const
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Return true if the attribute exists in this set.
bool operator==(const AttributeSet &O) const
Definition Attributes.h:429
LLVM_ABI std::optional< AttributeSet > intersectWith(LLVMContext &C, AttributeSet Other) const
Try to intersect this AttributeSet with Other.
LLVM_ABI Type * getStructRetType() const
LLVM_ABI std::string getAsString(bool InAttrGrp=false) const
~AttributeSet()=default
LLVM_ABI unsigned getVScaleRangeMin() const
LLVM_ABI std::optional< std::pair< unsigned, std::optional< unsigned > > > getAllocSizeArgs() const
LLVM_ABI UWTableKind getUWTableKind() const
LLVM_ABI bool hasParentContext(LLVMContext &C) const
Return true if this attribute set belongs to the LLVMContext.
LLVM_ABI iterator begin() const
LLVM_ABI iterator end() const
LLVM_ABI AttributeSet addSortedAttributes(LLVMContext &C, ArrayRef< Attribute > Attrs) const
Add attributes to the attribute set, replacing attributes of the same kind.
LLVM_ABI AttributeSet removeAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const
Remove the specified attributes from this set.
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
LLVM_ABI MaybeAlign getStackAlignment() const
LLVM_ABI Attribute getAttribute(Attribute::AttrKind Kind) const
Return the attribute object.
LLVM_ABI Type * getPreallocatedType() const
LLVM_ABI uint64_t getDereferenceableBytes() const
LLVM_ABI MaybeAlign getAlignment() const
LLVM_ABI FPClassTest getNoFPClass() const
friend struct DenseMapInfo
Definition Attributes.h:408
AttributeSet(const AttributeSet &)=default
LLVM_ABI Type * getElementType() const
LLVM_ABI Type * getByRefType() const
LLVM_ABI CaptureInfo getCaptureInfo() const
AttributeSet()=default
AttributeSet is a trivially copyable value type.
static LLVM_ABI AttributeSet get(LLVMContext &C, const AttrBuilder &B)
LLVM_ABI uint64_t getDereferenceableOrNullBytes() const
LLVM_ABI unsigned getNumAttributes() const
Return the number of attributes in this set.
LLVM_ABI AttributeSet addAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Add an argument attribute.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
static const unsigned NumTypeAttrKinds
Definition Attributes.h:137
LLVM_ABI bool isStringAttribute() const
Return true if the attribute is a string (target-dependent) attribute.
static LLVM_ABI Attribute getWithStructRetType(LLVMContext &Context, Type *Ty)
static LLVM_ABI bool isABIAttr(AttrKind Kind)
Whether this is an ABI attribute (for returns or arguments).
bool operator==(Attribute A) const
Equality and non-equality operators.
Definition Attributes.h:370
static LLVM_ABI Attribute::AttrKind getAttrKindFromName(StringRef AttrName)
static const unsigned NumEnumAttrKinds
Definition Attributes.h:135
LLVM_ABI bool isEnumAttribute() const
Return true if the attribute is an Attribute::AttrKind type.
static LLVM_ABI Attribute getWithStackAlignment(LLVMContext &Context, Align Alignment)
LLVM_ABI const ConstantRange & getRange() const
Returns the value of the range attribute.
static LLVM_ABI bool intersectWithCustom(AttrKind Kind)
LLVM_ABI bool isIntAttribute() const
Return true if the attribute is an integer attribute.
static LLVM_ABI Attribute getWithByRefType(LLVMContext &Context, Type *Ty)
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
LLVM_ABI uint64_t getValueAsInt() const
Return the attribute's value as an integer.
LLVM_ABI unsigned getVScaleRangeMin() const
Returns the minimum value for the vscale_range attribute.
LLVM_ABI AllocFnKind getAllocKind() const
LLVM_ABI bool isConstantRangeAttribute() const
Return true if the attribute is a ConstantRange attribute.
static LLVM_ABI Attribute getWithAllocKind(LLVMContext &Context, AllocFnKind Kind)
LLVM_ABI StringRef getKindAsString() const
Return the attribute's kind as a string.
static LLVM_ABI Attribute getWithPreallocatedType(LLVMContext &Context, Type *Ty)
static LLVM_ABI bool intersectWithMin(AttrKind Kind)
static LLVM_ABI Attribute getWithDeadOnReturnInfo(LLVMContext &Context, DeadOnReturnInfo DI)
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
static LLVM_ABI bool canUseAsRetAttr(AttrKind Kind)
static bool isTypeAttrKind(AttrKind Kind)
Definition Attributes.h:145
LLVM_ABI std::string getAsString(bool InAttrGrp=false) const
The Attribute is converted to a string of equivalent mnemonic.
LLVM_ABI uint64_t getDereferenceableOrNullBytes() const
Returns the number of dereferenceable_or_null bytes from the dereferenceable_or_null attribute.
static LLVM_ABI Attribute getWithDereferenceableBytes(LLVMContext &Context, uint64_t Bytes)
LLVM_ABI std::pair< unsigned, std::optional< unsigned > > getAllocSizeArgs() const
Returns the argument numbers for the allocsize attribute.
static LLVM_ABI Attribute getWithUWTableKind(LLVMContext &Context, UWTableKind Kind)
bool operator!=(Attribute A) const
Definition Attributes.h:371
LLVM_ABI FPClassTest getNoFPClass() const
Return the FPClassTest for nofpclass.
static LLVM_ABI Attribute getWithAllocSizeArgs(LLVMContext &Context, unsigned ElemSizeArg, const std::optional< unsigned > &NumElemsArg)
LLVM_ABI Attribute::AttrKind getKindAsEnum() const
Return the attribute's kind as an enum (Attribute::AttrKind).
Attribute()=default
LLVM_ABI bool getValueAsBool() const
Return the attribute's value as a boolean.
LLVM_ABI ArrayRef< ConstantRange > getInitializes() const
Returns the value of the initializes attribute.
LLVM_ABI const ConstantRange & getValueAsConstantRange() const
Return the attribute's value as a ConstantRange.
LLVM_ABI uint64_t getDereferenceableBytes() const
Returns the number of dereferenceable bytes from the dereferenceable attribute.
static LLVM_ABI Attribute getWithVScaleRangeArgs(LLVMContext &Context, unsigned MinValue, unsigned MaxValue)
LLVM_ABI MemoryEffects getMemoryEffects() const
Returns memory effects.
LLVM_ABI UWTableKind getUWTableKind() const
static LLVM_ABI Attribute getWithDereferenceableOrNullBytes(LLVMContext &Context, uint64_t Bytes)
LLVM_ABI ArrayRef< ConstantRange > getValueAsConstantRangeList() const
Return the attribute's value as a ConstantRange array.
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool hasKindAsEnum() const
Returns true if the attribute's kind can be represented as an enum (Enum, Integer,...
Definition Attributes.h:272
static LLVM_ABI StringRef getNameFromAttrKind(Attribute::AttrKind AttrKind)
static LLVM_ABI bool canUseAsFnAttr(AttrKind Kind)
static LLVM_ABI bool intersectWithAnd(AttrKind Kind)
static LLVM_ABI Attribute getWithNoFPClass(LLVMContext &Context, FPClassTest Mask)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:125
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
Definition Attributes.h:132
@ None
No attributes have been set.
Definition Attributes.h:127
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
Definition Attributes.h:131
@ EndAttrKinds
Sentinel value useful for loops.
Definition Attributes.h:130
static bool isConstantRangeAttrKind(AttrKind Kind)
Definition Attributes.h:148
void * getRawPointer() const
Return a raw pointer that uniquely identifies this attribute.
Definition Attributes.h:380
LLVM_ABI bool hasParentContext(LLVMContext &C) const
Return true if this attribute belongs to the LLVMContext.
LLVM_ABI bool isTypeAttribute() const
Return true if the attribute is a type attribute.
static LLVM_ABI Attribute getWithCaptureInfo(LLVMContext &Context, CaptureInfo CI)
static LLVM_ABI Attribute getWithInAllocaType(LLVMContext &Context, Type *Ty)
static bool isIntAttrKind(AttrKind Kind)
Definition Attributes.h:142
static bool isConstantRangeListAttrKind(AttrKind Kind)
Definition Attributes.h:151
LLVM_ABI bool isConstantRangeListAttribute() const
Return true if the attribute is a ConstantRangeList attribute.
static LLVM_ABI Attribute getWithByValType(LLVMContext &Context, Type *Ty)
Attribute getWithNewType(LLVMContext &Context, Type *ReplacementTy)
For a typed attribute, return the equivalent attribute with the type changed to ReplacementTy.
Definition Attributes.h:229
LLVM_ABI bool hasAttribute(AttrKind Val) const
Return true if the attribute is present.
static bool isEnumAttrKind(AttrKind Kind)
Definition Attributes.h:139
static LLVM_ABI Attribute getWithMemoryEffects(LLVMContext &Context, MemoryEffects ME)
static LLVM_ABI bool canUseAsParamAttr(AttrKind Kind)
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:262
LLVM_ABI MaybeAlign getStackAlignment() const
Returns the stack alignment field of an attribute as a byte alignment value.
static Attribute fromRawPointer(void *RawPtr)
Get an attribute from a raw pointer created by getRawPointer.
Definition Attributes.h:385
static const unsigned NumIntAttrKinds
Definition Attributes.h:136
LLVM_ABI MaybeAlign getAlignment() const
Returns the alignment field of an attribute as a byte alignment value.
LLVM_ABI CaptureInfo getCaptureInfo() const
Returns information from captures attribute.
static LLVM_ABI bool intersectMustPreserve(AttrKind Kind)
LLVM_ABI int cmpKind(Attribute A) const
Used to sort attribute by kind.
LLVM_ABI bool operator<(Attribute A) const
Less-than operator. Useful for sorting the attributes list.
static LLVM_ABI Attribute getWithAlignment(LLVMContext &Context, Align Alignment)
Return a uniquified Attribute object that has the specific alignment set.
LLVM_ABI DeadOnReturnInfo getDeadOnReturnInfo() const
Returns the number of dead_on_return bytes from the dead_on_return attribute, or std::nullopt if all ...
LLVM_ABI Type * getValueAsType() const
Return the attribute's value as a Type.
Represents which components of the pointer may be captured in which location.
Definition ModRef.h:414
This class represents a list of constant ranges.
This class represents a range of values.
static DeadOnReturnInfo createFromIntValue(uint64_t Data)
Definition Attributes.h:80
bool coversAllReachableMemory() const
Definition Attributes.h:78
uint64_t toIntValue() const
Definition Attributes.h:86
DeadOnReturnInfo(uint64_t DeadOnReturnBytes)
Definition Attributes.h:69
bool isZeroSized() const
Definition Attributes.h:92
uint64_t getNumberOfDeadBytes() const
Definition Attributes.h:71
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
struct LLVMOpaqueAttributeRef * LLVMAttributeRef
Used to represent an attributes.
Definition Types.h:145
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
Attribute
Attributes.
Definition Dwarf.h:125
iterator end() const
Definition BasicBlock.h:89
BBIterator iterator
Definition BasicBlock.h:87
LLVM_ABI iterator begin() const
LLVM_ABI std::error_code remove(const Twine &path, bool IgnoreNonExisting=true)
Remove path.
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
bool isEqual(const GCNRPTracker::LiveRegSet &S1, const GCNRPTracker::LiveRegSet &S2)
@ Unknown
Not known to have no common set bits.
@ Uninitialized
Definition Threading.h:60
APInt operator*(APInt a, uint64_t RHS)
Definition APInt.h:2261
AllocFnKind
Definition Attributes.h:54
bool operator!=(uint64_t V1, const APInt &V2)
Definition APInt.h:2139
LLVM_ABI AttributeMask typeIncompatible(Type *Ty, AttributeSet AS, AttributeSafetyKind ASK=ASK_ALL)
This class holds the attributes for a function, its return value, and its parameters.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:356
UWTableKind
Definition CodeGen.h:309
LLVM_ABI bool isStrictFPInlineCompatible(const Function &Caller, const Function &Callee)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
@ Other
Any other memory.
Definition ModRef.h:68
Attribute unwrap(LLVMAttributeRef Attr)
Definition Attributes.h:396
LLVM_ABI void mergeAttributesForOutlining(Function &Base, const Function &ToMerge)
Merges the functions attributes from ToMerge into function Base.
LLVMAttributeRef wrap(Attribute Attr)
Definition Attributes.h:391
LLVM_ABI bool areInlineCompatible(const Function &Caller, const Function &Callee)
LLVM_ABI void updateMinLegalVectorWidthAttr(Function &Fn, uint64_t Width)
Update min-legal-vector-width if it is in Attribute and less than Width.
LLVM_ABI void mergeAttributesForInlining(Function &Caller, const Function &Callee)
Merge caller's and callee's attributes.
LLVM_ABI bool areOutlineCompatible(const Function &A, const Function &B)
Checks if there are any incompatible function attributes between A and B.
LLVM_ABI AttributeMask getUBImplyingAttributes()
Get param/return attributes which imply immediate undefined behavior if an invalid value is passed.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Represents the full denormal controls for a function, including the default mode and the f32 specific...
Represent subnormal handling kind for floating point instruction inputs and outputs.
static bool isEqual(AttributeSet LHS, AttributeSet RHS)
Definition Attributes.h:540
static unsigned getHashValue(AttributeSet AS)
Definition Attributes.h:536
An information struct used to provide DenseMap with the various necessary components for a given valu...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:111
Trait to indicate whether a type's bits can be hashed directly.
Definition Hashing.h:180