We should backpatch all relative call sites regardless of kind of the
method.  That's because 'invokespecial' instruction can emit relative
calls to methods which are not static and are not constructors, for
example when calling a private method.

Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 arch/x86/emit-code_32.c |   22 +++++++++++-----------
 1 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/arch/x86/emit-code_32.c b/arch/x86/emit-code_32.c
index 139856b..a79e02d 100644
--- a/arch/x86/emit-code_32.c
+++ b/arch/x86/emit-code_32.c
@@ -1073,7 +1073,7 @@ void emit_body(struct basic_block *bb, struct buffer *buf)
  * this, we could suspend all threads before patching, and force them
  * to execute flush_icache() on resume.
  */
-static void fixup_invoke(struct jit_trampoline *t, unsigned long target)
+static void fixup_relative_calls(struct jit_trampoline *t, unsigned long 
target)
 {
        struct fixup_site *this, *next;
 
@@ -1099,9 +1099,8 @@ static void fixup_invoke(struct jit_trampoline *t, 
unsigned long target)
  * This function replaces pointers in vtable so that they point
  * directly to compiled code instead of trampoline code.
  */
-static void fixup_invokevirtual(struct compilation_unit *cu,
-                               struct object *objref,
-                               void *target)
+static void fixup_vtable(struct compilation_unit *cu, struct object *objref,
+                        void *target)
 {
        struct classblock *cb = CLASS_CB(objref->class);
 
@@ -1124,15 +1123,16 @@ void emit_trampoline(struct compilation_unit *cu,
 
        __emit_push_reg(buf, REG_EAX);
 
-       if ((cu->method->access_flags & ACC_STATIC) ||
-            method_is_constructor(cu->method)) {
-               __emit_push_imm(buf, (unsigned long)trampoline);
-               __emit_call(buf, fixup_invoke);
-               __emit_add_imm_reg(buf, 0x4, REG_ESP);
-       } else {
+       /* We should always try to fixup relative calls */
+       __emit_push_imm(buf, (unsigned long)trampoline);
+       __emit_call(buf, fixup_relative_calls);
+       __emit_add_imm_reg(buf, 0x4, REG_ESP);
+
+       if (!method_is_static(cu->method) &&
+           !method_is_constructor(cu->method)) {
                __emit_push_membase(buf, REG_EBP, 0x08);
                __emit_push_imm(buf, (unsigned long)cu);
-               __emit_call(buf, fixup_invokevirtual);
+               __emit_call(buf, fixup_vtable);
                __emit_add_imm_reg(buf, 0x08, REG_ESP);
        }
 
-- 
1.6.0.6


------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT 
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp as they present alongside digital heavyweights like Barbarian 
Group, R/GA, & Big Spaceship. http://p.sf.net/sfu/creativitycat-com 
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to