Mercurial > hg > truffle
comparison src/share/vm/code/nmethod.cpp @ 1563:1a5913bf5e19
6951083: oops and relocations should part of nmethod not CodeBlob
Summary: This moves the oops from Codeblob to nmethod.
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Thu, 20 May 2010 06:34:23 -0700 |
parents | bfe29ec02863 |
children | 852d0157c696 |
comparison
equal
deleted
inserted
replaced
1544:1a88d3c58e1d | 1563:1a5913bf5e19 |
---|---|
97 total_size += nm->size(); | 97 total_size += nm->size(); |
98 relocation_size += nm->relocation_size(); | 98 relocation_size += nm->relocation_size(); |
99 code_size += nm->code_size(); | 99 code_size += nm->code_size(); |
100 stub_size += nm->stub_size(); | 100 stub_size += nm->stub_size(); |
101 consts_size += nm->consts_size(); | 101 consts_size += nm->consts_size(); |
102 oops_size += nm->oops_size(); | |
102 scopes_data_size += nm->scopes_data_size(); | 103 scopes_data_size += nm->scopes_data_size(); |
103 scopes_pcs_size += nm->scopes_pcs_size(); | 104 scopes_pcs_size += nm->scopes_pcs_size(); |
104 dependencies_size += nm->dependencies_size(); | 105 dependencies_size += nm->dependencies_size(); |
105 handler_table_size += nm->handler_table_size(); | 106 handler_table_size += nm->handler_table_size(); |
106 nul_chk_table_size += nm->nul_chk_table_size(); | 107 nul_chk_table_size += nm->nul_chk_table_size(); |
107 oops_size += nm->oops_size(); | |
108 } | 108 } |
109 void print_nmethod_stats() { | 109 void print_nmethod_stats() { |
110 if (nmethod_count == 0) return; | 110 if (nmethod_count == 0) return; |
111 tty->print_cr("Statistics for %d bytecoded nmethods:", nmethod_count); | 111 tty->print_cr("Statistics for %d bytecoded nmethods:", nmethod_count); |
112 if (total_size != 0) tty->print_cr(" total in heap = %d", total_size); | 112 if (total_size != 0) tty->print_cr(" total in heap = %d", total_size); |
113 if (relocation_size != 0) tty->print_cr(" relocation = %d", relocation_size); | 113 if (relocation_size != 0) tty->print_cr(" relocation = %d", relocation_size); |
114 if (code_size != 0) tty->print_cr(" main code = %d", code_size); | 114 if (code_size != 0) tty->print_cr(" main code = %d", code_size); |
115 if (stub_size != 0) tty->print_cr(" stub code = %d", stub_size); | 115 if (stub_size != 0) tty->print_cr(" stub code = %d", stub_size); |
116 if (consts_size != 0) tty->print_cr(" constants = %d", consts_size); | 116 if (consts_size != 0) tty->print_cr(" constants = %d", consts_size); |
117 if (oops_size != 0) tty->print_cr(" oops = %d", oops_size); | |
117 if (scopes_data_size != 0) tty->print_cr(" scopes data = %d", scopes_data_size); | 118 if (scopes_data_size != 0) tty->print_cr(" scopes data = %d", scopes_data_size); |
118 if (scopes_pcs_size != 0) tty->print_cr(" scopes pcs = %d", scopes_pcs_size); | 119 if (scopes_pcs_size != 0) tty->print_cr(" scopes pcs = %d", scopes_pcs_size); |
119 if (dependencies_size != 0) tty->print_cr(" dependencies = %d", dependencies_size); | 120 if (dependencies_size != 0) tty->print_cr(" dependencies = %d", dependencies_size); |
120 if (handler_table_size != 0) tty->print_cr(" handler table = %d", handler_table_size); | 121 if (handler_table_size != 0) tty->print_cr(" handler table = %d", handler_table_size); |
121 if (nul_chk_table_size != 0) tty->print_cr(" nul chk table = %d", nul_chk_table_size); | 122 if (nul_chk_table_size != 0) tty->print_cr(" nul chk table = %d", nul_chk_table_size); |
122 if (oops_size != 0) tty->print_cr(" oops = %d", oops_size); | |
123 } | 123 } |
124 | 124 |
125 int native_nmethod_count; | 125 int native_nmethod_count; |
126 int native_total_size; | 126 int native_total_size; |
127 int native_relocation_size; | 127 int native_relocation_size; |
598 #ifdef HAVE_DTRACE_H | 598 #ifdef HAVE_DTRACE_H |
599 _trap_offset = 0; | 599 _trap_offset = 0; |
600 #endif // def HAVE_DTRACE_H | 600 #endif // def HAVE_DTRACE_H |
601 _stub_offset = data_offset(); | 601 _stub_offset = data_offset(); |
602 _consts_offset = data_offset(); | 602 _consts_offset = data_offset(); |
603 _scopes_data_offset = data_offset(); | 603 _oops_offset = data_offset(); |
604 _scopes_data_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize); | |
604 _scopes_pcs_offset = _scopes_data_offset; | 605 _scopes_pcs_offset = _scopes_data_offset; |
605 _dependencies_offset = _scopes_pcs_offset; | 606 _dependencies_offset = _scopes_pcs_offset; |
606 _handler_table_offset = _dependencies_offset; | 607 _handler_table_offset = _dependencies_offset; |
607 _nul_chk_table_offset = _handler_table_offset; | 608 _nul_chk_table_offset = _handler_table_offset; |
608 _nmethod_end_offset = _nul_chk_table_offset; | 609 _nmethod_end_offset = _nul_chk_table_offset; |
688 _unwind_handler_offset = -1; | 689 _unwind_handler_offset = -1; |
689 _trap_offset = offsets->value(CodeOffsets::Dtrace_trap); | 690 _trap_offset = offsets->value(CodeOffsets::Dtrace_trap); |
690 _orig_pc_offset = 0; | 691 _orig_pc_offset = 0; |
691 _stub_offset = data_offset(); | 692 _stub_offset = data_offset(); |
692 _consts_offset = data_offset(); | 693 _consts_offset = data_offset(); |
693 _scopes_data_offset = data_offset(); | 694 _oops_offset = data_offset(); |
695 _scopes_data_offset = _oops_offset + round_to(code_buffer->total_oop_size(), oopSize); | |
694 _scopes_pcs_offset = _scopes_data_offset; | 696 _scopes_pcs_offset = _scopes_data_offset; |
695 _dependencies_offset = _scopes_pcs_offset; | 697 _dependencies_offset = _scopes_pcs_offset; |
696 _handler_table_offset = _dependencies_offset; | 698 _handler_table_offset = _dependencies_offset; |
697 _nul_chk_table_offset = _handler_table_offset; | 699 _nul_chk_table_offset = _handler_table_offset; |
698 _nmethod_end_offset = _nul_chk_table_offset; | 700 _nmethod_end_offset = _nul_chk_table_offset; |
803 _unwind_handler_offset = instructions_offset() + offsets->value(CodeOffsets::UnwindHandler); | 805 _unwind_handler_offset = instructions_offset() + offsets->value(CodeOffsets::UnwindHandler); |
804 } else { | 806 } else { |
805 _unwind_handler_offset = -1; | 807 _unwind_handler_offset = -1; |
806 } | 808 } |
807 _consts_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->consts()->start()); | 809 _consts_offset = instructions_offset() + code_buffer->total_offset_of(code_buffer->consts()->start()); |
808 _scopes_data_offset = data_offset(); | 810 _oops_offset = data_offset(); |
809 _scopes_pcs_offset = _scopes_data_offset + round_to(debug_info->data_size (), oopSize); | 811 _scopes_data_offset = _oops_offset + round_to(code_buffer->total_oop_size (), oopSize); |
812 _scopes_pcs_offset = _scopes_data_offset + round_to(debug_info->data_size (), oopSize); | |
810 _dependencies_offset = _scopes_pcs_offset + adjust_pcs_size(debug_info->pcs_size()); | 813 _dependencies_offset = _scopes_pcs_offset + adjust_pcs_size(debug_info->pcs_size()); |
811 _handler_table_offset = _dependencies_offset + round_to(dependencies->size_in_bytes (), oopSize); | 814 _handler_table_offset = _dependencies_offset + round_to(dependencies->size_in_bytes (), oopSize); |
812 _nul_chk_table_offset = _handler_table_offset + round_to(handler_table->size_in_bytes(), oopSize); | 815 _nul_chk_table_offset = _handler_table_offset + round_to(handler_table->size_in_bytes(), oopSize); |
813 _nmethod_end_offset = _nul_chk_table_offset + round_to(nul_chk_table->size_in_bytes(), oopSize); | 816 _nmethod_end_offset = _nul_chk_table_offset + round_to(nul_chk_table->size_in_bytes(), oopSize); |
814 | 817 |
985 } | 988 } |
986 | 989 |
987 | 990 |
988 void nmethod::set_version(int v) { | 991 void nmethod::set_version(int v) { |
989 flags.version = v; | 992 flags.version = v; |
993 } | |
994 | |
995 | |
996 // Promote one word from an assembly-time handle to a live embedded oop. | |
997 inline void nmethod::initialize_immediate_oop(oop* dest, jobject handle) { | |
998 if (handle == NULL || | |
999 // As a special case, IC oops are initialized to 1 or -1. | |
1000 handle == (jobject) Universe::non_oop_word()) { | |
1001 (*dest) = (oop) handle; | |
1002 } else { | |
1003 (*dest) = JNIHandles::resolve_non_null(handle); | |
1004 } | |
1005 } | |
1006 | |
1007 | |
1008 void nmethod::copy_oops(GrowableArray<jobject>* array) { | |
1009 //assert(oops_size() == 0, "do this handshake just once, please"); | |
1010 int length = array->length(); | |
1011 assert((address)(oops_begin() + length) <= data_end(), "oops big enough"); | |
1012 oop* dest = oops_begin(); | |
1013 for (int index = 0 ; index < length; index++) { | |
1014 initialize_immediate_oop(&dest[index], array->at(index)); | |
1015 } | |
1016 | |
1017 // Now we can fix up all the oops in the code. We need to do this | |
1018 // in the code because the assembler uses jobjects as placeholders. | |
1019 // The code and relocations have already been initialized by the | |
1020 // CodeBlob constructor, so it is valid even at this early point to | |
1021 // iterate over relocations and patch the code. | |
1022 fix_oop_relocations(NULL, NULL, /*initialize_immediates=*/ true); | |
1023 } | |
1024 | |
1025 | |
1026 bool nmethod::is_at_poll_return(address pc) { | |
1027 RelocIterator iter(this, pc, pc+1); | |
1028 while (iter.next()) { | |
1029 if (iter.type() == relocInfo::poll_return_type) | |
1030 return true; | |
1031 } | |
1032 return false; | |
1033 } | |
1034 | |
1035 | |
1036 bool nmethod::is_at_poll_or_poll_return(address pc) { | |
1037 RelocIterator iter(this, pc, pc+1); | |
1038 while (iter.next()) { | |
1039 relocInfo::relocType t = iter.type(); | |
1040 if (t == relocInfo::poll_return_type || t == relocInfo::poll_type) | |
1041 return true; | |
1042 } | |
1043 return false; | |
1044 } | |
1045 | |
1046 | |
1047 void nmethod::fix_oop_relocations(address begin, address end, bool initialize_immediates) { | |
1048 // re-patch all oop-bearing instructions, just in case some oops moved | |
1049 RelocIterator iter(this, begin, end); | |
1050 while (iter.next()) { | |
1051 if (iter.type() == relocInfo::oop_type) { | |
1052 oop_Relocation* reloc = iter.oop_reloc(); | |
1053 if (initialize_immediates && reloc->oop_is_immediate()) { | |
1054 oop* dest = reloc->oop_addr(); | |
1055 initialize_immediate_oop(dest, (jobject) *dest); | |
1056 } | |
1057 // Refresh the oop-related bits of this instruction. | |
1058 reloc->fix_oop_relocation(); | |
1059 } | |
1060 | |
1061 // There must not be any interfering patches or breakpoints. | |
1062 assert(!(iter.type() == relocInfo::breakpoint_type | |
1063 && iter.breakpoint_reloc()->active()), | |
1064 "no active breakpoint"); | |
1065 } | |
990 } | 1066 } |
991 | 1067 |
992 | 1068 |
993 ScopeDesc* nmethod::scope_desc_at(address pc) { | 1069 ScopeDesc* nmethod::scope_desc_at(address pc) { |
994 PcDesc* pd = pc_desc_at(pc); | 1070 PcDesc* pd = pc_desc_at(pc); |
2280 stub_size()); | 2356 stub_size()); |
2281 if (consts_size () > 0) tty->print_cr(" constants [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d", | 2357 if (consts_size () > 0) tty->print_cr(" constants [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d", |
2282 consts_begin(), | 2358 consts_begin(), |
2283 consts_end(), | 2359 consts_end(), |
2284 consts_size()); | 2360 consts_size()); |
2361 if (oops_size () > 0) tty->print_cr(" oops [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d", | |
2362 oops_begin(), | |
2363 oops_end(), | |
2364 oops_size()); | |
2285 if (scopes_data_size () > 0) tty->print_cr(" scopes data [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d", | 2365 if (scopes_data_size () > 0) tty->print_cr(" scopes data [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d", |
2286 scopes_data_begin(), | 2366 scopes_data_begin(), |
2287 scopes_data_end(), | 2367 scopes_data_end(), |
2288 scopes_data_size()); | 2368 scopes_data_size()); |
2289 if (scopes_pcs_size () > 0) tty->print_cr(" scopes pcs [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d", | 2369 if (scopes_pcs_size () > 0) tty->print_cr(" scopes pcs [" INTPTR_FORMAT "," INTPTR_FORMAT "] = %d", |