hotspot/src/share/vm/code/nmethod.hpp
changeset 5702 201c5cde25bb
parent 5547 f4b087cbb361
parent 5686 5435e77aa3df
child 5896 c60924a89622
equal deleted inserted replaced
5685:0e4c848d5c06 5702:201c5cde25bb
   103 // A nmethod contains:
   103 // A nmethod contains:
   104 //  - header                 (the nmethod structure)
   104 //  - header                 (the nmethod structure)
   105 //  [Relocation]
   105 //  [Relocation]
   106 //  - relocation information
   106 //  - relocation information
   107 //  - constant part          (doubles, longs and floats used in nmethod)
   107 //  - constant part          (doubles, longs and floats used in nmethod)
       
   108 //  - oop table
   108 //  [Code]
   109 //  [Code]
   109 //  - code body
   110 //  - code body
   110 //  - exception handler
   111 //  - exception handler
   111 //  - stub code
   112 //  - stub code
   112 //  [Debugging information]
   113 //  [Debugging information]
   159 #ifdef HAVE_DTRACE_H
   160 #ifdef HAVE_DTRACE_H
   160   int _trap_offset;
   161   int _trap_offset;
   161 #endif // def HAVE_DTRACE_H
   162 #endif // def HAVE_DTRACE_H
   162   int _stub_offset;
   163   int _stub_offset;
   163   int _consts_offset;
   164   int _consts_offset;
       
   165   int _oops_offset;                       // offset to where embedded oop table begins (inside data)
   164   int _scopes_data_offset;
   166   int _scopes_data_offset;
   165   int _scopes_pcs_offset;
   167   int _scopes_pcs_offset;
   166   int _dependencies_offset;
   168   int _dependencies_offset;
   167   int _handler_table_offset;
   169   int _handler_table_offset;
   168   int _nul_chk_table_offset;
   170   int _nul_chk_table_offset;
   345   address deopt_mh_handler_begin() const          { return           header_begin() + _deoptimize_mh_offset ; }
   347   address deopt_mh_handler_begin() const          { return           header_begin() + _deoptimize_mh_offset ; }
   346   address unwind_handler_begin  () const          { return _unwind_handler_offset != -1 ? (header_begin() + _unwind_handler_offset) : NULL; }
   348   address unwind_handler_begin  () const          { return _unwind_handler_offset != -1 ? (header_begin() + _unwind_handler_offset) : NULL; }
   347   address stub_begin            () const          { return           header_begin() + _stub_offset          ; }
   349   address stub_begin            () const          { return           header_begin() + _stub_offset          ; }
   348   address stub_end              () const          { return           header_begin() + _consts_offset        ; }
   350   address stub_end              () const          { return           header_begin() + _consts_offset        ; }
   349   address consts_begin          () const          { return           header_begin() + _consts_offset        ; }
   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   address scopes_data_begin     () const          { return           header_begin() + _scopes_data_offset   ; }
   356   address scopes_data_begin     () const          { return           header_begin() + _scopes_data_offset   ; }
   352   address scopes_data_end       () const          { return           header_begin() + _scopes_pcs_offset    ; }
   357   address scopes_data_end       () const          { return           header_begin() + _scopes_pcs_offset    ; }
   353   PcDesc* scopes_pcs_begin      () const          { return (PcDesc*)(header_begin() + _scopes_pcs_offset   ); }
   358   PcDesc* scopes_pcs_begin      () const          { return (PcDesc*)(header_begin() + _scopes_pcs_offset   ); }
   354   PcDesc* scopes_pcs_end        () const          { return (PcDesc*)(header_begin() + _dependencies_offset) ; }
   359   PcDesc* scopes_pcs_end        () const          { return (PcDesc*)(header_begin() + _dependencies_offset) ; }
   355   address dependencies_begin    () const          { return           header_begin() + _dependencies_offset  ; }
   360   address dependencies_begin    () const          { return           header_begin() + _dependencies_offset  ; }
   357   address handler_table_begin   () const          { return           header_begin() + _handler_table_offset ; }
   362   address handler_table_begin   () const          { return           header_begin() + _handler_table_offset ; }
   358   address handler_table_end     () const          { return           header_begin() + _nul_chk_table_offset ; }
   363   address handler_table_end     () const          { return           header_begin() + _nul_chk_table_offset ; }
   359   address nul_chk_table_begin   () const          { return           header_begin() + _nul_chk_table_offset ; }
   364   address nul_chk_table_begin   () const          { return           header_begin() + _nul_chk_table_offset ; }
   360   address nul_chk_table_end     () const          { return           header_begin() + _nmethod_end_offset   ; }
   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         (); }
   367   // Sizes
   363   int stub_size         () const                  { return      stub_end         () -      stub_begin         (); }
   368   int code_size         () const                  { return            code_end         () -            code_begin         (); }
   364   int consts_size       () const                  { return      consts_end       () -      consts_begin       (); }
   369   int stub_size         () const                  { return            stub_end         () -            stub_begin         (); }
   365   int scopes_data_size  () const                  { return      scopes_data_end  () -      scopes_data_begin  (); }
   370   int consts_size       () const                  { return            consts_end       () -            consts_begin       (); }
   366   int scopes_pcs_size   () const                  { return (intptr_t)scopes_pcs_end   () - (intptr_t)scopes_pcs_begin   (); }
   371   int oops_size         () const                  { return (address)  oops_end         () - (address)  oops_begin         (); }
   367   int dependencies_size () const                  { return      dependencies_end () -      dependencies_begin (); }
   372   int scopes_data_size  () const                  { return            scopes_data_end  () -            scopes_data_begin  (); }
   368   int handler_table_size() const                  { return      handler_table_end() -      handler_table_begin(); }
   373   int scopes_pcs_size   () const                  { return (intptr_t) scopes_pcs_end   () - (intptr_t) scopes_pcs_begin   (); }
   369   int nul_chk_table_size() const                  { return      nul_chk_table_end() -      nul_chk_table_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   int total_size        () const;
   378   int total_size        () const;
   372 
   379 
       
   380   // Containment
   373   bool code_contains         (address addr) const { return code_begin         () <= addr && addr < code_end         (); }
   381   bool code_contains         (address addr) const { return code_begin         () <= addr && addr < code_end         (); }
   374   bool stub_contains         (address addr) const { return stub_begin         () <= addr && addr < stub_end         (); }
   382   bool stub_contains         (address addr) const { return stub_begin         () <= addr && addr < stub_end         (); }
   375   bool consts_contains       (address addr) const { return consts_begin       () <= addr && addr < consts_end       (); }
   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   bool scopes_data_contains  (address addr) const { return scopes_data_begin  () <= addr && addr < scopes_data_end  (); }
   385   bool scopes_data_contains  (address addr) const { return scopes_data_begin  () <= addr && addr < scopes_data_end  (); }
   377   bool scopes_pcs_contains   (PcDesc* addr) const { return scopes_pcs_begin   () <= addr && addr < scopes_pcs_end   (); }
   386   bool scopes_pcs_contains   (PcDesc* addr) const { return scopes_pcs_begin   () <= addr && addr < scopes_pcs_end   (); }
   378   bool handler_table_contains(address addr) const { return handler_table_begin() <= addr && addr < handler_table_end(); }
   387   bool handler_table_contains(address addr) const { return handler_table_begin() <= addr && addr < handler_table_end(); }
   379   bool nul_chk_table_contains(address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); }
   388   bool nul_chk_table_contains(address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); }
   380 
   389 
   428 
   437 
   429   int   comp_level() const                        { return _comp_level; }
   438   int   comp_level() const                        { return _comp_level; }
   430 
   439 
   431   int   version() const                           { return flags.version; }
   440   int   version() const                           { return flags.version; }
   432   void  set_version(int v);
   441   void  set_version(int v);
       
   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);
   433 
   465 
   434   // Non-perm oop support
   466   // Non-perm oop support
   435   bool  on_scavenge_root_list() const                  { return (_scavenge_root_state & 1) != 0; }
   467   bool  on_scavenge_root_list() const                  { return (_scavenge_root_state & 1) != 0; }
   436  protected:
   468  protected:
   437   enum { npl_on_list = 0x01, npl_marked = 0x10 };
   469   enum { npl_on_list = 0x01, npl_marked = 0x10 };
   509   bool can_unload(BoolObjectClosure* is_alive, OopClosure* keep_alive,
   541   bool can_unload(BoolObjectClosure* is_alive, OopClosure* keep_alive,
   510                   oop* root, bool unloading_occurred);
   542                   oop* root, bool unloading_occurred);
   511 
   543 
   512   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
   544   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
   513                                      OopClosure* f);
   545                                      OopClosure* f);
   514   virtual void oops_do(OopClosure* f) { oops_do(f, false); }
   546   void oops_do(OopClosure* f) { oops_do(f, false); }
   515   void         oops_do(OopClosure* f, bool do_strong_roots_only);
   547   void oops_do(OopClosure* f, bool do_strong_roots_only);
   516   bool detect_scavenge_root_oops();
   548   bool detect_scavenge_root_oops();
   517   void verify_scavenge_root_oops() PRODUCT_RETURN;
   549   void verify_scavenge_root_oops() PRODUCT_RETURN;
   518 
   550 
   519   bool test_set_oops_do_mark();
   551   bool test_set_oops_do_mark();
   520   static void oops_do_marking_prologue();
   552   static void oops_do_marking_prologue();