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(); |