Mercurial > hg > truffle
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. |