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