Mercurial > hg > graal-jvmci-8
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 // |