Print this page


Split Close
Expand all
Collapse all
          --- old/src/share/vm/code/nmethod.cpp
          +++ new/src/share/vm/code/nmethod.cpp
↓ open down ↓ 91 lines elided ↑ open up ↑
  92   92    int nul_chk_table_size;
  93   93    int oops_size;
  94   94  
  95   95    void note_nmethod(nmethod* nm) {
  96   96      nmethod_count += 1;
  97   97      total_size          += nm->size();
  98   98      relocation_size     += nm->relocation_size();
  99   99      code_size           += nm->code_size();
 100  100      stub_size           += nm->stub_size();
 101  101      consts_size         += nm->consts_size();
      102 +    oops_size           += nm->oops_size();
 102  103      scopes_data_size    += nm->scopes_data_size();
 103  104      scopes_pcs_size     += nm->scopes_pcs_size();
 104  105      dependencies_size   += nm->dependencies_size();
 105  106      handler_table_size  += nm->handler_table_size();
 106  107      nul_chk_table_size  += nm->nul_chk_table_size();
 107      -    oops_size += nm->oops_size();
 108  108    }
 109  109    void print_nmethod_stats() {
 110  110      if (nmethod_count == 0)  return;
 111  111      tty->print_cr("Statistics for %d bytecoded nmethods:", nmethod_count);
 112  112      if (total_size != 0)          tty->print_cr(" total in heap  = %d", total_size);
 113  113      if (relocation_size != 0)     tty->print_cr(" relocation     = %d", relocation_size);
 114  114      if (code_size != 0)           tty->print_cr(" main code      = %d", code_size);
 115  115      if (stub_size != 0)           tty->print_cr(" stub code      = %d", stub_size);
 116  116      if (consts_size != 0)         tty->print_cr(" constants      = %d", consts_size);
      117 +    if (oops_size != 0)           tty->print_cr(" oops           = %d", oops_size);
 117  118      if (scopes_data_size != 0)    tty->print_cr(" scopes data    = %d", scopes_data_size);
 118  119      if (scopes_pcs_size != 0)     tty->print_cr(" scopes pcs     = %d", scopes_pcs_size);
 119  120      if (dependencies_size != 0)   tty->print_cr(" dependencies   = %d", dependencies_size);
 120  121      if (handler_table_size != 0)  tty->print_cr(" handler table  = %d", handler_table_size);
 121  122      if (nul_chk_table_size != 0)  tty->print_cr(" nul chk table  = %d", nul_chk_table_size);
 122      -    if (oops_size != 0)           tty->print_cr(" oops           = %d", oops_size);
 123  123    }
 124  124  
 125  125    int native_nmethod_count;
 126  126    int native_total_size;
 127  127    int native_relocation_size;
 128  128    int native_code_size;
 129  129    int native_oops_size;
 130  130    void note_native_nmethod(nmethod* nm) {
 131  131      native_nmethod_count += 1;
 132  132      native_total_size       += nm->size();
↓ open down ↓ 460 lines elided ↑ open up ↑
 593  593      // values something that will never match a pc like the nmethod vtable entry
 594  594      _exception_offset        = 0;
 595  595      _deoptimize_offset       = 0;
 596  596      _deoptimize_mh_offset    = 0;
 597  597      _orig_pc_offset          = 0;
 598  598  #ifdef HAVE_DTRACE_H
 599  599      _trap_offset             = 0;
 600  600  #endif // def HAVE_DTRACE_H
 601  601      _stub_offset             = data_offset();
 602  602      _consts_offset           = data_offset();
 603      -    _scopes_data_offset      = data_offset();
      603 +    _oops_offset             = data_offset();
      604 +    _scopes_data_offset      = _oops_offset          + round_to(code_buffer->total_oop_size(), oopSize);
 604  605      _scopes_pcs_offset       = _scopes_data_offset;
 605  606      _dependencies_offset     = _scopes_pcs_offset;
 606  607      _handler_table_offset    = _dependencies_offset;
 607  608      _nul_chk_table_offset    = _handler_table_offset;
 608  609      _nmethod_end_offset      = _nul_chk_table_offset;
 609  610      _compile_id              = 0;  // default
 610  611      _comp_level              = CompLevel_none;
 611  612      _entry_point             = instructions_begin();
 612  613      _verified_entry_point    = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry);
 613  614      _osr_entry_point         = NULL;
↓ open down ↓ 69 lines elided ↑ open up ↑
 683  684      // We have no exception handler or deopt handler make the
 684  685      // values something that will never match a pc like the nmethod vtable entry
 685  686      _exception_offset        = 0;
 686  687      _deoptimize_offset       = 0;
 687  688      _deoptimize_mh_offset    = 0;
 688  689      _unwind_handler_offset   = -1;
 689  690      _trap_offset             = offsets->value(CodeOffsets::Dtrace_trap);
 690  691      _orig_pc_offset          = 0;
 691  692      _stub_offset             = data_offset();
 692  693      _consts_offset           = data_offset();
 693      -    _scopes_data_offset      = data_offset();
      694 +    _oops_offset             = data_offset();
      695 +    _scopes_data_offset      = _oops_offset          + round_to(code_buffer->total_oop_size(), oopSize);
 694  696      _scopes_pcs_offset       = _scopes_data_offset;
 695  697      _dependencies_offset     = _scopes_pcs_offset;
 696  698      _handler_table_offset    = _dependencies_offset;
 697  699      _nul_chk_table_offset    = _handler_table_offset;
 698  700      _nmethod_end_offset      = _nul_chk_table_offset;
 699  701      _compile_id              = 0;  // default
 700  702      _comp_level              = CompLevel_none;
 701  703      _entry_point             = instructions_begin();
 702  704      _verified_entry_point    = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry);
 703  705      _osr_entry_point         = NULL;
↓ open down ↓ 94 lines elided ↑ open up ↑
 798  800      // Exception handler and deopt handler are in the stub section
 799  801      _exception_offset        = _stub_offset + offsets->value(CodeOffsets::Exceptions);
 800  802      _deoptimize_offset       = _stub_offset + offsets->value(CodeOffsets::Deopt);
 801  803      _deoptimize_mh_offset    = _stub_offset + offsets->value(CodeOffsets::DeoptMH);
 802  804      if (offsets->value(CodeOffsets::UnwindHandler) != -1) {
 803  805        _unwind_handler_offset   = instructions_offset() + offsets->value(CodeOffsets::UnwindHandler);
 804  806      } else {
 805  807        _unwind_handler_offset   = -1;
 806  808      }
 807  809      _consts_offset           = instructions_offset() + code_buffer->total_offset_of(code_buffer->consts()->start());
 808      -    _scopes_data_offset      = data_offset();
 809      -    _scopes_pcs_offset       = _scopes_data_offset   + round_to(debug_info->data_size         (), oopSize);
      810 +    _oops_offset             = data_offset();
      811 +    _scopes_data_offset      = _oops_offset          + round_to(code_buffer->total_oop_size (), oopSize);
      812 +    _scopes_pcs_offset       = _scopes_data_offset   + round_to(debug_info->data_size       (), oopSize);
 810  813      _dependencies_offset     = _scopes_pcs_offset    + adjust_pcs_size(debug_info->pcs_size());
 811  814      _handler_table_offset    = _dependencies_offset  + round_to(dependencies->size_in_bytes (), oopSize);
 812  815      _nul_chk_table_offset    = _handler_table_offset + round_to(handler_table->size_in_bytes(), oopSize);
 813  816      _nmethod_end_offset      = _nul_chk_table_offset + round_to(nul_chk_table->size_in_bytes(), oopSize);
 814  817  
 815  818      _entry_point             = instructions_begin();
 816  819      _verified_entry_point    = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry);
 817  820      _osr_entry_point         = instructions_begin() + offsets->value(CodeOffsets::OSR_Entry);
 818  821      _exception_cache         = NULL;
 819  822      _pc_desc_cache.reset_to(scopes_pcs_begin());
↓ open down ↓ 163 lines elided ↑ open up ↑
 983  986      xtty->tail("print_nmethod");
 984  987    }
 985  988  }
 986  989  
 987  990  
 988  991  void nmethod::set_version(int v) {
 989  992    flags.version = v;
 990  993  }
 991  994  
 992  995  
      996 +// Promote one word from an assembly-time handle to a live embedded oop.
      997 +inline void nmethod::initialize_immediate_oop(oop* dest, jobject handle) {
      998 +  if (handle == NULL ||
      999 +      // As a special case, IC oops are initialized to 1 or -1.
     1000 +      handle == (jobject) Universe::non_oop_word()) {
     1001 +    (*dest) = (oop) handle;
     1002 +  } else {
     1003 +    (*dest) = JNIHandles::resolve_non_null(handle);
     1004 +  }
     1005 +}
     1006 +
     1007 +
     1008 +void nmethod::copy_oops(GrowableArray<jobject>* array) {
     1009 +  //assert(oops_size() == 0, "do this handshake just once, please");
     1010 +  int length = array->length();
     1011 +  assert((address)(oops_begin() + length) <= data_end(), "oops big enough");
     1012 +  oop* dest = oops_begin();
     1013 +  for (int index = 0 ; index < length; index++) {
     1014 +    initialize_immediate_oop(&dest[index], array->at(index));
     1015 +  }
     1016 +
     1017 +  // Now we can fix up all the oops in the code.  We need to do this
     1018 +  // in the code because the assembler uses jobjects as placeholders.
     1019 +  // The code and relocations have already been initialized by the
     1020 +  // CodeBlob constructor, so it is valid even at this early point to
     1021 +  // iterate over relocations and patch the code.
     1022 +  fix_oop_relocations(NULL, NULL, /*initialize_immediates=*/ true);
     1023 +}
     1024 +
     1025 +
     1026 +bool nmethod::is_at_poll_return(address pc) {
     1027 +  RelocIterator iter(this, pc, pc+1);
     1028 +  while (iter.next()) {
     1029 +    if (iter.type() == relocInfo::poll_return_type)
     1030 +      return true;
     1031 +  }
     1032 +  return false;
     1033 +}
     1034 +
     1035 +
     1036 +bool nmethod::is_at_poll_or_poll_return(address pc) {
     1037 +  RelocIterator iter(this, pc, pc+1);
     1038 +  while (iter.next()) {
     1039 +    relocInfo::relocType t = iter.type();
     1040 +    if (t == relocInfo::poll_return_type || t == relocInfo::poll_type)
     1041 +      return true;
     1042 +  }
     1043 +  return false;
     1044 +}
     1045 +
     1046 +
     1047 +void nmethod::fix_oop_relocations(address begin, address end, bool initialize_immediates) {
     1048 +  // re-patch all oop-bearing instructions, just in case some oops moved
     1049 +  RelocIterator iter(this, begin, end);
     1050 +  while (iter.next()) {
     1051 +    if (iter.type() == relocInfo::oop_type) {
     1052 +      oop_Relocation* reloc = iter.oop_reloc();
     1053 +      if (initialize_immediates && reloc->oop_is_immediate()) {
     1054 +        oop* dest = reloc->oop_addr();
     1055 +        initialize_immediate_oop(dest, (jobject) *dest);
     1056 +      }
     1057 +      // Refresh the oop-related bits of this instruction.
     1058 +      reloc->fix_oop_relocation();
     1059 +    }
     1060 +
     1061 +    // There must not be any interfering patches or breakpoints.
     1062 +    assert(!(iter.type() == relocInfo::breakpoint_type
     1063 +             && iter.breakpoint_reloc()->active()),
     1064 +           "no active breakpoint");
     1065 +  }
     1066 +}
     1067 +
     1068 +
 993 1069  ScopeDesc* nmethod::scope_desc_at(address pc) {
 994 1070    PcDesc* pd = pc_desc_at(pc);
 995 1071    guarantee(pd != NULL, "scope must be present");
 996 1072    return new ScopeDesc(this, pd->scope_decode_offset(),
 997 1073                         pd->obj_decode_offset(), pd->should_reexecute(),
 998 1074                         pd->return_oop());
 999 1075  }
1000 1076  
1001 1077  
1002 1078  void nmethod::clear_inline_caches() {
↓ open down ↓ 1272 lines elided ↑ open up ↑
2275 2351                                                code_end(),
2276 2352                                                code_size());
2277 2353    if (stub_size         () > 0) tty->print_cr(" stub code      [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
2278 2354                                                stub_begin(),
2279 2355                                                stub_end(),
2280 2356                                                stub_size());
2281 2357    if (consts_size       () > 0) tty->print_cr(" constants      [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
2282 2358                                                consts_begin(),
2283 2359                                                consts_end(),
2284 2360                                                consts_size());
     2361 +  if (oops_size         () > 0) tty->print_cr(" oops           [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
     2362 +                                              oops_begin(),
     2363 +                                              oops_end(),
     2364 +                                              oops_size());
2285 2365    if (scopes_data_size  () > 0) tty->print_cr(" scopes data    [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
2286 2366                                                scopes_data_begin(),
2287 2367                                                scopes_data_end(),
2288 2368                                                scopes_data_size());
2289 2369    if (scopes_pcs_size   () > 0) tty->print_cr(" scopes pcs     [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
2290 2370                                                scopes_pcs_begin(),
2291 2371                                                scopes_pcs_end(),
2292 2372                                                scopes_pcs_size());
2293 2373    if (dependencies_size () > 0) tty->print_cr(" dependencies   [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d",
2294 2374                                                dependencies_begin(),
↓ open down ↓ 386 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX