123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===-- 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|