OSDN Git Service

* headers.txt (gnu/gcj/jvmti/Breakpoint.h)[DIRECT_THREADED]:
authorkseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Apr 2007 18:18:56 +0000 (18:18 +0000)
committerkseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Apr 2007 18:18:56 +0000 (18:18 +0000)
        Add _Jv_RewriteBreakpointInsn friend declaration.
        * gnu/gcj/jvmti/natBreakpoint.cc (_Jv_RewriteBreakpointInsn)
        [DIRECT_THREADED]: New function.
        * gnu/gcj/jvmti/Breakpoint.h: Regenerate.
        * interpret-run.cc: Define new REWRITE_INSN macro.
        Changed all occurrences of insn rewriting to call REWRITE_INSN.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124111 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/gnu/gcj/jvmti/Breakpoint.h
libjava/gnu/gcj/jvmti/natBreakpoint.cc
libjava/headers.txt
libjava/interpret-run.cc

index b93bb3c..0c29421 100644 (file)
@@ -1,3 +1,22 @@
+2007-04-24  Keith Seitz  <keiths@redhat.com>
+
+       * headers.txt (gnu/gcj/jvmti/Breakpoint.h)[DIRECT_THREADED]:
+       Add _Jv_RewriteBreakpointInsn friend declaration.
+       * gnu/gcj/jvmti/natBreakpoint.cc (_Jv_RewriteBreakpointInsn)
+       [DIRECT_THREADED]: New function.
+       * gnu/gcj/jvmti/Breakpoint.h: Regenerate.
+       * interpret-run.cc: Define new REWRITE_INSN macro.
+       Changed all occurrences of insn rewriting to call REWRITE_INSN.
+
+2007-04-23  Keith Seitz  <keiths@redhat.com>
+
+       * include/no-gc.h (_Jv_IsThreadSuspended): Declare.
+       * include/boehm-gc.h (_Jv_IsThreadSuspended): Likewise.
+       * boehm.cc (_Jv_IsThreadSuspended): New function.
+       * nogc.cc (_Jv_IsThreadSuspended): Likewise.
+       * jvmti.cc (_Jv_JVMTI_GetThreadState): New function.
+       (_Jv_JVMTI_Interface): Define GetThreadState.
+
 2007-04-23  Kyle Galloway  <kgallowa@redhat.com>
 
        * include/java-interp.h (_Jv_InterpFrame): Add pointer to the
index ebdd855..b522c77 100644 (file)
@@ -22,9 +22,17 @@ extern "Java"
   }
 }
 
+#ifdef DIRECT_THREADED
+void _Jv_RewriteBreakpointInsn (jmethodID, jlocation, pc_t);
+#endif
+
 class gnu::gcj::jvmti::Breakpoint : public ::java::lang::Object
 {
 
+#ifdef DIRECT_THREADED
+friend void (::_Jv_RewriteBreakpointInsn (jmethodID, jlocation, pc_t));
+#endif
+
 public:
   Breakpoint(jlong, jlong);
 private:
index 2a85a93..5dbd3f8 100644 (file)
@@ -17,6 +17,7 @@ details.  */
 #include <jvmti.h>
 
 #include <gnu/gcj/jvmti/Breakpoint.h>
+#include <gnu/gcj/jvmti/BreakpointManager.h>
 
 static _Jv_InterpMethod *
 get_interp_method (jlong method)
@@ -54,3 +55,18 @@ gnu::gcj::jvmti::Breakpoint::remove ()
   _Jv_InterpMethod *imeth = get_interp_method (method);
   imeth->set_insn (location, reinterpret_cast<pc_t> (data));
 }
+
+#ifdef DIRECT_THREADED
+void
+_Jv_RewriteBreakpointInsn (jmethodID mid, jlocation loc, pc_t new_insn)
+{
+  using namespace ::gnu::gcj::jvmti;
+  Breakpoint *bp
+    = BreakpointManager::getBreakpoint (reinterpret_cast<jlong> (mid), loc);
+  if (bp != NULL)
+    {
+      pc_t old_insn = (pc_t) bp->data;
+      old_insn->insn = new_insn;
+    }
+}
+#endif // DIRECT_THREADED
index c7a4caa..aad3fdd 100644 (file)
@@ -63,5 +63,13 @@ friend class java::lang::Class;
 friend class java::io::ObjectInputStream;
 friend java::lang::reflect::Method* ::_Jv_GetReflectedMethod (jclass, _Jv_Utf8Const*, _Jv_Utf8Const*);
 
+class gnu/gcj/jvmti/Breakpoint
+prepend #ifdef DIRECT_THREADED
+prepend void _Jv_RewriteBreakpointInsn (jmethodID, jlocation, pc_t);
+prepend #endif
+add #ifdef DIRECT_THREADED
+add friend void (::_Jv_RewriteBreakpointInsn (jmethodID, jlocation, pc_t));
+add #endif
+
 class gnu/gcj/runtime/ExtensionClassLoader
 friend class ::java::lang::ClassLoader;
index 9e1ed2e..f99ff5c 100644 (file)
@@ -359,9 +359,32 @@ details.  */
       goto *((pc++)->insn);                                            \
     }                                                                  \
   while (0)
+
+#undef REWRITE_INSN
+#define REWRITE_INSN(INSN,SLOT,VALUE)                                  \
+  do {                                                                 \
+    if (pc[-2].insn == breakpoint_insn->insn)                          \
+      {                                                                        \
+       using namespace ::gnu::gcj::jvmti;                              \
+       jlocation location = meth->insn_index (pc - 2);                 \
+       _Jv_RewriteBreakpointInsn (meth->self, location, (pc_t) INSN);  \
+      }                                                                        \
+    else                                                               \
+      pc[-2].insn = INSN;                                              \
+                                                                       \
+    pc[-1].SLOT = VALUE;                                               \
+  }                                                                    \
+  while (0)
+
 #else
 #undef NEXT_INSN
 #define NEXT_INSN goto *((pc++)->insn)
+#define REWRITE_INSN(INSN,SLOT,VALUE)          \
+  do {                                         \
+    pc[-2].insn = INSN;                                \
+    pc[-1].SLOT = VALUE;                       \
+  }                                            \
+  while (0)
 #endif
 
 #define INTVAL() ((pc++)->int_val)
@@ -511,8 +534,7 @@ details.  */
 #ifdef DIRECT_THREADED
        // Rewrite instruction so that we use a faster pre-resolved
        // method.
-       pc[-2].insn = &&invokevirtual_resolved;
-       pc[-1].datum = rmeth;
+       REWRITE_INSN (&&invokevirtual_resolved, datum, rmeth);
 #endif /* DIRECT_THREADED */
       }
       goto perform_invoke;
@@ -1846,8 +1868,7 @@ details.  */
          }
 
 #ifdef DIRECT_THREADED
-       pc[-2].insn = newinsn;
-       pc[-1].datum = field->u.addr;
+       REWRITE_INSN (newinsn, datum, field->u.addr);
 #endif /* DIRECT_THREADED */
       }
       NEXT_INSN;
@@ -1937,8 +1958,7 @@ details.  */
          }
 
 #ifdef DIRECT_THREADED
-       pc[-2].insn = newinsn;
-       pc[-1].int_val = field_offset;
+       REWRITE_INSN (newinsn, int_val, field_offset);
 #endif /* DIRECT_THREADED */
       }
       NEXT_INSN;
@@ -2053,8 +2073,7 @@ details.  */
          }
 
 #ifdef DIRECT_THREADED
-       pc[-2].insn = newinsn;
-       pc[-1].datum = field->u.addr;
+       REWRITE_INSN (newinsn, datum, field->u.addr);
 #endif /* DIRECT_THREADED */
       }
       NEXT_INSN;
@@ -2152,8 +2171,7 @@ details.  */
          }
 
 #ifdef DIRECT_THREADED
-       pc[-2].insn = newinsn;
-       pc[-1].int_val = field_offset;
+       REWRITE_INSN (newinsn, int_val, field_offset);
 #endif /* DIRECT_THREADED */
       }
       NEXT_INSN;
@@ -2228,8 +2246,7 @@ details.  */
 #ifdef DIRECT_THREADED
        // Rewrite instruction so that we use a faster pre-resolved
        // method.
-       pc[-2].insn = &&invokespecial_resolved;
-       pc[-1].datum = rmeth;
+       REWRITE_INSN (&&invokespecial_resolved, datum, rmeth);
 #endif /* DIRECT_THREADED */
       }
       goto perform_invoke;
@@ -2266,8 +2283,7 @@ details.  */
 #ifdef DIRECT_THREADED
        // Rewrite instruction so that we use a faster pre-resolved
        // method.
-       pc[-2].insn = &&invokestatic_resolved;
-       pc[-1].datum = rmeth;
+       REWRITE_INSN (&&invokestatic_resolved, datum, rmeth);
 #endif /* DIRECT_THREADED */
       }
       goto perform_invoke;
@@ -2305,8 +2321,7 @@ details.  */
 #ifdef DIRECT_THREADED
        // Rewrite instruction so that we use a faster pre-resolved
        // method.
-       pc[-2].insn = &&invokeinterface_resolved;
-       pc[-1].datum = rmeth;
+       REWRITE_INSN (&&invokeinterface_resolved, datum, rmeth);
 #else
        // Skip dummy bytes.
        pc += 2;
@@ -2344,8 +2359,7 @@ details.  */
        PUSHA (res);
 
 #ifdef DIRECT_THREADED
-       pc[-2].insn = &&new_resolved;
-       pc[-1].datum = klass;
+       REWRITE_INSN (&&new_resolved, datum, klass);
 #endif /* DIRECT_THREADED */
       }
       NEXT_INSN;
@@ -2380,8 +2394,7 @@ details.  */
        PUSHA (result);
 
 #ifdef DIRECT_THREADED
-       pc[-2].insn = &&anewarray_resolved;
-       pc[-1].datum = klass;
+       REWRITE_INSN (&&anewarray_resolved, datum, klass);
 #endif /* DIRECT_THREADED */
       }
       NEXT_INSN;
@@ -2425,8 +2438,7 @@ details.  */
        PUSHA (value);
 
 #ifdef DIRECT_THREADED
-       pc[-2].insn = &&checkcast_resolved;
-       pc[-1].datum = to;
+       REWRITE_INSN (&&checkcast_resolved, datum, to);
 #endif /* DIRECT_THREADED */
       }
       NEXT_INSN;
@@ -2453,8 +2465,7 @@ details.  */
        PUSHI (to->isInstance (value));
 
 #ifdef DIRECT_THREADED
-       pc[-2].insn = &&instanceof_resolved;
-       pc[-1].datum = to;
+       REWRITE_INSN (&&instanceof_resolved, datum, to);
 #endif /* DIRECT_THREADED */
       }
       NEXT_INSN;