Mercurial > hg > graal-compiler
comparison src/share/vm/code/nmethod.cpp @ 116:018d5b58dd4f
6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
Summary: Initial checkin of JSDT code
Reviewed-by: acorn, sbohne
author | kamg |
---|---|
date | Thu, 17 Apr 2008 22:18:15 -0400 |
parents | c7c777385a15 |
children | d1605aabd0a1 |
comparison
equal
deleted
inserted
replaced
115:e7a91a357527 | 116:018d5b58dd4f |
---|---|
25 # include "incls/_precompiled.incl" | 25 # include "incls/_precompiled.incl" |
26 # include "incls/_nmethod.cpp.incl" | 26 # include "incls/_nmethod.cpp.incl" |
27 | 27 |
28 #ifdef DTRACE_ENABLED | 28 #ifdef DTRACE_ENABLED |
29 | 29 |
30 | |
31 // Only bother with this argument setup if dtrace is available | 30 // Only bother with this argument setup if dtrace is available |
32 | 31 |
33 HS_DTRACE_PROBE_DECL8(hotspot, compiled__method__load, | 32 HS_DTRACE_PROBE_DECL8(hotspot, compiled__method__load, |
34 const char*, int, const char*, int, const char*, int, void*, size_t); | 33 const char*, int, const char*, int, const char*, int, void*, size_t); |
35 | 34 |
436 // create nmethod | 435 // create nmethod |
437 nmethod* nm = NULL; | 436 nmethod* nm = NULL; |
438 { | 437 { |
439 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); | 438 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); |
440 int native_nmethod_size = allocation_size(code_buffer, sizeof(nmethod)); | 439 int native_nmethod_size = allocation_size(code_buffer, sizeof(nmethod)); |
441 const int dummy = -1; // Flag to force proper "operator new" | |
442 CodeOffsets offsets; | 440 CodeOffsets offsets; |
443 offsets.set_value(CodeOffsets::Verified_Entry, vep_offset); | 441 offsets.set_value(CodeOffsets::Verified_Entry, vep_offset); |
444 offsets.set_value(CodeOffsets::Frame_Complete, frame_complete); | 442 offsets.set_value(CodeOffsets::Frame_Complete, frame_complete); |
445 nm = new (native_nmethod_size) | 443 nm = new (native_nmethod_size) |
446 nmethod(method(), native_nmethod_size, &offsets, | 444 nmethod(method(), native_nmethod_size, &offsets, |
458 nm->log_new_nmethod(); | 456 nm->log_new_nmethod(); |
459 } | 457 } |
460 | 458 |
461 return nm; | 459 return nm; |
462 } | 460 } |
461 | |
462 #ifdef HAVE_DTRACE_H | |
463 nmethod* nmethod::new_dtrace_nmethod(methodHandle method, | |
464 CodeBuffer *code_buffer, | |
465 int vep_offset, | |
466 int trap_offset, | |
467 int frame_complete, | |
468 int frame_size) { | |
469 // create nmethod | |
470 nmethod* nm = NULL; | |
471 { | |
472 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); | |
473 int nmethod_size = allocation_size(code_buffer, sizeof(nmethod)); | |
474 CodeOffsets offsets; | |
475 offsets.set_value(CodeOffsets::Verified_Entry, vep_offset); | |
476 offsets.set_value(CodeOffsets::Dtrace_trap, trap_offset); | |
477 offsets.set_value(CodeOffsets::Frame_Complete, frame_complete); | |
478 | |
479 nm = new (nmethod_size) nmethod(method(), nmethod_size, &offsets, code_buffer, frame_size); | |
480 | |
481 NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm)); | |
482 if (PrintAssembly && nm != NULL) | |
483 Disassembler::decode(nm); | |
484 } | |
485 // verify nmethod | |
486 debug_only(if (nm) nm->verify();) // might block | |
487 | |
488 if (nm != NULL) { | |
489 nm->log_new_nmethod(); | |
490 } | |
491 | |
492 return nm; | |
493 } | |
494 | |
495 #endif // def HAVE_DTRACE_H | |
463 | 496 |
464 nmethod* nmethod::new_nmethod(methodHandle method, | 497 nmethod* nmethod::new_nmethod(methodHandle method, |
465 int compile_id, | 498 int compile_id, |
466 int entry_bci, | 499 int entry_bci, |
467 CodeOffsets* offsets, | 500 CodeOffsets* offsets, |
556 // We have no exception handler or deopt handler make the | 589 // We have no exception handler or deopt handler make the |
557 // values something that will never match a pc like the nmethod vtable entry | 590 // values something that will never match a pc like the nmethod vtable entry |
558 _exception_offset = 0; | 591 _exception_offset = 0; |
559 _deoptimize_offset = 0; | 592 _deoptimize_offset = 0; |
560 _orig_pc_offset = 0; | 593 _orig_pc_offset = 0; |
594 #ifdef HAVE_DTRACE_H | |
595 _trap_offset = 0; | |
596 #endif // def HAVE_DTRACE_H | |
561 _stub_offset = data_offset(); | 597 _stub_offset = data_offset(); |
562 _consts_offset = data_offset(); | 598 _consts_offset = data_offset(); |
563 _scopes_data_offset = data_offset(); | 599 _scopes_data_offset = data_offset(); |
564 _scopes_pcs_offset = _scopes_data_offset; | 600 _scopes_pcs_offset = _scopes_data_offset; |
565 _dependencies_offset = _scopes_pcs_offset; | 601 _dependencies_offset = _scopes_pcs_offset; |
613 } | 649 } |
614 } | 650 } |
615 Events::log("Create nmethod " INTPTR_FORMAT, this); | 651 Events::log("Create nmethod " INTPTR_FORMAT, this); |
616 } | 652 } |
617 | 653 |
654 // For dtrace wrappers | |
655 #ifdef HAVE_DTRACE_H | |
656 nmethod::nmethod( | |
657 methodOop method, | |
658 int nmethod_size, | |
659 CodeOffsets* offsets, | |
660 CodeBuffer* code_buffer, | |
661 int frame_size) | |
662 : CodeBlob("dtrace nmethod", code_buffer, sizeof(nmethod), | |
663 nmethod_size, offsets->value(CodeOffsets::Frame_Complete), frame_size, NULL), | |
664 _compiled_synchronized_native_basic_lock_owner_sp_offset(in_ByteSize(-1)), | |
665 _compiled_synchronized_native_basic_lock_sp_offset(in_ByteSize(-1)) | |
666 { | |
667 { | |
668 debug_only(No_Safepoint_Verifier nsv;) | |
669 assert_locked_or_safepoint(CodeCache_lock); | |
670 | |
671 NOT_PRODUCT(_has_debug_info = false; ) | |
672 _method = method; | |
673 _entry_bci = InvocationEntryBci; | |
674 _link = NULL; | |
675 _compiler = NULL; | |
676 // We have no exception handler or deopt handler make the | |
677 // values something that will never match a pc like the nmethod vtable entry | |
678 _exception_offset = 0; | |
679 _deoptimize_offset = 0; | |
680 _trap_offset = offsets->value(CodeOffsets::Dtrace_trap); | |
681 _orig_pc_offset = 0; | |
682 _stub_offset = data_offset(); | |
683 _consts_offset = data_offset(); | |
684 _scopes_data_offset = data_offset(); | |
685 _scopes_pcs_offset = _scopes_data_offset; | |
686 _dependencies_offset = _scopes_pcs_offset; | |
687 _handler_table_offset = _dependencies_offset; | |
688 _nul_chk_table_offset = _handler_table_offset; | |
689 _nmethod_end_offset = _nul_chk_table_offset; | |
690 _compile_id = 0; // default | |
691 _comp_level = CompLevel_none; | |
692 _entry_point = instructions_begin(); | |
693 _verified_entry_point = instructions_begin() + offsets->value(CodeOffsets::Verified_Entry); | |
694 _osr_entry_point = NULL; | |
695 _exception_cache = NULL; | |
696 _pc_desc_cache.reset_to(NULL); | |
697 | |
698 flags.clear(); | |
699 flags.state = alive; | |
700 _markedForDeoptimization = 0; | |
701 | |
702 _lock_count = 0; | |
703 _stack_traversal_mark = 0; | |
704 | |
705 code_buffer->copy_oops_to(this); | |
706 debug_only(check_store();) | |
707 CodeCache::commit(this); | |
708 VTune::create_nmethod(this); | |
709 } | |
710 | |
711 if (PrintNMethods || PrintDebugInfo || PrintRelocations || PrintDependencies) { | |
712 ttyLocker ttyl; // keep the following output all in one block | |
713 // This output goes directly to the tty, not the compiler log. | |
714 // To enable tools to match it up with the compilation activity, | |
715 // be sure to tag this tty output with the compile ID. | |
716 if (xtty != NULL) { | |
717 xtty->begin_head("print_dtrace_nmethod"); | |
718 xtty->method(_method); | |
719 xtty->stamp(); | |
720 xtty->end_head(" address='" INTPTR_FORMAT "'", (intptr_t) this); | |
721 } | |
722 // print the header part first | |
723 print(); | |
724 // then print the requested information | |
725 if (PrintNMethods) { | |
726 print_code(); | |
727 } | |
728 if (PrintRelocations) { | |
729 print_relocations(); | |
730 } | |
731 if (xtty != NULL) { | |
732 xtty->tail("print_dtrace_nmethod"); | |
733 } | |
734 } | |
735 Events::log("Create nmethod " INTPTR_FORMAT, this); | |
736 } | |
737 #endif // def HAVE_DTRACE_H | |
618 | 738 |
619 void* nmethod::operator new(size_t size, int nmethod_size) { | 739 void* nmethod::operator new(size_t size, int nmethod_size) { |
620 // Always leave some room in the CodeCache for I2C/C2I adapters | 740 // Always leave some room in the CodeCache for I2C/C2I adapters |
621 if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) return NULL; | 741 if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) return NULL; |
622 return CodeCache::allocate(nmethod_size); | 742 return CodeCache::allocate(nmethod_size); |
656 _comp_level = comp_level; | 776 _comp_level = comp_level; |
657 _entry_bci = entry_bci; | 777 _entry_bci = entry_bci; |
658 _link = NULL; | 778 _link = NULL; |
659 _compiler = compiler; | 779 _compiler = compiler; |
660 _orig_pc_offset = orig_pc_offset; | 780 _orig_pc_offset = orig_pc_offset; |
781 #ifdef HAVE_DTRACE_H | |
782 _trap_offset = 0; | |
783 #endif // def HAVE_DTRACE_H | |
661 _stub_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->stubs()->start()); | 784 _stub_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->stubs()->start()); |
662 | 785 |
663 // Exception handler and deopt handler are in the stub section | 786 // Exception handler and deopt handler are in the stub section |
664 _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions); | 787 _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions); |
665 _deoptimize_offset = _stub_offset + offsets->value(CodeOffsets::Deopt); | 788 _deoptimize_offset = _stub_offset + offsets->value(CodeOffsets::Deopt); |
1883 if (is_compiled_by_c1()) { | 2006 if (is_compiled_by_c1()) { |
1884 tty->print("(c1) "); | 2007 tty->print("(c1) "); |
1885 } else if (is_compiled_by_c2()) { | 2008 } else if (is_compiled_by_c2()) { |
1886 tty->print("(c2) "); | 2009 tty->print("(c2) "); |
1887 } else { | 2010 } else { |
1888 assert(is_native_method(), "Who else?"); | |
1889 tty->print("(nm) "); | 2011 tty->print("(nm) "); |
1890 } | 2012 } |
1891 | 2013 |
1892 print_on(tty, "nmethod"); | 2014 print_on(tty, "nmethod"); |
1893 tty->cr(); | 2015 tty->cr(); |