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 22 namespace llvm { 23 24 /// This class represents an incoming formal argument to a Function. A formal 25 /// argument, since it is ``formal'', does not contain an actual value but 26 /// instead represents the type, argument number, and attributes of an argument 27 /// for a specific function. When used in the body of said function, the 28 /// argument of course represents the value of the actual argument that the 29 /// function was called with. 30 class Argument final : public Value { 31 Function *Parent; 32 unsigned ArgNo; 33 34 friend class Function; 35 void setParent(Function *parent); 36 37 public: 38 /// Argument constructor. 39 explicit Argument(Type *Ty, const Twine &Name = "", Function *F = nullptr, 40 unsigned ArgNo = 0); 41 42 inline const Function *getParent() const { return Parent; } 43 inline Function *getParent() { return Parent; } 44 45 /// Return the index of this formal argument in its containing function. 46 /// 47 /// For example in "void foo(int a, float b)" a is 0 and b is 1. 48 unsigned getArgNo() const { 49 assert(Parent && "can't get number of unparented arg"); 50 return ArgNo; 51 } 52 53 /// Return true if this argument has the nonnull attribute. Also returns true 54 /// if at least one byte is known to be dereferenceable and the pointer is in 55 /// addrspace(0). 56 bool hasNonNullAttr() const; 57 58 /// If this argument has the dereferenceable attribute, return the number of 59 /// bytes known to be dereferenceable. Otherwise, zero is returned. 60 uint64_t getDereferenceableBytes() const; 61 62 /// If this argument has the dereferenceable_or_null attribute, return the 63 /// number of bytes known to be dereferenceable. Otherwise, zero is returned. 64 uint64_t getDereferenceableOrNullBytes() const; 65 66 /// Return true if this argument has the byval attribute. 67 bool hasByValAttr() const; 68 69 /// Return true if this argument has the swiftself attribute. 70 bool hasSwiftSelfAttr() const; 71 72 /// Return true if this argument has the swifterror attribute. 73 bool hasSwiftErrorAttr() const; 74 75 /// Return true if this argument has the byval attribute or inalloca 76 /// attribute. These attributes represent arguments being passed by value. 77 bool hasByValOrInAllocaAttr() const; 78 79 /// If this is a byval or inalloca argument, return its alignment. 80 unsigned getParamAlignment() const; 81 82 /// Return true if this argument has the nest attribute. 83 bool hasNestAttr() const; 84 85 /// Return true if this argument has the noalias attribute. 86 bool hasNoAliasAttr() const; 87 88 /// Return true if this argument has the nocapture attribute. 89 bool hasNoCaptureAttr() const; 90 91 /// Return true if this argument has the sret attribute. 92 bool hasStructRetAttr() const; 93 94 /// Return true if this argument has the returned attribute. 95 bool hasReturnedAttr() const; 96 97 /// Return true if this argument has the readonly or readnone attribute. 98 bool onlyReadsMemory() const; 99 100 /// Return true if this argument has the inalloca attribute. 101 bool hasInAllocaAttr() const; 102 103 /// Return true if this argument has the zext attribute. 104 bool hasZExtAttr() const; 105 106 /// Return true if this argument has the sext attribute. 107 bool hasSExtAttr() const; 108 109 /// Add attributes to an argument. 110 void addAttrs(AttrBuilder &B); 111 112 void addAttr(Attribute::AttrKind Kind); 113 114 void addAttr(Attribute Attr); 115 116 /// Remove attributes from an argument. 117 void removeAttr(Attribute::AttrKind Kind); 118 119 /// Check if an argument has a given attribute. 120 bool hasAttribute(Attribute::AttrKind Kind) const; 121 122 /// Method for support type inquiry through isa, cast, and dyn_cast. 123 static inline bool classof(const Value *V) { 124 return V->getValueID() == ArgumentVal; 125 } 126 }; 127 128 } // End llvm namespace 129 130 #endif 131