blob: 2de5c71120ee9f12d177117e501558457127df91 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===-- llvm/Argument.h - Definition of the Argument class ------*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// 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
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
7//===----------------------------------------------------------------------===//
8//
9// This file declares the Argument class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_IR_ARGUMENT_H
14#define LLVM_IR_ARGUMENT_H
15
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"
20
21namespace llvm {
22
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.
29class Argument final : public Value {
30 Function *Parent;
31 unsigned ArgNo;
32
33 friend class Function;
34 void setParent(Function *parent);
35
36public:
37 /// Argument constructor.
38 explicit Argument(Type *Ty, const Twine &Name = "", Function *F = nullptr,
39 unsigned ArgNo = 0);
40
41 inline const Function *getParent() const { return Parent; }
42 inline Function *getParent() { return Parent; }
43
44 /// Return the index of this formal argument in its containing function.
45 ///
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");
49 return ArgNo;
50 }
51
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
54 /// addrspace(0).
55 bool hasNonNullAttr() const;
56
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;
60
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;
64
65 /// Return true if this argument has the byval attribute.
66 bool hasByValAttr() const;
67
68 /// Return true if this argument has the swiftself attribute.
69 bool hasSwiftSelfAttr() const;
70
71 /// Return true if this argument has the swifterror attribute.
72 bool hasSwiftErrorAttr() const;
73
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;
77
78 /// If this is a byval or inalloca argument, return its alignment.
79 unsigned getParamAlignment() const;
80
81 /// Return true if this argument has the nest attribute.
82 bool hasNestAttr() const;
83
84 /// Return true if this argument has the noalias attribute.
85 bool hasNoAliasAttr() const;
86
87 /// Return true if this argument has the nocapture attribute.
88 bool hasNoCaptureAttr() const;
89
90 /// Return true if this argument has the sret attribute.
91 bool hasStructRetAttr() const;
92
93 /// Return true if this argument has the returned attribute.
94 bool hasReturnedAttr() const;
95
96 /// Return true if this argument has the readonly or readnone attribute.
97 bool onlyReadsMemory() const;
98
99 /// Return true if this argument has the inalloca attribute.
100 bool hasInAllocaAttr() const;
101
102 /// Return true if this argument has the zext attribute.
103 bool hasZExtAttr() const;
104
105 /// Return true if this argument has the sext attribute.
106 bool hasSExtAttr() const;
107
108 /// Add attributes to an argument.
109 void addAttrs(AttrBuilder &B);
110
111 void addAttr(Attribute::AttrKind Kind);
112
113 void addAttr(Attribute Attr);
114
115 /// Remove attributes from an argument.
116 void removeAttr(Attribute::AttrKind Kind);
117
118 /// Check if an argument has a given attribute.
119 bool hasAttribute(Attribute::AttrKind Kind) const;
120
121 /// Method for support type inquiry through isa, cast, and dyn_cast.
122 static bool classof(const Value *V) {
123 return V->getValueID() == ArgumentVal;
124 }
125};
126
127} // End llvm namespace
128
129#endif