comparison src/cpu/sparc/vm/templateInterpreter_sparc.cpp @ 8727:0094485b46c7

8009761: Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates Summary: deoptimization doesn't set up callee frames so that they restore caller frames correctly. Reviewed-by: kvn
author roland
date Wed, 13 Mar 2013 09:44:45 +0100
parents db9981fd3124
children 0f7ca53be929 aeaca88565e6
comparison
equal deleted inserted replaced
8708:8196357e95b5 8727:0094485b46c7
1579 int caller_actual_parameters, 1579 int caller_actual_parameters,
1580 int callee_param_count, 1580 int callee_param_count,
1581 int callee_local_count, 1581 int callee_local_count,
1582 frame* caller, 1582 frame* caller,
1583 frame* interpreter_frame, 1583 frame* interpreter_frame,
1584 bool is_top_frame) { 1584 bool is_top_frame,
1585 bool is_bottom_frame) {
1585 // Note: This calculation must exactly parallel the frame setup 1586 // Note: This calculation must exactly parallel the frame setup
1586 // in InterpreterGenerator::generate_fixed_frame. 1587 // in InterpreterGenerator::generate_fixed_frame.
1587 // If f!=NULL, set up the following variables: 1588 // If f!=NULL, set up the following variables:
1588 // - Lmethod 1589 // - Lmethod
1589 // - Llocals 1590 // - Llocals
1662 int parm_words = caller_actual_parameters * Interpreter::stackElementWords; 1663 int parm_words = caller_actual_parameters * Interpreter::stackElementWords;
1663 locals = Lesp_ptr + parm_words; 1664 locals = Lesp_ptr + parm_words;
1664 int delta = local_words - parm_words; 1665 int delta = local_words - parm_words;
1665 int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0; 1666 int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0;
1666 *interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS; 1667 *interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS;
1668 if (!is_bottom_frame) {
1669 // Llast_SP is set below for the current frame to SP (with the
1670 // extra space for the callee's locals). Here we adjust
1671 // Llast_SP for the caller's frame, removing the extra space
1672 // for the current method's locals.
1673 *caller->register_addr(Llast_SP) = *interpreter_frame->register_addr(I5_savedSP);
1674 } else {
1675 assert(*caller->register_addr(Llast_SP) >= *interpreter_frame->register_addr(I5_savedSP), "strange Llast_SP");
1676 }
1667 } else { 1677 } else {
1668 assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases"); 1678 assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases");
1669 // Don't have Lesp available; lay out locals block in the caller 1679 // Don't have Lesp available; lay out locals block in the caller
1670 // adjacent to the register window save area. 1680 // adjacent to the register window save area.
1671 // 1681 //