comparison src/share/vm/ci/ciEnv.cpp @ 17622:849eb7bfceac

8028468: Add inlining information into ciReplay Summary: Allow dump and replay inlining for specified method during a program execution. Reviewed-by: roland, twisti
author kvn
date Wed, 08 Jan 2014 10:25:50 -0800
parents 938e1e64e28f
children 96d2c94bbdd0 606acabe7b5c
comparison
equal deleted inserted replaced
17621:df8573b1a44c 17622:849eb7bfceac
1145 // ------------------------------------------------------------------ 1145 // ------------------------------------------------------------------
1146 // ciEnv::dump_replay_data* 1146 // ciEnv::dump_replay_data*
1147 1147
1148 // Don't change thread state and acquire any locks. 1148 // Don't change thread state and acquire any locks.
1149 // Safe to call from VM error reporter. 1149 // Safe to call from VM error reporter.
1150
1151 void ciEnv::dump_compile_data(outputStream* out) {
1152 CompileTask* task = this->task();
1153 Method* method = task->method();
1154 int entry_bci = task->osr_bci();
1155 int comp_level = task->comp_level();
1156 out->print("compile %s %s %s %d %d",
1157 method->klass_name()->as_quoted_ascii(),
1158 method->name()->as_quoted_ascii(),
1159 method->signature()->as_quoted_ascii(),
1160 entry_bci, comp_level);
1161 if (compiler_data() != NULL) {
1162 if (is_c2_compile(comp_level)) { // C2 or Shark
1163 #ifdef COMPILER2
1164 // Dump C2 inlining data.
1165 ((Compile*)compiler_data())->dump_inline_data(out);
1166 #endif
1167 } else if (is_c1_compile(comp_level)) { // C1
1168 #ifdef COMPILER1
1169 // Dump C1 inlining data.
1170 ((Compilation*)compiler_data())->dump_inline_data(out);
1171 #endif
1172 }
1173 }
1174 out->cr();
1175 }
1176
1150 void ciEnv::dump_replay_data_unsafe(outputStream* out) { 1177 void ciEnv::dump_replay_data_unsafe(outputStream* out) {
1151 ResourceMark rm; 1178 ResourceMark rm;
1152 #if INCLUDE_JVMTI 1179 #if INCLUDE_JVMTI
1153 out->print_cr("JvmtiExport can_access_local_variables %d", _jvmti_can_access_local_variables); 1180 out->print_cr("JvmtiExport can_access_local_variables %d", _jvmti_can_access_local_variables);
1154 out->print_cr("JvmtiExport can_hotswap_or_post_breakpoint %d", _jvmti_can_hotswap_or_post_breakpoint); 1181 out->print_cr("JvmtiExport can_hotswap_or_post_breakpoint %d", _jvmti_can_hotswap_or_post_breakpoint);
1158 GrowableArray<ciMetadata*>* objects = _factory->get_ci_metadata(); 1185 GrowableArray<ciMetadata*>* objects = _factory->get_ci_metadata();
1159 out->print_cr("# %d ciObject found", objects->length()); 1186 out->print_cr("# %d ciObject found", objects->length());
1160 for (int i = 0; i < objects->length(); i++) { 1187 for (int i = 0; i < objects->length(); i++) {
1161 objects->at(i)->dump_replay_data(out); 1188 objects->at(i)->dump_replay_data(out);
1162 } 1189 }
1163 CompileTask* task = this->task(); 1190 dump_compile_data(out);
1164 Method* method = task->method();
1165 int entry_bci = task->osr_bci();
1166 int comp_level = task->comp_level();
1167 // Klass holder = method->method_holder();
1168 out->print_cr("compile %s %s %s %d %d",
1169 method->klass_name()->as_quoted_ascii(),
1170 method->name()->as_quoted_ascii(),
1171 method->signature()->as_quoted_ascii(),
1172 entry_bci, comp_level);
1173 out->flush(); 1191 out->flush();
1174 } 1192 }
1175 1193
1176 void ciEnv::dump_replay_data(outputStream* out) { 1194 void ciEnv::dump_replay_data(outputStream* out) {
1177 GUARDED_VM_ENTRY( 1195 GUARDED_VM_ENTRY(
1178 MutexLocker ml(Compile_lock); 1196 MutexLocker ml(Compile_lock);
1179 dump_replay_data_unsafe(out); 1197 dump_replay_data_unsafe(out);
1180 ) 1198 )
1181 } 1199 }
1200
1201 void ciEnv::dump_replay_data(int compile_id) {
1202 static char buffer[O_BUFLEN];
1203 int ret = jio_snprintf(buffer, O_BUFLEN, "replay_pid%p_compid%d.log", os::current_process_id(), compile_id);
1204 if (ret > 0) {
1205 int fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
1206 if (fd != -1) {
1207 FILE* replay_data_file = os::open(fd, "w");
1208 if (replay_data_file != NULL) {
1209 fileStream replay_data_stream(replay_data_file, /*need_close=*/true);
1210 dump_replay_data(&replay_data_stream);
1211 tty->print("# Compiler replay data is saved as: ");
1212 tty->print_cr(buffer);
1213 } else {
1214 tty->print_cr("# Can't open file to dump replay data.");
1215 }
1216 }
1217 }
1218 }
1219
1220 void ciEnv::dump_inline_data(int compile_id) {
1221 static char buffer[O_BUFLEN];
1222 int ret = jio_snprintf(buffer, O_BUFLEN, "inline_pid%p_compid%d.log", os::current_process_id(), compile_id);
1223 if (ret > 0) {
1224 int fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666);
1225 if (fd != -1) {
1226 FILE* inline_data_file = os::open(fd, "w");
1227 if (inline_data_file != NULL) {
1228 fileStream replay_data_stream(inline_data_file, /*need_close=*/true);
1229 GUARDED_VM_ENTRY(
1230 MutexLocker ml(Compile_lock);
1231 dump_compile_data(&replay_data_stream);
1232 )
1233 replay_data_stream.flush();
1234 tty->print("# Compiler inline data is saved as: ");
1235 tty->print_cr(buffer);
1236 } else {
1237 tty->print_cr("# Can't open file to dump inline data.");
1238 }
1239 }
1240 }
1241 }