comparison src/share/vm/ci/ciMethod.cpp @ 6972:bd7a7ce2e264

6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
author minqi
date Mon, 12 Nov 2012 14:03:53 -0800
parents 18fb7da42534
children bb33c6fdcf0d
comparison
equal deleted inserted replaced
6965:3be318ecfae5 6972:bd7a7ce2e264
29 #include "ci/ciMethod.hpp" 29 #include "ci/ciMethod.hpp"
30 #include "ci/ciMethodBlocks.hpp" 30 #include "ci/ciMethodBlocks.hpp"
31 #include "ci/ciMethodData.hpp" 31 #include "ci/ciMethodData.hpp"
32 #include "ci/ciStreams.hpp" 32 #include "ci/ciStreams.hpp"
33 #include "ci/ciSymbol.hpp" 33 #include "ci/ciSymbol.hpp"
34 #include "ci/ciReplay.hpp"
34 #include "ci/ciUtilities.hpp" 35 #include "ci/ciUtilities.hpp"
35 #include "classfile/systemDictionary.hpp" 36 #include "classfile/systemDictionary.hpp"
36 #include "compiler/abstractCompiler.hpp" 37 #include "compiler/abstractCompiler.hpp"
37 #include "compiler/compilerOracle.hpp" 38 #include "compiler/compilerOracle.hpp"
38 #include "compiler/methodLiveness.hpp" 39 #include "compiler/methodLiveness.hpp"
137 _interpreter_invocation_count = 0; 138 _interpreter_invocation_count = 0;
138 _interpreter_throwout_count = 0; 139 _interpreter_throwout_count = 0;
139 } 140 }
140 if (_interpreter_invocation_count == 0) 141 if (_interpreter_invocation_count == 0)
141 _interpreter_invocation_count = 1; 142 _interpreter_invocation_count = 1;
143 _instructions_size = -1;
144 #ifdef ASSERT
145 if (ReplayCompiles) {
146 ciReplay::initialize(this);
147 }
148 #endif
142 } 149 }
143 150
144 151
145 // ------------------------------------------------------------------ 152 // ------------------------------------------------------------------
146 // ciMethod::ciMethod 153 // ciMethod::ciMethod
159 _method_blocks( NULL), 166 _method_blocks( NULL),
160 _method_data( NULL) 167 _method_data( NULL)
161 #if defined(COMPILER2) || defined(SHARK) 168 #if defined(COMPILER2) || defined(SHARK)
162 , 169 ,
163 _flow( NULL), 170 _flow( NULL),
164 _bcea( NULL) 171 _bcea( NULL),
172 _instructions_size(-1)
165 #endif // COMPILER2 || SHARK 173 #endif // COMPILER2 || SHARK
166 { 174 {
167 // Usually holder and accessor are the same type but in some cases 175 // Usually holder and accessor are the same type but in some cases
168 // the holder has the wrong class loader (e.g. invokedynamic call 176 // the holder has the wrong class loader (e.g. invokedynamic call
169 // sites) so we pass the accessor. 177 // sites) so we pass the accessor.
998 } 1006 }
999 1007
1000 // ------------------------------------------------------------------ 1008 // ------------------------------------------------------------------
1001 // ciMethod::has_compiled_code 1009 // ciMethod::has_compiled_code
1002 bool ciMethod::has_compiled_code() { 1010 bool ciMethod::has_compiled_code() {
1003 VM_ENTRY_MARK; 1011 return instructions_size() > 0;
1004 return get_Method()->code() != NULL;
1005 } 1012 }
1006 1013
1007 int ciMethod::comp_level() { 1014 int ciMethod::comp_level() {
1008 check_is_loaded(); 1015 check_is_loaded();
1009 VM_ENTRY_MARK; 1016 VM_ENTRY_MARK;
1037 // This is a rough metric for "fat" methods, compared before inlining 1044 // This is a rough metric for "fat" methods, compared before inlining
1038 // with InlineSmallCode. The CodeBlob::code_size accessor includes 1045 // with InlineSmallCode. The CodeBlob::code_size accessor includes
1039 // junk like exception handler, stubs, and constant table, which are 1046 // junk like exception handler, stubs, and constant table, which are
1040 // not highly relevant to an inlined method. So we use the more 1047 // not highly relevant to an inlined method. So we use the more
1041 // specific accessor nmethod::insts_size. 1048 // specific accessor nmethod::insts_size.
1042 int ciMethod::instructions_size(int comp_level) { 1049 int ciMethod::instructions_size() {
1043 GUARDED_VM_ENTRY( 1050 if (_instructions_size == -1) {
1044 nmethod* code = get_Method()->code(); 1051 GUARDED_VM_ENTRY(
1045 if (code != NULL && (comp_level == CompLevel_any || comp_level == code->comp_level())) { 1052 nmethod* code = get_Method()->code();
1046 return code->insts_end() - code->verified_entry_point(); 1053 if (code != NULL && (code->comp_level() == CompLevel_full_optimization)) {
1047 } 1054 _instructions_size = code->insts_end() - code->verified_entry_point();
1048 return 0; 1055 } else {
1049 ) 1056 _instructions_size = 0;
1057 }
1058 );
1059 }
1060 return _instructions_size;
1050 } 1061 }
1051 1062
1052 // ------------------------------------------------------------------ 1063 // ------------------------------------------------------------------
1053 // ciMethod::log_nmethod_identity 1064 // ciMethod::log_nmethod_identity
1054 void ciMethod::log_nmethod_identity(xmlStream* log) { 1065 void ciMethod::log_nmethod_identity(xmlStream* log) {
1164 return _method_blocks; 1175 return _method_blocks;
1165 } 1176 }
1166 1177
1167 #undef FETCH_FLAG_FROM_VM 1178 #undef FETCH_FLAG_FROM_VM
1168 1179
1180 void ciMethod::dump_replay_data(outputStream* st) {
1181 ASSERT_IN_VM;
1182 Method* method = get_Method();
1183 Klass* holder = method->method_holder();
1184 st->print_cr("ciMethod %s %s %s %d %d %d %d %d",
1185 holder->name()->as_quoted_ascii(),
1186 method->name()->as_quoted_ascii(),
1187 method->signature()->as_quoted_ascii(),
1188 method->invocation_counter()->raw_counter(),
1189 method->backedge_counter()->raw_counter(),
1190 interpreter_invocation_count(),
1191 interpreter_throwout_count(),
1192 _instructions_size);
1193 }
1169 1194
1170 // ------------------------------------------------------------------ 1195 // ------------------------------------------------------------------
1171 // ciMethod::print_codes 1196 // ciMethod::print_codes
1172 // 1197 //
1173 // Print a range of the bytecodes for this method. 1198 // Print a range of the bytecodes for this method.