hotspot/src/share/vm/code/codeBlob.hpp
changeset 5702 201c5cde25bb
parent 5547 f4b087cbb361
parent 5686 5435e77aa3df
child 6065 26016b8ed869
equal deleted inserted replaced
5685:0e4c848d5c06 5702:201c5cde25bb
    52   int        _frame_complete_offset;             // instruction offsets in [0.._frame_complete_offset) have
    52   int        _frame_complete_offset;             // instruction offsets in [0.._frame_complete_offset) have
    53                                                  // not finished setting up their frame. Beware of pc's in
    53                                                  // not finished setting up their frame. Beware of pc's in
    54                                                  // that range. There is a similar range(s) on returns
    54                                                  // that range. There is a similar range(s) on returns
    55                                                  // which we don't detect.
    55                                                  // which we don't detect.
    56   int        _data_offset;                       // offset to where data region begins
    56   int        _data_offset;                       // offset to where data region begins
    57   int        _oops_offset;                       // offset to where embedded oop table begins (inside data)
       
    58   int        _oops_length;                       // number of embedded oops
       
    59   int        _frame_size;                        // size of stack frame
    57   int        _frame_size;                        // size of stack frame
    60   OopMapSet* _oop_maps;                          // OopMap for this CodeBlob
    58   OopMapSet* _oop_maps;                          // OopMap for this CodeBlob
    61   CodeComments _comments;
    59   CodeComments _comments;
    62 
    60 
    63   friend class OopRecorder;
    61   friend class OopRecorder;
    64 
       
    65   void fix_oop_relocations(address begin, address end, bool initialize_immediates);
       
    66   inline void initialize_immediate_oop(oop* dest, jobject handle);
       
    67 
    62 
    68  public:
    63  public:
    69   // Returns the space needed for CodeBlob
    64   // Returns the space needed for CodeBlob
    70   static unsigned int allocation_size(CodeBuffer* cb, int header_size);
    65   static unsigned int allocation_size(CodeBuffer* cb, int header_size);
    71 
    66 
   113   relocInfo* relocation_end() const              { return (relocInfo*)(header_end()   + _relocation_size); }
   108   relocInfo* relocation_end() const              { return (relocInfo*)(header_end()   + _relocation_size); }
   114   address    instructions_begin() const          { return (address)    header_begin() + _instructions_offset;  }
   109   address    instructions_begin() const          { return (address)    header_begin() + _instructions_offset;  }
   115   address    instructions_end() const            { return (address)    header_begin() + _data_offset; }
   110   address    instructions_end() const            { return (address)    header_begin() + _data_offset; }
   116   address    data_begin() const                  { return (address)    header_begin() + _data_offset; }
   111   address    data_begin() const                  { return (address)    header_begin() + _data_offset; }
   117   address    data_end() const                    { return (address)    header_begin() + _size; }
   112   address    data_end() const                    { return (address)    header_begin() + _size; }
   118   oop*       oops_begin() const                  { return (oop*)      (header_begin() + _oops_offset); }
       
   119   oop*       oops_end() const                    { return                oops_begin() + _oops_length; }
       
   120 
   113 
   121   // Offsets
   114   // Offsets
   122   int relocation_offset() const                  { return _header_size; }
   115   int relocation_offset() const                  { return _header_size; }
   123   int instructions_offset() const                { return _instructions_offset; }
   116   int instructions_offset() const                { return _instructions_offset; }
   124   int data_offset() const                        { return _data_offset; }
   117   int data_offset() const                        { return _data_offset; }
   125   int oops_offset() const                        { return _oops_offset; }
       
   126 
   118 
   127   // Sizes
   119   // Sizes
   128   int size() const                               { return _size; }
   120   int size() const                               { return _size; }
   129   int header_size() const                        { return _header_size; }
   121   int header_size() const                        { return _header_size; }
   130   int relocation_size() const                    { return (address) relocation_end() - (address) relocation_begin(); }
   122   int relocation_size() const                    { return (address) relocation_end() - (address) relocation_begin(); }
   131   int instructions_size() const                  { return instructions_end() - instructions_begin();  }
   123   int instructions_size() const                  { return instructions_end() - instructions_begin();  }
   132   int data_size() const                          { return data_end() - data_begin(); }
   124   int data_size() const                          { return data_end() - data_begin(); }
   133   int oops_size() const                          { return (address) oops_end() - (address) oops_begin(); }
       
   134 
   125 
   135   // Containment
   126   // Containment
   136   bool blob_contains(address addr) const         { return header_begin()       <= addr && addr < data_end(); }
   127   bool blob_contains(address addr) const         { return header_begin()       <= addr && addr < data_end(); }
   137   bool relocation_contains(relocInfo* addr) const{ return relocation_begin()   <= addr && addr < relocation_end(); }
   128   bool relocation_contains(relocInfo* addr) const{ return relocation_begin()   <= addr && addr < relocation_end(); }
   138   bool instructions_contains(address addr) const { return instructions_begin() <= addr && addr < instructions_end(); }
   129   bool instructions_contains(address addr) const { return instructions_begin() <= addr && addr < instructions_end(); }
   139   bool data_contains(address addr) const         { return data_begin()         <= addr && addr < data_end(); }
   130   bool data_contains(address addr) const         { return data_begin()         <= addr && addr < data_end(); }
   140   bool oops_contains(oop* addr) const            { return oops_begin()         <= addr && addr < oops_end(); }
       
   141   bool contains(address addr) const              { return instructions_contains(addr); }
   131   bool contains(address addr) const              { return instructions_contains(addr); }
   142   bool is_frame_complete_at(address addr) const  { return instructions_contains(addr) &&
   132   bool is_frame_complete_at(address addr) const  { return instructions_contains(addr) &&
   143                                                           addr >= instructions_begin() + _frame_complete_offset; }
   133                                                           addr >= instructions_begin() + _frame_complete_offset; }
   144 
       
   145   // Relocation support
       
   146   void fix_oop_relocations(address begin, address end) {
       
   147     fix_oop_relocations(begin, end, false);
       
   148   }
       
   149   void fix_oop_relocations() {
       
   150     fix_oop_relocations(NULL, NULL, false);
       
   151   }
       
   152   relocInfo::relocType reloc_type_for_address(address pc);
       
   153   bool is_at_poll_return(address pc);
       
   154   bool is_at_poll_or_poll_return(address pc);
       
   155 
       
   156   // Support for oops in scopes and relocs:
       
   157   // Note: index 0 is reserved for null.
       
   158   oop  oop_at(int index) const                   { return index == 0? (oop)NULL: *oop_addr_at(index); }
       
   159   oop* oop_addr_at(int index) const{             // for GC
       
   160     // relocation indexes are biased by 1 (because 0 is reserved)
       
   161     assert(index > 0 && index <= _oops_length, "must be a valid non-zero index");
       
   162     return &oops_begin()[index-1];
       
   163   }
       
   164 
       
   165   void copy_oops(GrowableArray<jobject>* oops);
       
   166 
   134 
   167   // CodeCache support: really only used by the nmethods, but in order to get
   135   // CodeCache support: really only used by the nmethods, but in order to get
   168   // asserts and certain bookkeeping to work in the CodeCache they are defined
   136   // asserts and certain bookkeeping to work in the CodeCache they are defined
   169   // virtual here.
   137   // virtual here.
   170   virtual bool is_zombie() const                 { return false; }
   138   virtual bool is_zombie() const                 { return false; }
   173   virtual bool is_unloaded() const               { return false; }
   141   virtual bool is_unloaded() const               { return false; }
   174   virtual bool is_not_entrant() const            { return false; }
   142   virtual bool is_not_entrant() const            { return false; }
   175 
   143 
   176   // GC support
   144   // GC support
   177   virtual bool is_alive() const                  = 0;
   145   virtual bool is_alive() const                  = 0;
   178   virtual void do_unloading(BoolObjectClosure* is_alive,
       
   179                             OopClosure* keep_alive,
       
   180                             bool unloading_occurred);
       
   181   virtual void oops_do(OopClosure* f) = 0;
       
   182   // (All CodeBlob subtypes other than NMethod currently have
       
   183   // an empty oops_do() method.
       
   184 
   146 
   185   // OopMap for frame
   147   // OopMap for frame
   186   OopMapSet* oop_maps() const                    { return _oop_maps; }
   148   OopMapSet* oop_maps() const                    { return _oop_maps; }
   187   void set_oop_maps(OopMapSet* p);
   149   void set_oop_maps(OopMapSet* p);
   188   OopMap* oop_map_for_return_address(address return_address);
   150   OopMap* oop_map_for_return_address(address return_address);
   243   virtual bool is_buffer_blob() const            { return true; }
   205   virtual bool is_buffer_blob() const            { return true; }
   244 
   206 
   245   // GC/Verification support
   207   // GC/Verification support
   246   void preserve_callee_argument_oops(frame fr, const RegisterMap* reg_map, OopClosure* f)  { /* nothing to do */ }
   208   void preserve_callee_argument_oops(frame fr, const RegisterMap* reg_map, OopClosure* f)  { /* nothing to do */ }
   247   bool is_alive() const                          { return true; }
   209   bool is_alive() const                          { return true; }
   248   void do_unloading(BoolObjectClosure* is_alive,
       
   249                     OopClosure* keep_alive,
       
   250                     bool unloading_occurred)     { /* do nothing */ }
       
   251 
       
   252   void oops_do(OopClosure* f)                    { /* do nothing*/ }
       
   253 
   210 
   254   void verify();
   211   void verify();
   255   void print() const                             PRODUCT_RETURN;
   212   void print() const                             PRODUCT_RETURN;
   256   void print_value_on(outputStream* st) const    PRODUCT_RETURN;
   213   void print_value_on(outputStream* st) const    PRODUCT_RETURN;
   257 };
   214 };
   332   address entry_point()                          { return instructions_begin(); }
   289   address entry_point()                          { return instructions_begin(); }
   333 
   290 
   334   // GC/Verification support
   291   // GC/Verification support
   335   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f)  { /* nothing to do */ }
   292   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f)  { /* nothing to do */ }
   336   bool is_alive() const                          { return true; }
   293   bool is_alive() const                          { return true; }
   337   void do_unloading(BoolObjectClosure* is_alive,
       
   338                     OopClosure* keep_alive,
       
   339                     bool unloading_occurred)     { /* do nothing */ }
       
   340   void oops_do(OopClosure* f) { /* do-nothing*/ }
       
   341 
   294 
   342   void verify();
   295   void verify();
   343   void print() const                             PRODUCT_RETURN;
   296   void print() const                             PRODUCT_RETURN;
   344   void print_value_on(outputStream* st) const    PRODUCT_RETURN;
   297   void print_value_on(outputStream* st) const    PRODUCT_RETURN;
   345 };
   298 };
   361    )
   314    )
   362    : CodeBlob(name, cb, header_size, size, CodeOffsets::frame_never_safe, frame_size, oop_maps)
   315    : CodeBlob(name, cb, header_size, size, CodeOffsets::frame_never_safe, frame_size, oop_maps)
   363    {};
   316    {};
   364 
   317 
   365    bool is_alive() const                         { return true; }
   318    bool is_alive() const                         { return true; }
   366    void do_unloading(BoolObjectClosure* is_alive,
       
   367                      OopClosure* keep_alive,
       
   368                      bool unloading_occurred)    { /* do-nothing*/ }
       
   369 
   319 
   370    void verify(); // does nothing
   320    void verify(); // does nothing
   371    void print() const                            PRODUCT_RETURN;
   321    void print() const                            PRODUCT_RETURN;
   372    void print_value_on(outputStream* st) const   PRODUCT_RETURN;
   322    void print_value_on(outputStream* st) const   PRODUCT_RETURN;
   373 };
   323 };
   420 
   370 
   421 
   371 
   422 
   372 
   423   // GC for args
   373   // GC for args
   424   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f) { /* Nothing to do */ }
   374   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f) { /* Nothing to do */ }
   425 
       
   426   // Iteration
       
   427   void oops_do(OopClosure* f) {}
       
   428 
   375 
   429   // Printing
   376   // Printing
   430   void print_value_on(outputStream* st) const PRODUCT_RETURN;
   377   void print_value_on(outputStream* st) const PRODUCT_RETURN;
   431 
   378 
   432   address unpack() const                         { return instructions_begin() + _unpack_offset;           }
   379   address unpack() const                         { return instructions_begin() + _unpack_offset;           }
   475   // GC for args
   422   // GC for args
   476   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f)  { /* nothing to do */ }
   423   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map, OopClosure* f)  { /* nothing to do */ }
   477 
   424 
   478   // Typing
   425   // Typing
   479   bool is_uncommon_trap_stub() const             { return true; }
   426   bool is_uncommon_trap_stub() const             { return true; }
   480 
       
   481   // Iteration
       
   482   void oops_do(OopClosure* f) {}
       
   483 };
   427 };
   484 
   428 
   485 
   429 
   486 //----------------------------------------------------------------------------------------------------
   430 //----------------------------------------------------------------------------------------------------
   487 // ExceptionBlob: used for exception unwinding in compiled code (currently only used by Compiler 2)
   431 // ExceptionBlob: used for exception unwinding in compiled code (currently only used by Compiler 2)
   510   // GC for args
   454   // GC for args
   511   void preserve_callee_argument_oops(frame fr, const RegisterMap* reg_map, OopClosure* f)  { /* nothing to do */ }
   455   void preserve_callee_argument_oops(frame fr, const RegisterMap* reg_map, OopClosure* f)  { /* nothing to do */ }
   512 
   456 
   513   // Typing
   457   // Typing
   514   bool is_exception_stub() const                 { return true; }
   458   bool is_exception_stub() const                 { return true; }
   515 
       
   516   // Iteration
       
   517   void oops_do(OopClosure* f) {}
       
   518 };
   459 };
   519 #endif // COMPILER2
   460 #endif // COMPILER2
   520 
   461 
   521 
   462 
   522 //----------------------------------------------------------------------------------------------------
   463 //----------------------------------------------------------------------------------------------------
   546   // GC for args
   487   // GC for args
   547   void preserve_callee_argument_oops(frame fr, const RegisterMap* reg_map, OopClosure* f)  { /* nothing to do */ }
   488   void preserve_callee_argument_oops(frame fr, const RegisterMap* reg_map, OopClosure* f)  { /* nothing to do */ }
   548 
   489 
   549   // Typing
   490   // Typing
   550   bool is_safepoint_stub() const                 { return true; }
   491   bool is_safepoint_stub() const                 { return true; }
   551 
   492 };
   552   // Iteration
       
   553   void oops_do(OopClosure* f) {}
       
   554 };