* 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.
.globl asm_call_jit_compiler
-.globl asm_patcher_wrapper
-
.globl asm_abstractmethoderror
.globl asm_handle_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:
#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"
dseg_createlinenumbertable(cd);
/* generate stubs */
- emit_patcher_stubs(jd);
+ emit_patcher_traps(jd);
return true;
}
M_JSR_IMM(0);
/* generate patcher stub call code */
- emit_patcher_stubs(jd);
+ emit_patcher_traps(jd);
}
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;
#endif /* ENABLE_VERIFIER */
#endif
-#if 0
/* patcher_resolve_classref_to_classinfo ***************************************
ACONST:
0x4028f2ca: 2479 0000 0000 moveal 0x00000000,%a2
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)))
return true;
}
-#endif
/* patcher_get_putstatic *******************************************************
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
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__)
/* 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);