diff options
author | Keith Seitz <keiths@redhat.com> | 2007-04-24 18:18:56 +0000 |
---|---|---|
committer | Keith Seitz <kseitz@gcc.gnu.org> | 2007-04-24 18:18:56 +0000 |
commit | 9872ecadbd94fa67562ed7ff6825250b122aae62 (patch) | |
tree | abee94b0b7a0cb00f3aa1d59f96ec58c46c6bd9a /libjava | |
parent | 676b23ba25b9f21507847fe1f7a90266aaa2e81f (diff) | |
download | gcc-9872ecadbd94fa67562ed7ff6825250b122aae62.zip gcc-9872ecadbd94fa67562ed7ff6825250b122aae62.tar.gz gcc-9872ecadbd94fa67562ed7ff6825250b122aae62.tar.bz2 |
headers.txt (gnu/gcj/jvmti/Breakpoint.h): Add _Jv_RewriteBreakpointInsn friend declaration.
* 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.
From-SVN: r124111
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 19 | ||||
-rw-r--r-- | libjava/gnu/gcj/jvmti/Breakpoint.h | 8 | ||||
-rw-r--r-- | libjava/gnu/gcj/jvmti/natBreakpoint.cc | 16 | ||||
-rw-r--r-- | libjava/headers.txt | 8 | ||||
-rw-r--r-- | libjava/interpret-run.cc | 59 |
5 files changed, 86 insertions, 24 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index b93bb3c..0c29421 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -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 diff --git a/libjava/gnu/gcj/jvmti/Breakpoint.h b/libjava/gnu/gcj/jvmti/Breakpoint.h index ebdd855..b522c77 100644 --- a/libjava/gnu/gcj/jvmti/Breakpoint.h +++ b/libjava/gnu/gcj/jvmti/Breakpoint.h @@ -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: diff --git a/libjava/gnu/gcj/jvmti/natBreakpoint.cc b/libjava/gnu/gcj/jvmti/natBreakpoint.cc index 2a85a93..5dbd3f8 100644 --- a/libjava/gnu/gcj/jvmti/natBreakpoint.cc +++ b/libjava/gnu/gcj/jvmti/natBreakpoint.cc @@ -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 diff --git a/libjava/headers.txt b/libjava/headers.txt index c7a4caa..aad3fdd 100644 --- a/libjava/headers.txt +++ b/libjava/headers.txt @@ -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; diff --git a/libjava/interpret-run.cc b/libjava/interpret-run.cc index 9e1ed2e..f99ff5c 100644 --- a/libjava/interpret-run.cc +++ b/libjava/interpret-run.cc @@ -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; |