// TODO: Try to combine the 2 layoutParm functions. int32_t TR::AMD64SystemLinkage::layoutParm( TR::ParameterSymbol *parmSymbol, int32_t &dataCursor, uint16_t &intReg, uint16_t &floatReg, TR::parmLayoutResult &layoutResult) { //AMD64 SysV ABI: if the size of an object is larger than four eightbytes, or it contains unaligned fields, it has class MEMORY. if (parmSymbol->getSize() > 4*AMD64_STACK_SLOT_SIZE) goto LAYOUT_ON_STACK; if (layoutTypeInRegs(parmSymbol->getDataType(), intReg, floatReg, layoutResult)) { layoutResult.abstract |= TR::parmLayoutResult::IN_LINKAGE_REG; if (parmSymbol->getSize() > GPR_REG_WIDTH) layoutResult.abstract |= TR::parmLayoutResult::IN_LINKAGE_REG_PAIR; if (comp()->getOption(TR_TraceCG)) traceMsg(comp(), "layout param symbol %p in register\n", parmSymbol); if (!getProperties().getCallerFrameAllocatesSpaceForLinkageRegisters()) return 0; } LAYOUT_ON_STACK: layoutResult.abstract |= TR::parmLayoutResult::ON_STACK; int32_t align = layoutTypeOnStack(parmSymbol->getDataType(), dataCursor, layoutResult); if (comp()->getOption(TR_TraceCG)) traceMsg(comp(), "layout param symbol %p on stack\n", parmSymbol); return align; }
int32_t TR::IA32SystemLinkage::layoutParm(TR::ParameterSymbol *parmSymbol, int32_t &dataCursor, uint16_t &intReg, uint16_t &floatReg, TR::parmLayoutResult &layoutResult) { layoutResult.abstract |= TR::parmLayoutResult::ON_STACK; int32_t align = layoutTypeOnStack(parmSymbol->getDataType(), dataCursor, layoutResult); if (comp()->getOption(TR_TraceCG)) traceMsg(comp(), "layout param symbol %p on stack\n", parmSymbol); return align; }