//===-- llvm/Argument.h - Definition of the Argument class ------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the Argument class.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_IR_ARGUMENT_H
#define LLVM_IR_ARGUMENT_H

#include "llvm/ADT/Twine.h"
#include "llvm/ADT/ilist_node.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/Value.h"

namespace llvm {

template <typename NodeTy> class SymbolTableListTraits;

/// \brief LLVM Argument representation
///
/// 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 : public Value, public ilist_node<Argument> {
  virtual void anchor();
  Function *Parent;

  friend class SymbolTableListTraits<Argument>;
  void setParent(Function *parent);

public:
  /// \brief Constructor.
  ///
  /// If \p F is specified, the argument is inserted at the end of the argument
  /// list for \p F.
  explicit Argument(Type *Ty, const Twine &Name = "", Function *F = nullptr);

  inline const Function *getParent() const { return Parent; }
  inline       Function *getParent()       { return Parent; }

  /// \brief 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;

  /// \brief Return true if this argument has the nonnull attribute on it in
  /// its containing function. Also returns true if at least one byte is known
  /// to be dereferenceable and the pointer is in addrspace(0).
  bool hasNonNullAttr() const;

  /// \brief If this argument has the dereferenceable attribute on it in its
  /// containing function, return the number of bytes known to be
  /// dereferenceable. Otherwise, zero is returned.
  uint64_t getDereferenceableBytes() const;

  /// \brief If this argument has the dereferenceable_or_null attribute on
  /// it in its containing function, return the number of bytes known to be
  /// dereferenceable. Otherwise, zero is returned.
  uint64_t getDereferenceableOrNullBytes() const;

  /// \brief Return true if this argument has the byval attribute on it in its
  /// containing function.
  bool hasByValAttr() const;

  /// \brief Return true if this argument has the swiftself attribute.
  bool hasSwiftSelfAttr() const;

  /// \brief Return true if this argument has the swifterror attribute.
  bool hasSwiftErrorAttr() const;

  /// \brief Return true if this argument has the byval attribute or inalloca
  /// attribute on it in its containing function.  These attributes both
  /// represent arguments being passed by value.
  bool hasByValOrInAllocaAttr() const;

  /// \brief If this is a byval or inalloca argument, return its alignment.
  unsigned getParamAlignment() const;

  /// \brief Return true if this argument has the nest attribute on it in its
  /// containing function.
  bool hasNestAttr() const;

  /// \brief Return true if this argument has the noalias attribute on it in its
  /// containing function.
  bool hasNoAliasAttr() const;

  /// \brief Return true if this argument has the nocapture attribute on it in
  /// its containing function.
  bool hasNoCaptureAttr() const;

  /// \brief Return true if this argument has the sret attribute on it in its
  /// containing function.
  bool hasStructRetAttr() const;

  /// \brief Return true if this argument has the returned attribute on it in
  /// its containing function.
  bool hasReturnedAttr() const;

  /// \brief Return true if this argument has the readonly or readnone attribute
  /// on it in its containing function.
  bool onlyReadsMemory() const;

  /// \brief Return true if this argument has the inalloca attribute on it in
  /// its containing function.
  bool hasInAllocaAttr() const;

  /// \brief Return true if this argument has the zext attribute on it in its
  /// containing function.
  bool hasZExtAttr() const;

  /// \brief Return true if this argument has the sext attribute on it in its
  /// containing function.
  bool hasSExtAttr() const;

  /// \brief Add a Attribute to an argument.
  void addAttr(AttributeSet AS);

  void addAttr(Attribute::AttrKind Kind) {
    addAttr(AttributeSet::get(getContext(), getArgNo() + 1, Kind));
  }

  /// \brief Remove a Attribute from an argument.
  void removeAttr(AttributeSet AS);

  void removeAttr(Attribute::AttrKind Kind) {
    removeAttr(AttributeSet::get(getContext(), getArgNo() + 1, Kind));
  }

  /// \brief Checks if an argument has a given attribute.
  bool hasAttribute(Attribute::AttrKind Kind) const;

  /// \brief Method for support type inquiry through isa, cast, and
  /// dyn_cast.
  static inline bool classof(const Value *V) {
    return V->getValueID() == ArgumentVal;
  }
};

} // End llvm namespace

#endif
