* src/vm/jit/codegen-common.c (codegen_start_native_call): Return class
authorMichael Starzinger <michi@complang.tuwien.ac.at>
Wed, 5 Sep 2007 10:44:01 +0000 (12:44 +0200)
committerMichael Starzinger <michi@complang.tuwien.ac.at>
Wed, 5 Sep 2007 10:44:01 +0000 (12:44 +0200)
argument for static native methods.

* src/vm/jit/codegen-common.h (codegen_start_native_call): Adapted signature.

* src/vm/jit/alpha/codegen.c (codegen_emit_stub_native): Class argument is no
longer placed onto the data segment.

* 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/sparc64/codegen.c: Likewise.
* src/vm/jit/x86_64/codegen.c: Likewise.

12 files changed:
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/sparc64/codegen.c
src/vm/jit/x86_64/codegen.c

index bb51bac108914cabf46a6880f72dc0c2ad548b51..269e8a7b320a6442a3008a5ac3553d1149a94cd6 100644 (file)
@@ -3393,6 +3393,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        disp = (s4) (cd->mcodeptr - cd->mcodebase);
        M_LDA(REG_PV, REG_RA, -disp);
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_RESULT, REG_ITMP3);
+
        /* restore integer and float argument registers */
 
        for (i = 0; i < md->paramcount; i++) {
@@ -3463,10 +3468,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* put class into second argument register */
 
-       if (m->flags & ACC_STATIC) {
-               disp = dseg_add_address(cd, m->class);
-               M_ALD(REG_A1, REG_PV, disp);
-       }
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_ITMP3, REG_A1);
 
        /* put env into first argument register */
 
index 8ee95bf033791186ca5cdea4027924d5db33a780..a0be6d723f20974e989e0f41418cf42a4c3ce057 100644 (file)
@@ -3147,6 +3147,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        s1 = (s4) (cd->mcodeptr - cd->mcodebase);
        M_RECOMPUTE_PV(s1);
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_ITMP3, REG_RESULT);
+
        /* Restore integer and float argument registers (these are 4
           registers, stack is 8-byte aligned). */
 
@@ -3201,10 +3206,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* put class into second argument register */
 
-       if (m->flags & ACC_STATIC) {
-               disp = dseg_add_address(cd, m->class);
-               M_DSEG_LOAD(REG_A1, disp);
-       }
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_A1, REG_ITMP3);
 
        /* put env into first argument register */
 
index ca97dde9cb515b6d440d0a36ccfd2682a32ab336..f285f51caabf71743bddbaf83565ee2cc0060004 100644 (file)
@@ -67,6 +67,8 @@
 #include "native/localref.h"
 #include "native/native.h"
 
+#include "native/include/java_lang_Class.h"
+
 #include "threads/threads-common.h"
 
 #include "vm/builtin.h"
@@ -1522,7 +1524,7 @@ void codegen_stub_builtin_exit(u1 *datasp)
 
 *******************************************************************************/
 
-void codegen_start_native_call(u1 *currentsp, u1 *pv)
+java_handle_t *codegen_start_native_call(u1 *currentsp, u1 *pv)
 {
        stackframeinfo *sfi;
        localref_table *lrt;
@@ -1609,6 +1611,13 @@ void codegen_start_native_call(u1 *currentsp, u1 *pv)
        /* add a stackframeinfo to the chain */
 
        stacktrace_create_native_stackframeinfo(sfi, pv, javasp, javara);
+
+       /* return a wrapped classinfo for static methods */
+
+       if (m->flags & ACC_STATIC)
+               return LLNI_classinfo_wrap(m->class);
+       else
+               return NULL;
 }
 
 
index 29514934595a06bb58a5bbfc841b0798fefac644..c6228d60bd1f6e0c1b19206ebb62627179d9da51 100644 (file)
@@ -328,7 +328,7 @@ void removenativestub(u1 *stub);
 void codegen_stub_builtin_enter(u1 *datasp, u1 *pv, u1 *sp, u1 *ra);
 void codegen_stub_builtin_exit(u1 *datasp);
 
-void codegen_start_native_call(u1 *currentsp, u1 *pv);
+java_handle_t *codegen_start_native_call(u1 *currentsp, u1 *pv);
 java_object_t *codegen_finish_native_call(u1 *datasp);
 
 s4 codegen_reg_of_var(u2 opcode, varinfo *v, s4 tempregnum);
index 392e5b37339177c34245e35a445d2e71ca717c68..35fbdfa074ce041b09d3b2f4f07b69f86b81e0ac 100644 (file)
@@ -3776,6 +3776,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_MOV_IMM(codegen_start_native_call, REG_ITMP1);
        M_CALL(REG_ITMP1);
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_RESULT, REG_ITMP2);
+
        M_ALD(REG_ITMP3, REG_SP, 4 * 4);
 
        /* copy arguments into new stackframe */
@@ -3804,7 +3809,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* if function is static, put class into second argument */
 
        if (m->flags & ACC_STATIC)
-               M_AST_IMM(m->class, REG_SP, 1 * 4);
+               M_AST(REG_ITMP2, REG_SP, 1 * 4);
 
        /* put env into first argument */
 
index 37c41d5c668e673bc9eeb8a6d164128d6f22678d..535589ca85e7f015828abebb52f938ead0932b99 100644 (file)
@@ -2644,6 +2644,10 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        M_JSR_IMM(codegen_start_native_call);
 
+       /* remember class argument */
+       if (m->flags & ACC_STATIC)
+               M_INT2ADRMOVE(REG_RESULT, REG_ATMP3);
+
        /* load function pointer */
        M_ALD(REG_ATMP2, REG_SP, 4 * 4);
 
@@ -2666,10 +2670,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        }
 
        /* for static function class as second arg */
-       if (m->flags & ACC_STATIC)      {
-               M_AMOV_IMM(m->class, REG_ATMP1);
-               M_AST(REG_ATMP1, REG_SP, 1 * 4);
-       }
+       if (m->flags & ACC_STATIC)
+               M_AST(REG_ATMP3, REG_SP, 1 * 4);
+
        /* env ist first argument */
        M_AMOV_IMM(_Jv_env, REG_ATMP1);
        M_AST(REG_ATMP1, REG_SP, 0 * 4);
index 360d6b6e5dcffe743dafaa2d6b43ecc6d08d8a5c..8252132308bf4951e008b6423f1e5640d23c43b0 100644 (file)
@@ -3756,6 +3756,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_JSR(REG_RA, REG_ITMP3);
        M_NOP; /* XXX fill me! */
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_RESULT, REG_ITMP3);
+
        /* restore integer and float argument registers */
 
 #if SIZEOF_VOID_P == 8
@@ -3922,10 +3927,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* put class into second argument register */
 
-       if (m->flags & ACC_STATIC) {
-               disp = dseg_add_address(cd, m->class);
-               M_ALD(REG_A1, REG_PV, disp);
-       }
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_ITMP3, REG_A1);
 
        /* put env into first argument register */
 
index c7ac1461546e3e786a0117b4cc12d3f3c9e041f9..18f6a07ebb5ecec374a0ce799e9d6291f1010fdf 100644 (file)
@@ -3226,6 +3226,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_MTCTR(REG_ITMP1);
        M_JSR;
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_RESULT, REG_ITMP3);
+
        /* restore integer and float argument registers */
 
        for (i = 0; i < md->paramcount; i++) {
@@ -3304,10 +3309,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* put class into second argument register */
 
-       if (m->flags & ACC_STATIC) {
-               disp = dseg_add_address(cd, m->class);
-               M_ALD(REG_A1, REG_PV, disp);
-       }
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_ITMP3, REG_A1);
 
        /* put env into first argument register */
 
index 2e56a13985508ebf23333d95d8b8bab9d4338ce3..b292ccc170cfa6fb0b82aba2e5dea92172332e95 100644 (file)
@@ -2817,6 +2817,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_MTCTR(REG_ITMP1);
        M_JSR;
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_RESULT, REG_ITMP3);
+
        /* restore integer and float argument registers */
 
        j = 0;
@@ -2886,10 +2891,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* put class into second argument register */
 
-       if (m->flags & ACC_STATIC) {
-               disp = dseg_add_unique_address(cd, m->class);
-               M_ALD(REG_A1, REG_PV, disp);
-       }
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_ITMP3, REG_A1);
 
        /* put env into first argument register */
 
index d99fcfad276b249f707ab894c8cb22c9eaf1b743..befb98191ecfb7db2e01c2de3cae891d7f4fae70 100644 (file)
@@ -3620,6 +3620,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        M_CALL(REG_ITMP1); /* call */
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               N_LR(REG_ITMP3, REG_RESULT);
+
        /* restore integer and float argument registers */
 
        j = 96 + (nmd->memuse * 8);
@@ -3725,10 +3730,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* put class into second argument register */
 
-       if (m->flags & ACC_STATIC) {
-               disp = dseg_add_address(cd, m->class);
-               M_ILD_DSEG(REG_A1, disp);
-       }
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_ITMP3, REG_A1);
 
        /* put env into first argument register */
 
index 2f424ac6a0892a192e6e0ffec7095ed434645838..65d2783f32d9ddc1f3ca7560b5e5a9f37d372bcf 100644 (file)
@@ -3349,6 +3349,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_JMP(REG_RA_CALLER, REG_ITMP3, REG_ZERO);
        M_NOP; /* XXX fill me! */
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_RESULT_CALLER, REG_ITMP3);
+
        /* keep float arguments on stack */
 #if 0
        for (i = 0, j = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) {
@@ -3454,10 +3459,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* put class into second argument register */
 
-       if (m->flags & ACC_STATIC) {
-               disp = dseg_add_address(cd, m->class);
-               M_ALD(REG_OUT1, REG_PV_CALLEE, disp);
-       }
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_ITMP3, REG_OUT1);
 
        /* put env into first argument register */
 
index 2f98f246a310712f5c6f54625391dd12263f5dad..f896c417df4e537592e538147c34be5d9b9d008f 100644 (file)
@@ -3213,6 +3213,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_MOV_IMM(codegen_start_native_call, REG_ITMP1);
        M_CALL(REG_ITMP1);
 
+       /* remember class argument */
+
+       if (m->flags & ACC_STATIC)
+               M_MOV(REG_RESULT, REG_ITMP2);
+
        /* restore integer and float argument registers */
 
        for (i = 0; i < md->paramcount; i++) {
@@ -3278,7 +3283,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* put class into second argument register */
 
        if (m->flags & ACC_STATIC)
-               M_MOV_IMM(m->class, REG_A1);
+               M_MOV(REG_ITMP2, REG_A1);
 
        /* put env into first argument register */