// Convert a register class name to its register mask. const char *ArchDesc::reg_class_to_reg_mask(const char *rc_name) { const char *reg_mask = "RegMask::Empty"; if( _register ) { RegClass *reg_class = _register->getRegClass(rc_name); assert( reg_class, "Use of an undefined register class"); // Construct the name of the register mask. reg_mask = getRegMask(rc_name); } return reg_mask; }
// Convert a register class name to its register mask. const char *ArchDesc::reg_class_to_reg_mask(const char *rc_name) { const char *reg_mask = "RegMask::Empty"; if( _register ) { RegClass *reg_class = _register->getRegClass(rc_name); if (reg_class == NULL) { syntax_err(0, "Use of an undefined register class %s", rc_name); return reg_mask; } // Construct the name of the register mask. reg_mask = getRegMask(rc_name); } return reg_mask; }
POINTER_SIZE_INT* StackInfo::getRegOffset(const JitFrameContext* context, RegName reg) const { assert(stackDepth >=0); if(calleeSaveRegsMask & getRegMask(reg)) { //callee save regs //regnames are hardcoded -> unwind() has hardcoded regs too. //return register offset for previous stack frame. //MUST be called before unwind() switch(reg) { #ifdef _EM64T_ case RegName_R15: return context->p_r15; case RegName_R14: return context->p_r14; case RegName_R13: return context->p_r13; case RegName_R12: return context->p_r12; case RegName_RBP: return context->p_rbp; case RegName_RBX: return context->p_rbx; #ifdef _WIN64 case RegName_RSI: return context->p_rsi; case RegName_RDI: return context->p_rdi; #endif #else case RegName_ESI: return context->p_esi; case RegName_EDI: return context->p_edi; case RegName_EBP: return context->p_ebp; case RegName_EBX: return context->p_ebx; #endif default: assert(0); return NULL; } } else { //caller save regs assert(0); VERIFY_OUT("Caller save register requested!"); exit(1); } }
void StackInfo::unwind(MethodDesc* pMethodDesc, JitFrameContext* context, bool isFirst) const { POINTER_SIZE_INT offset_step = sizeof(POINTER_SIZE_INT); #ifdef _EM64T_ if (itraceMethodExitString!=NULL){ Log::cat_rt()->out()<<"__UNWIND__:" <<(itraceMethodExitString!=(const char*)1?itraceMethodExitString:"") <<"; unwound from EIP="<<(void*)*context->p_rip <<::std::endl; } context->rsp += stackDepth; assert((context->rsp & 0xf) == 0x8); POINTER_SIZE_INT offset = context->rsp; context->p_rip = (POINTER_SIZE_INT *) (offset); offset += icalleeOffset; if(stackDepth != 0) { if(getRegMask(RegName_R15) & icalleeMask) { context->p_r15 = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_R14) & icalleeMask) { context->p_r14 = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_R13) & icalleeMask) { context->p_r13 = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_R12) & icalleeMask) { context->p_r12 = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_RDI) & icalleeMask) { context->p_rdi = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_RSI) & icalleeMask) { context->p_rsi = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_RBP) & icalleeMask) { context->p_rbp = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_RBX) & icalleeMask) { context->p_rbx = (POINTER_SIZE_INT *) offset; } } context->rsp += offset_step; //IP register size #else if (itraceMethodExitString!=NULL){ Log::cat_rt()->out()<<"__UNWIND__:" <<(itraceMethodExitString!=(const char*)1?itraceMethodExitString:"") <<"; unwound from EIP="<<(void*)*context->p_eip <<::std::endl; } context->esp += stackDepth; U_32 offset = context->esp; context->p_eip = (POINTER_SIZE_INT *) offset; offset += icalleeOffset; if(stackDepth != 0) { if(getRegMask(RegName_EDI) & icalleeMask) { context->p_edi = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_ESI) & icalleeMask) { context->p_esi = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_EBP) & icalleeMask) { context->p_ebp = (POINTER_SIZE_INT *) offset; offset += offset_step; } if(getRegMask(RegName_EBX) & icalleeMask) { context->p_ebx = (POINTER_SIZE_INT *) offset; } } context->esp += offset_step; //IP register size #endif }