// 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;
}
Exemple #2
0
// 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;
}
Exemple #3
0
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);
    }
}
Exemple #4
0
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
}