375 PcDesc* scopes_pcs_end () const { return (PcDesc*)(header_begin() + _dependencies_offset) ; } 376 address dependencies_begin () const { return header_begin() + _dependencies_offset ; } 377 address dependencies_end () const { return header_begin() + _handler_table_offset ; } 378 address handler_table_begin () const { return header_begin() + _handler_table_offset ; } 379 address handler_table_end () const { return header_begin() + _nul_chk_table_offset ; } 380 address nul_chk_table_begin () const { return header_begin() + _nul_chk_table_offset ; } 381 address nul_chk_table_end () const { return header_begin() + _nmethod_end_offset ; } 382 383 // Sizes 384 int consts_size () const { return consts_end () - consts_begin (); } 385 int insts_size () const { return insts_end () - insts_begin (); } 386 int stub_size () const { return stub_end () - stub_begin (); } 387 int oops_size () const { return (address) oops_end () - (address) oops_begin (); } 388 int metadata_size () const { return (address) metadata_end () - (address) metadata_begin (); } 389 int scopes_data_size () const { return scopes_data_end () - scopes_data_begin (); } 390 int scopes_pcs_size () const { return (intptr_t) scopes_pcs_end () - (intptr_t) scopes_pcs_begin (); } 391 int dependencies_size () const { return dependencies_end () - dependencies_begin (); } 392 int handler_table_size() const { return handler_table_end() - handler_table_begin(); } 393 int nul_chk_table_size() const { return nul_chk_table_end() - nul_chk_table_begin(); } 394 395 int total_size () const; 396 397 void dec_hotness_counter() { _hotness_counter--; } 398 void set_hotness_counter(int val) { _hotness_counter = val; } 399 int hotness_counter() const { return _hotness_counter; } 400 401 // Containment 402 bool consts_contains (address addr) const { return consts_begin () <= addr && addr < consts_end (); } 403 bool insts_contains (address addr) const { return insts_begin () <= addr && addr < insts_end (); } 404 bool stub_contains (address addr) const { return stub_begin () <= addr && addr < stub_end (); } 405 bool oops_contains (oop* addr) const { return oops_begin () <= addr && addr < oops_end (); } 406 bool metadata_contains (Metadata** addr) const { return metadata_begin () <= addr && addr < metadata_end (); } 407 bool scopes_data_contains (address addr) const { return scopes_data_begin () <= addr && addr < scopes_data_end (); } 408 bool scopes_pcs_contains (PcDesc* addr) const { return scopes_pcs_begin () <= addr && addr < scopes_pcs_end (); } 409 bool handler_table_contains(address addr) const { return handler_table_begin() <= addr && addr < handler_table_end(); } 410 bool nul_chk_table_contains(address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); } 411 412 // entry points 413 address entry_point() const { return _entry_point; } // normal entry point 414 address verified_entry_point() const { return _verified_entry_point; } // if klass is correct 474 475 bool has_unsafe_access() const { return _has_unsafe_access; } 476 void set_has_unsafe_access(bool z) { _has_unsafe_access = z; } 477 478 bool has_method_handle_invokes() const { return _has_method_handle_invokes; } 479 void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; } 480 481 bool is_lazy_critical_native() const { return _lazy_critical_native; } 482 void set_lazy_critical_native(bool z) { _lazy_critical_native = z; } 483 484 bool has_wide_vectors() const { return _has_wide_vectors; } 485 void set_has_wide_vectors(bool z) { _has_wide_vectors = z; } 486 487 int comp_level() const { return _comp_level; } 488 489 // Support for oops in scopes and relocs: 490 // Note: index 0 is reserved for null. 491 oop oop_at(int index) const { return index == 0 ? (oop) NULL: *oop_addr_at(index); } 492 oop* oop_addr_at(int index) const { // for GC 493 // relocation indexes are biased by 1 (because 0 is reserved) 494 assert(index > 0 && index <= oops_size(), "must be a valid non-zero index"); 495 assert(!_oops_are_stale, "oops are stale"); 496 return &oops_begin()[index - 1]; 497 } 498 499 // Support for meta data in scopes and relocs: 500 // Note: index 0 is reserved for null. 501 Metadata* metadata_at(int index) const { return index == 0 ? NULL: *metadata_addr_at(index); } 502 Metadata** metadata_addr_at(int index) const { // for GC 503 // relocation indexes are biased by 1 (because 0 is reserved) 504 assert(index > 0 && index <= metadata_size(), "must be a valid non-zero index"); 505 return &metadata_begin()[index - 1]; 506 } 507 508 void copy_values(GrowableArray<jobject>* oops); 509 void copy_values(GrowableArray<Metadata*>* metadata); 510 511 // Relocation support 512 private: 513 void fix_oop_relocations(address begin, address end, bool initialize_immediates); 514 inline void initialize_immediate_oop(oop* dest, jobject handle); 515 516 public: 517 void fix_oop_relocations(address begin, address end) { fix_oop_relocations(begin, end, false); } 518 void fix_oop_relocations() { fix_oop_relocations(NULL, NULL, false); } 519 void verify_oop_relocations(); 520 521 bool is_at_poll_return(address pc); 522 bool is_at_poll_or_poll_return(address pc); 523 524 // Scavengable oop support 525 bool on_scavenge_root_list() const { return (_scavenge_root_state & 1) != 0; } 526 protected: 527 enum { sl_on_list = 0x01, sl_marked = 0x10 }; 528 void set_on_scavenge_root_list() { _scavenge_root_state = sl_on_list; } 529 void clear_on_scavenge_root_list() { _scavenge_root_state = 0; } 530 // assertion-checking and pruning logic uses the bits of _scavenge_root_state 679 // jvmti support: 680 void post_compiled_method_load_event(); 681 jmethodID get_and_cache_jmethod_id(); 682 683 // verify operations 684 void verify(); 685 void verify_scopes(); 686 void verify_interrupt_point(address interrupt_point); 687 688 // printing support 689 void print() const; 690 void print_code(); 691 void print_relocations() PRODUCT_RETURN; 692 void print_pcs() PRODUCT_RETURN; 693 void print_scopes() PRODUCT_RETURN; 694 void print_dependencies() PRODUCT_RETURN; 695 void print_value_on(outputStream* st) const PRODUCT_RETURN; 696 void print_calls(outputStream* st) PRODUCT_RETURN; 697 void print_handler_table() PRODUCT_RETURN; 698 void print_nul_chk_table() PRODUCT_RETURN; 699 void print_nmethod(bool print_code); 700 701 // need to re-define this from CodeBlob else the overload hides it 702 virtual void print_on(outputStream* st) const { CodeBlob::print_on(st); } 703 void print_on(outputStream* st, const char* msg) const; 704 705 // Logging 706 void log_identity(xmlStream* log) const; 707 void log_new_nmethod() const; 708 void log_state_change() const; 709 710 // Prints block-level comments, including nmethod specific block labels: 711 virtual void print_block_comment(outputStream* stream, address block_begin) const { 712 print_nmethod_labels(stream, block_begin); 713 CodeBlob::print_block_comment(stream, block_begin); 714 } 715 void print_nmethod_labels(outputStream* stream, address block_begin) const; 716 717 // Prints a comment for one native instruction (reloc info, pc desc) 718 void print_code_comment_on(outputStream* st, int column, address begin, address end); | 375 PcDesc* scopes_pcs_end () const { return (PcDesc*)(header_begin() + _dependencies_offset) ; } 376 address dependencies_begin () const { return header_begin() + _dependencies_offset ; } 377 address dependencies_end () const { return header_begin() + _handler_table_offset ; } 378 address handler_table_begin () const { return header_begin() + _handler_table_offset ; } 379 address handler_table_end () const { return header_begin() + _nul_chk_table_offset ; } 380 address nul_chk_table_begin () const { return header_begin() + _nul_chk_table_offset ; } 381 address nul_chk_table_end () const { return header_begin() + _nmethod_end_offset ; } 382 383 // Sizes 384 int consts_size () const { return consts_end () - consts_begin (); } 385 int insts_size () const { return insts_end () - insts_begin (); } 386 int stub_size () const { return stub_end () - stub_begin (); } 387 int oops_size () const { return (address) oops_end () - (address) oops_begin (); } 388 int metadata_size () const { return (address) metadata_end () - (address) metadata_begin (); } 389 int scopes_data_size () const { return scopes_data_end () - scopes_data_begin (); } 390 int scopes_pcs_size () const { return (intptr_t) scopes_pcs_end () - (intptr_t) scopes_pcs_begin (); } 391 int dependencies_size () const { return dependencies_end () - dependencies_begin (); } 392 int handler_table_size() const { return handler_table_end() - handler_table_begin(); } 393 int nul_chk_table_size() const { return nul_chk_table_end() - nul_chk_table_begin(); } 394 395 int oops_count() const { assert(oops_size() % oopSize == 0, ""); return (oops_size() / oopSize) + 1; } 396 int metadata_count() const { assert(metadata_size() % wordSize == 0, ""); return (metadata_size() / wordSize) + 1; } 397 398 int total_size () const; 399 400 void dec_hotness_counter() { _hotness_counter--; } 401 void set_hotness_counter(int val) { _hotness_counter = val; } 402 int hotness_counter() const { return _hotness_counter; } 403 404 // Containment 405 bool consts_contains (address addr) const { return consts_begin () <= addr && addr < consts_end (); } 406 bool insts_contains (address addr) const { return insts_begin () <= addr && addr < insts_end (); } 407 bool stub_contains (address addr) const { return stub_begin () <= addr && addr < stub_end (); } 408 bool oops_contains (oop* addr) const { return oops_begin () <= addr && addr < oops_end (); } 409 bool metadata_contains (Metadata** addr) const { return metadata_begin () <= addr && addr < metadata_end (); } 410 bool scopes_data_contains (address addr) const { return scopes_data_begin () <= addr && addr < scopes_data_end (); } 411 bool scopes_pcs_contains (PcDesc* addr) const { return scopes_pcs_begin () <= addr && addr < scopes_pcs_end (); } 412 bool handler_table_contains(address addr) const { return handler_table_begin() <= addr && addr < handler_table_end(); } 413 bool nul_chk_table_contains(address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); } 414 415 // entry points 416 address entry_point() const { return _entry_point; } // normal entry point 417 address verified_entry_point() const { return _verified_entry_point; } // if klass is correct 477 478 bool has_unsafe_access() const { return _has_unsafe_access; } 479 void set_has_unsafe_access(bool z) { _has_unsafe_access = z; } 480 481 bool has_method_handle_invokes() const { return _has_method_handle_invokes; } 482 void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; } 483 484 bool is_lazy_critical_native() const { return _lazy_critical_native; } 485 void set_lazy_critical_native(bool z) { _lazy_critical_native = z; } 486 487 bool has_wide_vectors() const { return _has_wide_vectors; } 488 void set_has_wide_vectors(bool z) { _has_wide_vectors = z; } 489 490 int comp_level() const { return _comp_level; } 491 492 // Support for oops in scopes and relocs: 493 // Note: index 0 is reserved for null. 494 oop oop_at(int index) const { return index == 0 ? (oop) NULL: *oop_addr_at(index); } 495 oop* oop_addr_at(int index) const { // for GC 496 // relocation indexes are biased by 1 (because 0 is reserved) 497 assert(index > 0 && index <= oops_count(), "must be a valid non-zero index"); 498 assert(!_oops_are_stale, "oops are stale"); 499 return &oops_begin()[index - 1]; 500 } 501 502 // Support for meta data in scopes and relocs: 503 // Note: index 0 is reserved for null. 504 Metadata* metadata_at(int index) const { return index == 0 ? NULL: *metadata_addr_at(index); } 505 Metadata** metadata_addr_at(int index) const { // for GC 506 // relocation indexes are biased by 1 (because 0 is reserved) 507 assert(index > 0 && index <= metadata_count(), "must be a valid non-zero index"); 508 return &metadata_begin()[index - 1]; 509 } 510 511 void copy_values(GrowableArray<jobject>* oops); 512 void copy_values(GrowableArray<Metadata*>* metadata); 513 514 Method* attached_method(address call_pc); 515 516 // Relocation support 517 private: 518 void fix_oop_relocations(address begin, address end, bool initialize_immediates); 519 inline void initialize_immediate_oop(oop* dest, jobject handle); 520 521 public: 522 void fix_oop_relocations(address begin, address end) { fix_oop_relocations(begin, end, false); } 523 void fix_oop_relocations() { fix_oop_relocations(NULL, NULL, false); } 524 void verify_oop_relocations(); 525 526 bool is_at_poll_return(address pc); 527 bool is_at_poll_or_poll_return(address pc); 528 529 // Scavengable oop support 530 bool on_scavenge_root_list() const { return (_scavenge_root_state & 1) != 0; } 531 protected: 532 enum { sl_on_list = 0x01, sl_marked = 0x10 }; 533 void set_on_scavenge_root_list() { _scavenge_root_state = sl_on_list; } 534 void clear_on_scavenge_root_list() { _scavenge_root_state = 0; } 535 // assertion-checking and pruning logic uses the bits of _scavenge_root_state 684 // jvmti support: 685 void post_compiled_method_load_event(); 686 jmethodID get_and_cache_jmethod_id(); 687 688 // verify operations 689 void verify(); 690 void verify_scopes(); 691 void verify_interrupt_point(address interrupt_point); 692 693 // printing support 694 void print() const; 695 void print_code(); 696 void print_relocations() PRODUCT_RETURN; 697 void print_pcs() PRODUCT_RETURN; 698 void print_scopes() PRODUCT_RETURN; 699 void print_dependencies() PRODUCT_RETURN; 700 void print_value_on(outputStream* st) const PRODUCT_RETURN; 701 void print_calls(outputStream* st) PRODUCT_RETURN; 702 void print_handler_table() PRODUCT_RETURN; 703 void print_nul_chk_table() PRODUCT_RETURN; 704 void print_recorded_oops() PRODUCT_RETURN; 705 void print_recorded_metadata() PRODUCT_RETURN; 706 void print_nmethod(bool print_code); 707 708 // need to re-define this from CodeBlob else the overload hides it 709 virtual void print_on(outputStream* st) const { CodeBlob::print_on(st); } 710 void print_on(outputStream* st, const char* msg) const; 711 712 // Logging 713 void log_identity(xmlStream* log) const; 714 void log_new_nmethod() const; 715 void log_state_change() const; 716 717 // Prints block-level comments, including nmethod specific block labels: 718 virtual void print_block_comment(outputStream* stream, address block_begin) const { 719 print_nmethod_labels(stream, block_begin); 720 CodeBlob::print_block_comment(stream, block_begin); 721 } 722 void print_nmethod_labels(outputStream* stream, address block_begin) const; 723 724 // Prints a comment for one native instruction (reloc info, pc desc) 725 void print_code_comment_on(outputStream* st, int column, address begin, address end); |