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"
20 #include "llvm/ADT/Optional.h"
21 #include "llvm/ADT/SmallString.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/ADT/iterator_range.h"
24 #include "llvm/Config/llvm-config.h"
25 #include "llvm/Support/Alignment.h"
26 #include "llvm/Support/PointerLikeTypeTraits.h"
27 #include <bitset>
28 #include <cassert>
29 #include <cstdint>
30 #include <map>
31 #include <string>
32 #include <utility>
33
34 namespace llvm {
35
36 class AttrBuilder;
37 class AttributeImpl;
38 class AttributeListImpl;
39 class AttributeSetNode;
40 template<typename T> struct DenseMapInfo;
41 class FoldingSetNodeID;
42 class Function;
43 class LLVMContext;
44 class Type;
45
46 //===----------------------------------------------------------------------===//
47 /// \class
48 /// Functions, function parameters, and return types can have attributes
49 /// to indicate how they should be treated by optimizations and code
50 /// generation. This class represents one of those attributes. It's light-weight
51 /// and should be passed around by-value.
52 class Attribute {
53 public:
54 /// This enumeration lists the attributes that can be associated with
55 /// parameters, function results, or the function itself.
56 ///
57 /// Note: The `uwtable' attribute is about the ABI or the user mandating an
58 /// entry in the unwind table. The `nounwind' attribute is about an exception
59 /// passing by the function.
60 ///
61 /// In a theoretical system that uses tables for profiling and SjLj for
62 /// exceptions, they would be fully independent. In a normal system that uses
63 /// tables for both, the semantics are:
64 ///
65 /// nil = Needs an entry because an exception might pass by.
66 /// nounwind = No need for an entry
67 /// uwtable = Needs an entry because the ABI says so and because
68 /// an exception might pass by.
69 /// uwtable + nounwind = Needs an entry because the ABI says so.
70
71 enum AttrKind {
72 // IR-Level Attributes
73 None, ///< No attributes have been set
74 #define GET_ATTR_ENUM
75 #include "llvm/IR/Attributes.inc"
76 EndAttrKinds, ///< Sentinal value useful for loops
77 EmptyKey, ///< Use as Empty key for DenseMap of AttrKind
78 TombstoneKey, ///< Use as Tombstone key for DenseMap of AttrKind
79 };
80
81 static const unsigned NumTypeAttrKinds = LastTypeAttr - FirstTypeAttr + 1;
82
isEnumAttrKind(AttrKind Kind)83 static bool isEnumAttrKind(AttrKind Kind) {
84 return Kind >= FirstEnumAttr && Kind <= LastEnumAttr;
85 }
isIntAttrKind(AttrKind Kind)86 static bool isIntAttrKind(AttrKind Kind) {
87 return Kind >= FirstIntAttr && Kind <= LastIntAttr;
88 }
isTypeAttrKind(AttrKind Kind)89 static bool isTypeAttrKind(AttrKind Kind) {
90 return Kind >= FirstTypeAttr && Kind <= LastTypeAttr;
91 }
92
93 static bool canUseAsFnAttr(AttrKind Kind);
94 static bool canUseAsParamAttr(AttrKind Kind);
95 static bool canUseAsRetAttr(AttrKind Kind);
96
97 private:
98 AttributeImpl *pImpl = nullptr;
99
Attribute(AttributeImpl * A)100 Attribute(AttributeImpl *A) : pImpl(A) {}
101
102 public:
103 Attribute() = default;
104
105 //===--------------------------------------------------------------------===//
106 // Attribute Construction
107 //===--------------------------------------------------------------------===//
108
109 /// Return a uniquified Attribute object.
110 static Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val = 0);
111 static Attribute get(LLVMContext &Context, StringRef Kind,
112 StringRef Val = StringRef());
113 static Attribute get(LLVMContext &Context, AttrKind Kind, Type *Ty);
114
115 /// Return a uniquified Attribute object that has the specific
116 /// alignment set.
117 static Attribute getWithAlignment(LLVMContext &Context, Align Alignment);
118 static Attribute getWithStackAlignment(LLVMContext &Context, Align Alignment);
119 static Attribute getWithDereferenceableBytes(LLVMContext &Context,
120 uint64_t Bytes);
121 static Attribute getWithDereferenceableOrNullBytes(LLVMContext &Context,
122 uint64_t Bytes);
123 static Attribute getWithAllocSizeArgs(LLVMContext &Context,
124 unsigned ElemSizeArg,
125 const Optional<unsigned> &NumElemsArg);
126 static Attribute getWithVScaleRangeArgs(LLVMContext &Context,
127 unsigned MinValue, unsigned MaxValue);
128 static Attribute getWithByValType(LLVMContext &Context, Type *Ty);
129 static Attribute getWithStructRetType(LLVMContext &Context, Type *Ty);
130 static Attribute getWithByRefType(LLVMContext &Context, Type *Ty);
131 static Attribute getWithPreallocatedType(LLVMContext &Context, Type *Ty);
132 static Attribute getWithInAllocaType(LLVMContext &Context, Type *Ty);
133
134 /// For a typed attribute, return the equivalent attribute with the type
135 /// changed to \p ReplacementTy.
getWithNewType(LLVMContext & Context,Type * ReplacementTy)136 Attribute getWithNewType(LLVMContext &Context, Type *ReplacementTy) {
137 assert(isTypeAttribute() && "this requires a typed attribute");
138 return get(Context, getKindAsEnum(), ReplacementTy);
139 }
140
141 static Attribute::AttrKind getAttrKindFromName(StringRef AttrName);
142
143 static StringRef getNameFromAttrKind(Attribute::AttrKind AttrKind);
144
145 /// Return true if the provided string matches the IR name of an attribute.
146 /// example: "noalias" return true but not "NoAlias"
147 static bool isExistingAttribute(StringRef Name);
148
149 //===--------------------------------------------------------------------===//
150 // Attribute Accessors
151 //===--------------------------------------------------------------------===//
152
153 /// Return true if the attribute is an Attribute::AttrKind type.
154 bool isEnumAttribute() const;
155
156 /// Return true if the attribute is an integer attribute.
157 bool isIntAttribute() const;
158
159 /// Return true if the attribute is a string (target-dependent)
160 /// attribute.
161 bool isStringAttribute() const;
162
163 /// Return true if the attribute is a type attribute.
164 bool isTypeAttribute() const;
165
166 /// Return true if the attribute is any kind of attribute.
isValid()167 bool isValid() const { return pImpl; }
168
169 /// Return true if the attribute is present.
170 bool hasAttribute(AttrKind Val) const;
171
172 /// Return true if the target-dependent attribute is present.
173 bool hasAttribute(StringRef Val) const;
174
175 /// Return the attribute's kind as an enum (Attribute::AttrKind). This
176 /// requires the attribute to be an enum, integer, or type attribute.
177 Attribute::AttrKind getKindAsEnum() const;
178
179 /// Return the attribute's value as an integer. This requires that the
180 /// attribute be an integer attribute.
181 uint64_t getValueAsInt() const;
182
183 /// Return the attribute's value as a boolean. This requires that the
184 /// attribute be a string attribute.
185 bool getValueAsBool() const;
186
187 /// Return the attribute's kind as a string. This requires the
188 /// attribute to be a string attribute.
189 StringRef getKindAsString() const;
190
191 /// Return the attribute's value as a string. This requires the
192 /// attribute to be a string attribute.
193 StringRef getValueAsString() const;
194
195 /// Return the attribute's value as a Type. This requires the attribute to be
196 /// a type attribute.
197 Type *getValueAsType() const;
198
199 /// Returns the alignment field of an attribute as a byte alignment
200 /// value.
201 MaybeAlign getAlignment() const;
202
203 /// Returns the stack alignment field of an attribute as a byte
204 /// alignment value.
205 MaybeAlign getStackAlignment() const;
206
207 /// Returns the number of dereferenceable bytes from the
208 /// dereferenceable attribute.
209 uint64_t getDereferenceableBytes() const;
210
211 /// Returns the number of dereferenceable_or_null bytes from the
212 /// dereferenceable_or_null attribute.
213 uint64_t getDereferenceableOrNullBytes() const;
214
215 /// Returns the argument numbers for the allocsize attribute (or pair(0, 0)
216 /// if not known).
217 std::pair<unsigned, Optional<unsigned>> getAllocSizeArgs() const;
218
219 /// Returns the argument numbers for the vscale_range attribute (or pair(0, 0)
220 /// if not known).
221 std::pair<unsigned, unsigned> getVScaleRangeArgs() const;
222
223 /// The Attribute is converted to a string of equivalent mnemonic. This
224 /// is, presumably, for writing out the mnemonics for the assembly writer.
225 std::string getAsString(bool InAttrGrp = false) const;
226
227 /// Return true if this attribute belongs to the LLVMContext.
228 bool hasParentContext(LLVMContext &C) const;
229
230 /// Equality and non-equality operators.
231 bool operator==(Attribute A) const { return pImpl == A.pImpl; }
232 bool operator!=(Attribute A) const { return pImpl != A.pImpl; }
233
234 /// Less-than operator. Useful for sorting the attributes list.
235 bool operator<(Attribute A) const;
236
237 void Profile(FoldingSetNodeID &ID) const;
238
239 /// Return a raw pointer that uniquely identifies this attribute.
getRawPointer()240 void *getRawPointer() const {
241 return pImpl;
242 }
243
244 /// Get an attribute from a raw pointer created by getRawPointer.
fromRawPointer(void * RawPtr)245 static Attribute fromRawPointer(void *RawPtr) {
246 return Attribute(reinterpret_cast<AttributeImpl*>(RawPtr));
247 }
248 };
249
250 // Specialized opaque value conversions.
wrap(Attribute Attr)251 inline LLVMAttributeRef wrap(Attribute Attr) {
252 return reinterpret_cast<LLVMAttributeRef>(Attr.getRawPointer());
253 }
254
255 // Specialized opaque value conversions.
unwrap(LLVMAttributeRef Attr)256 inline Attribute unwrap(LLVMAttributeRef Attr) {
257 return Attribute::fromRawPointer(Attr);
258 }
259
260 //===----------------------------------------------------------------------===//
261 /// \class
262 /// This class holds the attributes for a particular argument, parameter,
263 /// function, or return value. It is an immutable value type that is cheap to
264 /// copy. Adding and removing enum attributes is intended to be fast, but adding
265 /// and removing string or integer attributes involves a FoldingSet lookup.
266 class AttributeSet {
267 friend AttributeListImpl;
268 template <typename Ty> friend struct DenseMapInfo;
269
270 // TODO: Extract AvailableAttrs from AttributeSetNode and store them here.
271 // This will allow an efficient implementation of addAttribute and
272 // removeAttribute for enum attrs.
273
274 /// Private implementation pointer.
275 AttributeSetNode *SetNode = nullptr;
276
277 private:
AttributeSet(AttributeSetNode * ASN)278 explicit AttributeSet(AttributeSetNode *ASN) : SetNode(ASN) {}
279
280 public:
281 /// AttributeSet is a trivially copyable value type.
282 AttributeSet() = default;
283 AttributeSet(const AttributeSet &) = default;
284 ~AttributeSet() = default;
285
286 static AttributeSet get(LLVMContext &C, const AttrBuilder &B);
287 static AttributeSet get(LLVMContext &C, ArrayRef<Attribute> Attrs);
288
289 bool operator==(const AttributeSet &O) const { return SetNode == O.SetNode; }
290 bool operator!=(const AttributeSet &O) const { return !(*this == O); }
291
292 /// Add an argument attribute. Returns a new set because attribute sets are
293 /// immutable.
294 LLVM_NODISCARD AttributeSet addAttribute(LLVMContext &C,
295 Attribute::AttrKind Kind) const;
296
297 /// Add a target-dependent attribute. Returns a new set because attribute sets
298 /// are immutable.
299 LLVM_NODISCARD AttributeSet addAttribute(LLVMContext &C, StringRef Kind,
300 StringRef Value = StringRef()) const;
301
302 /// Add attributes to the attribute set. Returns a new set because attribute
303 /// sets are immutable.
304 LLVM_NODISCARD AttributeSet addAttributes(LLVMContext &C,
305 AttributeSet AS) const;
306
307 /// Remove the specified attribute from this set. Returns a new set because
308 /// attribute sets are immutable.
309 LLVM_NODISCARD AttributeSet removeAttribute(LLVMContext &C,
310 Attribute::AttrKind Kind) const;
311
312 /// Remove the specified attribute from this set. Returns a new set because
313 /// attribute sets are immutable.
314 LLVM_NODISCARD AttributeSet removeAttribute(LLVMContext &C,
315 StringRef Kind) const;
316
317 /// Remove the specified attributes from this set. Returns a new set because
318 /// attribute sets are immutable.
319 LLVM_NODISCARD AttributeSet
320 removeAttributes(LLVMContext &C, const AttrBuilder &AttrsToRemove) const;
321
322 /// Return the number of attributes in this set.
323 unsigned getNumAttributes() const;
324
325 /// Return true if attributes exists in this set.
hasAttributes()326 bool hasAttributes() const { return SetNode != nullptr; }
327
328 /// Return true if the attribute exists in this set.
329 bool hasAttribute(Attribute::AttrKind Kind) const;
330
331 /// Return true if the attribute exists in this set.
332 bool hasAttribute(StringRef Kind) const;
333
334 /// Return the attribute object.
335 Attribute getAttribute(Attribute::AttrKind Kind) const;
336
337 /// Return the target-dependent attribute object.
338 Attribute getAttribute(StringRef Kind) const;
339
340 MaybeAlign getAlignment() const;
341 MaybeAlign getStackAlignment() const;
342 uint64_t getDereferenceableBytes() const;
343 uint64_t getDereferenceableOrNullBytes() const;
344 Type *getByValType() const;
345 Type *getStructRetType() const;
346 Type *getByRefType() const;
347 Type *getPreallocatedType() const;
348 Type *getInAllocaType() const;
349 Type *getElementType() const;
350 std::pair<unsigned, Optional<unsigned>> getAllocSizeArgs() const;
351 std::pair<unsigned, unsigned> getVScaleRangeArgs() const;
352 std::string getAsString(bool InAttrGrp = false) const;
353
354 /// Return true if this attribute set belongs to the LLVMContext.
355 bool hasParentContext(LLVMContext &C) const;
356
357 using iterator = const Attribute *;
358
359 iterator begin() const;
360 iterator end() const;
361 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
362 void dump() const;
363 #endif
364 };
365
366 //===----------------------------------------------------------------------===//
367 /// \class
368 /// Provide DenseMapInfo for AttributeSet.
369 template <> struct DenseMapInfo<AttributeSet> {
370 static AttributeSet getEmptyKey() {
371 auto Val = static_cast<uintptr_t>(-1);
372 Val <<= PointerLikeTypeTraits<void *>::NumLowBitsAvailable;
373 return AttributeSet(reinterpret_cast<AttributeSetNode *>(Val));
374 }
375
376 static AttributeSet getTombstoneKey() {
377 auto Val = static_cast<uintptr_t>(-2);
378 Val <<= PointerLikeTypeTraits<void *>::NumLowBitsAvailable;
379 return AttributeSet(reinterpret_cast<AttributeSetNode *>(Val));
380 }
381
382 static unsigned getHashValue(AttributeSet AS) {
383 return (unsigned((uintptr_t)AS.SetNode) >> 4) ^
384 (unsigned((uintptr_t)AS.SetNode) >> 9);
385 }
386
387 static bool isEqual(AttributeSet LHS, AttributeSet RHS) { return LHS == RHS; }
388 };
389
390 //===----------------------------------------------------------------------===//
391 /// \class
392 /// This class holds the attributes for a function, its return value, and
393 /// its parameters. You access the attributes for each of them via an index into
394 /// the AttributeList object. The function attributes are at index
395 /// `AttributeList::FunctionIndex', the return value is at index
396 /// `AttributeList::ReturnIndex', and the attributes for the parameters start at
397 /// index `AttributeList::FirstArgIndex'.
398 class AttributeList {
399 public:
400 enum AttrIndex : unsigned {
401 ReturnIndex = 0U,
402 FunctionIndex = ~0U,
403 FirstArgIndex = 1,
404 };
405
406 private:
407 friend class AttrBuilder;
408 friend class AttributeListImpl;
409 friend class AttributeSet;
410 friend class AttributeSetNode;
411 template <typename Ty> friend struct DenseMapInfo;
412
413 /// The attributes that we are managing. This can be null to represent
414 /// the empty attributes list.
415 AttributeListImpl *pImpl = nullptr;
416
417 public:
418 /// Create an AttributeList with the specified parameters in it.
419 static AttributeList get(LLVMContext &C,
420 ArrayRef<std::pair<unsigned, Attribute>> Attrs);
421 static AttributeList get(LLVMContext &C,
422 ArrayRef<std::pair<unsigned, AttributeSet>> Attrs);
423
424 /// Create an AttributeList from attribute sets for a function, its
425 /// return value, and all of its arguments.
426 static AttributeList get(LLVMContext &C, AttributeSet FnAttrs,
427 AttributeSet RetAttrs,
428 ArrayRef<AttributeSet> ArgAttrs);
429
430 private:
431 explicit AttributeList(AttributeListImpl *LI) : pImpl(LI) {}
432
433 static AttributeList getImpl(LLVMContext &C, ArrayRef<AttributeSet> AttrSets);
434
435 AttributeList setAttributes(LLVMContext &C, unsigned Index,
436 AttributeSet Attrs) const;
437
438 public:
439 AttributeList() = default;
440
441 //===--------------------------------------------------------------------===//
442 // AttributeList Construction and Mutation
443 //===--------------------------------------------------------------------===//
444
445 /// Return an AttributeList with the specified parameters in it.
446 static AttributeList get(LLVMContext &C, ArrayRef<AttributeList> Attrs);
447 static AttributeList get(LLVMContext &C, unsigned Index,
448 ArrayRef<Attribute::AttrKind> Kinds);
449 static AttributeList get(LLVMContext &C, unsigned Index,
450 ArrayRef<Attribute::AttrKind> Kinds,
451 ArrayRef<uint64_t> Values);
452 static AttributeList get(LLVMContext &C, unsigned Index,
453 ArrayRef<StringRef> Kind);
454 static AttributeList get(LLVMContext &C, unsigned Index,
455 const AttrBuilder &B);
456
457 /// Add an attribute to the attribute set at the given index.
458 /// Returns a new list because attribute lists are immutable.
459 LLVM_NODISCARD AttributeList addAttribute(LLVMContext &C, unsigned Index,
460 Attribute::AttrKind Kind) const;
461
462 /// Add an attribute to the attribute set at the given index.
463 /// Returns a new list because attribute lists are immutable.
464 LLVM_NODISCARD AttributeList
465 addAttribute(LLVMContext &C, unsigned Index, StringRef Kind,
466 StringRef Value = StringRef()) const;
467
468 /// Add an attribute to the attribute set at the given index.
469 /// Returns a new list because attribute lists are immutable.
470 LLVM_NODISCARD AttributeList addAttribute(LLVMContext &C, unsigned Index,
471 Attribute A) const;
472
473 /// Add attributes to the attribute set at the given index.
474 /// Returns a new list because attribute lists are immutable.
475 LLVM_NODISCARD AttributeList addAttributes(LLVMContext &C, unsigned Index,
476 const AttrBuilder &B) const;
477
478 /// Add an argument attribute to the list. Returns a new list because
479 /// attribute lists are immutable.
480 LLVM_NODISCARD AttributeList addParamAttribute(
481 LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const {
482 return addAttribute(C, ArgNo + FirstArgIndex, Kind);
483 }
484
485 /// Add an argument attribute to the list. Returns a new list because
486 /// attribute lists are immutable.
487 LLVM_NODISCARD AttributeList
488 addParamAttribute(LLVMContext &C, unsigned ArgNo, StringRef Kind,
489 StringRef Value = StringRef()) const {
490 return addAttribute(C, ArgNo + FirstArgIndex, Kind, Value);
491 }
492
493 /// Add an attribute to the attribute list at the given arg indices. Returns a
494 /// new list because attribute lists are immutable.
495 LLVM_NODISCARD AttributeList addParamAttribute(LLVMContext &C,
496 ArrayRef<unsigned> ArgNos,
497 Attribute A) const;
498
499 /// Add an argument attribute to the list. Returns a new list because
500 /// attribute lists are immutable.
501 LLVM_NODISCARD AttributeList addParamAttributes(LLVMContext &C,
502 unsigned ArgNo,
503 const AttrBuilder &B) const {
504 return addAttributes(C, ArgNo + FirstArgIndex, B);
505 }
506
507 /// Remove the specified attribute at the specified index from this
508 /// attribute list. Returns a new list because attribute lists are immutable.
509 LLVM_NODISCARD AttributeList removeAttribute(LLVMContext &C, unsigned Index,
510 Attribute::AttrKind Kind) const;
511
512 /// Remove the specified attribute at the specified index from this
513 /// attribute list. Returns a new list because attribute lists are immutable.
514 LLVM_NODISCARD AttributeList removeAttribute(LLVMContext &C, unsigned Index,
515 StringRef Kind) const;
516
517 /// Remove the specified attributes at the specified index from this
518 /// attribute list. Returns a new list because attribute lists are immutable.
519 LLVM_NODISCARD AttributeList removeAttributes(
520 LLVMContext &C, unsigned Index, const AttrBuilder &AttrsToRemove) const;
521
522 /// Remove all attributes at the specified index from this
523 /// attribute list. Returns a new list because attribute lists are immutable.
524 LLVM_NODISCARD AttributeList removeAttributes(LLVMContext &C,
525 unsigned Index) const;
526
527 /// Remove the specified attribute at the specified arg index from this
528 /// attribute list. Returns a new list because attribute lists are immutable.
529 LLVM_NODISCARD AttributeList removeParamAttribute(
530 LLVMContext &C, unsigned ArgNo, Attribute::AttrKind Kind) const {
531 return removeAttribute(C, ArgNo + FirstArgIndex, Kind);
532 }
533
534 /// Remove the specified attribute at the specified arg index from this
535 /// attribute list. Returns a new list because attribute lists are immutable.
536 LLVM_NODISCARD AttributeList removeParamAttribute(LLVMContext &C,
537 unsigned ArgNo,
538 StringRef Kind) const {
539 return removeAttribute(C, ArgNo + FirstArgIndex, Kind);
540 }
541
542 /// Remove the specified attribute at the specified arg index from this
543 /// attribute list. Returns a new list because attribute lists are immutable.
544 LLVM_NODISCARD AttributeList removeParamAttributes(
545 LLVMContext &C, unsigned ArgNo, const AttrBuilder &AttrsToRemove) const {
546 return removeAttributes(C, ArgNo + FirstArgIndex, AttrsToRemove);
547 }
548
549 /// Remove all attributes at the specified arg index from this
550 /// attribute list. Returns a new list because attribute lists are immutable.
551 LLVM_NODISCARD AttributeList removeParamAttributes(LLVMContext &C,
552 unsigned ArgNo) const {
553 return removeAttributes(C, ArgNo + FirstArgIndex);
554 }
555
556 /// Replace the type contained by attribute \p AttrKind at index \p ArgNo wih
557 /// \p ReplacementTy, preserving all other attributes.
558 LLVM_NODISCARD AttributeList replaceAttributeType(LLVMContext &C,
559 unsigned ArgNo,
560 Attribute::AttrKind Kind,
561 Type *ReplacementTy) const {
562 Attribute Attr = getAttribute(ArgNo, Kind);
563 auto Attrs = removeAttribute(C, ArgNo, Kind);
564 return Attrs.addAttribute(C, ArgNo, Attr.getWithNewType(C, ReplacementTy));
565 }
566
567 /// \brief Add the dereferenceable attribute to the attribute set at the given
568 /// index. Returns a new list because attribute lists are immutable.
569 LLVM_NODISCARD AttributeList addDereferenceableAttr(LLVMContext &C,
570 unsigned Index,
571 uint64_t Bytes) const;
572
573 /// \brief Add the dereferenceable attribute to the attribute set at the given
574 /// arg index. Returns a new list because attribute lists are immutable.
575 LLVM_NODISCARD AttributeList addDereferenceableParamAttr(
576 LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const {
577 return addDereferenceableAttr(C, ArgNo + FirstArgIndex, Bytes);
578 }
579
580 /// Add the dereferenceable_or_null attribute to the attribute set at
581 /// the given index. Returns a new list because attribute lists are immutable.
582 LLVM_NODISCARD AttributeList addDereferenceableOrNullAttr(
583 LLVMContext &C, unsigned Index, uint64_t Bytes) const;
584
585 /// Add the dereferenceable_or_null attribute to the attribute set at
586 /// the given arg index. Returns a new list because attribute lists are
587 /// immutable.
588 LLVM_NODISCARD AttributeList addDereferenceableOrNullParamAttr(
589 LLVMContext &C, unsigned ArgNo, uint64_t Bytes) const {
590 return addDereferenceableOrNullAttr(C, ArgNo + FirstArgIndex, Bytes);
591 }
592
593 /// Add the allocsize attribute to the attribute set at the given index.
594 /// Returns a new list because attribute lists are immutable.
595 LLVM_NODISCARD AttributeList
596 addAllocSizeAttr(LLVMContext &C, unsigned Index, unsigned ElemSizeArg,
597 const Optional<unsigned> &NumElemsArg);
598
599 /// Add the allocsize attribute to the attribute set at the given arg index.
600 /// Returns a new list because attribute lists are immutable.
601 LLVM_NODISCARD AttributeList
602 addAllocSizeParamAttr(LLVMContext &C, unsigned ArgNo, unsigned ElemSizeArg,
603 const Optional<unsigned> &NumElemsArg) {
604 return addAllocSizeAttr(C, ArgNo + FirstArgIndex, ElemSizeArg, NumElemsArg);
605 }
606
607 /// Add the vscale_range attribute to the attribute set at the given index.
608 /// Returns a new list because attribute lists are immutable.
609 LLVM_NODISCARD AttributeList addVScaleRangeAttr(LLVMContext &C,
610 unsigned Index,
611 unsigned MinValue,
612 unsigned MaxValue);
613
614 //===--------------------------------------------------------------------===//
615 // AttributeList Accessors
616 //===--------------------------------------------------------------------===//
617
618 /// The attributes for the specified index are returned.
619 AttributeSet getAttributes(unsigned Index) const;
620
621 /// The attributes for the argument or parameter at the given index are
622 /// returned.
623 AttributeSet getParamAttributes(unsigned ArgNo) const;
624
625 /// The attributes for the ret value are returned.
626 AttributeSet getRetAttributes() const;
627
628 /// The function attributes are returned.
629 AttributeSet getFnAttributes() const;
630
631 /// Return true if the attribute exists at the given index.
632 bool hasAttribute(unsigned Index, Attribute::AttrKind Kind) const;
633
634 /// Return true if the attribute exists at the given index.
635 bool hasAttribute(unsigned Index, StringRef Kind) const;
636
637 /// Return true if attribute exists at the given index.
638 bool hasAttributes(unsigned Index) const;
639
640 /// Return true if the attribute exists for the given argument
641 bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
642 return hasAttribute(ArgNo + FirstArgIndex, Kind);
643 }
644
645 /// Return true if the attribute exists for the given argument
646 bool hasParamAttr(unsigned ArgNo, StringRef Kind) const {
647 return hasAttribute(ArgNo + FirstArgIndex, Kind);
648 }
649
650 /// Return true if attributes exists for the given argument
651 bool hasParamAttrs(unsigned ArgNo) const {
652 return hasAttributes(ArgNo + FirstArgIndex);
653 }
654
655 /// Equivalent to hasAttribute(AttributeList::FunctionIndex, Kind) but
656 /// may be faster.
657 bool hasFnAttribute(Attribute::AttrKind Kind) const;
658
659 /// Equivalent to hasAttribute(AttributeList::FunctionIndex, Kind) but
660 /// may be faster.
661 bool hasFnAttribute(StringRef Kind) const;
662
663 /// Equivalent to hasAttribute(ArgNo + FirstArgIndex, Kind).
664 bool hasParamAttribute(unsigned ArgNo, Attribute::AttrKind Kind) const;
665
666 /// Return true if the specified attribute is set for at least one
667 /// parameter or for the return value. If Index is not nullptr, the index
668 /// of a parameter with the specified attribute is provided.
669 bool hasAttrSomewhere(Attribute::AttrKind Kind,
670 unsigned *Index = nullptr) const;
671
672 /// Return the attribute object that exists at the given index.
673 Attribute getAttribute(unsigned Index, Attribute::AttrKind Kind) const;
674
675 /// Return the attribute object that exists at the given index.
676 Attribute getAttribute(unsigned Index, StringRef Kind) const;
677
678 /// Return the attribute object that exists at the arg index.
679 Attribute getParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
680 return getAttribute(ArgNo + FirstArgIndex, Kind);
681 }
682
683 /// Return the attribute object that exists at the given index.
684 Attribute getParamAttr(unsigned ArgNo, StringRef Kind) const {
685 return getAttribute(ArgNo + FirstArgIndex, Kind);
686 }
687
688 /// Return the alignment of the return value.
689 MaybeAlign getRetAlignment() const;
690
691 /// Return the alignment for the specified function parameter.
692 MaybeAlign getParamAlignment(unsigned ArgNo) const;
693
694 /// Return the stack alignment for the specified function parameter.
695 MaybeAlign getParamStackAlignment(unsigned ArgNo) const;
696
697 /// Return the byval type for the specified function parameter.
698 Type *getParamByValType(unsigned ArgNo) const;
699
700 /// Return the sret type for the specified function parameter.
701 Type *getParamStructRetType(unsigned ArgNo) const;
702
703 /// Return the byref type for the specified function parameter.
704 Type *getParamByRefType(unsigned ArgNo) const;
705
706 /// Return the preallocated type for the specified function parameter.
707 Type *getParamPreallocatedType(unsigned ArgNo) const;
708
709 /// Return the inalloca type for the specified function parameter.
710 Type *getParamInAllocaType(unsigned ArgNo) const;
711
712 /// Return the elementtype type for the specified function parameter.
713 Type *getParamElementType(unsigned ArgNo) const;
714
715 /// Get the stack alignment.
716 MaybeAlign getStackAlignment(unsigned Index) const;
717
718 /// Get the number of dereferenceable bytes (or zero if unknown).
719 uint64_t getDereferenceableBytes(unsigned Index) const;
720
721 /// Get the number of dereferenceable bytes (or zero if unknown) of an
722 /// arg.
723 uint64_t getParamDereferenceableBytes(unsigned ArgNo) const {
724 return getDereferenceableBytes(ArgNo + FirstArgIndex);
725 }
726
727 /// Get the number of dereferenceable_or_null bytes (or zero if
728 /// unknown).
729 uint64_t getDereferenceableOrNullBytes(unsigned Index) const;
730
731 /// Get the number of dereferenceable_or_null bytes (or zero if
732 /// unknown) of an arg.
733 uint64_t getParamDereferenceableOrNullBytes(unsigned ArgNo) const {
734 return getDereferenceableOrNullBytes(ArgNo + FirstArgIndex);
735 }
736
737 /// Get the allocsize argument numbers (or pair(0, 0) if unknown).
738 std::pair<unsigned, Optional<unsigned>>
739 getAllocSizeArgs(unsigned Index) const;
740
741 /// Get the vscale_range argument numbers (or pair(0, 0) if unknown).
742 std::pair<unsigned, unsigned> getVScaleRangeArgs(unsigned Index) const;
743
744 /// Return the attributes at the index as a string.
745 std::string getAsString(unsigned Index, bool InAttrGrp = false) const;
746
747 /// Return true if this attribute list belongs to the LLVMContext.
748 bool hasParentContext(LLVMContext &C) const;
749
750 //===--------------------------------------------------------------------===//
751 // AttributeList Introspection
752 //===--------------------------------------------------------------------===//
753
754 using iterator = const AttributeSet *;
755
756 iterator begin() const;
757 iterator end() const;
758
759 unsigned getNumAttrSets() const;
760
761 /// Use these to iterate over the valid attribute indices.
762 unsigned index_begin() const { return AttributeList::FunctionIndex; }
763 unsigned index_end() const { return getNumAttrSets() - 1; }
764
765 /// operator==/!= - Provide equality predicates.
766 bool operator==(const AttributeList &RHS) const { return pImpl == RHS.pImpl; }
767 bool operator!=(const AttributeList &RHS) const { return pImpl != RHS.pImpl; }
768
769 /// Return a raw pointer that uniquely identifies this attribute list.
770 void *getRawPointer() const {
771 return pImpl;
772 }
773
774 /// Return true if there are no attributes.
775 bool isEmpty() const { return pImpl == nullptr; }
776
777 void print(raw_ostream &O) const;
778
779 void dump() const;
780 };
781
782 //===----------------------------------------------------------------------===//
783 /// \class
784 /// Provide DenseMapInfo for AttributeList.
785 template <> struct DenseMapInfo<AttributeList> {
786 static AttributeList getEmptyKey() {
787 auto Val = static_cast<uintptr_t>(-1);
788 Val <<= PointerLikeTypeTraits<void*>::NumLowBitsAvailable;
789 return AttributeList(reinterpret_cast<AttributeListImpl *>(Val));
790 }
791
792 static AttributeList getTombstoneKey() {
793 auto Val = static_cast<uintptr_t>(-2);
794 Val <<= PointerLikeTypeTraits<void*>::NumLowBitsAvailable;
795 return AttributeList(reinterpret_cast<AttributeListImpl *>(Val));
796 }
797
798 static unsigned getHashValue(AttributeList AS) {
799 return (unsigned((uintptr_t)AS.pImpl) >> 4) ^
800 (unsigned((uintptr_t)AS.pImpl) >> 9);
801 }
802
803 static bool isEqual(AttributeList LHS, AttributeList RHS) {
804 return LHS == RHS;
805 }
806 };
807
808 //===----------------------------------------------------------------------===//
809 /// \class
810 /// This class is used in conjunction with the Attribute::get method to
811 /// create an Attribute object. The object itself is uniquified. The Builder's
812 /// value, however, is not. So this can be used as a quick way to test for
813 /// equality, presence of attributes, etc.
814 class AttrBuilder {
815 std::bitset<Attribute::EndAttrKinds> Attrs;
816 std::map<SmallString<32>, SmallString<32>, std::less<>> TargetDepAttrs;
817 MaybeAlign Alignment;
818 MaybeAlign StackAlignment;
819 uint64_t DerefBytes = 0;
820 uint64_t DerefOrNullBytes = 0;
821 uint64_t AllocSizeArgs = 0;
822 uint64_t VScaleRangeArgs = 0;
823 std::array<Type *, Attribute::NumTypeAttrKinds> TypeAttrs = {};
824
825 Optional<unsigned> kindToTypeIndex(Attribute::AttrKind Kind) const;
826
827 public:
828 AttrBuilder() = default;
829
830 AttrBuilder(const Attribute &A) {
831 addAttribute(A);
832 }
833
834 AttrBuilder(AttributeList AS, unsigned Idx);
835 AttrBuilder(AttributeSet AS);
836
837 void clear();
838
839 /// Add an attribute to the builder.
840 AttrBuilder &addAttribute(Attribute::AttrKind Val) {
841 assert((unsigned)Val < Attribute::EndAttrKinds &&
842 "Attribute out of range!");
843 assert(Attribute::isEnumAttrKind(Val) &&
844 "Adding integer/type attribute without an argument!");
845 Attrs[Val] = true;
846 return *this;
847 }
848
849 /// Add the Attribute object to the builder.
850 AttrBuilder &addAttribute(Attribute A);
851
852 /// Add the target-dependent attribute to the builder.
853 AttrBuilder &addAttribute(StringRef A, StringRef V = StringRef());
854
855 /// Remove an attribute from the builder.
856 AttrBuilder &removeAttribute(Attribute::AttrKind Val);
857
858 /// Remove the attributes from the builder.
859 AttrBuilder &removeAttributes(AttributeList A, uint64_t WithoutIndex);
860
861 /// Remove the target-dependent attribute to the builder.
862 AttrBuilder &removeAttribute(StringRef A);
863
864 /// Add the attributes from the builder.
865 AttrBuilder &merge(const AttrBuilder &B);
866
867 /// Remove the attributes from the builder.
868 AttrBuilder &remove(const AttrBuilder &B);
869
870 /// Return true if the builder has any attribute that's in the
871 /// specified builder.
872 bool overlaps(const AttrBuilder &B) const;
873
874 /// Return true if the builder has the specified attribute.
875 bool contains(Attribute::AttrKind A) const {
876 assert((unsigned)A < Attribute::EndAttrKinds && "Attribute out of range!");
877 return Attrs[A];
878 }
879
880 /// Return true if the builder has the specified target-dependent
881 /// attribute.
882 bool contains(StringRef A) const;
883
884 /// Return true if the builder has IR-level attributes.
885 bool hasAttributes() const;
886
887 /// Return true if the builder has any attribute that's in the
888 /// specified attribute.
889 bool hasAttributes(AttributeList A, uint64_t Index) const;
890
891 /// Return true if the builder has an alignment attribute.
892 bool hasAlignmentAttr() const;
893
894 /// Retrieve the alignment attribute, if it exists.
895 MaybeAlign getAlignment() const { return Alignment; }
896
897 /// Retrieve the stack alignment attribute, if it exists.
898 MaybeAlign getStackAlignment() const { return StackAlignment; }
899
900 /// Retrieve the number of dereferenceable bytes, if the
901 /// dereferenceable attribute exists (zero is returned otherwise).
902 uint64_t getDereferenceableBytes() const { return DerefBytes; }
903
904 /// Retrieve the number of dereferenceable_or_null bytes, if the
905 /// dereferenceable_or_null attribute exists (zero is returned otherwise).
906 uint64_t getDereferenceableOrNullBytes() const { return DerefOrNullBytes; }
907
908 /// Retrieve type for the given type attribute.
909 Type *getTypeAttr(Attribute::AttrKind Kind) const;
910
911 /// Retrieve the byval type.
912 Type *getByValType() const { return getTypeAttr(Attribute::ByVal); }
913
914 /// Retrieve the sret type.
915 Type *getStructRetType() const { return getTypeAttr(Attribute::StructRet); }
916
917 /// Retrieve the byref type.
918 Type *getByRefType() const { return getTypeAttr(Attribute::ByRef); }
919
920 /// Retrieve the preallocated type.
921 Type *getPreallocatedType() const {
922 return getTypeAttr(Attribute::Preallocated);
923 }
924
925 /// Retrieve the inalloca type.
926 Type *getInAllocaType() const { return getTypeAttr(Attribute::InAlloca); }
927
928 /// Retrieve the allocsize args, if the allocsize attribute exists. If it
929 /// doesn't exist, pair(0, 0) is returned.
930 std::pair<unsigned, Optional<unsigned>> getAllocSizeArgs() const;
931
932 /// Retrieve the vscale_range args, if the vscale_range attribute exists. If
933 /// it doesn't exist, pair(0, 0) is returned.
934 std::pair<unsigned, unsigned> getVScaleRangeArgs() const;
935
936 /// This turns an alignment into the form used internally in Attribute.
937 /// This call has no effect if Align is not set.
938 AttrBuilder &addAlignmentAttr(MaybeAlign Align);
939
940 /// This turns an int alignment (which must be a power of 2) into the
941 /// form used internally in Attribute.
942 /// This call has no effect if Align is 0.
943 /// Deprecated, use the version using a MaybeAlign.
944 inline AttrBuilder &addAlignmentAttr(unsigned Align) {
945 return addAlignmentAttr(MaybeAlign(Align));
946 }
947
948 /// This turns a stack alignment into the form used internally in Attribute.
949 /// This call has no effect if Align is not set.
950 AttrBuilder &addStackAlignmentAttr(MaybeAlign Align);
951
952 /// This turns an int stack alignment (which must be a power of 2) into
953 /// the form used internally in Attribute.
954 /// This call has no effect if Align is 0.
955 /// Deprecated, use the version using a MaybeAlign.
956 inline AttrBuilder &addStackAlignmentAttr(unsigned Align) {
957 return addStackAlignmentAttr(MaybeAlign(Align));
958 }
959
960 /// This turns the number of dereferenceable bytes into the form used
961 /// internally in Attribute.
962 AttrBuilder &addDereferenceableAttr(uint64_t Bytes);
963
964 /// This turns the number of dereferenceable_or_null bytes into the
965 /// form used internally in Attribute.
966 AttrBuilder &addDereferenceableOrNullAttr(uint64_t Bytes);
967
968 /// This turns one (or two) ints into the form used internally in Attribute.
969 AttrBuilder &addAllocSizeAttr(unsigned ElemSizeArg,
970 const Optional<unsigned> &NumElemsArg);
971
972 /// This turns two ints into the form used internally in Attribute.
973 AttrBuilder &addVScaleRangeAttr(unsigned MinValue, unsigned MaxValue);
974
975 /// Add a type attribute with the given type.
976 AttrBuilder &addTypeAttr(Attribute::AttrKind Kind, Type *Ty);
977
978 /// This turns a byval type into the form used internally in Attribute.
979 AttrBuilder &addByValAttr(Type *Ty);
980
981 /// This turns a sret type into the form used internally in Attribute.
982 AttrBuilder &addStructRetAttr(Type *Ty);
983
984 /// This turns a byref type into the form used internally in Attribute.
985 AttrBuilder &addByRefAttr(Type *Ty);
986
987 /// This turns a preallocated type into the form used internally in Attribute.
988 AttrBuilder &addPreallocatedAttr(Type *Ty);
989
990 /// This turns an inalloca type into the form used internally in Attribute.
991 AttrBuilder &addInAllocaAttr(Type *Ty);
992
993 /// Add an allocsize attribute, using the representation returned by
994 /// Attribute.getIntValue().
995 AttrBuilder &addAllocSizeAttrFromRawRepr(uint64_t RawAllocSizeRepr);
996
997 /// Add a vscale_range attribute, using the representation returned by
998 /// Attribute.getIntValue().
999 AttrBuilder &addVScaleRangeAttrFromRawRepr(uint64_t RawVScaleRangeRepr);
1000
1001 /// Return true if the builder contains no target-independent
1002 /// attributes.
1003 bool empty() const { return Attrs.none(); }
1004
1005 // Iterators for target-dependent attributes.
1006 using td_type = decltype(TargetDepAttrs)::value_type;
1007 using td_iterator = decltype(TargetDepAttrs)::iterator;
1008 using td_const_iterator = decltype(TargetDepAttrs)::const_iterator;
1009 using td_range = iterator_range<td_iterator>;
1010 using td_const_range = iterator_range<td_const_iterator>;
1011
1012 td_iterator td_begin() { return TargetDepAttrs.begin(); }
1013 td_iterator td_end() { return TargetDepAttrs.end(); }
1014
1015 td_const_iterator td_begin() const { return TargetDepAttrs.begin(); }
1016 td_const_iterator td_end() const { return TargetDepAttrs.end(); }
1017
1018 td_range td_attrs() { return td_range(td_begin(), td_end()); }
1019
1020 td_const_range td_attrs() const {
1021 return td_const_range(td_begin(), td_end());
1022 }
1023
1024 bool td_empty() const { return TargetDepAttrs.empty(); }
1025
1026 bool operator==(const AttrBuilder &B) const;
1027 bool operator!=(const AttrBuilder &B) const { return !(*this == B); }
1028 };
1029
1030 namespace AttributeFuncs {
1031
1032 /// Which attributes cannot be applied to a type.
1033 AttrBuilder typeIncompatible(Type *Ty);
1034
1035 /// Get param/return attributes which imply immediate undefined behavior if an
1036 /// invalid value is passed. For example, this includes noundef (where undef
1037 /// implies UB), but not nonnull (where null implies poison). It also does not
1038 /// include attributes like nocapture, which constrain the function
1039 /// implementation rather than the passed value.
1040 AttrBuilder getUBImplyingAttributes();
1041
1042 /// \returns Return true if the two functions have compatible target-independent
1043 /// attributes for inlining purposes.
1044 bool areInlineCompatible(const Function &Caller, const Function &Callee);
1045
1046
1047 /// Checks if there are any incompatible function attributes between
1048 /// \p A and \p B.
1049 ///
1050 /// \param [in] A - The first function to be compared with.
1051 /// \param [in] B - The second function to be compared with.
1052 /// \returns true if the functions have compatible attributes.
1053 bool areOutlineCompatible(const Function &A, const Function &B);
1054
1055 /// Merge caller's and callee's attributes.
1056 void mergeAttributesForInlining(Function &Caller, const Function &Callee);
1057
1058 /// Merges the functions attributes from \p ToMerge into function \p Base.
1059 ///
1060 /// \param [in,out] Base - The function being merged into.
1061 /// \param [in] ToMerge - The function to merge attributes from.
1062 void mergeAttributesForOutlining(Function &Base, const Function &ToMerge);
1063
1064 } // end namespace AttributeFuncs
1065
1066 } // end namespace llvm
1067
1068 #endif // LLVM_IR_ATTRIBUTES_H
1069