* src/vm/jit/codegen-common.h (codegen_finish_native_call): Changes signature.
authorMichael Starzinger <michi@complang.tuwien.ac.at>
Wed, 5 Sep 2007 21:25:53 +0000 (23:25 +0200)
committerMichael Starzinger <michi@complang.tuwien.ac.at>
Wed, 5 Sep 2007 21:25:53 +0000 (23:25 +0200)
* src/vm/jit/codegen-common.c (codegen_finish_native_call): Takes the same
arguments as the enter pendant now.

* src/vm/jit/alpha/codegen.c (codegen_emit_stub_native): Adapted to new
signature mentioned above.

* src/vm/jit/arm/codegen.c: Likewise.
* src/vm/jit/i386/codegen.c: Likewise.
* src/vm/jit/m68k/codegen.c: Likewise.
* src/vm/jit/mips/codegen.c: Likewise.
* src/vm/jit/powerpc/codegen.c: Likewise.
* src/vm/jit/powerpc64/codegen.c: Likewise.
* src/vm/jit/s390/codegen.c: Likewise.
* src/vm/jit/x86_64/codegen.c: Likewise.

src/vm/jit/alpha/codegen.c
src/vm/jit/arm/codegen.c
src/vm/jit/codegen-common.c
src/vm/jit/codegen-common.h
src/vm/jit/i386/codegen.c
src/vm/jit/m68k/codegen.c
src/vm/jit/mips/codegen.c
src/vm/jit/powerpc/codegen.c
src/vm/jit/powerpc64/codegen.c
src/vm/jit/s390/codegen.c
src/vm/jit/x86_64/codegen.c

index 73c4aedc3af2a7d964f8398cb318c303f4007055..a5fe6b0adae9245b8ae4837c81af0549ddac7a3b 100644 (file)
@@ -3506,7 +3506,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* remove native stackframe info */
 
-       M_LDA(REG_A0, REG_SP, cd->stackframesize * 8 - SIZEOF_VOID_P);
+       M_MOV(REG_SP, REG_A0);
+       M_MOV(REG_PV, REG_A1);
        disp = dseg_add_functionptr(cd, codegen_finish_native_call);
        M_ALD(REG_PV, REG_PV, disp);
        M_JSR(REG_RA, REG_PV);
index 6325dfbb7a0421e961a0e580b3b9e52ebc8d33b1..0dbb7e3700e818ac4cdc2c35b8999d827d904482 100644 (file)
@@ -3252,7 +3252,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        M_STMFD(BITMASK_RESULT, REG_SP);
 
-       M_ADD_IMM(REG_A0, REG_SP, 2*4 + cd->stackframesize - SIZEOF_VOID_P);
+       M_ADD_IMM(REG_A0, REG_SP, 2*4);
+       M_MOV(REG_A1, REG_PV);
        disp = dseg_add_functionptr(cd, codegen_finish_native_call);
        M_DSEG_BRANCH(disp);
        s1 = (s4) (cd->mcodeptr - cd->mcodebase);
index f36e8438c01f5510b0fceabceca9c12d9093133d..5764cffbc1cebe6f01c4d85d555328017b473a5b 100644 (file)
@@ -1544,14 +1544,12 @@ java_handle_t *codegen_start_native_call(u1 *currentsp, u1 *pv)
 
        code      = *((codeinfo **) (pv + CodeinfoPointer));
        framesize = *((int32_t *)   (pv + FrameSize));
-
        assert(code);
        assert(framesize > sizeof(stackframeinfo) + sizeof(localref_table));
 
        /* get the methodinfo */
 
        m = code->m;
-
        assert(m);
 
        /* calculate needed values */
@@ -1633,11 +1631,59 @@ java_handle_t *codegen_start_native_call(u1 *currentsp, u1 *pv)
 
 *******************************************************************************/
 
-java_object_t *codegen_finish_native_call(u1 *datasp)
+java_object_t *codegen_finish_native_call(u1 *currentsp, u1 *pv)
 {
        stackframeinfo *sfi;
        java_handle_t  *e;
        java_object_t  *o;
+       codeinfo       *code;
+       methodinfo     *m;
+       int32_t         framesize;
+
+       uint8_t  *datasp;
+       uint64_t *ret_regs;
+
+       /* get information from method header */
+
+       code      = *((codeinfo **) (pv + CodeinfoPointer));
+       framesize = *((int32_t *)   (pv + FrameSize));
+       assert(code);
+
+       /* get the methodinfo */
+
+       m = code->m;
+       assert(m);
+
+       /* calculate needed values */
+
+#if defined(__ALPHA__) || defined(__ARM__)
+       datasp   = currentsp + framesize - SIZEOF_VOID_P;
+       ret_regs = (uint64_t *) currentsp;
+#elif defined(__MIPS__) || defined(__S390__)
+       /* MIPS and S390 always uses 8 bytes to store the RA */
+       datasp   = currentsp + framesize - 8;
+#elif defined(__I386__)
+       datasp   = currentsp + framesize;
+       ret_regs = (uint64_t *) (currentsp + 2 * SIZEOF_VOID_P);
+#elif defined (__M68K__) || defined (__X86_64__)
+       datasp   = currentsp + framesize;
+       ret_regs = (uint64_t *) currentsp;
+#elif defined(__POWERPC__) || defined(__POWERPC64__)
+       datasp   = currentsp + framesize;
+       ret_regs = (uint64_t *) (currentsp + LA_SIZE + 2 * SIZEOF_VOID_P);
+#else
+       vm_abort("codegen_finish_native_call: unsupported architecture");
+#endif
+
+
+#if !defined(NDEBUG)
+# if defined(__POWERPC__)
+       /* print the call-trace if necesarry */
+
+       if (opt_TraceJavaCalls)
+               trace_java_call_exit(m, ret_regs);
+# endif
+#endif
 
        /* get data structures from stack */
 
@@ -1647,6 +1693,8 @@ java_object_t *codegen_finish_native_call(u1 *datasp)
 
        stacktrace_remove_stackframeinfo(sfi);
 
+       /* XXX unfill lrt here!!! */
+
        /* get and unwrap the exception */
        /* ATTENTION: do the this _after_ the stackframeinfo was
        removed but _before_ the localref_table gets removed! */
index c6228d60bd1f6e0c1b19206ebb62627179d9da51..f4caa4010e0f9597eefdd988ba141d963feea296 100644 (file)
@@ -329,7 +329,7 @@ void codegen_stub_builtin_enter(u1 *datasp, u1 *pv, u1 *sp, u1 *ra);
 void codegen_stub_builtin_exit(u1 *datasp);
 
 java_handle_t *codegen_start_native_call(u1 *currentsp, u1 *pv);
-java_object_t *codegen_finish_native_call(u1 *datasp);
+java_object_t *codegen_finish_native_call(u1 *currentsp, u1 *pv);
 
 s4 codegen_reg_of_var(u2 opcode, varinfo *v, s4 tempregnum);
 s4 codegen_reg_of_dst(jitdata *jd, instruction *iptr, s4 tempregnum);
index f68f8e21af74113deae440daae46d26537172cb2..796d2e5dfd15a2a9b0a58a9e5d8d7f34656ea4e8 100644 (file)
@@ -3844,9 +3844,10 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* remove native stackframe info */
 
        M_MOV(REG_SP, REG_ITMP1);
-       M_AADD_IMM(cd->stackframesize * 8, REG_ITMP1);
-
        M_AST(REG_ITMP1, REG_SP, 0 * 4);
+       M_IST_IMM(0, REG_SP, 1 * 4);
+       dseg_adddata(cd);
+
        M_MOV_IMM(codegen_finish_native_call, REG_ITMP1);
        M_CALL(REG_ITMP1);
        M_MOV(REG_RESULT, REG_ITMP2);                 /* REG_ITMP3 == REG_RESULT2 */
index 64632b5a846be9c5d6c316b914be083396e9b8e7..b8c1ce7c96ba297cc45f6b36e82a58f16ffa065a 100644 (file)
@@ -2692,7 +2692,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                case TYPE_FLT:
                case TYPE_INT:
                case TYPE_ADR:
-                       M_IST(REG_D0, REG_SP, 1 * 4);
+                       M_IST(REG_D0, REG_SP, 2 * 4);
                        break;
 
                default: assert(0);
@@ -2707,9 +2707,14 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* remove native stackframe info */
        /* therefore we call: java_objectheader *codegen_finish_native_call(u1 *datasp) */
 
-       M_AMOV(REG_SP, REG_ATMP3);
-       M_AADD_IMM(cd->stackframesize * 4, REG_ATMP3);
-       M_AST(REG_ATMP3, REG_SP, 0 * 4);                        /* datasp */
+       M_AMOV(REG_SP, REG_ATMP1);
+       M_AST(REG_ATMP1, REG_SP, 0 * 4);                /* currentsp */
+
+       M_AMOV_IMM(0, REG_ATMP2);                       /* 0 needs to patched */
+       dseg_adddata(cd);                                   /* this patches it */
+
+       M_AST(REG_ATMP2, REG_SP, 1 * 4);                /* pv */
+
        M_JSR_IMM(codegen_finish_native_call);
        
        M_INT2ADRMOVE(REG_RESULT, REG_ATMP1);
@@ -2724,7 +2729,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                case TYPE_FLT:
                case TYPE_INT:
                case TYPE_ADR:
-                       M_ILD(REG_D0, REG_SP, 1 * 4);
+                       M_ILD(REG_D0, REG_SP, 2 * 4);
                        break;
 
                default: assert(0);
@@ -2734,10 +2739,10 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                 * as cacao jit code expects them there */
        switch (md->returntype.type)    {
                case TYPE_FLT:
-                       M_FLD(REG_D0, REG_SP, 1 * 4);
+                       M_FLD(REG_D0, REG_SP, 2 * 4);
                        break;
                case TYPE_DBL:  
-                       M_DLD(REG_D0, REG_SP, 1 * 4);
+                       M_DLD(REG_D0, REG_SP, 2 * 4);
                        break;
        }
 #endif
index 9ecb43cd2ad07ccf2b604b006b15c8642fe76f8c..f75e067bdd2cd5ff5b7a4d545aab31247fb25cf1 100644 (file)
@@ -3976,7 +3976,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* remove native stackframe info */
 
-       M_AADD_IMM(REG_SP, (cd->stackframesize - 1) * 8, REG_A0);
+       M_MOV(REG_SP, REG_A0);
+       M_MOV(REG_PV, REG_A1);
        disp = dseg_add_functionptr(cd, codegen_finish_native_call);
        M_ALD(REG_ITMP3, REG_PV, disp);
        M_JSR(REG_RA, REG_ITMP3);
index f676f94c35236cff816f03af1c3b09e518d13b8e..5269c281d125931fe54386793fdcd209d64aad5b 100644 (file)
@@ -3317,23 +3317,19 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_MTCTR(REG_ITMP3);
        M_JSR;
 
-       /* print call trace */
-
-       emit_verbosecall_exit(jd);
-
        /* save return value */
 
        switch (md->returntype.type) {
        case TYPE_INT:
        case TYPE_ADR:
-               M_IST(REG_RESULT, REG_SP, LA_SIZE + 1 * 8);
+               M_IST(REG_RESULT, REG_SP, LA_SIZE + 2 * 4);
                break;
        case TYPE_LNG:
-               M_LST(REG_RESULT_PACKED, REG_SP, LA_SIZE + 1 * 8);
+               M_LST(REG_RESULT_PACKED, REG_SP, LA_SIZE + 2 * 4);
                break;
        case TYPE_FLT:
        case TYPE_DBL:
-               M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8);
+               M_DST(REG_FRESULT, REG_SP, LA_SIZE + 2 * 4);
                break;
        case TYPE_VOID:
                break;
@@ -3341,7 +3337,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* remove native stackframe info */
 
-       M_AADD_IMM(REG_SP, cd->stackframesize * 8, REG_A0);
+       M_MOV(REG_SP, REG_A0);
+       M_MOV(REG_PV, REG_A1);
        disp = dseg_add_functionptr(cd, codegen_finish_native_call);
        M_ALD(REG_ITMP1, REG_PV, disp);
        M_MTCTR(REG_ITMP1);
@@ -3353,14 +3350,14 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        switch (md->returntype.type) {
        case TYPE_INT:
        case TYPE_ADR:
-               M_ILD(REG_RESULT, REG_SP, LA_SIZE + 1 * 8);
+               M_ILD(REG_RESULT, REG_SP, LA_SIZE + 2 * 4);
                break;
        case TYPE_LNG:
-               M_LLD(REG_RESULT_PACKED, REG_SP, LA_SIZE + 1 * 8);
+               M_LLD(REG_RESULT_PACKED, REG_SP, LA_SIZE + 2 * 4);
                break;
        case TYPE_FLT:
        case TYPE_DBL:
-               M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 8);
+               M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 2 * 4);
                break;
        case TYPE_VOID:
                break;
index 6db0fc987d19367e65b14fe5c3d725da1065b2ab..1456e47b69137ef04d27f41a9e051f18e9a2c8c9 100644 (file)
@@ -2911,10 +2911,10 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        if (md->returntype.type != TYPE_VOID) {
                if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       M_LST(REG_RESULT, REG_SP, LA_SIZE + PA_SIZE + 1 * 8);
+                       M_LST(REG_RESULT, REG_SP, LA_SIZE + PA_SIZE + 2 * 8);
                }
                else {
-                       M_DST(REG_FRESULT, REG_SP, LA_SIZE + PA_SIZE + 1 * 8);
+                       M_DST(REG_FRESULT, REG_SP, LA_SIZE + PA_SIZE + 2 * 8);
                }
        }
 
@@ -2928,7 +2928,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* remove native stackframe info */
 
-       M_AADD_IMM(REG_SP, cd->stackframesize * 8, REG_A0);
+       M_MOV(REG_SP, REG_A0);
+       M_MOV(REG_PV, REG_A1);
        disp = dseg_add_functionptr(cd, codegen_finish_native_call);
        M_ALD(REG_ITMP1, REG_PV, disp);
        M_ALD(REG_ITMP1, REG_ITMP1, 0); /* XXX what about TOC? */
@@ -2940,13 +2941,13 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        if (md->returntype.type != TYPE_VOID) {
                if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       M_LLD(REG_RESULT, REG_SP, LA_SIZE + PA_SIZE + 1 * 8);
+                       M_LLD(REG_RESULT, REG_SP, LA_SIZE + PA_SIZE + 2 * 8);
                }
                else {
 /*                     if (IS_2_WORD_TYPE(md->returntype.type)) */
-                               M_DLD(REG_FRESULT, REG_SP, LA_SIZE + PA_SIZE + 1 * 8);
+                               M_DLD(REG_FRESULT, REG_SP, LA_SIZE + PA_SIZE + 2 * 8);
 /*                     else
-                               M_FLD(REG_FRESULT, REG_SP, LA_SIZE + PA_SIZE + 1 * 8); F XXX
+                               M_FLD(REG_FRESULT, REG_SP, LA_SIZE + PA_SIZE + 2 * 8); F XXX
                                */
                }
        }
index 877afe5c0db03b52fd4ed37bd1878f960bc86b8f..849c983cacf3df0252713a3eec104d19fc37598b 100644 (file)
@@ -3767,7 +3767,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* remove native stackframe info */
 
-       N_LAE(REG_A0, (cd->stackframesize - 1) * 8, RN, REG_SP); /* datasp */
+       N_MOV(REG_SP, REG_A0); /* currentsp */
+       N_LA(REG_A1, -N_PV_OFFSET, RN, REG_PV); /* pv */
        disp = dseg_add_functionptr(cd, codegen_finish_native_call);
        M_ALD_DSEG(REG_ITMP1, disp);
        M_CALL(REG_ITMP1);
index 57382d0788b8c5cccd7f512b0c7ee527c721a79f..77cadfcd7a4926a7393254457944730680629deb 100644 (file)
@@ -3314,7 +3314,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* remove native stackframe info */
 
-       M_ALEA(REG_SP, cd->stackframesize * 8, REG_A0);
+       M_MOV(REG_SP, REG_A0);
+       emit_lea_membase_reg(cd, RIP, -((cd->mcodeptr + 7) - cd->mcodebase), REG_A1);
        M_MOV_IMM(codegen_finish_native_call, REG_ITMP1);
        M_CALL(REG_ITMP1);
        M_MOV(REG_RESULT, REG_ITMP3);