static X86MachineFunctionInfo calculateFunctionInfo(const Function *F, const TargetData *TD) { X86MachineFunctionInfo Info; uint64_t Size = 0; switch (F->getCallingConv()) { case CallingConv::X86_StdCall: Info.setDecorationStyle(StdCall); break; case CallingConv::X86_FastCall: Info.setDecorationStyle(FastCall); break; default: return Info; } unsigned argNum = 1; for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end(); AI != AE; ++AI, ++argNum) { const Type* Ty = AI->getType(); // 'Dereference' type in case of byval parameter attribute if (F->paramHasAttr(argNum, Attribute::ByVal)) Ty = cast<PointerType>(Ty)->getElementType(); // Size should be aligned to DWORD boundary Size += ((TD->getTypePaddedSize(Ty) + 3)/4)*4; } // We're not supporting tooooo huge arguments :) Info.setBytesToPopOnReturn((unsigned int)Size); return Info; }