* changed src/vm/jit/m68k/arch.h (JIT_COMPILER_VIA_SIGNAL): Added.
authorRoland Lezuo <tbfg@complang.tuwien.ac.at>
Mon, 22 Oct 2007 16:08:41 +0000 (18:08 +0200)
committerRoland Lezuo <tbfg@complang.tuwien.ac.at>
Mon, 22 Oct 2007 16:08:41 +0000 (18:08 +0200)
* changed src/vm/jit/m68k/asmpart.S (asm_call_jit_compiler): Removed.

* changed src/vm/jit/m68k/codegen.c (codegen_emit): All
codegen_addpatchref replaced by patcher_add_patch_ref.

(codegen_emit_stub_native): Use 8 byte stack slots.

* changed src/vm/jit/m68k/emit.c (emit_verbosecall_enter): New tracer.
(emit_trap_compiler): Added.
(emit_trap): Likewise.

* changed src/vm/jit/m68k/linux/md-abi.c (md_param_alloc): Use 8 byte
stackslots.

* changed src/vm/jit/m68k/linux/md-os.c (md_init_linux): Removed.
(md_signal_handler_sigsegv): Support for patchers and compiler
via signal added.

* changed src/vm/jit/m68k/linux/md-os.h (md_init_linux): Removed.

* changed src/vm/jit/m68k/md.c (md_init): Call to md_init_linux
removed.

* changed src/vm/signal.c (signal_init): Register sigill for M68K.

* changed src/vm/signallocal.h (md_signal_handler_sigill): Enabled
for M68K.

* changed src/vmcore/linker.c (link_class_intern): Enable long 4
byte alignment.

src/vm/jit/m68k/arch.h
src/vm/jit/m68k/asmpart.S
src/vm/jit/m68k/codegen.c
src/vm/jit/m68k/emit.c
src/vm/jit/m68k/linux/md-abi.c
src/vm/jit/m68k/linux/md-os.c
src/vm/jit/m68k/linux/md-os.h
src/vm/jit/m68k/md.c
src/vm/signal.c
src/vm/signallocal.h
src/vmcore/linker.c

index 5c7b88bf7e791524fbd5508ee25e85c70325ec11..2d1ed85465ed3746d80a0c31405b24246b514d42 100644 (file)
 #define REG_ZERO -1
 
 #define SPECIALMEMUSE
+#define JIT_COMPILER_VIA_SIGNAL
 /* #define HAS_4BYTE_STACKSLOT */
 /* #define SUPPORT_COMBINE_INTEGER_REGISTERS */
 
index fa4d52bd554885d4a8e3d6e3e84de348f1f6dcb9..c760c1977133e9c29df31ed4b036cbf1d7f8efb5 100644 (file)
@@ -42,8 +42,6 @@
 .globl asm_vm_call_method_end
 .globl asm_vm_call_method_exception_handler
 
-.globl asm_call_jit_compiler
-
 .globl asm_abstractmethoderror
 
 .globl asm_handle_exception
@@ -107,8 +105,8 @@ asm_vm_call_method_double:
        movel   %sp@(12*4+6*8+2*4),%a2                          /* arg array */
        movel   %sp@(12*4+6*8+3*4),%d2                          /* arg count */
 
-       movel   %a3, %sp@(11*4+6*8)                                     /* copy method address to stackslot */
-       leal    %sp@(11*4+6*8), %a3                                     /* and store that address in %a3 */
+       movel   %a3, %sp@(12*4+6*8)                                     /* copy method address to stackslot */
+       leal    %sp@(12*4+6*8), %a3                                     /* and store that address in %a3 */
 #endif
 
        moveal  %sp, %a5                                        /* memorize stack */
@@ -170,55 +168,6 @@ asm_vm_call_method_exception_handler:
        jmp     L_asm_vm_call_method_return
 
 
-/* asm_call_jit_compiler ************************************************************************************
- *     Invokes compiler for untranslated java methods.
- *     C prototype: void asm_call_jit_compiler(void);
- *     BUT: this does not match reality, arguments _ARE_ passed via createcompilerstub and asm_vm_call_method...
- *     arguments passed via %a2(methodinfo) == REG_ATMP1
- *                       %a3(mptr)       == REG_ATMP2
- ************************************************************************************************************/
-asm_call_jit_compiler:
-       addal   #(-4*4),%sp                                             /* create stackframe to save registers */
-       moveml  %a0/%a1/%d0/%d1,%sp@                    /* save volatile registers */
-#if !defined(ENABLE_SOFTFLOAT)
-       addal   #-8*2, %sp
-       fmovemd %fp0/%fp1, %sp@
-       movel   %sp@(8*4), %sp@-
-       pea             %sp@(8*4+8)
-#else
-       movel   %sp@(4*4), %sp@-                                /* push arguments onto stack (ra)*/
-       pea     %sp@(4*4+8)                                             /* the old stack pointer*/
-#endif
-       movel   %a3,%sp@-                                               /* mptr */
-       movel   %a2,%sp@-                                               /* methodinfo */
-
-       /* C prototype: u1 *jit_asm_compile(methodinfo *m, u1 *mptr, u1 *sp, u1 *ra); */
-       jsr     jit_asm_compile                                         /* invoke compiler */
-       addal   #(4*4),%sp                                              /* pop arguments off stack */
-       moveal  %d0, %a2                                                /* to tmp register */
-
-#if !defined(ENABLE_SOFTFLOAT)
-       fmovemd %sp@, %fp0/%fp1
-       addal   #8*2, %sp
-#endif
-
-       moveml %sp@,%a0/%a1/%d0/%d1                             /* restore volatile registers */
-       addal   #(4*4),%sp                                              /* remove stackframe */
-
-       tstl    %a2                                                             /* check for exception */
-       beq     L_asm_call_jit_compiler_exception
-
-       jmp     %a2@                                                            /* invoke java method */
-       jsr     0                                                               /* we should not ever return here */
-
-L_asm_call_jit_compiler_exception:
-       jsr             exceptions_get_and_clear_exception              /* exception object in %d0 now */
-       moveal  %d0, %a2                                                                /* move exception object into sptr register */
-       moveal  %sp@+, %a3                                                              /* pop return address into exception address reg */
-       jmp asm_handle_exception                                                /* handle exception */
-
-
-
 asm_abstractmethoderror:
 
 /* asm_handle_exception ********************************************************
index 02c79329c2baf28a20bef93f16da9ff015a0fb22..d1d5bf33999a30e807aca60ef3c7977cc939c0f6 100644 (file)
@@ -1017,7 +1017,7 @@ bool codegen_emit(jitdata *jd)
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                constant_classref *cr = iptr->sx.val.c.ref;;
-                               codegen_addpatchref(cd, PATCHER_resolve_classref_to_classinfo, cr, 0);
+                               patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_classinfo, cr, 0);
                                M_AMOV_IMM(0, d);
                        } else {
                                M_AMOV_IMM(iptr->sx.val.anyptr, d);
@@ -1035,7 +1035,7 @@ bool codegen_emit(jitdata *jd)
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                unresolved_class *uc = iptr->sx.s23.s2.uc;
 
-                               codegen_addpatchref(cd, PATCHER_resolve_class, uc, 0);
+                               patcher_add_patch_ref(jd, PATCHER_resolve_class, uc, 0);
                        }
 #endif /* ENABLE_VERIFIER */
                        M_JSR_PCREL(2);                         /* get current PC */
@@ -1114,7 +1114,7 @@ bool codegen_emit(jitdata *jd)
                                fieldtype = uf->fieldref->parseddesc.fd->type;
                                disp      = 0;
 
-                               codegen_addpatchref(cd, PATCHER_get_putstatic, uf, 0);
+                               patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, 0);
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
@@ -1122,7 +1122,7 @@ bool codegen_emit(jitdata *jd)
                                disp      = (intptr_t) fi->value;
 
                                if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) {
-                                       codegen_addpatchref(cd, PATCHER_initialize_class, fi->class,
+                                       patcher_add_patch_ref(jd, PATCHER_initialize_class, fi->class,
                                                                                0);
                                }
                        }
@@ -1168,7 +1168,7 @@ bool codegen_emit(jitdata *jd)
                                fieldtype = uf->fieldref->parseddesc.fd->type;
                                disp      = 0;
 
-                               codegen_addpatchref(cd, PATCHER_get_putstatic, uf, 0);
+                               patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, 0);
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
@@ -1176,7 +1176,7 @@ bool codegen_emit(jitdata *jd)
                                disp      = (intptr_t) fi->value;
 
                                if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
-                                       codegen_addpatchref(cd, PATCHER_initialize_class, fi->class,
+                                       patcher_add_patch_ref(jd, PATCHER_initialize_class, fi->class,
                                                                                0);
                        }
                
@@ -1223,7 +1223,7 @@ bool codegen_emit(jitdata *jd)
                                fieldtype = uf->fieldref->parseddesc.fd->type;
                                disp      = 0;
 
-                               codegen_addpatchref(cd, PATCHER_get_putfield, uf, 0);
+                               patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
@@ -1291,7 +1291,7 @@ bool codegen_emit(jitdata *jd)
                        }
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr))
-                               codegen_addpatchref(cd, PATCHER_get_putfield, uf, 0);
+                               patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
 
                        /* implicit null-pointer check */
                        switch (fieldtype) {
@@ -1700,7 +1700,7 @@ bool codegen_emit(jitdata *jd)
                                        /* fall through */
                                case ICMD_INVOKESTATIC: 
                                        if (lm == NULL) {
-                                               codegen_addpatchref(cd, PATCHER_invokestatic_special, um, 0);
+                                               patcher_add_patch_ref(jd, PATCHER_invokestatic_special, um, 0);
                                                disp = 0;
                                                M_AMOV_IMM(disp, REG_ATMP1);
                                        } else  {
@@ -1716,7 +1716,7 @@ bool codegen_emit(jitdata *jd)
 
                                case ICMD_INVOKEVIRTUAL:
                                        if (lm == NULL) {
-                                               codegen_addpatchref(cd, PATCHER_invokevirtual, um, 0);
+                                               patcher_add_patch_ref(jd, PATCHER_invokevirtual, um, 0);
                                                s1 = 0;
                                        } else {
                                                s1 = OFFSET(vftbl_t, table[0]) + sizeof(methodptr) * lm->vftblindex;
@@ -1731,7 +1731,7 @@ bool codegen_emit(jitdata *jd)
                                        break;
                                case ICMD_INVOKEINTERFACE: 
                                        if (lm == NULL) {
-                                               codegen_addpatchref(cd, PATCHER_invokeinterface, um, 0);
+                                               patcher_add_patch_ref(jd, PATCHER_invokeinterface, um, 0);
 
                                                s1 = 0;
                                                s2 = 0;
@@ -1832,7 +1832,7 @@ bool codegen_emit(jitdata *jd)
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                unresolved_class *uc = iptr->sx.s23.s2.uc;
 
-                               codegen_addpatchref(cd, PATCHER_resolve_class, uc, 0);
+                               patcher_add_patch_ref(jd, PATCHER_resolve_class, uc, 0);
                        }
 #endif /* ENABLE_VERIFIER */
                        goto nowperformreturn;
@@ -2015,7 +2015,7 @@ nowperformreturn:
                                M_ATST(s1);
                                emit_label_beq(cd, BRANCH_LABEL_1);
 
-                               codegen_addpatchref(cd, PATCHER_resolve_classref_to_flags, iptr->sx.s23.s3.c.ref, 0);
+                               patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_flags, iptr->sx.s23.s3.c.ref, 0);
 
                                M_IMOV_IMM32(0, REG_ITMP3);
                                M_IAND_IMM(ACC_INTERFACE, REG_ITMP3);
@@ -2026,7 +2026,7 @@ nowperformreturn:
 
                        if ((super == NULL) || (super->flags & ACC_INTERFACE)) {
                                if (super == NULL) {
-                                       codegen_addpatchref(cd, PATCHER_instanceof_interface, iptr->sx.s23.s3.c.ref, 0);
+                                       patcher_add_patch_ref(jd, PATCHER_instanceof_interface, iptr->sx.s23.s3.c.ref, 0);
                                } else {
                                        M_ATST(s1);
                                        emit_label_beq(cd, BRANCH_LABEL_3);
@@ -2054,7 +2054,7 @@ nowperformreturn:
                                if (super == NULL) {
                                        emit_label(cd, BRANCH_LABEL_2);
 
-                                       codegen_addpatchref(cd, PATCHER_resolve_classref_to_vftbl, iptr->sx.s23.s3.c.ref, 0);
+                                       patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_vftbl, iptr->sx.s23.s3.c.ref, 0);
                                        M_AMOV_IMM(0, REG_ATMP2);
                                } else {
                                        M_AMOV_IMM(super->vftbl, REG_ATMP2);
@@ -2135,7 +2135,7 @@ nowperformreturn:
                                        M_ATST(s1);
                                        emit_label_beq(cd, BRANCH_LABEL_1);
 
-                                       codegen_addpatchref(cd, PATCHER_resolve_classref_to_flags, iptr->sx.s23.s3.c.ref, 0);
+                                       patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_flags, iptr->sx.s23.s3.c.ref, 0);
                        
                                        M_IMOV_IMM32(0, REG_ITMP2);
                                        M_IAND_IMM(ACC_INTERFACE, REG_ITMP2);
@@ -2146,7 +2146,7 @@ nowperformreturn:
 
                                if ((super == NULL) || (super->flags & ACC_INTERFACE)) {
                                        if (super == NULL) {
-                                               codegen_addpatchref(cd, PATCHER_checkcast_interface, iptr->sx.s23.s3.c.ref, 0);
+                                               patcher_add_patch_ref(jd, PATCHER_checkcast_interface, iptr->sx.s23.s3.c.ref, 0);
                                        } else {
                                                M_ATST(s1);
                                                emit_label_beq(cd, BRANCH_LABEL_3);
@@ -2175,7 +2175,7 @@ nowperformreturn:
                                        if (super == NULL) {
                                                emit_label(cd, BRANCH_LABEL_2);
 
-                                               codegen_addpatchref(cd, PATCHER_resolve_classref_to_vftbl, iptr->sx.s23.s3.c.ref, 0);
+                                               patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_vftbl, iptr->sx.s23.s3.c.ref, 0);
                                                M_AMOV_IMM(0, REG_ATMP3);
                                        } else {
                                                M_AMOV_IMM(super->vftbl, REG_ATMP3);
@@ -2214,7 +2214,7 @@ nowperformreturn:
                                s1 = emit_load_s1(jd, iptr, REG_ATMP2);
 
                                if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                                       codegen_addpatchref(cd, PATCHER_resolve_classref_to_classinfo, iptr->sx.s23.s3.c.ref, 0);
+                                       patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_classinfo, iptr->sx.s23.s3.c.ref, 0);
                                        M_AMOV_IMM(0, REG_ATMP1);
                                } else {
                                        M_AMOV_IMM(iptr->sx.s23.s3.c.cls, REG_ATMP1);
@@ -2321,7 +2321,7 @@ nowperformreturn:
 
                        /* a1 = arraydescriptor */
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               codegen_addpatchref(cd, PATCHER_resolve_classref_to_classinfo, iptr->sx.s23.s3.c.ref, 0);
+                               patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_classinfo, iptr->sx.s23.s3.c.ref, 0);
                                M_AMOV_IMM(0, REG_ATMP1);
                        } else  {
                                M_AMOV_IMM(iptr->sx.s23.s3.c.cls, REG_ATMP1);
@@ -2376,8 +2376,7 @@ nowperformreturn:
 
        return true;
 }
-
-
+#if 0
 /* codegen_emit_stub_compiler **************************************************
 
    Emits a stub routine which calls the compiler.
@@ -2400,6 +2399,8 @@ void codegen_emit_stub_compiler(jitdata *jd)
        M_AMOV_IMM(asm_call_jit_compiler, REG_ATMP3);
        M_JMP(REG_ATMP3);
 }
+#endif
+
 /* codegen_emit_stub_native ****************************************************
 
    Emits a stub routine which calls a native method.
@@ -2434,7 +2435,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 
        /* create method header */
        (void) dseg_add_unique_address(cd, code);                      /* CodeinfoPointer */
-       (void) dseg_add_unique_s4(cd, cd->stackframesize * 4);         /* FrameSize       */
+       (void) dseg_add_unique_s4(cd, cd->stackframesize * 8);         /* FrameSize       */
        (void) dseg_add_unique_s4(cd, 0);                              /* IsSync          */
        (void) dseg_add_unique_s4(cd, 0);                              /* IsLeaf          */
        (void) dseg_add_unique_s4(cd, 0);                              /* IntSave         */
@@ -2450,11 +2451,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
 #endif
 
        /* generate code */
-       M_AADD_IMM(-(cd->stackframesize*4), REG_SP);
+       M_AADD_IMM(-(cd->stackframesize*8), REG_SP);
 
        /* get function address (this must happen before the stackframeinfo) */
        if (f == NULL)  {
-               codegen_addpatchref(cd, PATCHER_resolve_native_function, m, 0);
+               patcher_add_patch_ref(jd, PATCHER_resolve_native_function, m, 0);
        }
 
        M_AMOV_IMM(f, REG_ATMP2); /* do not move this line, the patcher is needed */
@@ -2487,7 +2488,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
                /* all arguments via stack */
                assert(md->params[i].inmemory);                                         
 
-               s1 = md->params[i].regoff + cd->stackframesize * 4 + 4;
+               s1 = md->params[i].regoff + cd->stackframesize * 8 + 4;
                s2 = nmd->params[j].regoff;
 
                /* simply copy argument stack */
@@ -2517,13 +2518,13 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
                /* natives return float arguments in %d0, %d1, cacao expects them in %fp0 */
                case TYPE_DBL:
                case TYPE_LNG:
-                       M_IST(REG_D1, REG_SP, 2 * 4);
+                       M_IST(REG_D1, REG_SP, 2 * 8);
                        /* fall through */
 
                case TYPE_FLT:
                case TYPE_INT:
                case TYPE_ADR:
-                       M_IST(REG_D0, REG_SP, 2 * 4);
+                       M_IST(REG_D0, REG_SP, 2 * 8);   /* XXX can this be correct ? */
                        break;
 
                default: assert(0);
@@ -2554,13 +2555,12 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
                case TYPE_VOID: break;
 
                case TYPE_DBL:
-               case TYPE_LNG:
-                       M_ILD(REG_D1, REG_SP, 2 * 4);
+               case TYPE_LNG:          M_ILD(REG_D1, REG_SP, 2 * 8);
                        /* fall through */
                case TYPE_FLT:
                case TYPE_INT:
                case TYPE_ADR:
-                       M_ILD(REG_D0, REG_SP, 2 * 4);
+                       M_ILD(REG_D0, REG_SP, 2 * 8);   /* XXX */
                        break;
 
                default: assert(0);
@@ -2570,16 +2570,16 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
                 * as cacao jit code expects them there */
        switch (md->returntype.type)    {
                case TYPE_FLT:
-                       M_FLD(REG_D0, REG_SP, 2 * 4);
+                       M_FLD(REG_D0, REG_SP, 2 * 8);
                        break;
                case TYPE_DBL:  
-                       M_DLD(REG_D0, REG_SP, 2 * 4);
+                       M_DLD(REG_D0, REG_SP, 2 * 8);   /* XXX */
                        break;
        }
 #endif
        /* restore saved registers */
 
-       M_AADD_IMM(cd->stackframesize*4, REG_SP);
+       M_AADD_IMM(cd->stackframesize*8, REG_SP);
        /* check for exception */
        M_ATST(REG_ATMP1);
        M_BNE(2);
index 2b418f01e99632bd8e80dab03217ca4190847543..4a0c21ba171433470626c50030849ae1ec710310 100644 (file)
@@ -34,6 +34,7 @@
 #include "vm/exceptions.h"
 #include "vm/jit/asmpart.h"
 #include "vm/builtin.h"
+#include "vm/jit/trace.h"
 
 #include "mm/memory.h"
 
@@ -419,8 +420,6 @@ void emit_verbosecall_enter(jitdata* jd)
        codegendata  *cd;
        registerdata *rd;
        methoddesc   *md;
-       s4      disp,i,t;
-
 
        if (!JITDATA_HAS_FLAG_VERBOSECALL(jd))
                return;
@@ -438,47 +437,22 @@ void emit_verbosecall_enter(jitdata* jd)
        M_IPUSH(REG_D1);
        M_APUSH(REG_A0);
        M_APUSH(REG_A1);
+       M_AMOV(REG_SP, REG_A0); /* simpyfy stack offset calculation */
 
 #if !defined(ENABLE_SOFTFLOAT)
        M_AADD_IMM(-8*2, REG_SP);
        M_FSTORE(REG_F0, REG_SP, 8);
        M_FSTORE(REG_F1, REG_SP, 0);
-
-       disp = 4*4 + 8*2 + 4;   /* points to old argument stack initially */
-#else
-       disp = 4*4 + 4;
 #endif
-       /* builtin_verbosecall_enter takes all args as s8 type */
-       /* TRACE_ARGS_NUM is the number of args the builtin_verbosecall_enter expects */
-       M_IPUSH_IMM(m);
        
-
-       /* travel up stack to the first argument of the function which needs to be copied */
-       for (i=0; (i < md->paramcount) && (i < TRACE_ARGS_NUM); i++)    {
-               disp += 8;
-       }
-
-       /* disp now points to the first arg which gets copied to the trace stack, relative to REG_SP! */
-       for (i=TRACE_ARGS_NUM-1; i>=0; --i) {
-               if (i < md->paramcount) {
-                       /* traced function has such an argument */
-                       t = md->paramtypes[i].type;
-                       
-                       /* copy from original argument stack */
-                       M_ILD(REG_ITMP1, REG_SP, disp);
-                       M_ILD(REG_ITMP2, REG_SP, disp-4);
-                       M_IPUSH(REG_ITMP2);
-                       M_IPUSH(REG_ITMP1);
-               } else  {
-                       /* function has no arg here, push nothing and adapt displacement */
-                       M_IPUSH_IMM(0);
-                       M_IPUSH_IMM(0);
-                       disp += 8;
-               }
-       }
-       M_JSR_IMM(builtin_verbosecall_enter);
+       M_AADD_IMM(4*4 + 4, REG_A0);
+       M_APUSH(REG_A0);                /* third arg is original argument stack */
+       M_IPUSH_IMM(0);                 /* second arg is number of argument registers (=0) */
+       M_IPUSH_IMM(m);                 /* first arg is methodpointer */
+       
+       M_JSR_IMM(trace_java_call_enter);
        /* pop arguments off stack */
-       M_AADD_IMM(TRACE_ARGS_NUM*8+4, REG_SP);
+       M_AADD_IMM(3*4, REG_SP);
 
 #if !defined(ENABLE_SOFTFLOAT)
        M_FSTORE(REG_F1, REG_SP, 0);
@@ -667,6 +641,40 @@ void emit_exception_check(codegendata *cd, instruction *iptr)
        }
 }
 
+/* emit_trap_compiler **********************************************************
+
+   Emit a trap instruction which calls the JIT compiler.
+
+*******************************************************************************/
+
+void emit_trap_compiler(codegendata *cd)
+{
+       M_TRAP_SETREGISTER(REG_METHODPTR);
+       M_TRAP(EXCEPTION_HARDWARE_COMPILER);
+}
+
+
+/* emit_trap *******************************************************************
+
+   Emit a trap instruction and return the original machine code.
+
+*******************************************************************************/
+
+uint32_t emit_trap(codegendata *cd)
+{
+       uint16_t mcode;
+
+       /* Get machine code which is patched back in later. The
+          trap is 2 bytes long. */
+
+       mcode = *((uint16_t *) cd->mcodeptr);
+
+       M_TRAP(EXCEPTION_HARDWARE_PATCHER);
+
+       return (uint32_t) mcode;
+}
+
+
 
 /*
  * These are local overrides for various environment variables in Emacs.
index 3acb38c64636f5e1cce1480a82d439764b840c7a..c8f5b77282f7b4ff7fe1ea6108fb8b8baf0f0099 100644 (file)
@@ -121,8 +121,8 @@ void md_param_alloc(methoddesc *md)
 
        for (i=0; i<md->paramcount; i++, pd++)  {
                pd->inmemory = true;
-               pd->regoff = stacksize * 4;
-               stacksize += IS_2_WORD_TYPE(md->paramtypes[i].type) ? 2:1;
+               pd->regoff = stacksize * 8;
+/*             stacksize += IS_2_WORD_TYPE(md->paramtypes[i].type) ? 2:1;*/
        }
 
        md->memuse = stacksize;
index 1492d18f5be1ee997547fb386adc556835535fb6..a93bc1ea1ab327877be6c4652f679caee7400bb6 100644 (file)
@@ -67,20 +67,6 @@ typedef struct actual_ucontext {
 } actual_ucontext_t;
 
 
-/*
- *     linux specific initializations
- */
-void md_init_linux()
-{
-       struct sigaction act;
-       
-       act.sa_sigaction = md_signal_handler_sigill;
-       act.sa_flags     = SA_NODEFER | SA_SIGINFO;
-
-       if (sigaction(SIGILL, &act, NULL) == -1)        {
-               vm_abort("md_linux_init: Error registering signal handler");
-       }
-}
 
 /* md_signal_handler_sigsegv ******************************************
  *
@@ -162,10 +148,10 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
  **********************************************************************/
 void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p)
 {
-       uint32_t        xpc, sp;
+       uint32_t        xpc, sp, ra, pv;
        uint16_t        opc;
        uint32_t        type;
-       uint32_t        val, regval;
+       uint32_t        regval;
        void        *p;
        actual_mcontext_t       *_mc;
        actual_ucontext_t       *_uc;
@@ -173,6 +159,9 @@ void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p)
        _uc = (actual_ucontext_t*)_p;
        xpc = (uint32_t)siginfo->si_addr;
 
+       pv = NULL;      /* we have no pv */
+       ra = xpc;       /* that is ture for most cases */
+
        if (siginfo->si_code == ILL_ILLOPC)     {
                vm_abort("md_signal_handler_sigill: the illegal instruction @ 0x%x, aborting", xpc);
        }
@@ -210,6 +199,20 @@ void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p)
                case M68K_EXCEPTION_HARDWARE_NULLPOINTER:
                        type = EXCEPTION_HARDWARE_NULLPOINTER;
                        break;
+               case EXCEPTION_HARDWARE_COMPILER:
+                       regval = *(uint16_t*)(xpc-4);
+                       assert( (regval&0xfff0) == 0x4a00 );
+                       /* was in a address register */
+                       regval = _mc->gregs[ GREGS_ADRREG_OFF + (regval & 0x7) ];
+
+                       pv = xpc-4;     /* the compiler stub consists of 2 instructions */
+                       ra = md_stacktrace_get_returnaddress(sp, 0);
+                       sp = sp + SIZEOF_VOID_P;
+                       xpc = ra - 2;
+                       break;
+               case EXCEPTION_HARDWARE_PATCHER:
+                       xpc -= 2;
+                       break;
 
                default: assert(0);
        }
@@ -218,12 +221,30 @@ void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p)
        */
 
        /* Handle the type. */
+       p = signal_handle(type, regval, pv, (void*)sp, (void*)ra, (void*)xpc, _p);
 
-       p = signal_handle(type, val, NULL, (void*)sp, (void*)xpc, (void*)xpc, _p);
 
-       _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP1]     = (intptr_t) p;
-       _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP2_XPC] = (intptr_t) xpc;
-       _mc->gregs[R_PC]                             = (intptr_t) asm_handle_exception;
+       if (type == EXCEPTION_HARDWARE_COMPILER)        {
+               if (p == NULL)  {
+                       /* exception when compiling the method */
+                       java_object_t *o = exceptions_get_and_clear_exceptions();
+
+                       _mc->gregs[R_SP] = sp;  /* remove RA from stack */
+
+                       _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP1]     = (intptr_t) o;
+                       _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP2_XPC] = (intptr_t) xpc;
+                       _mc->gregs[R_PC]                             = (intptr_t) asm_handle_exception;
+
+               } else  {
+                       /* compilation ok, execute */
+                       _mc->gregs[R_PC] = p;
+               }
+
+       } else  {
+               _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP1]     = (intptr_t) p;
+               _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP2_XPC] = (intptr_t) xpc;
+               _mc->gregs[R_PC]                             = (intptr_t) asm_handle_exception;
+       }
 }
 
 /* md_signal_handler_sigusr1 ***************************************************
index 7ebfe074eff9f7f3cb81fcebc77d93866b72d6d7..d83c165a8913586ff0a960098a7fd0b1e3f00c69 100644 (file)
@@ -29,9 +29,6 @@
 /* XXX trap #0 is reserved and will not be delivered to signal handler */
 #define M68K_EXCEPTION_HARDWARE_NULLPOINTER 14
 
-void md_signal_handler_sigill();
-void md_init_linux();
-
 
 /*
  * These are local overrides for various environment variables in Emacs.
index 1cf89e90c2d5c47e0526fe8eed4e81b9f1d8223a..45abc87287c3e084c9318c3193bab2597bee6ab5 100644 (file)
@@ -54,9 +54,6 @@
  */
 void md_init(void) 
 {
-#ifdef __LINUX__
-       md_init_linux();
-#endif
 }
 
 /* md_codegen_get_pv_from_pc ***************************************************
index 090b7ef169c0bfe077a47754804c6778c38c370c..30318465a4b03cdd7646f5cdd024f320ebded120 100644 (file)
@@ -147,7 +147,7 @@ bool signal_init(void)
                                                           SA_NODEFER | SA_SIGINFO);
 #  endif
 
-#  if defined(__ARM__) || defined(__I386__) || defined(__S390__) || defined(__X86_64__)
+#  if defined(__ARM__) || defined(__I386__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__)
                /* XXX use better defines for that (in arch.h) */
                /* SIGILL handler */
 
index 1b769d3452c478e9d2225a02ec736299e69c7d5f..2c9450e547e351f3c94210397f94a0b8d4944949 100644 (file)
@@ -54,7 +54,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p);
 void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p);
 #endif
 
-#if defined(__ARM__) || defined(__I386__) || defined(__S390__) || defined(__X86_64__)
+#if defined(__ARM__) || defined(__I386__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__)
 /* XXX use better defines for that (in arch.h) */
 void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p);
 #endif
index b1979eea87d00d5f5ff53592c6d3b22952512e86..2eed5d4f7ab01aace474ec4a65bf4b5de8b31e34 100644 (file)
@@ -871,7 +871,7 @@ static classinfo *link_class_intern(classinfo *c)
                if (!(f->flags & ACC_STATIC)) {
                        dsize = descriptor_typesize(f->parseddesc);
 
-#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__)
                        /* On i386 and ARM we align double and s8 fields to
                           4-bytes.  This matches what GCC does for struct
                           members. We must do the same as gcc here because the