private unsafe void GetSimpleLoc(int offset, ArgLocDesc* pLoc) { // WRAPPER_NO_CONTRACT; pLoc->Init(); pLoc->m_idxGenReg = TransitionBlock.GetArgumentIndexFromOffset(offset); pLoc->m_cGenReg = 1; }
// Get layout information for the argument that the ArgIterator is currently visiting. private unsafe void GetArgLoc(int argOffset, ArgLocDesc* pLoc) { // LIMITED_METHOD_CONTRACT; pLoc->Init(); if (TransitionBlock.IsFloatArgumentRegisterOffset(argOffset)) { // Dividing by 8 as size of each register in FloatArgumentRegisters is 8 bytes. pLoc->m_idxFloatReg = (argOffset - TransitionBlock.GetOffsetOfFloatArgumentRegisters()) / 8; if (!_argTypeHandle.IsNull() && _argTypeHandle.IsHFA()) { CorElementType type = _argTypeHandle.GetHFAType(); pLoc->m_cFloatReg = (type == CorElementType.ELEMENT_TYPE_R4) ? GetArgSize() / sizeof(float) : GetArgSize() / sizeof(double); } else { pLoc->m_cFloatReg = 1; } return; } int cSlots = (GetArgSize() + 7) / 8; // Composites greater than 16bytes are passed by reference TypeHandle dummy; if (GetArgType(out dummy) == CorElementType.ELEMENT_TYPE_VALUETYPE && GetArgSize() > ArchitectureConstants.ENREGISTERED_PARAMTYPE_MAXSIZE) { cSlots = 1; } if (!TransitionBlock.IsStackArgumentOffset(argOffset)) { pLoc->m_idxGenReg = TransitionBlock.GetArgumentIndexFromOffset(argOffset); pLoc->m_cGenReg = cSlots; } else { pLoc->m_idxStack = TransitionBlock.GetArgumentIndexFromOffset(argOffset) - 8; pLoc->m_cStack = cSlots; } }
// Get layout information for the argument that the ArgIterator is currently visiting. unsafe void GetArgLoc(int argOffset, ArgLocDesc* pLoc) { // LIMITED_METHOD_CONTRACT; pLoc->Init(); if (TransitionBlock.IsFloatArgumentRegisterOffset(argOffset)) { // Dividing by 8 as size of each register in FloatArgumentRegisters is 8 bytes. pLoc->m_idxFloatReg = (argOffset - TransitionBlock.GetOffsetOfFloatArgumentRegisters()) / 8; // UNIXTODO: Passing of structs, HFAs. For now, use the Windows convention. pLoc->m_cFloatReg = 1; return; } // UNIXTODO: Passing of structs, HFAs. For now, use the Windows convention. int cSlots = 1; if (!TransitionBlock.IsStackArgumentOffset(argOffset)) { pLoc->m_idxGenReg = TransitionBlock.GetArgumentIndexFromOffset(argOffset); pLoc->m_cGenReg = cSlots; } else { pLoc->m_idxStack = (argOffset - TransitionBlock.GetOffsetOfArgs()) / 8; pLoc->m_cStack = cSlots; } }
// Get layout information for the argument that the ArgIterator is currently visiting. private unsafe void GetArgLoc(int argOffset, ArgLocDesc* pLoc) { // LIMITED_METHOD_CONTRACT; pLoc->Init(); pLoc->m_fRequires64BitAlignment = _fRequires64BitAlignment; int cSlots = (GetArgSize() + 3) / 4; if (TransitionBlock.IsFloatArgumentRegisterOffset(argOffset)) { pLoc->m_idxFloatReg = (argOffset - TransitionBlock.GetOffsetOfFloatArgumentRegisters()) / 4; pLoc->m_cFloatReg = cSlots; return; } if (!TransitionBlock.IsStackArgumentOffset(argOffset)) { pLoc->m_idxGenReg = TransitionBlock.GetArgumentIndexFromOffset(argOffset); if (cSlots <= (4 - pLoc->m_idxGenReg)) { pLoc->m_cGenReg = cSlots; } else { pLoc->m_cGenReg = 4 - pLoc->m_idxGenReg; pLoc->m_idxStack = 0; pLoc->m_cStack = cSlots - pLoc->m_cGenReg; } } else { pLoc->m_idxStack = TransitionBlock.GetArgumentIndexFromOffset(argOffset) - 4; pLoc->m_cStack = cSlots; } }
public unsafe void GetVASigCookieLoc(ArgLocDesc* pLoc) { GetSimpleLoc(GetVASigCookieOffset(), pLoc); }
public unsafe void GetParamTypeLoc(ArgLocDesc* pLoc) { GetSimpleLoc(GetParamTypeArgOffset(), pLoc); }
public unsafe void GetRetBuffArgLoc(ArgLocDesc* pLoc) { GetSimpleLoc(GetRetBuffArgOffset(), pLoc); }
// Accessors for built in argument descriptions of the special implicit parameters not mentioned directly // in signatures (this pointer and the like). Whether or not these can be used successfully before all the // explicit arguments have been scanned is platform dependent. public unsafe void GetThisLoc(ArgLocDesc* pLoc) { GetSimpleLoc(GetThisOffset(), pLoc); }