1//===-- llvm/Argument.h - Definition of the Argument class ------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the Argument class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_IR_ARGUMENT_H
15#define LLVM_IR_ARGUMENT_H
16
17#include "llvm/ADT/Twine.h"
18#include "llvm/ADT/ilist_node.h"
19#include "llvm/IR/Attributes.h"
20#include "llvm/IR/Value.h"
21
22namespace llvm {
23
24template <typename NodeTy> class SymbolTableListTraits;
25
26/// \brief LLVM Argument representation
27///
28/// This class represents an incoming formal argument to a Function. A formal
29/// argument, since it is ``formal'', does not contain an actual value but
30/// instead represents the type, argument number, and attributes of an argument
31/// for a specific function. When used in the body of said function, the
32/// argument of course represents the value of the actual argument that the
33/// function was called with.
34class Argument : public Value, public ilist_node<Argument> {
35  virtual void anchor();
36  Function *Parent;
37
38  friend class SymbolTableListTraits<Argument>;
39  void setParent(Function *parent);
40
41public:
42  /// \brief Constructor.
43  ///
44  /// If \p F is specified, the argument is inserted at the end of the argument
45  /// list for \p F.
46  explicit Argument(Type *Ty, const Twine &Name = "", Function *F = nullptr);
47
48  inline const Function *getParent() const { return Parent; }
49  inline       Function *getParent()       { return Parent; }
50
51  /// \brief Return the index of this formal argument in its containing
52  /// function.
53  ///
54  /// For example in "void foo(int a, float b)" a is 0 and b is 1.
55  unsigned getArgNo() const;
56
57  /// \brief Return true if this argument has the nonnull attribute on it in
58  /// its containing function. Also returns true if at least one byte is known
59  /// to be dereferenceable and the pointer is in addrspace(0).
60  bool hasNonNullAttr() const;
61
62  /// \brief If this argument has the dereferenceable attribute on it in its
63  /// containing function, return the number of bytes known to be
64  /// dereferenceable. Otherwise, zero is returned.
65  uint64_t getDereferenceableBytes() const;
66
67  /// \brief If this argument has the dereferenceable_or_null attribute on
68  /// it in its containing function, return the number of bytes known to be
69  /// dereferenceable. Otherwise, zero is returned.
70  uint64_t getDereferenceableOrNullBytes() const;
71
72  /// \brief Return true if this argument has the byval attribute on it in its
73  /// containing function.
74  bool hasByValAttr() const;
75
76  /// \brief Return true if this argument has the swiftself attribute.
77  bool hasSwiftSelfAttr() const;
78
79  /// \brief Return true if this argument has the swifterror attribute.
80  bool hasSwiftErrorAttr() const;
81
82  /// \brief Return true if this argument has the byval attribute or inalloca
83  /// attribute on it in its containing function.  These attributes both
84  /// represent arguments being passed by value.
85  bool hasByValOrInAllocaAttr() const;
86
87  /// \brief If this is a byval or inalloca argument, return its alignment.
88  unsigned getParamAlignment() const;
89
90  /// \brief Return true if this argument has the nest attribute on it in its
91  /// containing function.
92  bool hasNestAttr() const;
93
94  /// \brief Return true if this argument has the noalias attribute on it in its
95  /// containing function.
96  bool hasNoAliasAttr() const;
97
98  /// \brief Return true if this argument has the nocapture attribute on it in
99  /// its containing function.
100  bool hasNoCaptureAttr() const;
101
102  /// \brief Return true if this argument has the sret attribute on it in its
103  /// containing function.
104  bool hasStructRetAttr() const;
105
106  /// \brief Return true if this argument has the returned attribute on it in
107  /// its containing function.
108  bool hasReturnedAttr() const;
109
110  /// \brief Return true if this argument has the readonly or readnone attribute
111  /// on it in its containing function.
112  bool onlyReadsMemory() const;
113
114  /// \brief Return true if this argument has the inalloca attribute on it in
115  /// its containing function.
116  bool hasInAllocaAttr() const;
117
118  /// \brief Return true if this argument has the zext attribute on it in its
119  /// containing function.
120  bool hasZExtAttr() const;
121
122  /// \brief Return true if this argument has the sext attribute on it in its
123  /// containing function.
124  bool hasSExtAttr() const;
125
126  /// \brief Add a Attribute to an argument.
127  void addAttr(AttributeSet AS);
128
129  void addAttr(Attribute::AttrKind Kind) {
130    addAttr(AttributeSet::get(getContext(), getArgNo() + 1, Kind));
131  }
132
133  /// \brief Remove a Attribute from an argument.
134  void removeAttr(AttributeSet AS);
135
136  void removeAttr(Attribute::AttrKind Kind) {
137    removeAttr(AttributeSet::get(getContext(), getArgNo() + 1, Kind));
138  }
139
140  /// \brief Checks if an argument has a given attribute.
141  bool hasAttribute(Attribute::AttrKind Kind) const;
142
143  /// \brief Method for support type inquiry through isa, cast, and
144  /// dyn_cast.
145  static inline bool classof(const Value *V) {
146    return V->getValueID() == ArgumentVal;
147  }
148};
149
150} // End llvm namespace
151
152#endif
153