14#ifndef LLVM_ABI_FUNCTIONINFO_H
15#define LLVM_ABI_FUNCTIONINFO_H
50 const Type *CoercionType =
nullptr;
59 struct DirectAttrInfo {
63 struct IndirectAttrInfo {
75 bool IndirectByVal : 1;
76 bool IndirectRealign : 1;
77 bool CanBeFlattened : 1;
78 unsigned NeededIntRegs : 3;
79 unsigned NeededSseRegs : 3;
83 IndirectRealign(
false), CanBeFlattened(
false), NeededIntRegs(0),
99 bool CanBeFlattened =
true) {
102 AI.Alignment =
Align;
104 AI.CanBeFlattened = CanBeFlattened;
109 assert(
T &&
"Type cannot be null");
110 assert(
T->isInteger() &&
"Unexpected type - only integers can be extended");
114 AI.Alignment = std::nullopt;
118 if (IntTy->isSigned())
129 bool Realign =
false) {
131 AI.Alignment =
Align;
133 AI.IndirectByVal = ByVal;
134 AI.IndirectRealign = Realign;
141 bool Realign =
false) {
143 AI.Alignment =
Align;
145 AI.IndirectRealign = Realign;
152 this->SignExt = SignExtend;
154 this->ZeroExt =
false;
159 this->ZeroExt = ZeroExtend;
161 this->SignExt =
false;
168 CanBeFlattened = Flatten;
191 assert(
IntRegs <= 7 && SseRegs <= 7 &&
"Register demand does not fit");
193 NeededSseRegs = SseRegs;
203 assert(Alignment.has_value() &&
204 "Indirect arguments must have an alignment");
216 return IndirectByVal;
221 return IndirectRealign;
228 return CanBeFlattened;
243 return !SignExt && !ZeroExt;
270 unsigned NumRequired;
281 assert(
N != ~0U &&
"~0U is reserved for a signature with no ellipsis");
294 const Type *ReturnType;
303 NumArgs(NumArguments), CC(CC), Required(Required) {}
311 void operator delete(
void *p) { ::operator
delete(p); }
319 LLVM_ABI static std::unique_ptr<FunctionInfo>
330 bool isVariadic()
const {
return Required.allowsOptionalArgs(); }
345 assert(Index < NumArgs &&
"Invalid argument index");
350 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")
static const MCPhysReg IntRegs[32]
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()
static ArgInfo getIndirectAliased(Align Align, unsigned AddrSpace, bool Realign=false)
An aliased indirect argument.
void setNeededRegs(unsigned IntRegs, unsigned SseRegs)
unsigned getIndirectAddrSpace() const
IndirectAttrInfo IndirectAttr
@ IndirectAliased
Like Indirect, but the pointer may alias an object referenced elsewhere.
@ 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)
unsigned getNeededIntRegs() const
How many integer and vector argument registers this argument occupies.
bool getIndirectRealign() const
ArgInfo & setSignExt(bool SignExtend=true)
bool getIndirectByVal() const
unsigned getNeededSseRegs() const
bool isIndirectAliased() 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)