1 //===-- llvm/Argument.h - Definition of the Argument class ------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file declares the Argument class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_IR_ARGUMENT_H
14 #define LLVM_IR_ARGUMENT_H
16 #include "llvm/ADT/Twine.h"
17 #include "llvm/ADT/ilist_node.h"
18 #include "llvm/IR/Attributes.h"
19 #include "llvm/IR/Value.h"
23 /// This class represents an incoming formal argument to a Function. A formal
24 /// argument, since it is ``formal'', does not contain an actual value but
25 /// instead represents the type, argument number, and attributes of an argument
26 /// for a specific function. When used in the body of said function, the
27 /// argument of course represents the value of the actual argument that the
28 /// function was called with.
29 class Argument final
: public Value
{
33 friend class Function
;
34 void setParent(Function
*parent
);
37 /// Argument constructor.
38 explicit Argument(Type
*Ty
, const Twine
&Name
= "", Function
*F
= nullptr,
41 inline const Function
*getParent() const { return Parent
; }
42 inline Function
*getParent() { return Parent
; }
44 /// Return the index of this formal argument in its containing function.
46 /// For example in "void foo(int a, float b)" a is 0 and b is 1.
47 unsigned getArgNo() const {
48 assert(Parent
&& "can't get number of unparented arg");
52 /// Return true if this argument has the nonnull attribute. Also returns true
53 /// if at least one byte is known to be dereferenceable and the pointer is in
55 bool hasNonNullAttr() const;
57 /// If this argument has the dereferenceable attribute, return the number of
58 /// bytes known to be dereferenceable. Otherwise, zero is returned.
59 uint64_t getDereferenceableBytes() const;
61 /// If this argument has the dereferenceable_or_null attribute, return the
62 /// number of bytes known to be dereferenceable. Otherwise, zero is returned.
63 uint64_t getDereferenceableOrNullBytes() const;
65 /// Return true if this argument has the byval attribute.
66 bool hasByValAttr() const;
68 /// Return true if this argument has the swiftself attribute.
69 bool hasSwiftSelfAttr() const;
71 /// Return true if this argument has the swifterror attribute.
72 bool hasSwiftErrorAttr() const;
74 /// Return true if this argument has the byval attribute or inalloca
75 /// attribute. These attributes represent arguments being passed by value.
76 bool hasByValOrInAllocaAttr() const;
78 /// If this is a byval or inalloca argument, return its alignment.
79 unsigned getParamAlignment() const;
81 /// If this is a byval argument, return its type.
82 Type
*getParamByValType() const;
84 /// Return true if this argument has the nest attribute.
85 bool hasNestAttr() const;
87 /// Return true if this argument has the noalias attribute.
88 bool hasNoAliasAttr() const;
90 /// Return true if this argument has the nocapture attribute.
91 bool hasNoCaptureAttr() const;
93 /// Return true if this argument has the sret attribute.
94 bool hasStructRetAttr() const;
96 /// Return true if this argument has the inreg attribute.
97 bool hasInRegAttr() const;
99 /// Return true if this argument has the returned attribute.
100 bool hasReturnedAttr() const;
102 /// Return true if this argument has the readonly or readnone attribute.
103 bool onlyReadsMemory() const;
105 /// Return true if this argument has the inalloca attribute.
106 bool hasInAllocaAttr() const;
108 /// Return true if this argument has the zext attribute.
109 bool hasZExtAttr() const;
111 /// Return true if this argument has the sext attribute.
112 bool hasSExtAttr() const;
114 /// Add attributes to an argument.
115 void addAttrs(AttrBuilder
&B
);
117 void addAttr(Attribute::AttrKind Kind
);
119 void addAttr(Attribute Attr
);
121 /// Remove attributes from an argument.
122 void removeAttr(Attribute::AttrKind Kind
);
124 /// Check if an argument has a given attribute.
125 bool hasAttribute(Attribute::AttrKind Kind
) const;
127 Attribute
getAttribute(Attribute::AttrKind Kind
) const;
129 /// Method for support type inquiry through isa, cast, and dyn_cast.
130 static bool classof(const Value
*V
) {
131 return V
->getValueID() == ArgumentVal
;
135 } // End llvm namespace