14#ifndef LLVM_ABI_FUNCTIONINFO_H
15#define LLVM_ABI_FUNCTIONINFO_H
47 const Type *CoercionType =
nullptr;
56 struct DirectAttrInfo {
60 struct IndirectAttrInfo {
72 bool IndirectByVal : 1;
73 bool IndirectRealign : 1;
74 bool CanBeFlattened : 1;
78 IndirectRealign(
false), CanBeFlattened(
false) {}
93 bool CanBeFlattened =
true) {
98 AI.CanBeFlattened = CanBeFlattened;
103 assert(
T &&
"Type cannot be null");
104 assert(
T->isInteger() &&
"Unexpected type - only integers can be extended");
108 AI.Alignment = std::nullopt;
112 if (IntTy->isSigned())
123 bool Realign =
false) {
125 AI.Alignment =
Align;
127 AI.IndirectByVal = ByVal;
128 AI.IndirectRealign = Realign;
135 this->SignExt = SignExtend;
137 this->ZeroExt =
false;
142 this->ZeroExt = ZeroExtend;
144 this->SignExt =
false;
151 CanBeFlattened = Flatten;
173 assert(Alignment.has_value() &&
174 "Indirect arguments must have an alignment");
185 return IndirectByVal;
190 return IndirectRealign;
197 return CanBeFlattened;
212 return !SignExt && !ZeroExt;
239 unsigned NumRequired;
250 assert(
N != ~0U &&
"~0U is reserved for a signature with no ellipsis");
263 const Type *ReturnType;
272 NumArgs(NumArguments), CC(CC), Required(Required) {}
280 void operator delete(
void *p) { ::operator
delete(p); }
288 LLVM_ABI static std::unique_ptr<FunctionInfo>
299 bool isVariadic()
const {
return Required.allowsOptionalArgs(); }
314 assert(Index < NumArgs &&
"Invalid argument index");
319 assert(Index < NumArgs &&
"Invalid argument index");
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This header defines support for implementing classes that have some trailing object (or arrays of obj...
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
const T * getTrailingObjects() const
Helper class to encapsulate information about how a specific type should be passed to or returned fro...
bool getCanBeFlattened() const
Whether a Direct record coercion may be split into one wire argument per field.
const Type * getCoerceToType() const
ArgInfo & setCanBeFlattened(bool Flatten)
See getCanBeFlattened.
Align getIndirectAlign() const
DirectAttrInfo DirectAttr
ArgInfo & setZeroExt(bool ZeroExtend=true)
static ArgInfo getIgnore()
unsigned getIndirectAddrSpace() const
IndirectAttrInfo IndirectAttr
@ Extend
Valid only for integer argument types.
@ Direct
Pass the argument directly using the normal converted LLVM type, or by coercing to another specified ...
@ Ignore
Ignore the argument (treat as void). Useful for void and empty structs.
@ Indirect
Pass the argument indirectly via a hidden pointer with the specified alignment and address space.
static ArgInfo getExtend(const Type *T)
static ArgInfo getIndirect(Align Align, bool ByVal, unsigned AddrSpace=0, bool Realign=false)
Realign: the caller couldn't guarantee sufficient alignment - the callee must copy the argument to a ...
MaybeAlign getDirectAlign() const
static ArgInfo getDirect(const Type *T=nullptr, unsigned Offset=0, MaybeAlign Align=std::nullopt, bool CanBeFlattened=true)
bool getIndirectRealign() const
ArgInfo & setSignExt(bool SignExtend=true)
bool getIndirectByVal() const
unsigned getDirectOffset() const
ArrayRef< ArgEntry > arguments() const
unsigned getNumRequiredArgs() const
const ArgInfo & getReturnInfo() const
const ArgEntry * const_arg_iterator
MutableArrayRef< ArgEntry > arguments()
CallingConv::ID getCallingConvention() const
ArgInfo & getReturnInfo()
const_arg_iterator arg_begin() const
const ArgEntry & getArgInfo(unsigned Index) const
friend class TrailingObjects
const_arg_iterator arg_end() const
unsigned arg_size() const
ArgEntry & getArgInfo(unsigned Index)
const Type * getReturnType() const
static LLVM_ABI std::unique_ptr< FunctionInfo > create(CallingConv::ID CC, const Type *ReturnType, ArrayRef< const Type * > ArgTypes, RequiredArgs Required=RequiredArgs::All)
Whether a signature accepts arguments beyond its declared parameters, and where the declared ones end...
bool allowsOptionalArgs() const
RequiredArgs(unsigned N)
A signature whose leading N arguments are declared and whose remaining arguments pass through an elli...
unsigned getNumRequiredArgs() const
RequiredArgs(All_t)
A signature with no ellipsis, where every argument is declared.
Represents the ABI-specific view of a type in LLVM.
This file defines the type system for the LLVMABI library, which mirrors ABI-relevant aspects of fron...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
This struct is a compact representation of a valid (non-zero power of two) alignment.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
ArgEntry(const Type *T, ArgInfo A)