Mercurial > hg > graal-jvmci-8
comparison src/share/vm/runtime/deoptimization.cpp @ 4872:aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
Reviewed-by: kvn, jrose, kevinw, brutisso, twisti, jmasa
author | never |
---|---|
date | Wed, 01 Feb 2012 07:59:01 -0800 |
parents | e9a5e0a812c8 |
children | 33df1aeaebbf d2a62e0f25eb |
comparison
equal
deleted
inserted
replaced
4871:f067b4e0e04b | 4872:aa3d708d67c4 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
337 if (deoptee_nm != NULL && deoptee_nm->is_method_handle_return(deoptee.pc())) | 337 if (deoptee_nm != NULL && deoptee_nm->is_method_handle_return(deoptee.pc())) |
338 unpack_sp = deoptee.unextended_sp(); | 338 unpack_sp = deoptee.unextended_sp(); |
339 | 339 |
340 #ifdef ASSERT | 340 #ifdef ASSERT |
341 assert(cb->is_deoptimization_stub() || cb->is_uncommon_trap_stub(), "just checking"); | 341 assert(cb->is_deoptimization_stub() || cb->is_uncommon_trap_stub(), "just checking"); |
342 Events::log("fetch unroll sp " INTPTR_FORMAT, unpack_sp); | |
343 #endif | 342 #endif |
344 #else | 343 #else |
345 intptr_t* unpack_sp = stub_frame.sender(&dummy_map).unextended_sp(); | 344 intptr_t* unpack_sp = stub_frame.sender(&dummy_map).unextended_sp(); |
346 #endif // !SHARK | 345 #endif // !SHARK |
347 | 346 |
575 #ifndef PRODUCT | 574 #ifndef PRODUCT |
576 if (TraceDeoptimization) { | 575 if (TraceDeoptimization) { |
577 tty->print_cr("DEOPT UNPACKING thread " INTPTR_FORMAT " vframeArray " INTPTR_FORMAT " mode %d", thread, array, exec_mode); | 576 tty->print_cr("DEOPT UNPACKING thread " INTPTR_FORMAT " vframeArray " INTPTR_FORMAT " mode %d", thread, array, exec_mode); |
578 } | 577 } |
579 #endif | 578 #endif |
579 Events::log(thread, "DEOPT UNPACKING pc=" INTPTR_FORMAT " sp=" INTPTR_FORMAT " mode %d", | |
580 stub_frame.pc(), stub_frame.sp(), exec_mode); | |
580 | 581 |
581 UnrollBlock* info = array->unroll_block(); | 582 UnrollBlock* info = array->unroll_block(); |
582 | 583 |
583 // Unpack the interpreter frames and any adapter frame (c2 only) we might create. | 584 // Unpack the interpreter frames and any adapter frame (c2 only) we might create. |
584 array->unpack_to_stack(stub_frame, exec_mode, info->caller_actual_parameters()); | 585 array->unpack_to_stack(stub_frame, exec_mode, info->caller_actual_parameters()); |
979 } | 980 } |
980 #endif | 981 #endif |
981 #endif // COMPILER2 | 982 #endif // COMPILER2 |
982 | 983 |
983 vframeArray* Deoptimization::create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray<compiledVFrame*>* chunk) { | 984 vframeArray* Deoptimization::create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray<compiledVFrame*>* chunk) { |
985 Events::log(thread, "DEOPT PACKING pc=" INTPTR_FORMAT " sp=" INTPTR_FORMAT, fr.pc(), fr.sp()); | |
984 | 986 |
985 #ifndef PRODUCT | 987 #ifndef PRODUCT |
986 if (TraceDeoptimization) { | 988 if (TraceDeoptimization) { |
987 ttyLocker ttyl; | 989 ttyLocker ttyl; |
988 tty->print("DEOPT PACKING thread " INTPTR_FORMAT " ", thread); | 990 tty->print("DEOPT PACKING thread " INTPTR_FORMAT " ", thread); |
1024 // For Compiler1, the caller of the deoptimized frame is saved for use by unpack_frames(). | 1026 // For Compiler1, the caller of the deoptimized frame is saved for use by unpack_frames(). |
1025 vframeArray* array = vframeArray::allocate(thread, frame_size, chunk, reg_map, sender, caller, fr); | 1027 vframeArray* array = vframeArray::allocate(thread, frame_size, chunk, reg_map, sender, caller, fr); |
1026 | 1028 |
1027 // Compare the vframeArray to the collected vframes | 1029 // Compare the vframeArray to the collected vframes |
1028 assert(array->structural_compare(thread, chunk), "just checking"); | 1030 assert(array->structural_compare(thread, chunk), "just checking"); |
1029 Events::log("# vframes = %d", (intptr_t)chunk->length()); | |
1030 | 1031 |
1031 #ifndef PRODUCT | 1032 #ifndef PRODUCT |
1032 if (TraceDeoptimization) { | 1033 if (TraceDeoptimization) { |
1033 ttyLocker ttyl; | 1034 ttyLocker ttyl; |
1034 tty->print_cr(" Created vframeArray " INTPTR_FORMAT, array); | 1035 tty->print_cr(" Created vframeArray " INTPTR_FORMAT, array); |
1122 void Deoptimization::deoptimize_single_frame(JavaThread* thread, frame fr) { | 1123 void Deoptimization::deoptimize_single_frame(JavaThread* thread, frame fr) { |
1123 assert(fr.can_be_deoptimized(), "checking frame type"); | 1124 assert(fr.can_be_deoptimized(), "checking frame type"); |
1124 | 1125 |
1125 gather_statistics(Reason_constraint, Action_none, Bytecodes::_illegal); | 1126 gather_statistics(Reason_constraint, Action_none, Bytecodes::_illegal); |
1126 | 1127 |
1127 EventMark m("Deoptimization (pc=" INTPTR_FORMAT ", sp=" INTPTR_FORMAT ")", fr.pc(), fr.id()); | |
1128 | |
1129 // Patch the nmethod so that when execution returns to it we will | 1128 // Patch the nmethod so that when execution returns to it we will |
1130 // deopt the execution state and return to the interpreter. | 1129 // deopt the execution state and return to the interpreter. |
1131 fr.deoptimize(thread); | 1130 fr.deoptimize(thread); |
1132 } | 1131 } |
1133 | 1132 |
1237 frame fr = stub_frame.sender(®_map); | 1236 frame fr = stub_frame.sender(®_map); |
1238 // Make sure the calling nmethod is not getting deoptimized and removed | 1237 // Make sure the calling nmethod is not getting deoptimized and removed |
1239 // before we are done with it. | 1238 // before we are done with it. |
1240 nmethodLocker nl(fr.pc()); | 1239 nmethodLocker nl(fr.pc()); |
1241 | 1240 |
1241 // Log a message | |
1242 Events::log_deopt_message(thread, "Uncommon trap %d fr.pc " INTPTR_FORMAT, | |
1243 trap_request, fr.pc()); | |
1244 | |
1242 { | 1245 { |
1243 ResourceMark rm; | 1246 ResourceMark rm; |
1244 | 1247 |
1245 // Revoke biases of any monitors in the frame to ensure we can migrate them | 1248 // Revoke biases of any monitors in the frame to ensure we can migrate them |
1246 revoke_biases_of_monitors(thread, fr, ®_map); | 1249 revoke_biases_of_monitors(thread, fr, ®_map); |
1247 | 1250 |
1248 DeoptReason reason = trap_request_reason(trap_request); | 1251 DeoptReason reason = trap_request_reason(trap_request); |
1249 DeoptAction action = trap_request_action(trap_request); | 1252 DeoptAction action = trap_request_action(trap_request); |
1250 jint unloaded_class_index = trap_request_index(trap_request); // CP idx or -1 | 1253 jint unloaded_class_index = trap_request_index(trap_request); // CP idx or -1 |
1251 | 1254 |
1252 Events::log("Uncommon trap occurred @" INTPTR_FORMAT " unloaded_class_index = %d", fr.pc(), (int) trap_request); | |
1253 vframe* vf = vframe::new_vframe(&fr, ®_map, thread); | 1255 vframe* vf = vframe::new_vframe(&fr, ®_map, thread); |
1254 compiledVFrame* cvf = compiledVFrame::cast(vf); | 1256 compiledVFrame* cvf = compiledVFrame::cast(vf); |
1255 | 1257 |
1256 nmethod* nm = cvf->code(); | 1258 nmethod* nm = cvf->code(); |
1257 | 1259 |