Print this page


Split Close
Expand all
Collapse all
          --- old/src/share/vm/code/nmethod.hpp
          +++ new/src/share/vm/code/nmethod.hpp
↓ open down ↓ 97 lines elided ↑ open up ↑
  98   98  
  99   99    void clear();
 100  100  };
 101  101  
 102  102  
 103  103  // A nmethod contains:
 104  104  //  - header                 (the nmethod structure)
 105  105  //  [Relocation]
 106  106  //  - relocation information
 107  107  //  - constant part          (doubles, longs and floats used in nmethod)
      108 +//  - oop table
 108  109  //  [Code]
 109  110  //  - code body
 110  111  //  - exception handler
 111  112  //  - stub code
 112  113  //  [Debugging information]
 113  114  //  - oop array
 114  115  //  - data array
 115  116  //  - pcs
 116  117  //  [Exception handler table]
 117  118  //  - handler entry point array
↓ open down ↓ 36 lines elided ↑ open up ↑
 154  155    // at this location described by this offset.
 155  156    int _deoptimize_mh_offset;
 156  157    // Offset of the unwind handler if it exists
 157  158    int _unwind_handler_offset;
 158  159  
 159  160  #ifdef HAVE_DTRACE_H
 160  161    int _trap_offset;
 161  162  #endif // def HAVE_DTRACE_H
 162  163    int _stub_offset;
 163  164    int _consts_offset;
      165 +  int _oops_offset;                       // offset to where embedded oop table begins (inside data)
 164  166    int _scopes_data_offset;
 165  167    int _scopes_pcs_offset;
 166  168    int _dependencies_offset;
 167  169    int _handler_table_offset;
 168  170    int _nul_chk_table_offset;
 169  171    int _nmethod_end_offset;
 170  172  
 171  173    // location in frame (offset for sp) that deopt can store the original
 172  174    // pc during a deopt.
 173  175    int _orig_pc_offset;
↓ open down ↓ 166 lines elided ↑ open up ↑
 340  342    // boundaries for different parts
 341  343    address code_begin            () const          { return _entry_point; }
 342  344    address code_end              () const          { return           header_begin() + _stub_offset          ; }
 343  345    address exception_begin       () const          { return           header_begin() + _exception_offset     ; }
 344  346    address deopt_handler_begin   () const          { return           header_begin() + _deoptimize_offset    ; }
 345  347    address deopt_mh_handler_begin() const          { return           header_begin() + _deoptimize_mh_offset ; }
 346  348    address unwind_handler_begin  () const          { return _unwind_handler_offset != -1 ? (header_begin() + _unwind_handler_offset) : NULL; }
 347  349    address stub_begin            () const          { return           header_begin() + _stub_offset          ; }
 348  350    address stub_end              () const          { return           header_begin() + _consts_offset        ; }
 349  351    address consts_begin          () const          { return           header_begin() + _consts_offset        ; }
 350      -  address consts_end            () const          { return           header_begin() + _scopes_data_offset   ; }
      352 +  address consts_end            () const          { return           header_begin() + _oops_offset          ; }
      353 +  oop*    oops_begin            () const          { return (oop*)   (header_begin() + _oops_offset)         ; }
      354 +  oop*    oops_end              () const          { return (oop*)   (header_begin() + _scopes_data_offset)  ; }
      355 +
 351  356    address scopes_data_begin     () const          { return           header_begin() + _scopes_data_offset   ; }
 352  357    address scopes_data_end       () const          { return           header_begin() + _scopes_pcs_offset    ; }
 353  358    PcDesc* scopes_pcs_begin      () const          { return (PcDesc*)(header_begin() + _scopes_pcs_offset   ); }
 354  359    PcDesc* scopes_pcs_end        () const          { return (PcDesc*)(header_begin() + _dependencies_offset) ; }
 355  360    address dependencies_begin    () const          { return           header_begin() + _dependencies_offset  ; }
 356  361    address dependencies_end      () const          { return           header_begin() + _handler_table_offset ; }
 357  362    address handler_table_begin   () const          { return           header_begin() + _handler_table_offset ; }
 358  363    address handler_table_end     () const          { return           header_begin() + _nul_chk_table_offset ; }
 359  364    address nul_chk_table_begin   () const          { return           header_begin() + _nul_chk_table_offset ; }
 360  365    address nul_chk_table_end     () const          { return           header_begin() + _nmethod_end_offset   ; }
 361  366  
 362      -  int code_size         () const                  { return      code_end         () -      code_begin         (); }
 363      -  int stub_size         () const                  { return      stub_end         () -      stub_begin         (); }
 364      -  int consts_size       () const                  { return      consts_end       () -      consts_begin       (); }
 365      -  int scopes_data_size  () const                  { return      scopes_data_end  () -      scopes_data_begin  (); }
 366      -  int scopes_pcs_size   () const                  { return (intptr_t)scopes_pcs_end   () - (intptr_t)scopes_pcs_begin   (); }
 367      -  int dependencies_size () const                  { return      dependencies_end () -      dependencies_begin (); }
 368      -  int handler_table_size() const                  { return      handler_table_end() -      handler_table_begin(); }
 369      -  int nul_chk_table_size() const                  { return      nul_chk_table_end() -      nul_chk_table_begin(); }
      367 +  // Sizes
      368 +  int code_size         () const                  { return            code_end         () -            code_begin         (); }
      369 +  int stub_size         () const                  { return            stub_end         () -            stub_begin         (); }
      370 +  int consts_size       () const                  { return            consts_end       () -            consts_begin       (); }
      371 +  int oops_size         () const                  { return (address)  oops_end         () - (address)  oops_begin         (); }
      372 +  int scopes_data_size  () const                  { return            scopes_data_end  () -            scopes_data_begin  (); }
      373 +  int scopes_pcs_size   () const                  { return (intptr_t) scopes_pcs_end   () - (intptr_t) scopes_pcs_begin   (); }
      374 +  int dependencies_size () const                  { return            dependencies_end () -            dependencies_begin (); }
      375 +  int handler_table_size() const                  { return            handler_table_end() -            handler_table_begin(); }
      376 +  int nul_chk_table_size() const                  { return            nul_chk_table_end() -            nul_chk_table_begin(); }
 370  377  
 371  378    int total_size        () const;
 372  379  
      380 +  // Containment
 373  381    bool code_contains         (address addr) const { return code_begin         () <= addr && addr < code_end         (); }
 374  382    bool stub_contains         (address addr) const { return stub_begin         () <= addr && addr < stub_end         (); }
 375  383    bool consts_contains       (address addr) const { return consts_begin       () <= addr && addr < consts_end       (); }
      384 +  bool oops_contains         (oop*    addr) const { return oops_begin         () <= addr && addr < oops_end         (); }
 376  385    bool scopes_data_contains  (address addr) const { return scopes_data_begin  () <= addr && addr < scopes_data_end  (); }
 377  386    bool scopes_pcs_contains   (PcDesc* addr) const { return scopes_pcs_begin   () <= addr && addr < scopes_pcs_end   (); }
 378  387    bool handler_table_contains(address addr) const { return handler_table_begin() <= addr && addr < handler_table_end(); }
 379  388    bool nul_chk_table_contains(address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); }
 380  389  
 381  390    // entry points
 382  391    address entry_point() const                     { return _entry_point;             } // normal entry point
 383  392    address verified_entry_point() const            { return _verified_entry_point;    } // if klass is correct
 384  393  
 385  394    // flag accessing and manipulation
↓ open down ↓ 38 lines elided ↑ open up ↑
 424  433    void  set_has_method_handle_invokes(bool z)     { flags.has_method_handle_invokes = z; }
 425  434  
 426  435    bool  is_speculatively_disconnected() const     { return flags.speculatively_disconnected; }
 427  436    void  set_speculatively_disconnected(bool z)     { flags.speculatively_disconnected = z; }
 428  437  
 429  438    int   comp_level() const                        { return _comp_level; }
 430  439  
 431  440    int   version() const                           { return flags.version; }
 432  441    void  set_version(int v);
 433  442  
      443 +  // Support for oops in scopes and relocs:
      444 +  // Note: index 0 is reserved for null.
      445 +  oop   oop_at(int index) const                   { return index == 0 ? (oop) NULL: *oop_addr_at(index); }
      446 +  oop*  oop_addr_at(int index) const {  // for GC
      447 +    // relocation indexes are biased by 1 (because 0 is reserved)
      448 +    assert(index > 0 && index <= oops_size(), "must be a valid non-zero index");
      449 +    return &oops_begin()[index - 1];
      450 +  }
      451 +
      452 +  void copy_oops(GrowableArray<jobject>* oops);
      453 +
      454 +  // Relocation support
      455 +private:
      456 +  void fix_oop_relocations(address begin, address end, bool initialize_immediates);
      457 +  inline void initialize_immediate_oop(oop* dest, jobject handle);
      458 +
      459 +public:
      460 +  void fix_oop_relocations(address begin, address end) { fix_oop_relocations(begin, end, false); }
      461 +  void fix_oop_relocations()                           { fix_oop_relocations(NULL, NULL, false); }
      462 +
      463 +  bool is_at_poll_return(address pc);
      464 +  bool is_at_poll_or_poll_return(address pc);
      465 +
 434  466    // Non-perm oop support
 435  467    bool  on_scavenge_root_list() const                  { return (_scavenge_root_state & 1) != 0; }
 436  468   protected:
 437  469    enum { npl_on_list = 0x01, npl_marked = 0x10 };
 438  470    void  set_on_scavenge_root_list()                    { _scavenge_root_state = npl_on_list; }
 439  471    void  clear_on_scavenge_root_list()                  { _scavenge_root_state = 0; }
 440  472    // assertion-checking and pruning logic uses the bits of _scavenge_root_state
 441  473  #ifndef PRODUCT
 442  474    void  set_scavenge_root_marked()                     { _scavenge_root_state |= npl_marked; }
 443  475    void  clear_scavenge_root_marked()                   { _scavenge_root_state &= ~npl_marked; }
↓ open down ↓ 60 lines elided ↑ open up ↑
 504  536    void set_method(methodOop method) { _method = method; }
 505  537  
 506  538    // GC support
 507  539    void do_unloading(BoolObjectClosure* is_alive, OopClosure* keep_alive,
 508  540                      bool unloading_occurred);
 509  541    bool can_unload(BoolObjectClosure* is_alive, OopClosure* keep_alive,
 510  542                    oop* root, bool unloading_occurred);
 511  543  
 512  544    void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
 513  545                                       OopClosure* f);
 514      -  virtual void oops_do(OopClosure* f) { oops_do(f, false); }
 515      -  void         oops_do(OopClosure* f, bool do_strong_roots_only);
      546 +  void oops_do(OopClosure* f) { oops_do(f, false); }
      547 +  void oops_do(OopClosure* f, bool do_strong_roots_only);
 516  548    bool detect_scavenge_root_oops();
 517  549    void verify_scavenge_root_oops() PRODUCT_RETURN;
 518  550  
 519  551    bool test_set_oops_do_mark();
 520  552    static void oops_do_marking_prologue();
 521  553    static void oops_do_marking_epilogue();
 522  554    static bool oops_do_marking_is_active() { return _oops_do_mark_nmethods != NULL; }
 523  555    DEBUG_ONLY(bool test_oops_do_mark() { return _oops_do_mark_link != NULL; })
 524  556  
 525  557    // ScopeDesc for an instruction
↓ open down ↓ 149 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX