Mercurial > hg > truffle
comparison src/share/vm/ci/ciMethodData.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 | da91efe96a93 |
children | fcc9e7681d63 |
comparison
equal
deleted
inserted
replaced
6965:3be318ecfae5 | 6972:bd7a7ce2e264 |
---|---|
23 */ | 23 */ |
24 | 24 |
25 #include "precompiled.hpp" | 25 #include "precompiled.hpp" |
26 #include "ci/ciMetadata.hpp" | 26 #include "ci/ciMetadata.hpp" |
27 #include "ci/ciMethodData.hpp" | 27 #include "ci/ciMethodData.hpp" |
28 #include "ci/ciReplay.hpp" | |
28 #include "ci/ciUtilities.hpp" | 29 #include "ci/ciUtilities.hpp" |
29 #include "memory/allocation.inline.hpp" | 30 #include "memory/allocation.inline.hpp" |
30 #include "memory/resourceArea.hpp" | 31 #include "memory/resourceArea.hpp" |
31 #include "runtime/deoptimization.hpp" | 32 #include "runtime/deoptimization.hpp" |
32 #include "utilities/copy.hpp" | 33 #include "utilities/copy.hpp" |
113 | 114 |
114 _eflags = mdo->eflags(); | 115 _eflags = mdo->eflags(); |
115 _arg_local = mdo->arg_local(); | 116 _arg_local = mdo->arg_local(); |
116 _arg_stack = mdo->arg_stack(); | 117 _arg_stack = mdo->arg_stack(); |
117 _arg_returned = mdo->arg_returned(); | 118 _arg_returned = mdo->arg_returned(); |
119 #ifndef PRODUCT | |
120 if (ReplayCompiles) { | |
121 ciReplay::initialize(this); | |
122 } | |
123 #endif | |
118 } | 124 } |
119 | 125 |
120 void ciReceiverTypeData::translate_receiver_data_from(ProfileData* data) { | 126 void ciReceiverTypeData::translate_receiver_data_from(ProfileData* data) { |
121 for (uint row = 0; row < row_limit(); row++) { | 127 for (uint row = 0; row < row_limit(); row++) { |
122 Klass* k = data->as_ReceiverTypeData()->receiver(row); | 128 Klass* k = data->as_ReceiverTypeData()->receiver(row); |
364 // Implementation of the print method. | 370 // Implementation of the print method. |
365 void ciMethodData::print_impl(outputStream* st) { | 371 void ciMethodData::print_impl(outputStream* st) { |
366 ciMetadata::print_impl(st); | 372 ciMetadata::print_impl(st); |
367 } | 373 } |
368 | 374 |
375 void ciMethodData::dump_replay_data(outputStream* out) { | |
376 ASSERT_IN_VM; | |
377 MethodData* mdo = get_MethodData(); | |
378 Method* method = mdo->method(); | |
379 Klass* holder = method->method_holder(); | |
380 out->print("ciMethodData %s %s %s %d %d", | |
381 holder->name()->as_quoted_ascii(), | |
382 method->name()->as_quoted_ascii(), | |
383 method->signature()->as_quoted_ascii(), | |
384 _state, | |
385 current_mileage()); | |
386 | |
387 // dump the contents of the MDO header as raw data | |
388 unsigned char* orig = (unsigned char*)&_orig; | |
389 int length = sizeof(_orig); | |
390 out->print(" orig %d", length); | |
391 for (int i = 0; i < length; i++) { | |
392 out->print(" %d", orig[i]); | |
393 } | |
394 | |
395 // dump the MDO data as raw data | |
396 int elements = data_size() / sizeof(intptr_t); | |
397 out->print(" data %d", elements); | |
398 for (int i = 0; i < elements; i++) { | |
399 // We could use INTPTR_FORMAT here but that's a zero justified | |
400 // which makes comparing it with the SA version of this output | |
401 // harder. | |
402 #ifdef _LP64 | |
403 out->print(" 0x%" FORMAT64_MODIFIER "x", data()[i]); | |
404 #else | |
405 out->print(" 0x%x", data()[i]); | |
406 #endif | |
407 } | |
408 | |
409 // The MDO contained oop references as ciObjects, so scan for those | |
410 // and emit pairs of offset and klass name so that they can be | |
411 // reconstructed at runtime. The first round counts the number of | |
412 // oop references and the second actually emits them. | |
413 int count = 0; | |
414 for (int round = 0; round < 2; round++) { | |
415 if (round == 1) out->print(" oops %d", count); | |
416 ProfileData* pdata = first_data(); | |
417 for ( ; is_valid(pdata); pdata = next_data(pdata)) { | |
418 if (pdata->is_ReceiverTypeData()) { | |
419 ciReceiverTypeData* vdata = (ciReceiverTypeData*)pdata; | |
420 for (uint i = 0; i < vdata->row_limit(); i++) { | |
421 ciKlass* k = vdata->receiver(i); | |
422 if (k != NULL) { | |
423 if (round == 0) { | |
424 count++; | |
425 } else { | |
426 out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii()); | |
427 } | |
428 } | |
429 } | |
430 } else if (pdata->is_VirtualCallData()) { | |
431 ciVirtualCallData* vdata = (ciVirtualCallData*)pdata; | |
432 for (uint i = 0; i < vdata->row_limit(); i++) { | |
433 ciKlass* k = vdata->receiver(i); | |
434 if (k != NULL) { | |
435 if (round == 0) { | |
436 count++; | |
437 } else { | |
438 out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii()); | |
439 } | |
440 } | |
441 } | |
442 } | |
443 } | |
444 } | |
445 out->cr(); | |
446 } | |
447 | |
369 #ifndef PRODUCT | 448 #ifndef PRODUCT |
370 void ciMethodData::print() { | 449 void ciMethodData::print() { |
371 print_data_on(tty); | 450 print_data_on(tty); |
372 } | 451 } |
373 | 452 |