Ejemplo n.º 1
0
void LIR_Assembler::verify_oop_map(CodeEmitInfo* info) {
#ifndef PRODUCT
    if (VerifyOops) {
        OopMapStream s(info->oop_map());
        while (!s.is_done()) {
            OopMapValue v = s.current();
            if (v.is_oop()) {
                VMReg r = v.reg();
                if (!r->is_stack()) {
                    stringStream st;
                    st.print("bad oop %s at %d", r->as_Register()->name(), _masm->offset());
#ifdef SPARC
                    _masm->_verify_oop(r->as_Register(), os::strdup(st.as_string(), mtCompiler), __FILE__, __LINE__);
#else
                    _masm->verify_oop(r->as_Register());
#endif
                } else {
                    _masm->verify_stack_oop(r->reg2stack() * VMRegImpl::stack_slot_size);
                }
            }
            check_codespace();
            CHECK_BAILOUT();

            s.next();
        }
    }
#endif
}
Ejemplo n.º 2
0
address RegisterMap::pd_location(VMReg regname) const {
  register_map_init();

  assert(regname->is_reg(), "sanity check");
  // Only the GPRs get handled this way
  if( !regname->is_Register())
    return NULL;

  // don't talk about bad registers
  if ((bad_mask & ((LocationValidType)1 << regname->value())) != 0) {
    return NULL;
  }

  // Convert to a GPR
  Register reg;
  int second_word = 0;
  // 32-bit registers for in, out and local
  if (!regname->is_concrete()) {
    // HMM ought to return NULL for any non-concrete (odd) vmreg
    // this all tied up in the fact we put out double oopMaps for
    // register locations. When that is fixed we'd will return NULL
    // (or assert here).
    reg = regname->prev()->as_Register();
#ifdef _LP64
    second_word = sizeof(jint);
#else
    return NULL;
#endif // _LP64
  } else {
    reg = regname->as_Register();
  }
  if (reg->is_out()) {
    assert(_younger_window != NULL, "Younger window should be available");
    return second_word + (address)&_younger_window[reg->after_save()->sp_offset_in_saved_window()];
  }
  if (reg->is_local() || reg->is_in()) {
    assert(_window != NULL, "Window should be available");
    return second_word + (address)&_window[reg->sp_offset_in_saved_window()];
  }
  // Only the window'd GPRs get handled this way; not the globals.
  return NULL;
}