15#ifndef LLVM_CLANG_CODEGEN_CGFUNCTIONINFO_H
16#define LLVM_CLANG_CODEGEN_CGFUNCTIONINFO_H
22#include "llvm/IR/DerivedTypes.h"
23#include "llvm/ADT/FoldingSet.h"
24#include "llvm/Support/TrailingObjects.h"
101 struct DirectAttrInfo {
105 struct IndirectAttrInfo {
115 bool PaddingInReg : 1;
116 bool InAllocaSRet : 1;
117 bool InAllocaIndirect : 1;
118 bool IndirectByVal : 1;
119 bool IndirectRealign : 1;
120 bool SRetAfterThis : 1;
122 bool CanBeFlattened: 1;
126 bool canHavePaddingType()
const {
130 void setPaddingType(llvm::Type *
T) {
131 assert(canHavePaddingType());
135 void setUnpaddedCoerceToType(llvm::Type *
T) {
149 llvm::Type *Padding =
nullptr,
150 bool CanBeFlattened =
true,
unsigned Align = 0) {
152 AI.setCoerceToType(
T);
153 AI.setPaddingType(Padding);
154 AI.setDirectOffset(Offset);
155 AI.setDirectAlign(Align);
156 AI.setCanBeFlattened(CanBeFlattened);
168 AI.setCoerceToType(
T);
169 AI.setPaddingType(
nullptr);
170 AI.setDirectOffset(0);
171 AI.setDirectAlign(0);
179 AI.setCoerceToType(
T);
180 AI.setPaddingType(
nullptr);
181 AI.setDirectOffset(0);
182 AI.setDirectAlign(0);
199 AI.setCoerceToType(
T);
200 AI.setPaddingType(
nullptr);
201 AI.setDirectOffset(0);
202 AI.setDirectAlign(0);
215 bool ByVal =
true,
bool Realign =
false,
216 llvm::Type *Padding =
nullptr) {
218 AI.setIndirectAlign(Alignment);
219 AI.setIndirectByVal(ByVal);
220 AI.setIndirectRealign(Realign);
221 AI.setSRetAfterThis(
false);
222 AI.setPaddingType(Padding);
223 AI.setIndirectAddrSpace(AddrSpace);
229 bool Realign =
false,
230 llvm::Type *Padding =
nullptr) {
232 AI.setIndirectAlign(Alignment);
233 AI.setIndirectRealign(Realign);
234 AI.setPaddingType(Padding);
235 AI.setIndirectAddrSpace(AddrSpace);
240 bool Realign =
false) {
241 auto AI =
getIndirect(Alignment, 0, ByVal, Realign);
247 AI.setInAllocaFieldIndex(FieldIndex);
253 AI.setPaddingType(
nullptr);
257 llvm::Type *Padding) {
259 AI.setPaddingInReg(PaddingInReg);
260 AI.setPaddingType(Padding);
268 llvm::Type *unpaddedCoerceToType) {
273 auto unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoerceToType);
274 assert(!unpaddedStruct || unpaddedStruct->getNumElements() != 1);
278 unsigned unpaddedIndex = 0;
279 for (
auto eltType : coerceToType->elements()) {
286 if (unpaddedStruct) {
287 assert(unpaddedStruct->getNumElements() == unpaddedIndex);
289 assert(unpaddedIndex == 1);
294 AI.setCoerceToType(coerceToType);
295 AI.setUnpaddedCoerceToType(unpaddedCoerceToType);
301 llvm::Type *Padding =
nullptr,
302 bool CanBeFlattened =
true,
303 unsigned Align = 0) {
305 AI.setCoerceToType(
T);
306 AI.setPaddingType(Padding);
307 AI.setDirectOffset(Offset);
308 AI.setDirectAlign(Align);
309 AI.setCanBeFlattened(CanBeFlattened);
314 return eltType->isArrayTy() &&
315 eltType->getArrayElementType()->isIntegerTy(8);
337 "Not a direct or extend or target specific kind");
342 "Not a direct or extend or target specific kind");
348 "Not a direct or extend or target specific kind");
353 "Not a direct or extend or target specific kind");
358 assert(
isExtend() && (SignExt + ZeroExt <= 1) &&
"Invalid kind / flags!");
362 assert(
isExtend() &&
"Invalid kind!");
367 assert(
isExtend() && (SignExt + ZeroExt <= 1) &&
"Invalid kind / flags!");
371 assert(
isExtend() &&
"Invalid kind!");
376 assert(
isExtend() && (SignExt + ZeroExt <= 1) &&
"Invalid kind / flags!");
377 return !SignExt && !ZeroExt;
381 return (canHavePaddingType() ?
PaddingType :
nullptr);
403 return cast<llvm::StructType>(TypeData);
415 return structTy->elements();
445 return IndirectByVal;
464 return IndirectRealign;
468 IndirectRealign = IR;
473 return SRetAfterThis;
477 SRetAfterThis = AfterThis;
491 return InAllocaIndirect;
512 return CanBeFlattened;
517 CanBeFlattened = Flatten;
528 unsigned NumRequired;
543 unsigned additional) {
547 additional += llvm::count_if(
550 return ExtInfo.hasPassObjectSize();
557 unsigned additional) {
577 return argIdx == ~0
U || argIdx < NumRequired;
582 if (value == ~0
U)
return All;
597 :
public llvm::FoldingSetNode,
598 private llvm::TrailingObjects<CGFunctionInfo, CGFunctionInfoArgInfo,
599 FunctionProtoType::ExtParameterInfo> {
605 unsigned CallingConvention : 8;
609 unsigned EffectiveCallingConvention : 8;
613 unsigned ASTCallingConvention : 6;
616 LLVM_PREFERRED_TYPE(
bool)
617 unsigned InstanceMethod : 1;
620 LLVM_PREFERRED_TYPE(
bool)
621 unsigned ChainCall : 1;
625 LLVM_PREFERRED_TYPE(
bool)
626 unsigned DelegateCall : 1;
629 LLVM_PREFERRED_TYPE(
bool)
630 unsigned CmseNSCall : 1;
633 LLVM_PREFERRED_TYPE(
bool)
634 unsigned NoReturn : 1;
637 LLVM_PREFERRED_TYPE(
bool)
638 unsigned ReturnsRetained : 1;
641 LLVM_PREFERRED_TYPE(
bool)
642 unsigned NoCallerSavedRegs : 1;
645 LLVM_PREFERRED_TYPE(
bool)
646 unsigned HasRegParm : 1;
647 unsigned RegParm : 3;
650 LLVM_PREFERRED_TYPE(
bool)
651 unsigned NoCfCheck : 1;
654 unsigned MaxVectorWidth : 4;
660 llvm::StructType *ArgStruct;
661 unsigned ArgStructAlign : 31;
662 LLVM_PREFERRED_TYPE(
bool)
663 unsigned HasExtParameterInfos : 1;
668 return getTrailingObjects<ArgInfo>();
670 const ArgInfo *getArgsBuffer()
const {
671 return getTrailingObjects<ArgInfo>();
675 return getTrailingObjects<ExtParameterInfo>();
678 return getTrailingObjects<ExtParameterInfo>();
685 create(
unsigned llvmCC,
bool instanceMethod,
bool chainCall,
689 void operator delete(
void *p) { ::operator
delete(p); }
698 return (HasExtParameterInfos ? NumArgs : 0);
757 return EffectiveCallingConvention;
760 EffectiveCallingConvention =
Value;
779 if (!HasExtParameterInfos)
return {};
783 assert(argIndex <= NumArgs);
803 return MaxVectorWidth ? 1U << (MaxVectorWidth - 1) : 0;
808 assert(llvm::isPowerOf2_32(Width) &&
"Expected power of 2 vector");
809 MaxVectorWidth = llvm::countr_zero(Width) + 1;
814 ID.AddBoolean(InstanceMethod);
815 ID.AddBoolean(ChainCall);
816 ID.AddBoolean(DelegateCall);
817 ID.AddBoolean(NoReturn);
818 ID.AddBoolean(ReturnsRetained);
819 ID.AddBoolean(NoCallerSavedRegs);
820 ID.AddBoolean(HasRegParm);
821 ID.AddInteger(RegParm);
822 ID.AddBoolean(NoCfCheck);
823 ID.AddBoolean(CmseNSCall);
825 ID.AddBoolean(HasExtParameterInfos);
826 if (HasExtParameterInfos) {
828 ID.AddInteger(paramInfo.getOpaqueValue());
834 static void Profile(llvm::FoldingSetNodeID &
ID,
bool InstanceMethod,
841 ID.AddBoolean(InstanceMethod);
842 ID.AddBoolean(ChainCall);
852 ID.AddBoolean(!paramInfos.empty());
853 if (!paramInfos.empty()) {
854 for (
auto paramInfo : paramInfos)
855 ID.AddInteger(paramInfo.getOpaqueValue());
C Language Family Type Representation.
Represents a canonical, potentially-qualified type.
void Profile(llvm::FoldingSetNodeID &ID) const
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
ABIArgInfo - Helper class to encapsulate information about how a specific C type should be passed to ...
void setZeroExt(bool ZExt)
unsigned getInAllocaFieldIndex() const
void setIndirectAddrSpace(unsigned AddrSpace)
static ABIArgInfo getNoExtend(llvm::IntegerType *T)
bool getIndirectByVal() const
llvm::StructType * getCoerceAndExpandType() const
bool getIndirectRealign() const
static ABIArgInfo getInAlloca(unsigned FieldIndex, bool Indirect=false)
static ABIArgInfo getIgnore()
static ABIArgInfo getExpand()
void setCoerceToType(llvm::Type *T)
llvm::Type * getUnpaddedCoerceAndExpandType() const
bool getCanBeFlattened() const
unsigned getDirectOffset() const
static bool isPaddingForCoerceAndExpand(llvm::Type *eltType)
void setDirectOffset(unsigned Offset)
static ABIArgInfo getTargetSpecific(llvm::Type *T=nullptr, unsigned Offset=0, llvm::Type *Padding=nullptr, bool CanBeFlattened=true, unsigned Align=0)
void setPaddingInReg(bool PIR)
bool getInAllocaSRet() const
Return true if this field of an inalloca struct should be returned to implement a struct return calli...
void setIndirectAlign(CharUnits IA)
llvm::Type * getPaddingType() const
void setIndirectByVal(bool IBV)
static ABIArgInfo getExtendInReg(QualType Ty, llvm::Type *T=nullptr)
bool getPaddingInReg() const
static ABIArgInfo getExpandWithPadding(bool PaddingInReg, llvm::Type *Padding)
unsigned getDirectAlign() const
unsigned getIndirectAddrSpace() const
ABIArgInfo(Kind K=Direct)
static ABIArgInfo getIndirectInReg(CharUnits Alignment, bool ByVal=true, bool Realign=false)
void setIndirectRealign(bool IR)
static ABIArgInfo getDirect(llvm::Type *T=nullptr, unsigned Offset=0, llvm::Type *Padding=nullptr, bool CanBeFlattened=true, unsigned Align=0)
@ Extend
Extend - Valid only for integer argument types.
@ Ignore
Ignore - Ignore the argument (treat as void).
@ IndirectAliased
IndirectAliased - Similar to Indirect, but the pointer may be to an object that is otherwise referenc...
@ Expand
Expand - Only valid for aggregate argument types.
@ TargetSpecific
TargetSpecific - Some argument types are passed as target specific types such as RISC-V's tuple type,...
@ InAlloca
InAlloca - Pass the argument directly using the LLVM inalloca attribute.
@ Indirect
Indirect - Pass the argument indirectly via a hidden pointer with the specified alignment (0 indicate...
@ CoerceAndExpand
CoerceAndExpand - Only valid for aggregate argument types.
@ Direct
Direct - Pass the argument directly using the normal converted LLVM type, or by coercing to another s...
static ABIArgInfo getIndirect(CharUnits Alignment, unsigned AddrSpace, bool ByVal=true, bool Realign=false, llvm::Type *Padding=nullptr)
ArrayRef< llvm::Type * > getCoerceAndExpandTypeSequence() const
static ABIArgInfo getIndirectAliased(CharUnits Alignment, unsigned AddrSpace, bool Realign=false, llvm::Type *Padding=nullptr)
Pass this in memory using the IR byref attribute.
void setSRetAfterThis(bool AfterThis)
bool isTargetSpecific() const
void setInAllocaIndirect(bool Indirect)
void setInAllocaSRet(bool SRet)
bool isCoerceAndExpand() const
static ABIArgInfo getZeroExtend(QualType Ty, llvm::Type *T=nullptr)
static ABIArgInfo getExtend(QualType Ty, llvm::Type *T=nullptr)
DirectAttrInfo DirectAttr
static ABIArgInfo getCoerceAndExpand(llvm::StructType *coerceToType, llvm::Type *unpaddedCoerceToType)
unsigned AllocaFieldIndex
unsigned getInAllocaIndirect() const
llvm::Type * getCoerceToType() const
bool isIndirectAliased() const
void setInAllocaFieldIndex(unsigned FieldIndex)
bool isSRetAfterThis() const
IndirectAttrInfo IndirectAttr
bool canHaveCoerceToType() const
llvm::Type * UnpaddedCoerceAndExpandType
void setSignExt(bool SExt)
void setCanBeFlattened(bool Flatten)
void setDirectAlign(unsigned Align)
static ABIArgInfo getSignExtend(QualType Ty, llvm::Type *T=nullptr)
CharUnits getIndirectAlign() const
static ABIArgInfo getDirectInReg(llvm::Type *T=nullptr)
CGFunctionInfo - Class to encapsulate the information about a function definition.
bool usesInAlloca() const
Return true if this function uses inalloca arguments.
FunctionType::ExtInfo getExtInfo() const
bool isInstanceMethod() const
ABIArgInfo & getReturnInfo()
bool isReturnsRetained() const
In ARC, whether this function retains its return value.
unsigned getCallingConvention() const
getCallingConvention - Return the user specified calling convention, which has been translated into a...
void Profile(llvm::FoldingSetNodeID &ID)
const_arg_iterator arg_begin() const
bool isNoCallerSavedRegs() const
Whether this function no longer saves caller registers.
unsigned getRegParm() const
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
CanQualType getReturnType() const
bool isNoCfCheck() const
Whether this function has nocf_check attribute.
CallingConv getASTCallingConvention() const
getASTCallingConvention() - Return the AST-specified calling convention.
const ABIArgInfo & getReturnInfo() const
bool getHasRegParm() const
ArrayRef< ArgInfo > arguments() const
const ArgInfo * const_arg_iterator
static CGFunctionInfo * create(unsigned llvmCC, bool instanceMethod, bool chainCall, bool delegateCall, const FunctionType::ExtInfo &extInfo, ArrayRef< ExtParameterInfo > paramInfos, CanQualType resultType, ArrayRef< CanQualType > argTypes, RequiredArgs required)
static void Profile(llvm::FoldingSetNodeID &ID, bool InstanceMethod, bool ChainCall, bool IsDelegateCall, const FunctionType::ExtInfo &info, ArrayRef< ExtParameterInfo > paramInfos, RequiredArgs required, CanQualType resultType, ArrayRef< CanQualType > argTypes)
friend class TrailingObjects
bool isCmseNSCall() const
bool isDelegateCall() const
MutableArrayRef< ArgInfo > arguments()
const_arg_iterator arg_end() const
unsigned getEffectiveCallingConvention() const
getEffectiveCallingConvention - Return the actual calling convention to use, which may depend on the ...
void setArgStruct(llvm::StructType *Ty, CharUnits Align)
size_t numTrailingObjects(OverloadToken< ArgInfo >) const
ExtParameterInfo getExtParameterInfo(unsigned argIndex) const
unsigned getMaxVectorWidth() const
Return the maximum vector width in the arguments.
CharUnits getArgStructAlignment() const
size_t numTrailingObjects(OverloadToken< ExtParameterInfo >) const
unsigned arg_size() const
RequiredArgs getRequiredArgs() const
void setEffectiveCallingConvention(unsigned Value)
unsigned getNumRequiredArgs() const
llvm::StructType * getArgStruct() const
Get the struct type used to represent all the arguments in memory.
void setMaxVectorWidth(unsigned Width)
Set the maximum vector width in the arguments.
A class for recording the number of arguments that a function signature requires.
static RequiredArgs forPrototypePlus(CanQual< FunctionProtoType > prototype, unsigned additional)
bool allowsOptionalArgs() const
unsigned getNumRequiredArgs() const
static RequiredArgs forPrototype(CanQual< FunctionProtoType > prototype)
static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, unsigned additional)
Compute the arguments required by the given formal prototype, given that there may be some additional...
static RequiredArgs getFromOpaqueData(unsigned value)
bool isRequiredArg(unsigned argIdx) const
Return true if the argument at a given index is required.
static RequiredArgs forPrototype(const FunctionProtoType *prototype)
unsigned getOpaqueData() const
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
bool isVariadic() const
Whether this function prototype is variadic.
ArrayRef< ExtParameterInfo > getExtParameterInfos() const
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
A class which abstracts out some details necessary for making a call.
CallingConv getCC() const
bool getCmseNSCall() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
bool getHasRegParm() const
bool getProducesResult() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
A (possibly-)qualified type.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.