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 /// Return true if the provided string matches the IR name of an attribute.
239 /// example: "noalias" return true but not "NoAlias"
240 LLVM_ABI static bool isExistingAttribute(StringRef Name);
241
242 //===--------------------------------------------------------------------===//
243 // Attribute Accessors
244 //===--------------------------------------------------------------------===//
245
246 /// Return true if the attribute is an Attribute::AttrKind type.
247 LLVM_ABI bool isEnumAttribute() const;
248
249 /// Return true if the attribute is an integer attribute.
250 LLVM_ABI bool isIntAttribute() const;
251
252 /// Return true if the attribute is a string (target-dependent)
253 /// attribute.
254 LLVM_ABI bool isStringAttribute() const;
255
256 /// Return true if the attribute is a type attribute.
257 LLVM_ABI bool isTypeAttribute() const;
258
259 /// Return true if the attribute is a ConstantRange attribute.
261
262 /// Return true if the attribute is a ConstantRangeList attribute.
264
265 /// Return true if the attribute is any kind of attribute.
266 bool isValid() const { return pImpl; }
267
268 /// Return true if the attribute is present.
269 LLVM_ABI bool hasAttribute(AttrKind Val) const;
270
271 /// Return true if the target-dependent attribute is present.
272 LLVM_ABI bool hasAttribute(StringRef Val) const;
273
274 /// Returns true if the attribute's kind can be represented as an enum (Enum,
275 /// Integer, Type, ConstantRange, or ConstantRangeList attribute).
276 bool hasKindAsEnum() const { return !isStringAttribute(); }
277
278 /// Return the attribute's kind as an enum (Attribute::AttrKind). This
279 /// requires the attribute be representable as an enum (see: `hasKindAsEnum`).
281
282 /// Return the attribute's value as an integer. This requires that the
283 /// attribute be an integer attribute.
285
286 /// Return the attribute's value as a boolean. This requires that the
287 /// attribute be a string attribute.
288 LLVM_ABI bool getValueAsBool() const;
289
290 /// Return the attribute's kind as a string. This requires the
291 /// attribute to be a string attribute.
293
294 /// Return the attribute's value as a string. This requires the
295 /// attribute to be a string attribute.
297
298 /// Return the attribute's value as a Type. This requires the attribute to be
299 /// a type attribute.
301
302 /// Return the attribute's value as a ConstantRange. This requires the
303 /// attribute to be a ConstantRange attribute.
305
306 /// Return the attribute's value as a ConstantRange array. This requires the
307 /// attribute to be a ConstantRangeList attribute.
309
310 /// Returns the alignment field of an attribute as a byte alignment
311 /// value.
313
314 /// Returns the stack alignment field of an attribute as a byte
315 /// alignment value.
317
318 /// Returns the number of dereferenceable bytes from the
319 /// dereferenceable attribute.
321
322 /// Returns the number of dead_on_return bytes from the dead_on_return
323 /// attribute, or std::nullopt if all memory reachable through the pointer is
324 /// marked dead on return.
326
327 /// Returns the number of dereferenceable_or_null bytes from the
328 /// dereferenceable_or_null attribute.
330
331 /// Returns the argument numbers for the allocsize attribute.
332 LLVM_ABI std::pair<unsigned, std::optional<unsigned>>
333 getAllocSizeArgs() const;
334
335 /// Returns the minimum value for the vscale_range attribute.
336 LLVM_ABI unsigned getVScaleRangeMin() const;
337
338 /// Returns the maximum value for the vscale_range attribute or std::nullopt
339 /// when unknown.
340 LLVM_ABI std::optional<unsigned> getVScaleRangeMax() const;
341
342 // Returns the unwind table kind.
344
345 // Returns the allocator function kind.
347
348 /// Returns memory effects.
350
351 /// Returns denormal_fpenv.
353
354 /// Returns information from captures attribute.
356
357 /// Return the FPClassTest for nofpclass
359
360 /// Returns the value of the range attribute.
361 LLVM_ABI const ConstantRange &getRange() const;
362
363 /// Returns the value of the initializes attribute.
365
366 /// The Attribute is converted to a string of equivalent mnemonic. This
367 /// is, presumably, for writing out the mnemonics for the assembly writer.
368 LLVM_ABI std::string getAsString(bool InAttrGrp = false) const;
369
370 /// Return true if this attribute belongs to the LLVMContext.
372
373 /// Equality and non-equality operators.
374 bool operator==(Attribute A) const { return pImpl == A.pImpl; }
375 bool operator!=(Attribute A) const { return pImpl != A.pImpl; }
376
377 /// Used to sort attribute by kind.
378 LLVM_ABI int cmpKind(Attribute A) const;
379
380 /// Less-than operator. Useful for sorting the attributes list.
381 LLVM_ABI bool operator<(Attribute A) const;
382
383 /// Return a raw pointer that uniquely identifies this attribute.
384 void *getRawPointer() const {
385 return pImpl;
386 }
387
388 /// Get an attribute from a raw pointer created by getRawPointer.
389 static Attribute fromRawPointer(void *RawPtr) {
390 return Attribute(reinterpret_cast<AttributeImpl*>(RawPtr));
391 }
392};
393
394// Specialized opaque value conversions.
396 return reinterpret_cast<LLVMAttributeRef>(Attr.getRawPointer());
397}
398
399// Specialized opaque value conversions.
401 return Attribute::fromRawPointer(Attr);
402}
403
404//===----------------------------------------------------------------------===//
405/// \class
406/// This class holds the attributes for a particular argument, parameter,
407/// function, or return value. It is an immutable value type that is cheap to
408/// copy. Adding and removing enum attributes is intended to be fast, but adding
409/// and removing string or integer attributes involves a FoldingSet lookup.
410class AttributeSet {
411 friend AttributeListImpl;
412 template <typename Ty, typename Enable> friend struct DenseMapInfo;
413
414 // TODO: Extract AvailableAttrs from AttributeSetNode and store them here.
415 // This will allow an efficient implementation of addAttribute and
416 // removeAttribute for enum attrs.
417
418 /// Private implementation pointer.
419 AttributeSetNode *SetNode = nullptr;
420
421private:
422 explicit AttributeSet(AttributeSetNode *ASN) : SetNode(ASN) {}
423
424public:
425 /// AttributeSet is a trivially copyable value type.
426 AttributeSet() = default;
427 AttributeSet(const AttributeSet &) = default;
428 ~AttributeSet() = default;
429
430 LLVM_ABI static AttributeSet get(LLVMContext &C, const AttrBuilder &B);
431 LLVM_ABI static AttributeSet get(LLVMContext &C, ArrayRef<Attribute> Attrs);
432
433 bool operator==(const AttributeSet &O) const { return SetNode == O.SetNode; }
434 bool operator!=(const AttributeSet &O) const { return !(*this == O); }
435
436 /// Add an argument attribute. Returns a new set because attribute sets are
437 /// immutable.
438 [[nodiscard]] LLVM_ABI AttributeSet
440
441 /// Add a target-dependent attribute. Returns a new set because attribute sets
442 /// are immutable.
443 [[nodiscard]] LLVM_ABI AttributeSet addAttribute(
444 LLVMContext &C, StringRef Kind, StringRef Value = StringRef()) const;
445
446 /// Add attributes to the attribute set. Returns a new set because attribute
447 /// sets are immutable.
449 AttributeSet AS) const;
450
451 /// Add attributes to the attribute set. Returns a new set because attribute
452 /// sets are immutable.
454 const AttrBuilder &B) const;
455
456 /// Remove the specified attribute from this set. Returns a new set because
457 /// attribute sets are immutable.
458 [[nodiscard]] LLVM_ABI AttributeSet
460
461 /// Remove the specified attribute from this set. Returns a new set because
462 /// attribute sets are immutable.
464 StringRef Kind) const;
465
466 /// Remove the specified attributes from this set. Returns a new set because
467 /// attribute sets are immutable.
468 [[nodiscard]] LLVM_ABI AttributeSet
469 removeAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const;
470
471 /// Try to intersect this AttributeSet with Other. Returns std::nullopt if
472 /// the two lists are inherently incompatible (imply different behavior, not
473 /// just analysis).
474 [[nodiscard]] LLVM_ABI std::optional<AttributeSet>
476
477 /// Return the number of attributes in this set.
478 LLVM_ABI unsigned getNumAttributes() const;
479
480 /// Return true if attributes exists in this set.
481 bool hasAttributes() const { return SetNode != nullptr; }
482
483 /// Return true if the attribute exists in this set.
485
486 /// Return true if the attribute exists in this set.
487 LLVM_ABI bool hasAttribute(StringRef Kind) const;
488
489 /// Return the attribute object.
491
492 /// Return the target-dependent attribute object.
494
500 LLVM_ABI Type *getByValType() const;
502 LLVM_ABI Type *getByRefType() const;
506 LLVM_ABI std::optional<std::pair<unsigned, std::optional<unsigned>>>
507 getAllocSizeArgs() const;
508 LLVM_ABI unsigned getVScaleRangeMin() const;
509 LLVM_ABI std::optional<unsigned> getVScaleRangeMax() const;
515 LLVM_ABI std::string getAsString(bool InAttrGrp = false) const;
516
517 /// Return true if this attribute set belongs to the LLVMContext.
519
520 using iterator = const Attribute *;
521
522 LLVM_ABI iterator begin() const;
523 LLVM_ABI iterator end() const;
524#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
525 void dump() const;
526#endif
527};
528
529//===----------------------------------------------------------------------===//
530/// \class
531/// Provide DenseMapInfo for AttributeSet.
532template <> struct DenseMapInfo<AttributeSet, void> {
533 static unsigned getHashValue(AttributeSet AS) {
535 }
536
537 static bool isEqual(AttributeSet LHS, AttributeSet RHS) { return LHS == RHS; }
538};
539
540namespace hashing::detail {
541// Attribute and AttributeSet are trivial wrappers whose operator== is pointer
542// equality, so hashing the bytes is equivalent to hashing the values. Define
543// is_hashable_data to pick the contiguous hash_combine_range path.
544template <> struct is_hashable_data<Attribute> : std::true_type {};
545template <> struct is_hashable_data<AttributeSet> : std::true_type {};
546static_assert(std::has_unique_object_representations_v<Attribute> &&
547 std::has_unique_object_representations_v<AttributeSet>,
548 "hashing the bytes requires unique object representations");
549} // namespace hashing::detail
550
551//===----------------------------------------------------------------------===//
552/// \class
553/// This class holds the attributes for a function, its return value, and
554/// its parameters. You access the attributes for each of them via an index into
555/// the AttributeList object. The function attributes are at index
556/// `AttributeList::FunctionIndex', the return value is at index
557/// `AttributeList::ReturnIndex', and the attributes for the parameters start at
558/// index `AttributeList::FirstArgIndex'.
559class AttributeList {
560public:
561 enum AttrIndex : unsigned {
562 ReturnIndex = 0U,
563 FunctionIndex = ~0U,
564 FirstArgIndex = 1,
565 };
566
567private:
568 friend class AttrBuilder;
569 friend class AttributeListImpl;
570 friend class AttributeSet;
571 friend class AttributeSetNode;
572 template <typename Ty, typename Enable> friend struct DenseMapInfo;
573
574 /// The attributes that we are managing. This can be null to represent
575 /// the empty attributes list.
576 AttributeListImpl *pImpl = nullptr;
577
578public:
579 /// Create an AttributeList with the specified parameters in it.
581 get(LLVMContext &C, ArrayRef<std::pair<unsigned, Attribute>> Attrs);
583 get(LLVMContext &C, ArrayRef<std::pair<unsigned, AttributeSet>> Attrs);
584
585 /// Create an AttributeList from attribute sets for a function, its
586 /// return value, and all of its arguments.
588 AttributeSet RetAttrs,
589 ArrayRef<AttributeSet> ArgAttrs);
590
591private:
592 explicit AttributeList(AttributeListImpl *LI) : pImpl(LI) {}
593
594 static AttributeList getImpl(LLVMContext &C, ArrayRef<AttributeSet> AttrSets);
595
596public:
597 AttributeList() = default;
598
599 //===--------------------------------------------------------------------===//
600 // AttributeList Construction and Mutation
601 //===--------------------------------------------------------------------===//
602
603 /// Return an AttributeList with the specified parameters in it.
604 LLVM_ABI static AttributeList get(LLVMContext &C,
605 ArrayRef<AttributeList> Attrs);
606 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
607 ArrayRef<Attribute::AttrKind> Kinds);
608 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
609 ArrayRef<Attribute::AttrKind> Kinds,
610 ArrayRef<uint64_t> Values);
611 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
612 ArrayRef<StringRef> Kind);
613 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
614 AttributeSet Attrs);
615 LLVM_ABI static AttributeList get(LLVMContext &C, unsigned Index,
616 const AttrBuilder &B);
617
618 /// Set the attribute set at the given index.
619 /// Returns a new list because attribute lists are immutable.
620 [[nodiscard]] LLVM_ABI AttributeList setAttributesAtIndex(
621 LLVMContext &C, unsigned Index, AttributeSet Attrs) const;
622
623 // TODO: remove non-AtIndex versions of these methods.
624 /// Add an attribute to the attribute set at the given index.
625 /// Returns a new list because attribute lists are immutable.
626 [[nodiscard]] LLVM_ABI AttributeList addAttributeAtIndex(
627 LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const;
628
629 /// Add an attribute to the attribute set at the given index.
630 /// Returns a new list because attribute lists are immutable.
631 [[nodiscard]] LLVM_ABI AttributeList
632 addAttributeAtIndex(LLVMContext &C, unsigned Index, StringRef Kind,
633 StringRef Value = StringRef()) const;
634
635 /// Add an attribute to the attribute set at the given index.
636 /// Returns a new list because attribute lists are immutable.
637 [[nodiscard]] LLVM_ABI AttributeList addAttributeAtIndex(LLVMContext &C,
638 unsigned Index,
639 Attribute A) const;
640
641 /// Add attributes to the attribute set at the given index.
642 /// Returns a new list because attribute lists are immutable.
643 [[nodiscard]] LLVM_ABI AttributeList addAttributesAtIndex(
644 LLVMContext &C, unsigned Index, const AttrBuilder &B) const;
645
646 /// Add a function attribute to the list. Returns a new list because
647 /// attribute lists are immutable.
648 [[nodiscard]] AttributeList addFnAttribute(LLVMContext &C,
649 Attribute::AttrKind Kind) const {
650 return addAttributeAtIndex(C, FunctionIndex, Kind);
651 }
652
653 /// Add a function attribute to the list. Returns a new list because
654 /// attribute lists are immutable.
655 [[nodiscard]] AttributeList addFnAttribute(LLVMContext &C,
656 Attribute Attr) const {
657 return addAttributeAtIndex(C, FunctionIndex, Attr);
658 }
659
660 /// Add a function attribute to the list. Returns a new list because
661 /// attribute lists are immutable.
662 [[nodiscard]] AttributeList
663 addFnAttribute(LLVMContext &C, StringRef Kind,
664 StringRef Value = StringRef()) const {
665 return addAttributeAtIndex(C, FunctionIndex, Kind, Value);
666 }
667
668 /// Add function attribute to the list. Returns a new list because
669 /// attribute lists are immutable.
670 [[nodiscard]] AttributeList addFnAttributes(LLVMContext &C,
671 const AttrBuilder &B) const {
672 return addAttributesAtIndex(C, FunctionIndex, B);
673 }
674
675 /// Add a return value attribute to the list. Returns a new list because
676 /// attribute lists are immutable.
677 [[nodiscard]] AttributeList addRetAttribute(LLVMContext &C,
678 Attribute::AttrKind Kind) const {
679 return addAttributeAtIndex(C, ReturnIndex, Kind);
680 }
681
682 /// Add a return value attribute to the list. Returns a new list because
683 /// attribute lists are immutable.
684 [[nodiscard]] AttributeList addRetAttribute(LLVMContext &C,
685 Attribute Attr) const {
686 return addAttributeAtIndex(C, ReturnIndex, Attr);
687 }
688
689 /// Add a return value attribute to the list. Returns a new list because
690 /// attribute lists are immutable.
691 [[nodiscard]] AttributeList addRetAttributes(LLVMContext &C,
692 const AttrBuilder &B) const {
693 return addAttributesAtIndex(C, ReturnIndex, B);
694 }
695
696 /// Add an argument attribute to the list. Returns a new list because
697 /// attribute lists are immutable.
698 [[nodiscard]] AttributeList
699 addParamAttribute(LLVMContext &C, unsigned ArgNo,
700 Attribute::AttrKind Kind) const {
701 return addAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
702 }
703
704 /// Add an argument attribute to the list. Returns a new list because
705 /// attribute lists are immutable.
706 [[nodiscard]] AttributeList
707 addParamAttribute(LLVMContext &C, unsigned ArgNo, StringRef Kind,
708 StringRef Value = StringRef()) const {
709 return addAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind, Value);
710 }
711
712 /// Add an attribute to the attribute list at the given arg indices. Returns a
713 /// new list because attribute lists are immutable.
714 [[nodiscard]] LLVM_ABI AttributeList addParamAttribute(
715 LLVMContext &C, ArrayRef<unsigned> ArgNos, Attribute A) const;
716
717 /// Add an argument attribute to the list. Returns a new list because
718 /// attribute lists are immutable.
719 [[nodiscard]] AttributeList addParamAttributes(LLVMContext &C, unsigned ArgNo,
720 const AttrBuilder &B) const {
721 return addAttributesAtIndex(C, ArgNo + FirstArgIndex, B);
722 }
723
724 /// Remove the specified attribute at the specified index from this
725 /// attribute list. Returns a new list because attribute lists are immutable.
726 [[nodiscard]] LLVM_ABI AttributeList removeAttributeAtIndex(
727 LLVMContext &C, unsigned Index, Attribute::AttrKind Kind) const;
728
729 /// Remove the specified attribute at the specified index from this
730 /// attribute list. Returns a new list because attribute lists are immutable.
731 [[nodiscard]] LLVM_ABI AttributeList
732 removeAttributeAtIndex(LLVMContext &C, unsigned Index, StringRef Kind) const;
733 [[nodiscard]] AttributeList removeAttribute(LLVMContext &C, unsigned Index,
734 StringRef Kind) const {
735 return removeAttributeAtIndex(C, Index, Kind);
736 }
737
738 /// Remove the specified attributes at the specified index from this
739 /// attribute list. Returns a new list because attribute lists are immutable.
740 [[nodiscard]] LLVM_ABI AttributeList removeAttributesAtIndex(
741 LLVMContext &C, unsigned Index, const AttributeMask &AttrsToRemove) const;
742
743 /// Remove all attributes at the specified index from this
744 /// attribute list. Returns a new list because attribute lists are immutable.
745 [[nodiscard]] LLVM_ABI AttributeList
746 removeAttributesAtIndex(LLVMContext &C, unsigned Index) const;
747
748 /// Remove the specified attribute at the function index from this
749 /// attribute list. Returns a new list because attribute lists are immutable.
750 [[nodiscard]] AttributeList
751 removeFnAttribute(LLVMContext &C, Attribute::AttrKind Kind) const {
752 return removeAttributeAtIndex(C, FunctionIndex, Kind);
753 }
754
755 /// Remove the specified attribute at the function index from this
756 /// attribute list. Returns a new list because attribute lists are immutable.
757 [[nodiscard]] AttributeList removeFnAttribute(LLVMContext &C,
758 StringRef Kind) const {
759 return removeAttributeAtIndex(C, FunctionIndex, Kind);
760 }
761
762 /// Remove the specified attribute at the function index from this
763 /// attribute list. Returns a new list because attribute lists are immutable.
764 [[nodiscard]] AttributeList
765 removeFnAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const {
766 return removeAttributesAtIndex(C, FunctionIndex, AttrsToRemove);
767 }
768
769 /// Remove the attributes at the function index from this
770 /// attribute list. Returns a new list because attribute lists are immutable.
771 [[nodiscard]] AttributeList removeFnAttributes(LLVMContext &C) const {
772 return removeAttributesAtIndex(C, FunctionIndex);
773 }
774
775 /// Remove the specified attribute at the return value index from this
776 /// attribute list. Returns a new list because attribute lists are immutable.
777 [[nodiscard]] AttributeList
778 removeRetAttribute(LLVMContext &C, Attribute::AttrKind Kind) const {
779 return removeAttributeAtIndex(C, ReturnIndex, Kind);
780 }
781
782 /// Remove the specified attribute at the return value index from this
783 /// attribute list. Returns a new list because attribute lists are immutable.
784 [[nodiscard]] AttributeList removeRetAttribute(LLVMContext &C,
785 StringRef Kind) const {
786 return removeAttributeAtIndex(C, ReturnIndex, Kind);
787 }
788
789 /// Remove the specified attribute at the return value index from this
790 /// attribute list. Returns a new list because attribute lists are immutable.
791 [[nodiscard]] AttributeList
792 removeRetAttributes(LLVMContext &C,
793 const AttributeMask &AttrsToRemove) const {
794 return removeAttributesAtIndex(C, ReturnIndex, AttrsToRemove);
795 }
796
797 /// Remove the specified attribute at the specified arg index from this
798 /// attribute list. Returns a new list because attribute lists are immutable.
799 [[nodiscard]] AttributeList
800 removeParamAttribute(LLVMContext &C, unsigned ArgNo,
801 Attribute::AttrKind Kind) const {
802 return removeAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
803 }
804
805 /// Remove the specified attribute at the specified arg index from this
806 /// attribute list. Returns a new list because attribute lists are immutable.
807 [[nodiscard]] AttributeList
808 removeParamAttribute(LLVMContext &C, unsigned ArgNo, StringRef Kind) const {
809 return removeAttributeAtIndex(C, ArgNo + FirstArgIndex, Kind);
810 }
811
812 /// Remove the specified attribute at the specified arg index from this
813 /// attribute list. Returns a new list because attribute lists are immutable.
814 [[nodiscard]] AttributeList
815 removeParamAttributes(LLVMContext &C, unsigned ArgNo,
816 const AttributeMask &AttrsToRemove) const {
817 return removeAttributesAtIndex(C, ArgNo + FirstArgIndex, AttrsToRemove);
818 }
819
820 /// Remove all attributes at the specified arg index from this
821 /// attribute list. Returns a new list because attribute lists are immutable.
822 [[nodiscard]] AttributeList removeParamAttributes(LLVMContext &C,
823 unsigned ArgNo) const {
824 return removeAttributesAtIndex(C, ArgNo + FirstArgIndex);
825 }
826
827 /// Replace the type contained by attribute \p AttrKind at index \p ArgNo wih
828 /// \p ReplacementTy, preserving all other attributes.
829 [[nodiscard]] AttributeList
830 replaceAttributeTypeAtIndex(LLVMContext &C, unsigned ArgNo,
831 Attribute::AttrKind Kind,
832 Type *ReplacementTy) const {
833 Attribute Attr = getAttributeAtIndex(ArgNo, Kind);
834 auto Attrs = removeAttributeAtIndex(C, ArgNo, Kind);
835 return Attrs.addAttributeAtIndex(C, ArgNo,
836 Attr.getWithNewType(C, ReplacementTy));
837 }
838
839 /// \brief Add the dereferenceable attribute to the attribute set at the given
840 /// index. Returns a new list because attribute lists are immutable.
841 [[nodiscard]] LLVM_ABI AttributeList
842 addDereferenceableRetAttr(LLVMContext &C, uint64_t Bytes) const;
843
844 /// \brief Add the dereferenceable attribute to the attribute set at the given
845 /// arg index. Returns a new list because attribute lists are immutable.
846 [[nodiscard]] LLVM_ABI AttributeList addDereferenceableParamAttr(
847 LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const;
848
849 /// Add the dereferenceable_or_null attribute to the attribute set at
850 /// the given arg index. Returns a new list because attribute lists are
851 /// immutable.
852 [[nodiscard]] LLVM_ABI AttributeList addDereferenceableOrNullParamAttr(
853 LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const;
854
855 /// Add the range attribute to the attribute set at the return value index.
856 /// Returns a new list because attribute lists are immutable.
857 [[nodiscard]] LLVM_ABI AttributeList
858 addRangeRetAttr(LLVMContext &C, const ConstantRange &CR) const;
859
860 /// Add the allocsize attribute to the attribute set at the given arg index.
861 /// Returns a new list because attribute lists are immutable.
862 [[nodiscard]] LLVM_ABI AttributeList
863 addAllocSizeParamAttr(LLVMContext &C, unsigned ArgNo, unsigned ElemSizeArg,
864 const std::optional<unsigned> &NumElemsArg) const;
865
866 /// Try to intersect this AttributeList with Other. Returns std::nullopt if
867 /// the two lists are inherently incompatible (imply different behavior, not
868 /// just analysis).
869 [[nodiscard]] LLVM_ABI std::optional<AttributeList>
870 intersectWith(LLVMContext &C, AttributeList Other) const;
871
872 //===--------------------------------------------------------------------===//
873 // AttributeList Accessors
874 //===--------------------------------------------------------------------===//
875
876 /// The attributes for the specified index are returned.
877 LLVM_ABI AttributeSet getAttributes(unsigned Index) const;
878
879 /// The attributes for the argument or parameter at the given index are
880 /// returned.
881 LLVM_ABI AttributeSet getParamAttrs(unsigned ArgNo) const;
882
883 /// The attributes for the ret value are returned.
884 LLVM_ABI AttributeSet getRetAttrs() const;
885
886 /// The function attributes are returned.
887 LLVM_ABI AttributeSet getFnAttrs() const;
888
889 /// Return true if the attribute exists at the given index.
890 LLVM_ABI bool hasAttributeAtIndex(unsigned Index,
891 Attribute::AttrKind Kind) const;
892
893 /// Return true if the attribute exists at the given index.
894 LLVM_ABI bool hasAttributeAtIndex(unsigned Index, StringRef Kind) const;
895
896 /// Return true if attribute exists at the given index.
897 LLVM_ABI bool hasAttributesAtIndex(unsigned Index) const;
898
899 /// Return true if the attribute exists for the given argument
900 bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
901 return hasAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
902 }
903
904 /// Return true if the attribute exists for the given argument
905 bool hasParamAttr(unsigned ArgNo, StringRef Kind) const {
906 return hasAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
907 }
908
909 /// Return true if attributes exists for the given argument
910 bool hasParamAttrs(unsigned ArgNo) const {
911 return hasAttributesAtIndex(ArgNo + FirstArgIndex);
912 }
913
914 /// Return true if the attribute exists for the return value.
915 bool hasRetAttr(Attribute::AttrKind Kind) const {
916 return hasAttributeAtIndex(ReturnIndex, Kind);
917 }
918
919 /// Return true if the attribute exists for the return value.
920 bool hasRetAttr(StringRef Kind) const {
921 return hasAttributeAtIndex(ReturnIndex, Kind);
922 }
923
924 /// Return true if attributes exist for the return value.
925 bool hasRetAttrs() const { return hasAttributesAtIndex(ReturnIndex); }
926
927 /// Return true if the attribute exists for the function.
928 LLVM_ABI bool hasFnAttr(Attribute::AttrKind Kind) const;
929
930 /// Return true if the attribute exists for the function.
931 LLVM_ABI bool hasFnAttr(StringRef Kind) const;
932
933 /// Return true the attributes exist for the function.
934 bool hasFnAttrs() const { return hasAttributesAtIndex(FunctionIndex); }
935
936 /// Return true if the specified attribute is set for at least one
937 /// parameter or for the return value. If Index is not nullptr, the index
938 /// of a parameter with the specified attribute is provided.
939 LLVM_ABI bool hasAttrSomewhere(Attribute::AttrKind Kind,
940 unsigned *Index = nullptr) const;
941
942 /// Return the attribute object that exists at the given index.
943 LLVM_ABI Attribute getAttributeAtIndex(unsigned Index,
944 Attribute::AttrKind Kind) const;
945
946 /// Return the attribute object that exists at the given index.
947 LLVM_ABI Attribute getAttributeAtIndex(unsigned Index, StringRef Kind) const;
948
949 /// Return the attribute object that exists at the arg index.
950 Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
951 return getAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
952 }
953
954 /// Return the attribute object that exists at the given index.
955 Attribute getParamAttr(unsigned ArgNo, StringRef Kind) const {
956 return getAttributeAtIndex(ArgNo + FirstArgIndex, Kind);
957 }
958
959 /// Return the attribute object that exists for the function.
960 Attribute getFnAttr(Attribute::AttrKind Kind) const {
961 return getAttributeAtIndex(FunctionIndex, Kind);
962 }
963
964 /// Return the attribute object that exists for the function.
965 Attribute getFnAttr(StringRef Kind) const {
966 return getAttributeAtIndex(FunctionIndex, Kind);
967 }
968
969 /// Return the attribute for the given attribute kind for the return value.
970 Attribute getRetAttr(Attribute::AttrKind Kind) const {
971 return getAttributeAtIndex(ReturnIndex, Kind);
972 }
973
974 /// Return the alignment of the return value.
975 LLVM_ABI MaybeAlign getRetAlignment() const;
976
977 /// Return the alignment for the specified function parameter.
978 LLVM_ABI MaybeAlign getParamAlignment(unsigned ArgNo) const;
979
980 /// Return the stack alignment for the specified function parameter.
981 LLVM_ABI MaybeAlign getParamStackAlignment(unsigned ArgNo) const;
982
983 /// Return the byval type for the specified function parameter.
984 LLVM_ABI Type *getParamByValType(unsigned ArgNo) const;
985
986 /// Return the sret type for the specified function parameter.
987 LLVM_ABI Type *getParamStructRetType(unsigned ArgNo) const;
988
989 /// Return the byref type for the specified function parameter.
990 LLVM_ABI Type *getParamByRefType(unsigned ArgNo) const;
991
992 /// Return the preallocated type for the specified function parameter.
993 LLVM_ABI Type *getParamPreallocatedType(unsigned ArgNo) const;
994
995 /// Return the inalloca type for the specified function parameter.
996 LLVM_ABI Type *getParamInAllocaType(unsigned ArgNo) const;
997
998 /// Return the elementtype type for the specified function parameter.
999 LLVM_ABI Type *getParamElementType(unsigned ArgNo) const;
1000
1001 /// Get the stack alignment of the function.
1002 LLVM_ABI MaybeAlign getFnStackAlignment() const;
1003
1004 /// Get the stack alignment of the return value.
1005 LLVM_ABI MaybeAlign getRetStackAlignment() const;
1006
1007 /// Get the number of dereferenceable bytes (or zero if unknown) of the return
1008 /// value.
1009 LLVM_ABI uint64_t getRetDereferenceableBytes() const;
1010
1011 /// Get the number of dereferenceable bytes (or zero if unknown) of an arg.
1012 LLVM_ABI uint64_t getParamDereferenceableBytes(unsigned Index) const;
1013
1014 /// Get the number of dereferenceable_or_null bytes (or zero if unknown) of
1015 /// the return value.
1016 LLVM_ABI uint64_t getRetDereferenceableOrNullBytes() const;
1017
1018 /// Get the number of dead_on_return bytes (or zero if unknown) of an arg.
1019 LLVM_ABI DeadOnReturnInfo getDeadOnReturnInfo(unsigned Index) const;
1020
1021 /// Get the number of dereferenceable_or_null bytes (or zero if unknown) of an
1022 /// arg.
1023 LLVM_ABI uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const;
1024
1025 /// Get range (or std::nullopt if unknown) of an arg.
1026 LLVM_ABI std::optional<ConstantRange> getParamRange(unsigned ArgNo) const;
1027
1028 /// Get the disallowed floating-point classes of the return value.
1029 LLVM_ABI FPClassTest getRetNoFPClass() const;
1030
1031 /// Get the disallowed floating-point classes of the argument value.
1032 LLVM_ABI FPClassTest getParamNoFPClass(unsigned ArgNo) const;
1033
1034 /// Get the unwind table kind requested for the function.
1035 LLVM_ABI UWTableKind getUWTableKind() const;
1036
1037 LLVM_ABI AllocFnKind getAllocKind() const;
1038
1039 /// Returns memory effects of the function.
1040 LLVM_ABI MemoryEffects getMemoryEffects() const;
1041
1042 /// Return the attributes at the index as a string.
1043 LLVM_ABI std::string getAsString(unsigned Index,
1044 bool InAttrGrp = false) const;
1045
1046 /// Return true if this attribute list belongs to the LLVMContext.
1047 LLVM_ABI bool hasParentContext(LLVMContext &C) const;
1048
1049 //===--------------------------------------------------------------------===//
1050 // AttributeList Introspection
1051 //===--------------------------------------------------------------------===//
1052
1053 using iterator = const AttributeSet *;
1054
1055 LLVM_ABI iterator begin() const;
1056 LLVM_ABI iterator end() const;
1057
1058 LLVM_ABI unsigned getNumAttrSets() const;
1059
1060 // Implementation of indexes(). Produces iterators that wrap an index. Mostly
1061 // to hide the awkwardness of unsigned wrapping when iterating over valid
1062 // indexes.
1063 struct index_iterator {
1064 unsigned NumAttrSets;
1065 index_iterator(int NumAttrSets) : NumAttrSets(NumAttrSets) {}
1066 struct int_wrapper {
1067 int_wrapper(unsigned i) : i(i) {}
1068 unsigned i;
1069 unsigned operator*() { return i; }
1070 bool operator!=(const int_wrapper &Other) { return i != Other.i; }
1071 int_wrapper &operator++() {
1072 // This is expected to undergo unsigned wrapping since FunctionIndex is
1073 // ~0 and that's where we start.
1074 ++i;
1075 return *this;
1076 }
1077 };
1078
1079 int_wrapper begin() { return int_wrapper(AttributeList::FunctionIndex); }
1080
1081 int_wrapper end() { return int_wrapper(NumAttrSets - 1); }
1082 };
1083
1084 /// Use this to iterate over the valid attribute indexes.
1085 index_iterator indexes() const { return index_iterator(getNumAttrSets()); }
1086
1087 /// operator==/!= - Provide equality predicates.
1088 bool operator==(const AttributeList &RHS) const { return pImpl == RHS.pImpl; }
1089 bool operator!=(const AttributeList &RHS) const { return pImpl != RHS.pImpl; }
1090
1091 /// Return a raw pointer that uniquely identifies this attribute list.
1092 void *getRawPointer() const {
1093 return pImpl;
1094 }
1095
1096 /// Return true if there are no attributes.
1097 bool isEmpty() const { return pImpl == nullptr; }
1098
1099 LLVM_ABI void print(raw_ostream &O) const;
1100
1101 LLVM_ABI void dump() const;
1102};
1103
1104//===----------------------------------------------------------------------===//
1105/// \class
1106/// Provide DenseMapInfo for AttributeList.
1107template <> struct DenseMapInfo<AttributeList, void> {
1108 static unsigned getHashValue(AttributeList AS) {
1109 return DenseMapInfo<const void *>::getHashValue(AS.pImpl);
1110 }
1111
1112 static bool isEqual(AttributeList LHS, AttributeList RHS) {
1113 return LHS == RHS;
1114 }
1115};
1116
1117//===----------------------------------------------------------------------===//
1118/// \class
1119/// This class is used in conjunction with the Attribute::get method to
1120/// create an Attribute object. The object itself is uniquified. The Builder's
1121/// value, however, is not. So this can be used as a quick way to test for
1122/// equality, presence of attributes, etc.
1123class AttrBuilder {
1124 LLVMContext &Ctx;
1125 SmallVector<Attribute, 8> Attrs;
1126
1127public:
1128 AttrBuilder(LLVMContext &Ctx) : Ctx(Ctx) {}
1129 AttrBuilder(const AttrBuilder &) = delete;
1130 AttrBuilder(AttrBuilder &&) = default;
1131
1132 AttrBuilder(LLVMContext &Ctx, const Attribute &A) : Ctx(Ctx) {
1133 addAttribute(A);
1134 }
1135
1136 LLVM_ABI AttrBuilder(LLVMContext &Ctx, AttributeSet AS);
1137
1138 LLVM_ABI void clear();
1139
1140 /// Add an attribute to the builder.
1141 LLVM_ABI AttrBuilder &addAttribute(Attribute::AttrKind Val);
1142
1143 /// Add the Attribute object to the builder.
1144 LLVM_ABI AttrBuilder &addAttribute(Attribute A);
1145
1146 /// Add the target-dependent attribute to the builder.
1147 LLVM_ABI AttrBuilder &addAttribute(StringRef A, StringRef V = StringRef());
1148
1149 /// Remove an attribute from the builder.
1150 LLVM_ABI AttrBuilder &removeAttribute(Attribute::AttrKind Val);
1151
1152 /// Remove the target-dependent attribute from the builder.
1153 LLVM_ABI AttrBuilder &removeAttribute(StringRef A);
1154
1155 /// Remove the target-dependent attribute from the builder.
1156 AttrBuilder &removeAttribute(Attribute A) {
1157 if (A.isStringAttribute())
1158 return removeAttribute(A.getKindAsString());
1159 else
1160 return removeAttribute(A.getKindAsEnum());
1161 }
1162
1163 /// Add the attributes from the builder. Attributes in the passed builder
1164 /// overwrite attributes in this builder if they have the same key.
1165 LLVM_ABI AttrBuilder &merge(const AttrBuilder &B);
1166
1167 /// Remove the attributes from the builder.
1168 LLVM_ABI AttrBuilder &remove(const AttributeMask &AM);
1169
1170 /// Return true if the builder has any attribute that's in the
1171 /// specified builder.
1172 LLVM_ABI bool overlaps(const AttributeMask &AM) const;
1173
1174 /// Return true if the builder has the specified attribute.
1175 LLVM_ABI bool contains(Attribute::AttrKind A) const;
1176
1177 /// Return true if the builder has the specified target-dependent
1178 /// attribute.
1179 LLVM_ABI bool contains(StringRef A) const;
1180
1181 /// Return true if the builder has IR-level attributes.
1182 bool hasAttributes() const { return !Attrs.empty(); }
1183
1184 /// Return Attribute with the given Kind. The returned attribute will be
1185 /// invalid if the Kind is not present in the builder.
1186 LLVM_ABI Attribute getAttribute(Attribute::AttrKind Kind) const;
1187
1188 /// Return Attribute with the given Kind. The returned attribute will be
1189 /// invalid if the Kind is not present in the builder.
1190 LLVM_ABI Attribute getAttribute(StringRef Kind) const;
1191
1192 /// Retrieve the range if the attribute exists (std::nullopt is returned
1193 /// otherwise).
1194 LLVM_ABI std::optional<ConstantRange> getRange() const;
1195
1196 /// Return raw (possibly packed/encoded) value of integer attribute or
1197 /// std::nullopt if not set.
1198 LLVM_ABI std::optional<uint64_t>
1199 getRawIntAttr(Attribute::AttrKind Kind) const;
1200
1201 /// Retrieve the alignment attribute, if it exists.
1202 MaybeAlign getAlignment() const {
1203 return MaybeAlign(getRawIntAttr(Attribute::Alignment).value_or(0));
1204 }
1205
1206 /// Retrieve the stack alignment attribute, if it exists.
1207 MaybeAlign getStackAlignment() const {
1208 return MaybeAlign(getRawIntAttr(Attribute::StackAlignment).value_or(0));
1209 }
1210
1211 /// Retrieve the number of dereferenceable bytes, if the
1212 /// dereferenceable attribute exists (zero is returned otherwise).
1213 uint64_t getDereferenceableBytes() const {
1214 return getRawIntAttr(Attribute::Dereferenceable).value_or(0);
1215 }
1216
1217 /// Retrieve the number of dereferenceable_or_null bytes, if the
1218 /// dereferenceable_or_null attribute exists (zero is returned otherwise).
1219 uint64_t getDereferenceableOrNullBytes() const {
1220 return getRawIntAttr(Attribute::DereferenceableOrNull).value_or(0);
1221 }
1222
1223 /// Retrieve the bitmask for nofpclass, if the nofpclass attribute exists
1224 /// (fcNone is returned otherwise).
1225 FPClassTest getNoFPClass() const {
1226 std::optional<uint64_t> Raw = getRawIntAttr(Attribute::NoFPClass);
1227 return static_cast<FPClassTest>(Raw.value_or(0));
1228 }
1229
1230 /// Retrieve type for the given type attribute.
1231 LLVM_ABI Type *getTypeAttr(Attribute::AttrKind Kind) const;
1232
1233 /// Retrieve the byval type.
1234 Type *getByValType() const { return getTypeAttr(Attribute::ByVal); }
1235
1236 /// Retrieve the sret type.
1237 Type *getStructRetType() const { return getTypeAttr(Attribute::StructRet); }
1238
1239 /// Retrieve the byref type.
1240 Type *getByRefType() const { return getTypeAttr(Attribute::ByRef); }
1241
1242 /// Retrieve the preallocated type.
1243 Type *getPreallocatedType() const {
1244 return getTypeAttr(Attribute::Preallocated);
1245 }
1246
1247 /// Retrieve the inalloca type.
1248 Type *getInAllocaType() const { return getTypeAttr(Attribute::InAlloca); }
1249
1250 /// Retrieve the allocsize args, or std::nullopt if the attribute does not
1251 /// exist.
1252 LLVM_ABI std::optional<std::pair<unsigned, std::optional<unsigned>>>
1253 getAllocSizeArgs() const;
1254
1255 /// Add integer attribute with raw value (packed/encoded if necessary).
1256 LLVM_ABI AttrBuilder &addRawIntAttr(Attribute::AttrKind Kind, uint64_t Value);
1257
1258 /// This turns an alignment into the form used internally in Attribute.
1259 /// This call has no effect if Align is not set.
1260 LLVM_ABI AttrBuilder &addAlignmentAttr(MaybeAlign Align);
1261
1262 /// This turns an int alignment (which must be a power of 2) into the
1263 /// form used internally in Attribute.
1264 /// This call has no effect if Align is 0.
1265 /// Deprecated, use the version using a MaybeAlign.
1266 inline AttrBuilder &addAlignmentAttr(unsigned Align) {
1267 return addAlignmentAttr(MaybeAlign(Align));
1268 }
1269
1270 /// This turns a stack alignment into the form used internally in Attribute.
1271 /// This call has no effect if Align is not set.
1272 LLVM_ABI AttrBuilder &addStackAlignmentAttr(MaybeAlign Align);
1273
1274 /// This turns an int stack alignment (which must be a power of 2) into
1275 /// the form used internally in Attribute.
1276 /// This call has no effect if Align is 0.
1277 /// Deprecated, use the version using a MaybeAlign.
1278 inline AttrBuilder &addStackAlignmentAttr(unsigned Align) {
1279 return addStackAlignmentAttr(MaybeAlign(Align));
1280 }
1281
1282 /// This turns the number of dereferenceable bytes into the form used
1283 /// internally in Attribute.
1284 LLVM_ABI AttrBuilder &addDereferenceableAttr(uint64_t Bytes);
1285
1286 /// This turns the number of dead_on_return bytes into the form used
1287 /// internally in Attribute.
1288 LLVM_ABI AttrBuilder &addDeadOnReturnAttr(DeadOnReturnInfo Info);
1289
1290 /// This turns the number of dereferenceable_or_null bytes into the
1291 /// form used internally in Attribute.
1292 LLVM_ABI AttrBuilder &addDereferenceableOrNullAttr(uint64_t Bytes);
1293
1294 /// This turns one (or two) ints into the form used internally in Attribute.
1295 LLVM_ABI AttrBuilder &
1296 addAllocSizeAttr(unsigned ElemSizeArg,
1297 const std::optional<unsigned> &NumElemsArg);
1298
1299 /// This turns two ints into the form used internally in Attribute.
1300 LLVM_ABI AttrBuilder &addVScaleRangeAttr(unsigned MinValue,
1301 std::optional<unsigned> MaxValue);
1302
1303 /// Add a type attribute with the given type.
1304 LLVM_ABI AttrBuilder &addTypeAttr(Attribute::AttrKind Kind, Type *Ty);
1305
1306 /// This turns a byval type into the form used internally in Attribute.
1307 LLVM_ABI AttrBuilder &addByValAttr(Type *Ty);
1308
1309 /// This turns a sret type into the form used internally in Attribute.
1310 LLVM_ABI AttrBuilder &addStructRetAttr(Type *Ty);
1311
1312 /// This turns a byref type into the form used internally in Attribute.
1313 LLVM_ABI AttrBuilder &addByRefAttr(Type *Ty);
1314
1315 /// This turns a preallocated type into the form used internally in Attribute.
1316 LLVM_ABI AttrBuilder &addPreallocatedAttr(Type *Ty);
1317
1318 /// This turns an inalloca type into the form used internally in Attribute.
1319 LLVM_ABI AttrBuilder &addInAllocaAttr(Type *Ty);
1320
1321 /// Add an allocsize attribute, using the representation returned by
1322 /// Attribute.getIntValue().
1323 LLVM_ABI AttrBuilder &addAllocSizeAttrFromRawRepr(uint64_t RawAllocSizeRepr);
1324
1325 /// Add a vscale_range attribute, using the representation returned by
1326 /// Attribute.getIntValue().
1327 LLVM_ABI AttrBuilder &
1328 addVScaleRangeAttrFromRawRepr(uint64_t RawVScaleRangeRepr);
1329
1330 /// This turns the unwind table kind into the form used internally in
1331 /// Attribute.
1332 LLVM_ABI AttrBuilder &addUWTableAttr(UWTableKind Kind);
1333
1334 // This turns the allocator kind into the form used internally in Attribute.
1335 LLVM_ABI AttrBuilder &addAllocKindAttr(AllocFnKind Kind);
1336
1337 /// Add memory effect attribute.
1338 LLVM_ABI AttrBuilder &addMemoryAttr(MemoryEffects ME);
1339
1340 /// Add captures attribute.
1341 LLVM_ABI AttrBuilder &addCapturesAttr(CaptureInfo CI);
1342
1343 /// Add denormal_fpenv attribute.
1344 LLVM_ABI AttrBuilder &addDenormalFPEnvAttr(DenormalFPEnv Mode);
1345
1346 // Add nofpclass attribute
1347 LLVM_ABI AttrBuilder &addNoFPClassAttr(FPClassTest NoFPClassMask);
1348
1349 /// Add a ConstantRange attribute with the given range.
1350 LLVM_ABI AttrBuilder &addConstantRangeAttr(Attribute::AttrKind Kind,
1351 const ConstantRange &CR);
1352
1353 /// Add range attribute.
1354 LLVM_ABI AttrBuilder &addRangeAttr(const ConstantRange &CR);
1355
1356 /// Add a ConstantRangeList attribute with the given ranges.
1357 LLVM_ABI AttrBuilder &addConstantRangeListAttr(Attribute::AttrKind Kind,
1358 ArrayRef<ConstantRange> Val);
1359
1360 /// Add initializes attribute.
1361 LLVM_ABI AttrBuilder &addInitializesAttr(const ConstantRangeList &CRL);
1362
1363 /// Add 0 or more parameter attributes which are equivalent to metadata
1364 /// attached to \p I. e.g. !align -> align. This assumes the argument type is
1365 /// the same as the original instruction and the attribute is compatible.
1366 LLVM_ABI AttrBuilder &addFromEquivalentMetadata(const Instruction &I);
1367
1368 ArrayRef<Attribute> attrs() const { return Attrs; }
1369
1370 LLVM_ABI bool operator==(const AttrBuilder &B) const;
1371 bool operator!=(const AttrBuilder &B) const { return !(*this == B); }
1372};
1373
1374namespace AttributeFuncs {
1375
1376enum AttributeSafetyKind : uint8_t {
1377 ASK_SAFE_TO_DROP = 1,
1378 ASK_UNSAFE_TO_DROP = 2,
1379 ASK_ALL = ASK_SAFE_TO_DROP | ASK_UNSAFE_TO_DROP,
1380};
1381
1382/// Returns true if this is a type legal for the 'nofpclass' attribute. This
1383/// follows the same type rules as FPMathOperator.
1384LLVM_ABI bool isNoFPClassCompatibleType(Type *Ty);
1385
1386/// Which attributes cannot be applied to a type. The argument \p AS
1387/// is used as a hint for the attributes whose compatibility is being
1388/// checked against \p Ty. This does not mean the return will be a
1389/// subset of \p AS, just that attributes that have specific dynamic
1390/// type compatibilities (i.e `range`) will be checked against what is
1391/// contained in \p AS. The argument \p ASK indicates, if only
1392/// attributes that are known to be safely droppable are contained in
1393/// the mask; only attributes that might be unsafe to drop (e.g.,
1394/// ABI-related attributes) are in the mask; or both.
1395LLVM_ABI AttributeMask typeIncompatible(Type *Ty, AttributeSet AS,
1396 AttributeSafetyKind ASK = ASK_ALL);
1397
1398/// Get param/return attributes which imply immediate undefined behavior if an
1399/// invalid value is passed. For example, this includes noundef (where undef
1400/// implies UB), but not nonnull (where null implies poison). It also does not
1401/// include attributes like nocapture, which constrain the function
1402/// implementation rather than the passed value.
1403LLVM_ABI AttributeMask getUBImplyingAttributes();
1404
1405/// \returns Return true if the two functions have compatible target-independent
1406/// attributes for inlining purposes.
1408 const Function &Callee);
1409
1410/// \returns Return false if callee is strictfp and caller is not. Return true
1411/// otherwise.
1413 const Function &Callee);
1414
1415/// Checks if there are any incompatible function attributes between
1416/// \p A and \p B.
1417///
1418/// \param [in] A - The first function to be compared with.
1419/// \param [in] B - The second function to be compared with.
1420/// \returns true if the functions have compatible attributes.
1421LLVM_ABI bool areOutlineCompatible(const Function &A, const Function &B);
1422
1423/// Merge caller's and callee's attributes.
1425 const Function &Callee);
1426
1427/// Merges the functions attributes from \p ToMerge into function \p Base.
1428///
1429/// \param [in,out] Base - The function being merged into.
1430/// \param [in] ToMerge - The function to merge attributes from.
1432 const Function &ToMerge);
1433
1434/// Update min-legal-vector-width if it is in Attribute and less than Width.
1436
1437} // end namespace AttributeFuncs
1438
1439} // end namespace llvm
1440
1441#endif // LLVM_IR_ATTRIBUTES_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
unsigned 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:215
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:484
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:410
LLVM_ABI AllocFnKind getAllocKind() const
bool hasAttributes() const
Return true if attributes exists in this set.
Definition Attributes.h:481
const Attribute * iterator
Definition Attributes.h:520
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:434
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:433
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 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:412
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:374
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:375
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.
static LLVM_ABI bool isExistingAttribute(StringRef Name)
Return true if the provided string matches the IR name of an attribute.
bool hasKindAsEnum() const
Returns true if the attribute's kind can be represented as an enum (Enum, Integer,...
Definition Attributes.h:276
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:384
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:266
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:389
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:68
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:2262
AllocFnKind
Definition Attributes.h:54
bool operator!=(uint64_t V1, const APInt &V2)
Definition APInt.h:2140
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:250
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:400
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:395
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:537
static unsigned getHashValue(AttributeSet AS)
Definition Attributes.h:533
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:106
Trait to indicate whether a type's bits can be hashed directly.
Definition Hashing.h:180