Exemple #1
0
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))));
}
Exemple #2
0
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));
  }
}