//===-- llvm/Argument.h - Definition of the Argument class ------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
// This file declares the Argument class.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_IR_ARGUMENT_H
 
#define LLVM_IR_ARGUMENT_H
 
 
 
#include "llvm/ADT/Twine.h"
 
#include "llvm/IR/Attributes.h"
 
#include "llvm/IR/Value.h"
 
 
 
namespace llvm {
 
 
 
/// This class represents an incoming formal argument to a Function. A formal
 
/// argument, since it is ``formal'', does not contain an actual value but
 
/// instead represents the type, argument number, and attributes of an argument
 
/// for a specific function. When used in the body of said function, the
 
/// argument of course represents the value of the actual argument that the
 
/// function was called with.
 
class Argument final : public Value {
 
  Function *Parent;
 
  unsigned ArgNo;
 
 
 
  friend class Function;
 
  void setParent(Function *parent);
 
 
 
public:
 
  /// Argument constructor.
 
  explicit Argument(Type *Ty, const Twine &Name = "", Function *F = nullptr,
 
                    unsigned ArgNo = 0);
 
 
 
  inline const Function *getParent() const { return Parent; }
 
  inline       Function *getParent()       { return Parent; }
 
 
 
  /// Return the index of this formal argument in its containing function.
 
  ///
 
  /// For example in "void foo(int a, float b)" a is 0 and b is 1.
 
  unsigned getArgNo() const {
 
    assert(Parent && "can't get number of unparented arg");
 
    return ArgNo;
 
  }
 
 
 
  /// Return true if this argument has the nonnull attribute. Also returns true
 
  /// if at least one byte is known to be dereferenceable and the pointer is in
 
  /// addrspace(0).
 
  /// If AllowUndefOrPoison is true, respect the semantics of nonnull attribute
 
  /// and return true even if the argument can be undef or poison.
 
  bool hasNonNullAttr(bool AllowUndefOrPoison = true) const;
 
 
 
  /// If this argument has the dereferenceable attribute, return the number of
 
  /// bytes known to be dereferenceable. Otherwise, zero is returned.
 
  uint64_t getDereferenceableBytes() const;
 
 
 
  /// If this argument has the dereferenceable_or_null attribute, return the
 
  /// number of bytes known to be dereferenceable. Otherwise, zero is returned.
 
  uint64_t getDereferenceableOrNullBytes() const;
 
 
 
  /// Return true if this argument has the byval attribute.
 
  bool hasByValAttr() const;
 
 
 
  /// Return true if this argument has the byref attribute.
 
  bool hasByRefAttr() const;
 
 
 
  /// Return true if this argument has the swiftself attribute.
 
  bool hasSwiftSelfAttr() const;
 
 
 
  /// Return true if this argument has the swifterror attribute.
 
  bool hasSwiftErrorAttr() const;
 
 
 
  /// Return true if this argument has the byval, inalloca, or preallocated
 
  /// attribute. These attributes represent arguments being passed by value,
 
  /// with an associated copy between the caller and callee
 
  bool hasPassPointeeByValueCopyAttr() const;
 
 
 
  /// If this argument satisfies has hasPassPointeeByValueAttr, return the
 
  /// in-memory ABI size copied to the stack for the call. Otherwise, return 0.
 
  uint64_t getPassPointeeByValueCopySize(const DataLayout &DL) const;
 
 
 
  /// Return true if this argument has the byval, sret, inalloca, preallocated,
 
  /// or byref attribute. These attributes represent arguments being passed by
 
  /// value (which may or may not involve a stack copy)
 
  bool hasPointeeInMemoryValueAttr() const;
 
 
 
  /// If hasPointeeInMemoryValueAttr returns true, the in-memory ABI type is
 
  /// returned. Otherwise, nullptr.
 
  Type *getPointeeInMemoryValueType() const;
 
 
 
  /// If this is a byval or inalloca argument, return its alignment.
 
  /// FIXME: Remove this function once transition to Align is over.
 
  /// Use getParamAlign() instead.
 
  LLVM_DEPRECATED("Use getParamAlign() instead", "getParamAlign")
 
  uint64_t getParamAlignment() const;
 
 
 
  /// If this is a byval or inalloca argument, return its alignment.
 
  MaybeAlign getParamAlign() const;
 
 
 
  MaybeAlign getParamStackAlign() const;
 
 
 
  /// If this is a byval argument, return its type.
 
  Type *getParamByValType() const;
 
 
 
  /// If this is an sret argument, return its type.
 
  Type *getParamStructRetType() const;
 
 
 
  /// If this is a byref argument, return its type.
 
  Type *getParamByRefType() const;
 
 
 
  /// If this is an inalloca argument, return its type.
 
  Type *getParamInAllocaType() const;
 
 
 
  /// Return true if this argument has the nest attribute.
 
  bool hasNestAttr() const;
 
 
 
  /// Return true if this argument has the noalias attribute.
 
  bool hasNoAliasAttr() const;
 
 
 
  /// Return true if this argument has the nocapture attribute.
 
  bool hasNoCaptureAttr() const;
 
 
 
  /// Return true if this argument has the nofree attribute.
 
  bool hasNoFreeAttr() const;
 
 
 
  /// Return true if this argument has the sret attribute.
 
  bool hasStructRetAttr() const;
 
 
 
  /// Return true if this argument has the inreg attribute.
 
  bool hasInRegAttr() const;
 
 
 
  /// Return true if this argument has the returned attribute.
 
  bool hasReturnedAttr() const;
 
 
 
  /// Return true if this argument has the readonly or readnone attribute.
 
  bool onlyReadsMemory() const;
 
 
 
  /// Return true if this argument has the inalloca attribute.
 
  bool hasInAllocaAttr() const;
 
 
 
  /// Return true if this argument has the preallocated attribute.
 
  bool hasPreallocatedAttr() const;
 
 
 
  /// Return true if this argument has the zext attribute.
 
  bool hasZExtAttr() const;
 
 
 
  /// Return true if this argument has the sext attribute.
 
  bool hasSExtAttr() const;
 
 
 
  /// Add attributes to an argument.
 
  void addAttrs(AttrBuilder &B);
 
 
 
  void addAttr(Attribute::AttrKind Kind);
 
 
 
  void addAttr(Attribute Attr);
 
 
 
  /// Remove attributes from an argument.
 
  void removeAttr(Attribute::AttrKind Kind);
 
 
 
  void removeAttrs(const AttributeMask &AM);
 
 
 
  /// Check if an argument has a given attribute.
 
  bool hasAttribute(Attribute::AttrKind Kind) const;
 
 
 
  Attribute getAttribute(Attribute::AttrKind Kind) const;
 
 
 
  /// Method for support type inquiry through isa, cast, and dyn_cast.
 
  static bool classof(const Value *V) {
 
    return V->getValueID() == ArgumentVal;
 
  }
 
};
 
 
 
} // End llvm namespace
 
 
 
#endif