static bool similar(const ABIArgInfo &infoL, CanQualType typeL, const ABIArgInfo &infoR, CanQualType typeR) { return (infoL.getKind() == infoR.getKind() && (typeL == typeR || (isa<PointerType>(typeL) && isa<PointerType>(typeR)) || (isa<ReferenceType>(typeL) && isa<ReferenceType>(typeR)))); }
void X86_64_SysV::computeSignatureInfo( LLILCJitContext &Context, bool IsManagedCallingConv, ABIType ResultType, ArrayRef<ABIType> ArgTypes, const DataLayout &DL, ABIArgInfo &ResultInfo, std::vector<ABIArgInfo> &ArgInfos) { ResultInfo = classifyResult(Context, ResultType, DL, IsManagedCallingConv); uint32_t FreeIntRegs = ResultInfo.getKind() == ABIArgInfo::Indirect ? 5 : 6; uint32_t FreeSSERegs = 8; for (auto &Arg : ArgTypes) { uint32_t RequiredIntRegs = 0, RequiredSSERegs = 0; ABIArgInfo Info = classifyArgument(Context, Arg, DL, IsManagedCallingConv, RequiredIntRegs, RequiredSSERegs); // As per the ABI, if any eightbyte of a struct value does not fit in the // number of available registers, the entire struct value is passed on the // stack. if (Info.getKind() == ABIArgInfo::Expand && (FreeIntRegs < RequiredIntRegs || FreeSSERegs < RequiredSSERegs)) { Info = ABIArgInfo::getDirect(Arg.getType()); } else { if (RequiredIntRegs > 0 && FreeIntRegs >= RequiredIntRegs) { FreeIntRegs -= RequiredIntRegs; } if (RequiredSSERegs > 0 && FreeSSERegs >= RequiredSSERegs) { FreeSSERegs -= RequiredSSERegs; } } ArgInfos.push_back(std::move(Info)); } }