src/cpu/ppc/vm/cppInterpreter_ppc.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/cpu/ppc/vm/cppInterpreter_ppc.cpp
src/cpu/ppc/vm/cppInterpreter_ppc.cpp
Print this page
rev 6086 : 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
Summary: make compiled code bang the stack by the worst case size of the interpreter frame at deoptimization points.
Reviewed-by:
*** 24,33 ****
--- 24,34 ----
*/
#include "precompiled.hpp"
#include "asm/assembler.hpp"
#include "asm/macroAssembler.inline.hpp"
+ #include "ci/ciMethod.hpp"
#include "interpreter/bytecodeHistogram.hpp"
#include "interpreter/cppInterpreter.hpp"
#include "interpreter/interpreter.hpp"
#include "interpreter/interpreterGenerator.hpp"
#include "interpreter/interpreterRuntime.hpp"
*** 2938,2948 ****
intptr_t* last_Java_fp) {
istate->_last_Java_pc = last_Java_pc;
istate->_last_Java_fp = last_Java_fp;
}
! int AbstractInterpreter::layout_activation(Method* method,
int temps, // Number of slots on java expression stack in use.
int popframe_args,
int monitors, // Number of active monitors.
int caller_actual_parameters,
int callee_params,// Number of slots for callee parameters.
--- 2939,3006 ----
intptr_t* last_Java_fp) {
istate->_last_Java_pc = last_Java_pc;
istate->_last_Java_fp = last_Java_fp;
}
! template<class M> static void frame_size_helper(M* method,
! int monitors,
! int& monitor_size,
! int& top_frame_size) {
! monitor_size = frame::interpreter_frame_monitor_size_in_bytes() * monitors;
! top_frame_size = round_to(frame::interpreter_frame_cinterpreterstate_size_in_bytes()
! + monitor_size
! + (method->max_stack() *Interpreter::stackElementWords * BytesPerWord)
! + 2*BytesPerWord,
! frame::alignment_in_bytes)
! + frame::top_ijava_frame_abi_size;
! }
!
! template<class M> int AbstractInterpreter::size_activation(M* method,
! int temps,
! int popframe_args,
! int monitors,
! int callee_params,
! int callee_locals,
! bool is_top_frame) {
! int monitor_size = 0;
! int top_frame_size = 0;
! frame_size_helper<M>(method, monitors, monitor_size, top_frame_size);
!
! int frame_size;
! if (is_top_frame) {
! frame_size = top_frame_size;
! } else {
! frame_size = round_to(frame::interpreter_frame_cinterpreterstate_size_in_bytes()
! + monitor_size
! + ((temps - callee_params + callee_locals) *
! Interpreter::stackElementWords * BytesPerWord)
! + 2*BytesPerWord,
! frame::alignment_in_bytes)
! + frame::parent_ijava_frame_abi_size;
! assert(popframe_args==0, "non-zero for top_frame only");
! }
!
! return frame_size/BytesPerWord;
! }
!
! template int AbstractInterpreter::size_activation<Method>(Method* method,
! int temps,
! int popframe_args,
! int monitors,
! int callee_params,
! int callee_locals,
! bool is_top_frame);
!
! template int AbstractInterpreter::size_activation<ciMethod>(ciMethod* method,
! int temps,
! int popframe_args,
! int monitors,
! int callee_params,
! int callee_locals,
! bool is_top_frame);
!
! void AbstractInterpreter::layout_activation(Method* method,
int temps, // Number of slots on java expression stack in use.
int popframe_args,
int monitors, // Number of active monitors.
int caller_actual_parameters,
int callee_params,// Number of slots for callee parameters.
*** 2958,2990 ****
// exception. With the C++ based interpreter only the top most frame
// has a full sized expression stack. The 16 byte slop factor is
// both the abi scratch area and a place to hold a result from a
// callee on its way to the callers stack.
! int monitor_size = frame::interpreter_frame_monitor_size_in_bytes() * monitors;
! int frame_size;
! int top_frame_size = round_to(frame::interpreter_frame_cinterpreterstate_size_in_bytes()
! + monitor_size
! + (method->max_stack() *Interpreter::stackElementWords * BytesPerWord)
! + 2*BytesPerWord,
! frame::alignment_in_bytes)
! + frame::top_ijava_frame_abi_size;
! if (is_top_frame) {
! frame_size = top_frame_size;
! } else {
! frame_size = round_to(frame::interpreter_frame_cinterpreterstate_size_in_bytes()
! + monitor_size
! + ((temps - callee_params + callee_locals) *
! Interpreter::stackElementWords * BytesPerWord)
! + 2*BytesPerWord,
! frame::alignment_in_bytes)
! + frame::parent_ijava_frame_abi_size;
! assert(popframe_args==0, "non-zero for top_frame only");
! }
!
! // If we actually have a frame to layout we must now fill in all the pieces.
! if (interpreter_frame != NULL) {
intptr_t sp = (intptr_t)interpreter_frame->sp();
intptr_t fp = *(intptr_t *)sp;
assert(fp == (intptr_t)caller->sp(), "fp must match");
interpreterState cur_state =
--- 3016,3028 ----
// exception. With the C++ based interpreter only the top most frame
// has a full sized expression stack. The 16 byte slop factor is
// both the abi scratch area and a place to hold a result from a
// callee on its way to the callers stack.
! int monitor_size = 0;
! int top_frame_size = 0;
! frame_size_helper<Method>(method, monitors, monitor_size, top_frame_size);
intptr_t sp = (intptr_t)interpreter_frame->sp();
intptr_t fp = *(intptr_t *)sp;
assert(fp == (intptr_t)caller->sp(), "fp must match");
interpreterState cur_state =
*** 3036,3045 ****
(intptr_t*)(((intptr_t)fp)-top_frame_size),
is_top_frame);
BytecodeInterpreter::pd_layout_interpreterState(cur_state, interpreter_return_address,
interpreter_frame->fp());
- }
- return frame_size/BytesPerWord;
}
#endif // CC_INTERP
--- 3074,3081 ----
src/cpu/ppc/vm/cppInterpreter_ppc.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File