src/share/vm/runtime/thread.hpp
Print this page
rev 4810 : 8017313: PPC64 (part 6): stack handling improvements
Summary: Precompute limit for stack overflow check.
Reviewed-by: kvn, coleenp
@@ -893,10 +893,14 @@
private:
StackGuardState _stack_guard_state;
+ // Precompute the limit of the stack as used in stack overflow checks.
+ // We load it from here to simplify the stack overflow check in assembly.
+ address _stack_overflow_limit;
+
// Compiler exception handling (NOTE: The _exception_oop is *NOT* the same as _pending_exception. It is
// used to temp. parsing values into and out of the runtime system during exception handling for compiled
// code)
volatile oop _exception_oop; // Exception thrown in compiled code
volatile address _exception_pc; // PC where exception happened
@@ -1299,10 +1303,18 @@
bool reguard_stack(address cur_sp);
// Similar to above but see if current stackpoint is out of the guard area
// and reguard if possible.
bool reguard_stack(void);
+ address stack_overflow_limit() { return _stack_overflow_limit; }
+ void set_stack_overflow_limit() {
+ _stack_overflow_limit = _stack_base - _stack_size +
+ ((StackShadowPages +
+ StackYellowPages +
+ StackRedPages) * os::vm_page_size());
+ }
+
// Misc. accessors/mutators
void set_do_not_unlock(void) { _do_not_unlock_if_synchronized = true; }
void clr_do_not_unlock(void) { _do_not_unlock_if_synchronized = false; }
bool do_not_unlock(void) { return _do_not_unlock_if_synchronized; }
@@ -1333,10 +1345,11 @@
static ByteSize saved_exception_pc_offset() { return byte_offset_of(JavaThread, _saved_exception_pc ); }
static ByteSize osthread_offset() { return byte_offset_of(JavaThread, _osthread ); }
static ByteSize exception_oop_offset() { return byte_offset_of(JavaThread, _exception_oop ); }
static ByteSize exception_pc_offset() { return byte_offset_of(JavaThread, _exception_pc ); }
static ByteSize exception_handler_pc_offset() { return byte_offset_of(JavaThread, _exception_handler_pc); }
+ static ByteSize stack_overflow_limit_offset() { return byte_offset_of(JavaThread, _stack_overflow_limit); }
static ByteSize is_method_handle_return_offset() { return byte_offset_of(JavaThread, _is_method_handle_return); }
static ByteSize stack_guard_state_offset() { return byte_offset_of(JavaThread, _stack_guard_state ); }
static ByteSize suspend_flags_offset() { return byte_offset_of(JavaThread, _suspend_flags ); }
static ByteSize do_not_unlock_if_synchronized_offset() { return byte_offset_of(JavaThread, _do_not_unlock_if_synchronized); }