6950178: Zero stack improvements

Thu, 06 May 2010 02:09:18 -0700

author
twisti
date
Thu, 06 May 2010 02:09:18 -0700
changeset 1866
348346af6676
parent 1865
d6e880569997
child 1867
6cfbdb113e52

6950178: Zero stack improvements
Summary: Moves the logic for determining the size of the Zero stack into the ZeroStack class.
Reviewed-by: twisti
Contributed-by: Gary Benson <gbenson@redhat.com>

src/cpu/zero/vm/stack_zero.cpp file | annotate | diff | comparison | revisions
src/cpu/zero/vm/stack_zero.hpp file | annotate | diff | comparison | revisions
src/cpu/zero/vm/stack_zero.inline.hpp file | annotate | diff | comparison | revisions
src/cpu/zero/vm/stubGenerator_zero.cpp file | annotate | diff | comparison | revisions
src/share/vm/includeDB_zero file | annotate | diff | comparison | revisions
     1.1 --- a/src/cpu/zero/vm/stack_zero.cpp	Wed May 05 05:57:21 2010 -0700
     1.2 +++ b/src/cpu/zero/vm/stack_zero.cpp	Thu May 06 02:09:18 2010 -0700
     1.3 @@ -26,6 +26,11 @@
     1.4  #include "incls/_precompiled.incl"
     1.5  #include "incls/_stack_zero.cpp.incl"
     1.6  
     1.7 +int ZeroStack::suggest_size(Thread *thread) const {
     1.8 +  assert(needs_setup(), "already set up");
     1.9 +  return align_size_down(abi_stack_available(thread) / 2, wordSize);
    1.10 +}
    1.11 +
    1.12  void ZeroStack::handle_overflow(TRAPS) {
    1.13    JavaThread *thread = (JavaThread *) THREAD;
    1.14  
     2.1 --- a/src/cpu/zero/vm/stack_zero.hpp	Wed May 05 05:57:21 2010 -0700
     2.2 +++ b/src/cpu/zero/vm/stack_zero.hpp	Thu May 06 02:09:18 2010 -0700
     2.3 @@ -42,6 +42,8 @@
     2.4      return _base == NULL;
     2.5    }
     2.6  
     2.7 +  int suggest_size(Thread *thread) const;
     2.8 +
     2.9    void setup(void *mem, size_t size) {
    2.10      assert(needs_setup(), "already set up");
    2.11      assert(!(size & WordAlignmentMask), "unaligned");
    2.12 @@ -67,6 +69,9 @@
    2.13      _sp = new_sp;
    2.14    }
    2.15  
    2.16 +  int total_words() const {
    2.17 +    return _top - _base;
    2.18 +  }
    2.19    int available_words() const {
    2.20      return _sp - _base;
    2.21    }
    2.22 @@ -89,6 +94,7 @@
    2.23    int shadow_pages_size() const {
    2.24      return _shadow_pages_size;
    2.25    }
    2.26 +  int abi_stack_available(Thread *thread) const;
    2.27  
    2.28   public:
    2.29    void overflow_check(int required_words, TRAPS);
     3.1 --- a/src/cpu/zero/vm/stack_zero.inline.hpp	Wed May 05 05:57:21 2010 -0700
     3.2 +++ b/src/cpu/zero/vm/stack_zero.inline.hpp	Thu May 06 02:09:18 2010 -0700
     3.3 @@ -25,19 +25,24 @@
     3.4  
     3.5  // This function should match SharkStack::CreateStackOverflowCheck
     3.6  inline void ZeroStack::overflow_check(int required_words, TRAPS) {
     3.7 -  JavaThread *thread = (JavaThread *) THREAD;
     3.8 -
     3.9    // Check the Zero stack
    3.10 -  if (required_words > available_words()) {
    3.11 +  if (available_words() < required_words) {
    3.12      handle_overflow(THREAD);
    3.13      return;
    3.14    }
    3.15  
    3.16    // Check the ABI stack
    3.17 -  address stack_top = thread->stack_base() - thread->stack_size();
    3.18 -  int free_stack = ((address) &stack_top) - stack_top;
    3.19 -  if (free_stack < shadow_pages_size()) {
    3.20 +  if (abi_stack_available(THREAD) < 0) {
    3.21      handle_overflow(THREAD);
    3.22      return;
    3.23    }
    3.24  }
    3.25 +
    3.26 +// This method returns the amount of ABI stack available for us
    3.27 +// to use under normal circumstances.  Note that the returned
    3.28 +// value can be negative.
    3.29 +inline int ZeroStack::abi_stack_available(Thread *thread) const {
    3.30 +  int stack_used = thread->stack_base() - (address) &stack_used;
    3.31 +  int stack_free = thread->stack_size() - stack_used;
    3.32 +  return stack_free - shadow_pages_size();
    3.33 +}
     4.1 --- a/src/cpu/zero/vm/stubGenerator_zero.cpp	Wed May 05 05:57:21 2010 -0700
     4.2 +++ b/src/cpu/zero/vm/stubGenerator_zero.cpp	Thu May 06 02:09:18 2010 -0700
     4.3 @@ -51,10 +51,7 @@
     4.4      // Set up the stack if necessary
     4.5      bool stack_needs_teardown = false;
     4.6      if (stack->needs_setup()) {
     4.7 -      size_t stack_used = thread->stack_base() - (address) &stack_used;
     4.8 -      size_t stack_free = thread->stack_size() - stack_used;
     4.9 -      size_t zero_stack_size = align_size_down(stack_free / 2, wordSize);
    4.10 -
    4.11 +      size_t zero_stack_size = stack->suggest_size(thread);
    4.12        stack->setup(alloca(zero_stack_size), zero_stack_size);
    4.13        stack_needs_teardown = true;
    4.14      }
     5.1 --- a/src/share/vm/includeDB_zero	Wed May 05 05:57:21 2010 -0700
     5.2 +++ b/src/share/vm/includeDB_zero	Thu May 06 02:09:18 2010 -0700
     5.3 @@ -61,6 +61,7 @@
     5.4  
     5.5  stack_<arch>.cpp                        interpreterRuntime.hpp
     5.6  stack_<arch>.cpp                        stack_<arch>.hpp
     5.7 +stack_<arch>.cpp                        stack_<arch>.inline.hpp
     5.8  
     5.9  stubGenerator_<arch>.cpp                stack_<arch>.inline.hpp
    5.10  

mercurial