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.
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++) {
/* 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 */
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). */
/* 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 */
#include "native/localref.h"
#include "native/native.h"
+#include "native/include/java_lang_Class.h"
+
#include "threads/threads-common.h"
#include "vm/builtin.h"
*******************************************************************************/
-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;
/* 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;
}
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);
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 */
/* 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 */
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);
}
/* 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);
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
/* 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 */
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++) {
/* 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 */
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;
/* 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 */
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);
/* 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 */
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++) {
/* 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 */
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++) {
/* 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 */