15#ifndef LLVM_CLANG_CODEGEN_CGFUNCTIONINFO_H
16#define LLVM_CLANG_CODEGEN_CGFUNCTIONINFO_H
21#include "llvm/ADT/FoldingSet.h"
22#include "llvm/IR/DerivedTypes.h"
23#include "llvm/Support/TrailingObjects.h"
100 struct DirectAttrInfo {
104 struct IndirectAttrInfo {
114 bool PaddingInReg : 1;
115 bool InAllocaSRet : 1;
116 bool InAllocaIndirect : 1;
117 bool IndirectByVal : 1;
118 bool IndirectRealign : 1;
119 bool SRetAfterThis : 1;
121 bool CanBeFlattened: 1;
125 bool canHavePaddingType()
const {
129 void setPaddingType(llvm::Type *
T) {
130 assert(canHavePaddingType());
134 void setUnpaddedCoerceToType(llvm::Type *T) {
148 llvm::Type *Padding =
nullptr,
149 bool CanBeFlattened =
true,
unsigned Align = 0) {
151 AI.setCoerceToType(
T);
152 AI.setPaddingType(Padding);
153 AI.setDirectOffset(Offset);
154 AI.setDirectAlign(Align);
155 AI.setCanBeFlattened(CanBeFlattened);
165 llvm::Type *Padding =
nullptr) {
168 AI.setCoerceToType(
T);
169 AI.setPaddingType(Padding);
170 AI.setDirectOffset(0);
171 AI.setDirectAlign(0);
177 llvm::Type *Padding =
nullptr) {
180 AI.setCoerceToType(
T);
181 AI.setPaddingType(Padding);
182 AI.setDirectOffset(0);
183 AI.setDirectAlign(0);
191 llvm::Type *Padding =
nullptr) {
201 AI.setCoerceToType(
T);
202 AI.setPaddingType(
nullptr);
203 AI.setDirectOffset(0);
204 AI.setDirectAlign(0);
217 bool ByVal =
true,
bool Realign =
false,
218 llvm::Type *Padding =
nullptr) {
220 AI.setIndirectAlign(Alignment);
221 AI.setIndirectByVal(ByVal);
222 AI.setIndirectRealign(Realign);
223 AI.setSRetAfterThis(
false);
224 AI.setPaddingType(Padding);
225 AI.setIndirectAddrSpace(AddrSpace);
231 bool Realign =
false,
232 llvm::Type *Padding =
nullptr) {
234 AI.setIndirectAlign(Alignment);
235 AI.setIndirectRealign(Realign);
236 AI.setPaddingType(Padding);
237 AI.setIndirectAddrSpace(AddrSpace);
242 bool Realign =
false) {
243 auto AI =
getIndirect(Alignment, 0, ByVal, Realign);
249 AI.setInAllocaFieldIndex(FieldIndex);
255 AI.setPaddingType(
nullptr);
259 llvm::Type *Padding) {
261 AI.setPaddingInReg(PaddingInReg);
262 AI.setPaddingType(Padding);
270 llvm::Type *unpaddedCoerceToType) {
275 auto unpaddedStruct = dyn_cast<llvm::StructType>(unpaddedCoerceToType);
276 assert(!unpaddedStruct || unpaddedStruct->getNumElements() != 1);
280 unsigned unpaddedIndex = 0;
281 for (
auto eltType : coerceToType->elements()) {
288 if (unpaddedStruct) {
289 assert(unpaddedStruct->getNumElements() == unpaddedIndex);
291 assert(unpaddedIndex == 1);
296 AI.setCoerceToType(coerceToType);
297 AI.setUnpaddedCoerceToType(unpaddedCoerceToType);
303 llvm::Type *Padding =
nullptr,
304 bool CanBeFlattened =
true,
305 unsigned Align = 0) {
307 AI.setCoerceToType(
T);
308 AI.setPaddingType(Padding);
309 AI.setDirectOffset(Offset);
310 AI.setDirectAlign(Align);
311 AI.setCanBeFlattened(CanBeFlattened);
316 return eltType->isArrayTy() &&
317 eltType->getArrayElementType()->isIntegerTy(8);
339 "Not a direct or extend or target specific kind");
344 "Not a direct or extend or target specific kind");
350 "Not a direct or extend or target specific kind");
355 "Not a direct or extend or target specific kind");
360 assert(
isExtend() && (SignExt + ZeroExt <= 1) &&
"Invalid kind / flags!");
364 assert(
isExtend() &&
"Invalid kind!");
369 assert(
isExtend() && (SignExt + ZeroExt <= 1) &&
"Invalid kind / flags!");
373 assert(
isExtend() &&
"Invalid kind!");
378 assert(
isExtend() && (SignExt + ZeroExt <= 1) &&
"Invalid kind / flags!");
379 return !SignExt && !ZeroExt;
383 return (canHavePaddingType() ?
PaddingType :
nullptr);
417 return structTy->elements();
447 return IndirectByVal;
466 return IndirectRealign;
470 IndirectRealign = IR;
475 return SRetAfterThis;
479 SRetAfterThis = AfterThis;
493 return InAllocaIndirect;
514 return CanBeFlattened;
519 CanBeFlattened = Flatten;
530 unsigned NumRequired;
545 unsigned additional) {
549 additional += llvm::count_if(
552 return ExtInfo.hasPassObjectSize();
559 unsigned additional) {
579 return argIdx == ~0
U || argIdx < NumRequired;
584 if (value == ~0
U)
return All;
598class CGFunctionInfo final
599 :
public llvm::FoldingSetNode,
600 private llvm::TrailingObjects<CGFunctionInfo, CGFunctionInfoArgInfo,
601 FunctionProtoType::ExtParameterInfo> {
607 unsigned CallingConvention : 8;
611 unsigned EffectiveCallingConvention : 8;
615 unsigned ASTCallingConvention : 6;
618 LLVM_PREFERRED_TYPE(
bool)
619 unsigned InstanceMethod : 1;
622 LLVM_PREFERRED_TYPE(
bool)
623 unsigned ChainCall : 1;
627 LLVM_PREFERRED_TYPE(
bool)
628 unsigned DelegateCall : 1;
631 LLVM_PREFERRED_TYPE(
bool)
632 unsigned CmseNSCall : 1;
635 LLVM_PREFERRED_TYPE(
bool)
636 unsigned NoReturn : 1;
639 LLVM_PREFERRED_TYPE(
bool)
640 unsigned ReturnsRetained : 1;
643 LLVM_PREFERRED_TYPE(
bool)
644 unsigned NoCallerSavedRegs : 1;
647 LLVM_PREFERRED_TYPE(
bool)
648 unsigned HasRegParm : 1;
649 unsigned RegParm : 3;
652 LLVM_PREFERRED_TYPE(
bool)
653 unsigned NoCfCheck : 1;
656 unsigned MaxVectorWidth : 4;
660 unsigned X86ABIAVXLevel = 0;
666 llvm::StructType *ArgStruct;
667 unsigned ArgStructAlign : 31;
668 LLVM_PREFERRED_TYPE(
bool)
669 unsigned HasExtParameterInfos : 1;
673 ArgInfo *getArgsBuffer() {
674 return getTrailingObjects<ArgInfo>();
676 const ArgInfo *getArgsBuffer()
const {
677 return getTrailingObjects<ArgInfo>();
680 ExtParameterInfo *getExtParameterInfosBuffer() {
681 return getTrailingObjects<ExtParameterInfo>();
683 const ExtParameterInfo *getExtParameterInfosBuffer()
const{
684 return getTrailingObjects<ExtParameterInfo>();
690 static CGFunctionInfo *
691 create(
unsigned llvmCC,
bool instanceMethod,
bool chainCall,
692 bool delegateCall,
unsigned X86ABIAVXLevel,
696 void operator delete(
void *p) { ::operator
delete(p); }
705 return (HasExtParameterInfos ? NumArgs : 0);
725 bool isVariadic()
const {
return Required.allowsOptionalArgs(); }
764 return EffectiveCallingConvention;
767 EffectiveCallingConvention =
Value;
786 if (!HasExtParameterInfos)
return {};
790 assert(argIndex <= NumArgs);
791 if (!HasExtParameterInfos)
return ExtParameterInfo();
810 return MaxVectorWidth ? 1U << (MaxVectorWidth - 1) : 0;
815 assert(llvm::isPowerOf2_32(Width) &&
"Expected power of 2 vector");
816 MaxVectorWidth = llvm::countr_zero(Width) + 1;
823 ID.AddBoolean(InstanceMethod);
824 ID.AddBoolean(ChainCall);
825 ID.AddBoolean(DelegateCall);
826 ID.AddBoolean(NoReturn);
827 ID.AddBoolean(ReturnsRetained);
828 ID.AddBoolean(NoCallerSavedRegs);
829 ID.AddBoolean(HasRegParm);
830 ID.AddInteger(RegParm);
831 ID.AddBoolean(NoCfCheck);
832 ID.AddBoolean(CmseNSCall);
833 ID.AddInteger(X86ABIAVXLevel);
834 ID.AddInteger(Required.getOpaqueData());
835 ID.AddBoolean(HasExtParameterInfos);
836 if (HasExtParameterInfos) {
838 ID.AddInteger(paramInfo.getOpaqueValue());
844 static void Profile(llvm::FoldingSetNodeID &ID,
bool InstanceMethod,
846 unsigned X86ABIAVXLevel,
851 ID.AddInteger(info.getCC());
852 ID.AddBoolean(InstanceMethod);
853 ID.AddBoolean(ChainCall);
855 ID.AddBoolean(info.getNoReturn());
856 ID.AddBoolean(info.getProducesResult());
857 ID.AddBoolean(info.getNoCallerSavedRegs());
858 ID.AddBoolean(info.getHasRegParm());
859 ID.AddInteger(info.getRegParm());
860 ID.AddBoolean(info.getNoCfCheck());
861 ID.AddBoolean(info.getCmseNSCall());
862 ID.AddInteger(X86ABIAVXLevel);
864 ID.AddBoolean(!paramInfos.empty());
865 if (!paramInfos.empty()) {
866 for (
auto paramInfo : paramInfos)
867 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 ...
static ABIArgInfo getZeroExtend(QualType Ty, llvm::Type *T=nullptr, llvm::Type *Padding=nullptr)
void setZeroExt(bool ZExt)
unsigned getInAllocaFieldIndex() const
static ABIArgInfo getSignExtend(QualType Ty, llvm::Type *T=nullptr, llvm::Type *Padding=nullptr)
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 getExtend(QualType Ty, llvm::Type *T=nullptr, llvm::Type *Padding=nullptr)
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
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)
CharUnits getIndirectAlign() const
static ABIArgInfo getDirectInReg(llvm::Type *T=nullptr)
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
static void Profile(llvm::FoldingSetNodeID &ID, bool InstanceMethod, bool ChainCall, bool IsDelegateCall, unsigned X86ABIAVXLevel, const FunctionType::ExtInfo &info, ArrayRef< ExtParameterInfo > paramInfos, RequiredArgs required, CanQualType resultType, ArrayRef< CanQualType > argTypes)
CanQualType getReturnType() const
static CGFunctionInfo * create(unsigned llvmCC, bool instanceMethod, bool chainCall, bool delegateCall, unsigned X86ABIAVXLevel, const FunctionType::ExtInfo &extInfo, ArrayRef< ExtParameterInfo > paramInfos, CanQualType resultType, ArrayRef< CanQualType > argTypes, RequiredArgs required)
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
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 ...
unsigned getX86ABIAVXLevel() const
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.
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....
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t