* changed src/vm/jit/m68k/asmpart.S (asm_patcher_wrapper): Removed.
authorRoland Lezuo <tbfg@complang.tuwien.ac.at>
Wed, 17 Oct 2007 18:11:11 +0000 (20:11 +0200)
committerRoland Lezuo <tbfg@complang.tuwien.ac.at>
Wed, 17 Oct 2007 18:11:11 +0000 (20:11 +0200)
* changed src/vm/jit/m68k/codegen.c (patcher.h): Include removed.
(emit_codegen): Replaced emit_patcher_stubs by emit_patcher_trap.
(codegen_emit_stub_native): Likewise.

* changed src/vm/jit/m68k/emit.c (emit_patcher_stubs): Removed.

* changed src/vm/jit/m68k/patcher.c
(patcher_resolve_classref_to_classinfo): Ported to new patcher signature.

* changed src/vm/jit/patcher-common.h: Enabled new patchers for __M68K__.

* changed src/vmcore/linker.c (linker_preinit): __M68K__ has 4 byte
long alignment.

src/vm/jit/m68k/asmpart.S
src/vm/jit/m68k/codegen.c
src/vm/jit/m68k/emit.c
src/vm/jit/m68k/patcher.c
src/vm/jit/patcher-common.h
src/vmcore/linker.c

index d4164d52bedc531ac2a53a2331ffce099011ea5c..fa4d52bd554885d4a8e3d6e3e84de348f1f6dcb9 100644 (file)
@@ -44,8 +44,6 @@
 
 .globl asm_call_jit_compiler
 
-.globl asm_patcher_wrapper
-
 .globl asm_abstractmethoderror
 
 .globl asm_handle_exception
@@ -220,77 +218,6 @@ L_asm_call_jit_compiler_exception:
        jmp asm_handle_exception                                                /* handle exception */
 
 
-/* asm_patcher_wrapper ********************************************************
-       
-  prepares arguments on stack
-  calls patcher_wrapper signature: java_objectheader *patcher_wrapper(u1 *sp, u1 *pv, u1 *ra);
-
-  Stack layout:
-     24   return address
-     20   REG_ITMP3
-     16   pointer to virtual java_objectheader
-     12   last byte of machine code (xmcode)
-      8   machine code (which is patched back later)
-      4   unresolved field reference
-      0   patcher function pointer to call
-*******************************************************************************/
-asm_patcher_wrapper:
-
-  /* save scratch registers */
-  movel %a0, %sp@-
-  movel %a1, %sp@-
-  movel %d0, %sp@-
-  movel %d1, %sp@-
-
-#if defined(ENABLE_SOFTFLOAT)
-  /* calculate original value of sp */
-  movel %sp, %d0
-  addil #4*4, %d0
-#else
-  addal #-8*2, %sp
-  fmovemd %fp0/%fp1, %sp@
-
-  movel %sp, %d0
-  addil #8*4, %d0
-#endif
-
-  clrl %sp@-                           /* pass ra */
-  clrl %sp@-                           /* pass pv, if null use findmethod */
-  movel %d0, %sp@-                     /* pass sp of patcher stub */
-  jsr  patcher_wrapper         /* return value in %d0 */
-
-  lea  %sp@(3*4), %sp          /* pop arguments off stack */
-  tst  %d0                                     /* test if exception occured */
-  bne  L_asm_patcher_wrapper_exception
-
-#if !defined(ENABLE_SOFTFLOAT)
-  fmovemd %sp@, %fp0/%fp1
-  addal #8*2, %sp
-#endif
-  movel %sp@+, %d1
-  movel %sp@+, %d0
-  movel %sp@+, %a1
-  movel %sp@+, %a0
-
-  lea   %sp@(6*4), %sp                 /* restore stack and remove patcher stub*/
-  rts                                                  /* back to jit code */
-
-L_asm_patcher_wrapper_exception:
-  /* WARNING: the stack is still disturbed, look at asm_patcher_wrapper for details */
-  /* we do not need to restore the content of the registers, I hope */
-#if !defined(ENABLE_SOFTFLOAT)
-       lea             %sp@(8*4), %sp
-#else
-       lea             %sp@(4*4), %sp
-#endif
-
-  lea          %sp@(5*4), %sp                          /* restore stack and remove patcher stub*/
-  movel                %sp@+, %d4                                      /* restore REG_ITMP3, stored in emit_patcher_stubs */
-  moveal       %d0, %a2                                        /* xptr, pointer to exception object */
-  moveal       %sp@+, %a3                                      /* pop return address into exception address register */
-  jmp          asm_handle_exception            /* handle exception */
-  illegal                                                              /* XXX: we never come back */
-
 
 asm_abstractmethoderror:
 
index 963111236be5c2cbbf4dc0d1a40823e24354ebba..02c79329c2baf28a20bef93f16da9ff015a0fb22 100644 (file)
 
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
+#include "vm/jit/patcher-common.h"
 #include "vm/jit/dseg.h"
 #include "vm/jit/emit-common.h"
 #include "vm/jit/jit.h"
 #include "vm/jit/abi.h"
 #include "vm/jit/parse.h"
-#include "vm/jit/patcher.h"
 #include "vm/jit/reg.h"
 #include "vm/jit/replace.h"
 #include "vm/jit/stacktrace.h"
@@ -2372,7 +2372,7 @@ nowperformreturn:
        dseg_createlinenumbertable(cd);
 
        /* generate stubs */
-       emit_patcher_stubs(jd);
+       emit_patcher_traps(jd);
 
        return true;
 }
@@ -2595,7 +2595,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
        M_JSR_IMM(0);
 
        /* generate patcher stub call code */
-       emit_patcher_stubs(jd);
+       emit_patcher_traps(jd);
 }
 
 
index 50ed8d722180386ac04437a5f698e68e96164d1b..2b418f01e99632bd8e80dab03217ca4190847543 100644 (file)
@@ -262,78 +262,6 @@ s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
        return reg;
 }
 
-
-/* emit_patcher_stubs **********************************************************
-
-   Generates the code for the patcher stubs.
-
-*******************************************************************************/
-void emit_patcher_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       patchref    *pref;
-       u8           mcode;
-       u1          *savedmcodeptr;
-       u1          *tmpmcodeptr;
-       s4           targetdisp;
-       s4           disp;
-
-       /* get required compiler data */
-
-       cd = jd->cd;
-
-       /* generate code patching stub call code */
-
-       targetdisp = 0;
-
-       for (pref = cd->patchrefs; pref != NULL; pref = pref->next) {
-               /* check code segment size */
-
-               MCODECHECK(512);
-
-               /* Get machine code which is patched back in later. A
-                  `bsr.l' is 6 bytes long. */
-
-               savedmcodeptr = cd->mcodebase + pref->branchpos;
-               mcode = *((u8 *) savedmcodeptr);
-
-               /* patch in `bsr.l' to call the following code */
-
-               tmpmcodeptr  = cd->mcodeptr;    /* save current mcodeptr              */
-               cd->mcodeptr = savedmcodeptr;   /* set mcodeptr to patch position     */
-
-               M_BSR_IMM(tmpmcodeptr - (savedmcodeptr + PATCHER_CALL_SIZE) + 4);
-
-               cd->mcodeptr = tmpmcodeptr;     /* restore the current mcodeptr       */
-
-               /* save REG_ITMP3, restored in asm_patcher_wrapper  */
-               M_IPUSH(REG_ITMP3);             
-
-               /* move pointer to java_objectheader onto stack */
-
-#if defined(ENABLE_THREADS)
-               (void) dseg_add_unique_address(cd, NULL);                  /* flcword */
-               (void) dseg_add_unique_address(cd, lock_get_initial_lock_word());
-               disp = dseg_add_unique_address(cd, NULL);                  /* vftbl   */
-
-               M_IMOV_IMM32(0, REG_ITMP3);
-               dseg_adddata(cd);
-               M_IADD_IMM(disp, REG_ITMP3);
-               M_IPUSH(REG_ITMP3);
-#else
-               M_IPUSH_IMM(0);
-#endif
-
-               /* push move machine code bytes and classinfo pointer */
-
-               M_IPUSH_IMM(mcode >> 32);
-               M_IPUSH_IMM(mcode);
-               M_IPUSH_IMM(pref->ref);
-               M_IPUSH_IMM(pref->patcher);
-
-               M_JMP_IMM(asm_patcher_wrapper);
-       }
-}
 s4 emit_load_low(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg) 
 {
        codegendata  *cd;
index 3192fcb41b0cec4243dec713ab12e665f1f14efe..0aab56cce7a14fcc95bc7657086b613cc5fa09d7 100644 (file)
@@ -300,7 +300,6 @@ bool patcher_resolve_class(patchref_t *pr)
 #endif /* ENABLE_VERIFIER */
 #endif
 
-#if 0
 /* patcher_resolve_classref_to_classinfo ***************************************
   ACONST:
        0x4028f2ca:   2479 0000 0000    moveal 0x00000000,%a2
@@ -313,8 +312,8 @@ bool patcher_resolve_classref_to_classinfo(patchref_t *pr)
        classinfo         *c;
 
        /* get stuff from the stack */
-       cr   = (constant_classref *) *((ptrint *) (sp + 1 * 4));
-       disp =                       *((s4 *)     (sp + 6 * 4));
+       cr   = (constant_classref *) pr->ref;
+       disp =                       pr->mpc;
 
        /* get the classinfo */
        if (!(c = resolve_classref_eager(cr)))
@@ -332,7 +331,6 @@ bool patcher_resolve_classref_to_classinfo(patchref_t *pr)
 
        return true;
 }
-#endif
 
 /* patcher_get_putstatic *******************************************************
 
index f5004a207dc8e158b693dafc588dd94db918c97f..6ee0aec65f1b3667f4caf9a6aa4e8d62c5d48c65 100644 (file)
@@ -140,7 +140,7 @@ bool patcher_invokevirtual(patchref_t *pr);
 bool patcher_invokeinterface(patchref_t *pr);
 #define PATCHER_invokeinterface (functionptr) patcher_invokeinterface
 
-#if defined(__ALPHA__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__)
+#if defined(__ALPHA__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__)
 
 bool patcher_checkcast_interface(patchref_t *pr);
 #define PATCHER_checkcast_interface (functionptr) patcher_checkcast_interface
@@ -148,7 +148,7 @@ bool patcher_checkcast_interface(patchref_t *pr);
 bool patcher_instanceof_interface(patchref_t *pr);
 #define PATCHER_instanceof_interface (functionptr) patcher_instanceof_interface
 
-#endif /* defined(__ALPHA__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__) */
+#endif /* defined(__ALPHA__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__) */
 
 #if defined(__S390__)
 
index 27af88a4c105a05b0016601e8b0a24c8def194f9..b1979eea87d00d5f5ff53592c6d3b22952512e86 100644 (file)
@@ -135,7 +135,7 @@ void linker_preinit(void)
        /* Check for if alignment for long and double matches what we
           assume for the current architecture. */
 
-#if defined(__I386__) || (defined(__ARM__) && !defined(__ARM_EABI__)) || (defined(__POWERPC__) && defined(__DARWIN__))
+#if defined(__I386__) || (defined(__ARM__) && !defined(__ARM_EABI__)) || (defined(__POWERPC__) && defined(__DARWIN__)) || defined(__M68K__)
        if (OFFSET(dummy_alignment_long_t, l) != 4)
                vm_abort("linker_preinit: long alignment is different from what assumed: %d != %d",
                                 OFFSET(dummy_alignment_long_t, l), 4);