/hg/icedtea6: Backport new frame anchor and stack overflow code ...

gbenson at icedtea.classpath.org gbenson at icedtea.classpath.org
Mon May 10 03:44:37 PDT 2010


changeset 9bc0c7b7f327 in /hg/icedtea6
details: http://icedtea.classpath.org/hg/icedtea6?cmd=changeset;node=9bc0c7b7f327
author: Gary Benson <gbenson at redhat.com>
date: Mon May 10 11:44:31 2010 +0100

	Backport new frame anchor and stack overflow code for Zero and Shark


diffstat:

17 files changed, 270 insertions(+), 118 deletions(-)
ChangeLog                                                    |   80 +++++++
ports/hotspot/make/linux/makefiles/zeroshark.make            |    3 
ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp        |    2 
ports/hotspot/src/cpu/zero/vm/frame_zero.cpp                 |   10 
ports/hotspot/src/cpu/zero/vm/frame_zero.hpp                 |   19 -
ports/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp          |   12 -
ports/hotspot/src/cpu/zero/vm/javaFrameAnchor_zero.hpp       |   27 +-
ports/hotspot/src/cpu/zero/vm/stack_zero.cpp                 |   15 +
ports/hotspot/src/cpu/zero/vm/stack_zero.hpp                 |    9 
ports/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp          |   17 +
ports/hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp         |    5 
ports/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp |   21 +
ports/hotspot/src/share/vm/shark/sharkBuilder.cpp            |    8 
ports/hotspot/src/share/vm/shark/sharkBuilder.hpp            |   11 -
ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp      |    2 
ports/hotspot/src/share/vm/shark/sharkStack.cpp              |  106 +++++-----
ports/hotspot/src/share/vm/shark/sharkStack.hpp              |   41 ++-

diffs (truncated from 776 to 500 lines):

diff -r 373a443db017 -r 9bc0c7b7f327 ChangeLog
--- a/ChangeLog	Fri May 07 16:57:27 2010 -0400
+++ b/ChangeLog	Mon May 10 11:44:31 2010 +0100
@@ -1,3 +1,83 @@ 2010-05-07  Deepak Bhole <dbhole at redhat.
+2010-05-10  Gary Benson  <gbenson at redhat.com>
+
+	PR icedtea/323
+	* ports/hotspot/src/cpu/zero/vm/javaFrameAnchor_zero.hpp
+	(JavaFrameAnchor::_last_Java_fp): New field.
+	(JavaFrameAnchor::clear): Also clear the above.
+	(JavaFrameAnchor::set): New method.
+	(JavaFrameAnchor::copy): Use the above.
+	(JavaFrameAnchor::set_lat_Java_sp): Removed.
+	(JavaFrameAnchor::last_Java_fp): New method.
+	(JavaFrameAnchor::last_Java_fp_offset): Likewise.
+	* ports/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp
+	(JavaThread::last_Java_fp): Likewise.
+	(JavaThread::last_Java_fp_offset): Likewise.
+	(JavaThread::set_last_Java_frame): Use new new frame anchor code.
+	(JavaThread::reset_last_Java_frame): Likewise.
+	(JavaThread::pd_last_frame): Likewise.
+	* ports/hotspot/src/cpu/zero/vm/frame_zero.hpp
+	(frame::frame): Flipped arguments.
+	(frame::_fp): Replaced with...
+	(frame::_zeroframe): New field.
+	(frame::fp): Updated.
+	(frame::zeroframe): Likewise.
+	* ports/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp
+	(frame::frame): Likewise.
+	(frame::sender_sp): Likewise.
+	(frame::id): Likewise.
+	* ports/hotspot/src/cpu/zero/vm/frame_zero.cpp
+	(frame::sender_for_entry_frame): Likewise.
+	(frame::sender_for_nonentry_frame): Likewise.
+	(frame::zero_print_on_error): Likewise.
+	* ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
+	(AbstractInterpreter::layout_activation): Use new frame
+	anchor code.
+
+	* ports/hotspot/src/cpu/zero/vm/stack_zero.hpp
+	(ZeroStack::suggest_size): New method.
+	(ZeroStack::total_words): Likewise.
+	(ZeroStack::abi_stack_available): Likewise.
+	(ZeroStack::zap): Likewise.
+	* ports/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp
+	(ZeroStack::abi_stack_available): New method.
+	(ZeroStack::overflow_check): Use the above.
+	* ports/hotspot/src/cpu/zero/vm/stack_zero.cpp
+	(ZeroStack::suggest_size): New method.
+	(ZeroStack::zap): Likewise.
+	(ZeroStack::handle_overflow): Use new frame anchor code.
+	* ports/hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp
+	(StubGenerator::call_stub): Use ZeroStack::suggest_size.
+
+	* ports/hotspot/src/share/vm/shark/sharkBuilder.hpp
+	(SharkBuilder::throw_StackOverflowError): New method.
+	* ports/hotspot/src/share/vm/shark/sharkBuilder.cpp
+	(SharkBuilder::throw_StackOverflowError): Likewise.
+	* ports/hotspot/src/share/vm/shark/sharkStack.hpp
+	(SharkStack::initialize): Removed argument.
+	(SharkStack::CreateStackOverflowCheck): Updated.
+	(SharkStack::CreateCheckStack): Removed method.
+	(SharkStack::frame_anchor_addr): Likewise.
+	(SharkStack::last_Java_sp_addr): New method.
+	(SharkStack::last_Java_fp_addr): New method.
+	(SharkStack::CreateSetLastJavaFrame): Use new frame anchor code.
+	(SharkStack::CreateResetLastJavaFrame): Likewise.
+	(SharkStack::CreateAssertLastJavaSPIsNull): New method.
+	* ports/hotspot/src/share/vm/shark/sharkStack.cpp
+	(SharkStack::initialize): Updated for new stack overflow code.
+	(SharkStack::CreateStackOverflowCheck): Likewise.
+	(SharkStack::CreateCheckStack): Removed.
+	(SharkStackWithNormalFrame::SharkStackWithNormalFrame): Updated
+	for new stack overflow code.
+	(SharkStackWithNativeFrame::SharkStackWithNativeFrame): Likewise.
+	(SharkStack::CreateAssertLastJavaSPIsNull): New method.
+	
+	* ports/hotspot/make/linux/makefiles/zeroshark.make
+	(CFLAGS): Remove -DHOTSPOT_ASM until the ARM interpreter
+	and JIT are updated to use the new frame anchor code.
+
+	* ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp
+	(SharkNativeWrapper::initialize): Whitespace fix.
+
 2010-05-07  Deepak Bhole <dbhole at redhat.com>
 
 	* plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/make/linux/makefiles/zeroshark.make
--- a/ports/hotspot/make/linux/makefiles/zeroshark.make	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/make/linux/makefiles/zeroshark.make	Mon May 10 11:44:31 2010 +0100
@@ -31,7 +31,8 @@ Obj_Files += cppInterpreter_arm.o
 Obj_Files += cppInterpreter_arm.o
 Obj_Files += thumb2.o
 
-CFLAGS += -DHOTSPOT_ASM
+#XXX disabled until it has the updated frame anchor code
+#CFLAGS += -DHOTSPOT_ASM
 
 %.o: %.S
 	@echo Assembling $<
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
--- a/ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp	Mon May 10 11:44:31 2010 +0100
@@ -840,7 +840,7 @@ int AbstractInterpreter::layout_activati
   int callee_extra_locals = callee_locals - callee_param_count;
 
   if (interpreter_frame) {
-    intptr_t *locals        = interpreter_frame->sp() + method->max_locals();
+    intptr_t *locals        = interpreter_frame->fp() + method->max_locals();
     interpreterState istate = interpreter_frame->get_interpreterState();
     intptr_t *monitor_base  = (intptr_t*) istate;
     intptr_t *stack_base    = monitor_base - monitor_words;
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/frame_zero.cpp
--- a/ports/hotspot/src/cpu/zero/vm/frame_zero.cpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/frame_zero.cpp	Mon May 10 11:44:31 2010 +0100
@@ -1,6 +1,6 @@
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
- * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -48,14 +48,14 @@ frame frame::sender_for_entry_frame(Regi
          "sender should be next Java frame");
   map->clear();
   assert(map->include_argument_oops(), "should be set by clear");
-  return frame(sender_sp(), sp() + 1);
+  return frame(zeroframe()->next(), sender_sp());
 }
 
 frame frame::sender_for_nonentry_frame(RegisterMap *map) const {
   assert(zeroframe()->is_interpreter_frame() ||
          zeroframe()->is_shark_frame() ||
          zeroframe()->is_fake_stub_frame(), "wrong type of frame");
-  return frame(sender_sp(), sp() + 1);
+  return frame(zeroframe()->next(), sender_sp());
 }
 
 frame frame::sender(RegisterMap* map) const {
@@ -176,8 +176,8 @@ void frame::zero_print_on_error(int     
   char *valuebuf = buf + buflen;
 
   // Print each word of the frame
-  for (intptr_t *addr = fp(); addr <= sp(); addr++) {
-    int offset = sp() - addr;
+  for (intptr_t *addr = sp(); addr <= fp(); addr++) {
+    int offset = fp() - addr;
 
     // Fill in default values, then try and improve them
     snprintf(fieldbuf, buflen, "word[%d]", offset);
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/frame_zero.hpp
--- a/ports/hotspot/src/cpu/zero/vm/frame_zero.hpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/frame_zero.hpp	Mon May 10 11:44:31 2010 +0100
@@ -1,6 +1,6 @@
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
- * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,17 +32,18 @@
 
   // Constructor
  public:
-  frame(intptr_t* sp, intptr_t* fp);
+  frame(ZeroFrame* zeroframe, intptr_t* sp);
 
-  // The sp of a Zero frame is the address of the highest word in
-  // that frame.  We keep track of the lowest address too, so the
-  // boundaries of the frame are available for debug printing.
  private:
-  intptr_t* _fp;
+  ZeroFrame* _zeroframe;
 
  public:
+  const ZeroFrame *zeroframe() const {
+    return _zeroframe;
+  }
+
   intptr_t* fp() const {
-    return _fp;
+    return (intptr_t *) zeroframe();
   }
 
 #ifdef CC_INTERP
@@ -50,10 +51,6 @@
 #endif // CC_INTERP
 
  public:
-  const ZeroFrame *zeroframe() const {
-    return (ZeroFrame *) sp();
-  }
-
   const EntryFrame *zero_entryframe() const {
     return zeroframe()->as_entry_frame();
   }
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp
--- a/ports/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp	Mon May 10 11:44:31 2010 +0100
@@ -1,6 +1,6 @@
 /*
  * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
- * Copyright 2007, 2008, 2009 Red Hat, Inc.
+ * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,16 +26,16 @@
 // Constructors
 
 inline frame::frame() {
+  _zeroframe = NULL;
   _sp = NULL;
-  _fp = NULL;
   _pc = NULL;
   _cb = NULL;
   _deopt_state = unknown;
 }
 
-inline frame::frame(intptr_t* sp, intptr_t* fp) {
+inline frame::frame(ZeroFrame* zf, intptr_t* sp) {
+  _zeroframe = zf;
   _sp = sp;
-  _fp = fp;
   switch (zeroframe()->type()) {
   case ZeroFrame::ENTRY_FRAME:
     _pc = StubRoutines::call_stub_return_pc();
@@ -66,7 +66,7 @@ inline frame::frame(intptr_t* sp, intptr
 // Accessors
 
 inline intptr_t* frame::sender_sp() const {
-  return (intptr_t *) zeroframe()->next();
+  return fp() + 1;
 }
 
 inline intptr_t* frame::link() const {
@@ -120,7 +120,7 @@ inline jint frame::interpreter_frame_exp
 // we can distinguish identity and younger/older relationship. NULL
 // represents an invalid (incomparable) frame.
 inline intptr_t* frame::id() const {
-  return sp();
+  return fp();
 }
 
 inline JavaCallWrapper* frame::entry_frame_call_wrapper() const {
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/javaFrameAnchor_zero.hpp
--- a/ports/hotspot/src/cpu/zero/vm/javaFrameAnchor_zero.hpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/javaFrameAnchor_zero.hpp	Mon May 10 11:44:31 2010 +0100
@@ -1,6 +1,6 @@
 /*
  * Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
- * Copyright 2007, 2008 Red Hat, Inc.
+ * Copyright 2007, 2008, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,21 +23,31 @@
  *
  */
 
+ private:
+  ZeroFrame* volatile _last_Java_fp;
+
  public:
   // Each arch must define reset, save, restore
   // These are used by objects that only care about:
   //  1 - initializing a new state (thread creation, javaCalls)
   //  2 - saving a current state (javaCalls)
   //  3 - restoring an old state (javaCalls)
+  // Note that whenever _last_Java_sp != NULL other anchor fields
+  // must be valid.  The profiler apparently depends on this.
 
   void clear() {
     // clearing _last_Java_sp must be first
     _last_Java_sp = NULL;
     // fence?
+    _last_Java_fp = NULL;
     _last_Java_pc = NULL;
   }
 
   void copy(JavaFrameAnchor* src) {
+    set(src->_last_Java_sp, src->_last_Java_pc, src->_last_Java_fp);
+  }
+
+  void set(intptr_t* sp, address pc, ZeroFrame* fp) {
     // In order to make sure the transition state is valid for "this"
     // We must clear _last_Java_sp before copying the rest of the new
     // data
@@ -46,13 +56,14 @@
     // previous version (pd_cache_state) don't NULL _last_Java_sp
     // unless the value is changing
     //
-    if (_last_Java_sp != src->_last_Java_sp)
+    if (_last_Java_sp != sp)
       _last_Java_sp = NULL;
 
-    _last_Java_pc = src->_last_Java_pc;
+    _last_Java_fp = fp;
+    _last_Java_pc = pc;
     // Must be last so profiler will always see valid frame if
     // has_last_frame() is true
-    _last_Java_sp = src->_last_Java_sp;
+    _last_Java_sp = sp;
   }
 
   bool walkable() {
@@ -67,6 +78,10 @@
     return _last_Java_sp;
   }
 
-  void set_last_Java_sp(intptr_t* sp) {
-    _last_Java_sp = sp;
+  ZeroFrame* last_Java_fp() const {
+    return _last_Java_fp;
   }
+
+  static ByteSize last_Java_fp_offset() {
+    return byte_offset_of(JavaFrameAnchor, _last_Java_fp);
+  }
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/stack_zero.cpp
--- a/ports/hotspot/src/cpu/zero/vm/stack_zero.cpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/stack_zero.cpp	Mon May 10 11:44:31 2010 +0100
@@ -26,12 +26,18 @@
 #include "incls/_precompiled.incl"
 #include "incls/_stack_zero.cpp.incl"
 
+int ZeroStack::suggest_size(Thread *thread) const {
+  assert(needs_setup(), "already set up");
+  return align_size_down(abi_stack_available(thread) / 2, wordSize);
+}
+
 void ZeroStack::handle_overflow(TRAPS) {
   JavaThread *thread = (JavaThread *) THREAD;
 
   // Set up the frame anchor if it isn't already
   bool has_last_Java_frame = thread->has_last_Java_frame();
   if (!has_last_Java_frame) {
+    intptr_t *sp = thread->zero_stack()->sp();
     ZeroFrame *frame = thread->top_zero_frame();
     while (frame) {
       if (frame->is_shark_frame())
@@ -44,13 +50,14 @@ void ZeroStack::handle_overflow(TRAPS) {
           break;
       }
 
+      sp = ((intptr_t *) frame) + 1;
       frame = frame->next();
     }
 
     if (frame == NULL)
       fatal("unrecoverable stack overflow");
 
-    thread->set_last_Java_frame(frame);
+    thread->set_last_Java_frame(frame, sp);
   }
 
   // Throw the exception
@@ -71,3 +78,9 @@ void ZeroStack::handle_overflow(TRAPS) {
   if (!has_last_Java_frame)
     thread->reset_last_Java_frame();
 }
+
+#ifndef PRODUCT
+void ZeroStack::zap(int c) {
+  memset(_base, c, available_words() * wordSize);
+}
+#endif // PRODUCT
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/stack_zero.hpp
--- a/ports/hotspot/src/cpu/zero/vm/stack_zero.hpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/stack_zero.hpp	Mon May 10 11:44:31 2010 +0100
@@ -42,6 +42,8 @@ class ZeroStack {
     return _base == NULL;
   }
 
+  int suggest_size(Thread *thread) const;
+
   void setup(void *mem, size_t size) {
     assert(needs_setup(), "already set up");
     assert(!(size & WordAlignmentMask), "unaligned");
@@ -67,6 +69,9 @@ class ZeroStack {
     _sp = new_sp;
   }
 
+  int total_words() const {
+    return _top - _base;
+  }
   int available_words() const {
     return _sp - _base;
   }
@@ -89,10 +94,14 @@ class ZeroStack {
   int shadow_pages_size() const {
     return _shadow_pages_size;
   }
+  int abi_stack_available(Thread *thread) const;
 
  public:
   void overflow_check(int required_words, TRAPS);
   static void handle_overflow(TRAPS);
+
+ public:
+  void zap(int c) PRODUCT_RETURN;
 
  public:
   static ByteSize base_offset() {
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp
--- a/ports/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp	Mon May 10 11:44:31 2010 +0100
@@ -25,19 +25,24 @@
 
 // This function should match SharkStack::CreateStackOverflowCheck
 inline void ZeroStack::overflow_check(int required_words, TRAPS) {
-  JavaThread *thread = (JavaThread *) THREAD;
-
   // Check the Zero stack
-  if (required_words > available_words()) {
+  if (available_words() < required_words) {
     handle_overflow(THREAD);
     return;
   }
 
   // Check the ABI stack
-  address stack_top = thread->stack_base() - thread->stack_size();
-  int free_stack = ((address) &stack_top) - stack_top;
-  if (free_stack < shadow_pages_size()) {
+  if (abi_stack_available(THREAD) < 0) {
     handle_overflow(THREAD);
     return;
   }
 }
+
+// This method returns the amount of ABI stack available for us
+// to use under normal circumstances.  Note that the returned
+// value can be negative.
+inline int ZeroStack::abi_stack_available(Thread *thread) const {
+  int stack_used = thread->stack_base() - (address) &stack_used;
+  int stack_free = thread->stack_size() - stack_used;
+  return stack_free - shadow_pages_size();
+}
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp
--- a/ports/hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp	Mon May 10 11:44:31 2010 +0100
@@ -51,10 +51,7 @@ class StubGenerator: public StubCodeGene
     // Set up the stack if necessary
     bool stack_needs_teardown = false;
     if (stack->needs_setup()) {
-      size_t stack_used = thread->stack_base() - (address) &stack_used;
-      size_t stack_free = thread->stack_size() - stack_used;
-      size_t zero_stack_size = align_size_down(stack_free / 2, wordSize);
-
+      size_t zero_stack_size = stack->suggest_size(thread);
       stack->setup(alloca(zero_stack_size), zero_stack_size);
       stack_needs_teardown = true;
     }
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp
--- a/ports/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/os_cpu/linux_zero/vm/thread_linux_zero.hpp	Mon May 10 11:44:31 2010 +0100
@@ -68,19 +68,30 @@
 
  public:
   void set_last_Java_frame() {
-    set_last_Java_frame(top_zero_frame());
+    set_last_Java_frame(top_zero_frame(), zero_stack()->sp());
   }
   void reset_last_Java_frame() {
-    set_last_Java_frame(NULL);
+    frame_anchor()->zap();
   }
-  void set_last_Java_frame(ZeroFrame* frame) {
-    frame_anchor()->set_last_Java_sp((intptr_t *) frame);
+  void set_last_Java_frame(ZeroFrame* fp, intptr_t* sp) {
+    frame_anchor()->set(sp, NULL, fp);
+  }
+
+ public:
+  ZeroFrame* last_Java_fp() {
+    return frame_anchor()->last_Java_fp();
   }
 
  private:
   frame pd_last_frame() {
     assert(has_last_Java_frame(), "must have last_Java_sp() when suspended");
-    return frame(last_Java_sp(), zero_stack()->sp());
+    return frame(last_Java_fp(), last_Java_sp());
+  }
+
+ public:
+  static ByteSize last_Java_fp_offset() {
+    return byte_offset_of(JavaThread, _anchor) +
+      JavaFrameAnchor::last_Java_fp_offset();
   }
 
  public:
diff -r 373a443db017 -r 9bc0c7b7f327 ports/hotspot/src/share/vm/shark/sharkBuilder.cpp
--- a/ports/hotspot/src/share/vm/shark/sharkBuilder.cpp	Fri May 07 16:57:27 2010 -0400
+++ b/ports/hotspot/src/share/vm/shark/sharkBuilder.cpp	Mon May 10 11:44:31 2010 +0100
@@ -319,13 +319,17 @@ Value* SharkBuilder::osr_migration_end()
   return make_function((address) SharedRuntime::OSR_migration_end, "C", "v");
 }



More information about the distro-pkg-dev mailing list