From 06a2b8142759d0c45fc2cc8de4a9e66e0e3790e5 Mon Sep 17 00:00:00 2001 From: twisti Date: Mon, 11 Dec 2006 23:29:26 +0000 Subject: [PATCH] * src/vm/jit/mips/mips/emit.c (emit_arithmetic_check): Added iptr and check INSTRUCTION_MUST_CHECK. (emit_arrayindexoutofbounds_check): Likewise. (emit_arraystore_check): Likewise. (emit_classcast_check): Likewise. (emit_nullpointer_check): Likewise. (emit_exception_check): Likewise. (emit_patcher_stubs): Likewise. * src/vm/jit/mips/mips/md.c (vm/exceptions.h): Added. * src/vm/jit/mips/mips/codegen.c (codegen): Pass iptr to exception-emit functions. * src/vm/jit/mips/mips/irix/md-os.c (vm/jit/codegen-common.h): Added. (md_signal_handler_sigsegv): Call codegen_get_pv_from_pc in error-case. --- src/vm/jit/mips/codegen.c | 172 ++++++++++++----------------------- src/vm/jit/mips/emit.c | 163 +++++++++++++++++---------------- src/vm/jit/mips/irix/md-os.c | 26 +++--- src/vm/jit/mips/md.c | 6 +- 4 files changed, 157 insertions(+), 210 deletions(-) diff --git a/src/vm/jit/mips/codegen.c b/src/vm/jit/mips/codegen.c index 68949aada..233e68a50 100644 --- a/src/vm/jit/mips/codegen.c +++ b/src/vm/jit/mips/codegen.c @@ -34,7 +34,7 @@ This module generates MIPS machine code for a sequence of intermediate code commands (ICMDs). - $Id: codegen.c 6041 2006-11-22 18:16:15Z edwin $ + $Id: codegen.c 6180 2006-12-11 23:29:26Z twisti $ */ @@ -290,8 +290,18 @@ bool codegen(jitdata *jd) disp = dseg_add_address(cd, &m->class->object.header); M_ALD(REG_A0, REG_PV, disp); } - else - emit_nullpointer_check(cd, REG_A0); + else { +/* emit_nullpointer_check(cd, iptr, REG_A0); */ + M_BNEZ(REG_A0, 6); + M_NOP; + + M_LUI(REG_ITMP3, 0); + M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); + codegen_add_nullpointerexception_ref(cd); + M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); + M_JMP(REG_ITMP3); + M_NOP; + } disp = dseg_add_functionptr(cd, LOCK_monitor_enter); M_ALD(REG_ITMP3, REG_PV, disp); @@ -402,17 +412,22 @@ bool codegen(jitdata *jd) currentline = iptr->line; } - MCODECHECK(64); /* an instruction usually needs < 64 words */ + MCODECHECK(64); /* an instruction usually needs < 64 words */ - switch (iptr->opc) { + switch (iptr->opc) { case ICMD_NOP: /* ... ==> ... */ + case ICMD_POP: /* ..., value ==> ... */ + case ICMD_POP2: /* ..., value, value ==> ... */ + break; + + break; case ICMD_CHECKNULL: /* ..., objectref ==> ..., objectref */ s1 = emit_load_s1(jd, iptr, REG_ITMP1); - emit_nullpointer_check(cd, s1); + emit_nullpointer_check(cd, iptr, s1); break; /* constant operations ************************************************/ @@ -494,15 +509,6 @@ bool codegen(jitdata *jd) break; - /* pop/dup/swap operations ********************************************/ - - /* attention: double and longs are only one entry in CACAO ICMDs */ - - case ICMD_POP: /* ..., value ==> ... */ - case ICMD_POP2: /* ..., value, value ==> ... */ - break; - - /* integer operations *************************************************/ case ICMD_INEG: /* ..., value ==> ..., - value */ @@ -712,7 +718,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - emit_arithmetic_check(cd, s2); + emit_arithmetic_check(cd, iptr, s2); M_IDIV(s1, s2); M_MFLO(d); M_NOP; @@ -725,7 +731,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - emit_arithmetic_check(cd, s2); + emit_arithmetic_check(cd, iptr, s2); M_LDIV(s1, s2); M_MFLO(d); M_NOP; @@ -738,7 +744,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - emit_arithmetic_check(cd, s2); + emit_arithmetic_check(cd, iptr, s2); M_IDIV(s1, s2); M_MFHI(d); M_NOP; @@ -751,7 +757,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - emit_arithmetic_check(cd, s2); + emit_arithmetic_check(cd, iptr, s2); M_LDIV(s1, s2); M_MFHI(d); M_NOP; @@ -1329,7 +1335,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - emit_nullpointer_check(cd, s1); + emit_nullpointer_check(cd, iptr, s1); M_ILD(d, s1, OFFSET(java_arrayheader, size)); emit_store_dst(jd, iptr, d); break; @@ -1339,10 +1345,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_AADD(s2, s1, REG_ITMP3); M_BLDS(d, REG_ITMP3, OFFSET(java_bytearray, data[0])); emit_store_dst(jd, iptr, d); @@ -1353,10 +1356,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_AADD(s2, s1, REG_ITMP3); M_AADD(s2, REG_ITMP3, REG_ITMP3); M_SLDU(d, REG_ITMP3, OFFSET(java_chararray, data[0])); @@ -1368,10 +1368,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_AADD(s2, s1, REG_ITMP3); M_AADD(s2, REG_ITMP3, REG_ITMP3); M_SLDS(d, REG_ITMP3, OFFSET(java_shortarray, data[0])); @@ -1383,10 +1380,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 2, REG_ITMP3); M_AADD(REG_ITMP3, s1, REG_ITMP3); M_ILD(d, REG_ITMP3, OFFSET(java_intarray, data[0])); @@ -1398,10 +1392,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 3, REG_ITMP3); M_AADD(REG_ITMP3, s1, REG_ITMP3); M_LLD(d, REG_ITMP3, OFFSET(java_longarray, data[0])); @@ -1413,10 +1404,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 2, REG_ITMP3); M_AADD(REG_ITMP3, s1, REG_ITMP3); M_FLD(d, REG_ITMP3, OFFSET(java_floatarray, data[0])); @@ -1428,10 +1416,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 3, REG_ITMP3); M_AADD(REG_ITMP3, s1, REG_ITMP3); M_DLD(d, REG_ITMP3, OFFSET(java_doublearray, data[0])); @@ -1443,10 +1428,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, POINTERSHIFT, REG_ITMP3); M_AADD(REG_ITMP3, s1, REG_ITMP3); M_ALD(d, REG_ITMP3, OFFSET(java_objectarray, data[0])); @@ -1458,10 +1440,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_AADD(s2, s1, REG_ITMP1); s3 = emit_load_s3(jd, iptr, REG_ITMP3); M_BST(s3, REG_ITMP1, OFFSET(java_bytearray, data[0])); @@ -1472,10 +1451,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_AADD(s2, s1, REG_ITMP1); M_AADD(s2, REG_ITMP1, REG_ITMP1); s3 = emit_load_s3(jd, iptr, REG_ITMP3); @@ -1486,10 +1462,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 2, REG_ITMP2); M_AADD(REG_ITMP2, s1, REG_ITMP1); s3 = emit_load_s3(jd, iptr, REG_ITMP3); @@ -1500,10 +1473,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 3, REG_ITMP2); M_AADD(REG_ITMP2, s1, REG_ITMP1); s3 = emit_load_s3(jd, iptr, REG_ITMP3); @@ -1514,10 +1484,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 2, REG_ITMP2); M_AADD(REG_ITMP2, s1, REG_ITMP1); s3 = emit_load_s3(jd, iptr, REG_FTMP1); @@ -1528,10 +1495,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 3, REG_ITMP2); M_AADD(REG_ITMP2, s1, REG_ITMP1); s3 = emit_load_s3(jd, iptr, REG_FTMP1); @@ -1543,10 +1507,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); s3 = emit_load_s3(jd, iptr, REG_ITMP3); M_MOV(s1, REG_A0); @@ -1559,7 +1520,7 @@ bool codegen(jitdata *jd) /* M_BEQZ(REG_RESULT, 0); */ /* codegen_add_arraystoreexception_ref(cd); */ /* M_NOP; */ - emit_arraystore_check(cd, REG_RESULT); + emit_arraystore_check(cd, iptr, REG_RESULT); s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); @@ -1574,10 +1535,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_AADD(s2, s1, REG_ITMP1); M_BST(REG_ZERO, REG_ITMP1, OFFSET(java_bytearray, data[0])); break; @@ -1587,10 +1545,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_AADD(s2, s1, REG_ITMP1); M_AADD(s2, REG_ITMP1, REG_ITMP1); M_SST(REG_ZERO, REG_ITMP1, OFFSET(java_chararray, data[0])); @@ -1600,10 +1555,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 2, REG_ITMP2); M_AADD(REG_ITMP2, s1, REG_ITMP1); M_IST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_intarray, data[0])); @@ -1613,10 +1565,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, 3, REG_ITMP2); M_AADD(REG_ITMP2, s1, REG_ITMP1); M_LST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_longarray, data[0])); @@ -1626,10 +1575,7 @@ bool codegen(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_ITMP1); s2 = emit_load_s2(jd, iptr, REG_ITMP2); - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_nullpointer_check(cd, s1); - emit_arrayindexoutofbounds_check(cd, s1, s2); - } + emit_array_checks(cd, iptr, s1, s2); M_ASLL_IMM(s2, POINTERSHIFT, REG_ITMP2); M_AADD(REG_ITMP2, s1, REG_ITMP1); M_AST_INTERN(REG_ZERO, REG_ITMP1, OFFSET(java_objectarray, data[0])); @@ -1770,7 +1716,7 @@ bool codegen(jitdata *jd) case ICMD_GETFIELD: /* ... ==> ..., value */ s1 = emit_load_s1(jd, iptr, REG_ITMP1); - emit_nullpointer_check(cd, s1); + emit_nullpointer_check(cd, iptr, s1); if (INSTRUCTION_IS_UNRESOLVED(iptr)) { uf = iptr->sx.s23.s3.uf; @@ -1813,7 +1759,7 @@ bool codegen(jitdata *jd) case ICMD_PUTFIELD: /* ..., objectref, value ==> ... */ s1 = emit_load_s1(jd, iptr, REG_ITMP1); - emit_nullpointer_check(cd, s1); + emit_nullpointer_check(cd, iptr, s1); if (INSTRUCTION_IS_UNRESOLVED(iptr)) { uf = iptr->sx.s23.s3.uf; @@ -1856,7 +1802,7 @@ bool codegen(jitdata *jd) case ICMD_PUTFIELDCONST: /* ..., objectref ==> ... */ s1 = emit_load_s1(jd, iptr, REG_ITMP1); - emit_nullpointer_check(cd, s1); + emit_nullpointer_check(cd, iptr, s1); if (INSTRUCTION_IS_UNRESOLVED(iptr)) { unresolved_field *uf = iptr->sx.s23.s3.uf; @@ -2551,7 +2497,7 @@ gen_method: break; case ICMD_INVOKEVIRTUAL: - emit_nullpointer_check(cd, REG_A0); + emit_nullpointer_check(cd, iptr, REG_A0); if (lm == NULL) { codegen_add_patch_ref(cd, PATCHER_invokevirtual, um, 0); @@ -2568,7 +2514,7 @@ gen_method: break; case ICMD_INVOKEINTERFACE: - emit_nullpointer_check(cd, REG_A0); + emit_nullpointer_check(cd, iptr, REG_A0); if (lm == NULL) { codegen_add_patch_ref(cd, PATCHER_invokeinterface, um, 0); @@ -2599,9 +2545,7 @@ gen_method: /* actually only used for ICMD_BUILTIN */ - if (INSTRUCTION_MUST_CHECK(iptr)) { - emit_exception_check(cd); - } + emit_exception_check(cd, iptr); /* store return value */ @@ -2710,12 +2654,12 @@ gen_method: M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, interfacetablelength)); M_IADD_IMM(REG_ITMP3, -superindex, REG_ITMP3); - emit_classcast_check(cd, ICMD_IFLE, REG_ITMP3, s1); + emit_classcast_check(cd, iptr, ICMD_IFLE, REG_ITMP3, s1); M_ALD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, interfacetable[0]) - superindex * sizeof(methodptr*)); - emit_classcast_check(cd, ICMD_IFEQ, REG_ITMP3, s1); + emit_classcast_check(cd, iptr, ICMD_IFEQ, REG_ITMP3, s1); if (super == NULL) { M_BR(1 + s3); @@ -2764,7 +2708,7 @@ gen_method: #endif /* } */ M_CMPULT(REG_ITMP3, REG_ITMP2, REG_ITMP3); - emit_classcast_check(cd, ICMD_IFNE, REG_ITMP3, s1); + emit_classcast_check(cd, iptr, ICMD_IFNE, REG_ITMP3, s1); } d = codegen_reg_of_dst(jd, iptr, s1); @@ -2790,7 +2734,7 @@ gen_method: M_NOP; s1 = emit_load_s1(jd, iptr, REG_ITMP1); - emit_classcast_check(cd, ICMD_IFEQ, REG_RESULT, s1); + emit_classcast_check(cd, iptr, ICMD_IFEQ, REG_RESULT, s1); d = codegen_reg_of_dst(jd, iptr, s1); } @@ -2990,7 +2934,7 @@ gen_method: /* check for exception before result assignment */ - emit_exception_check(cd); + emit_exception_check(cd, iptr); d = codegen_reg_of_dst(jd, iptr, REG_RESULT); M_INTMOVE(REG_RESULT, d); diff --git a/src/vm/jit/mips/emit.c b/src/vm/jit/mips/emit.c index 7f1215d69..1f64afe1f 100644 --- a/src/vm/jit/mips/emit.c +++ b/src/vm/jit/mips/emit.c @@ -223,23 +223,25 @@ void emit_lconst(codegendata *cd, s4 d, s8 value) *******************************************************************************/ -void emit_arithmetic_check(codegendata *cd, s4 reg) +void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg) { + if (INSTRUCTION_MUST_CHECK(iptr)) { #if 0 - M_BEQZ(reg, 0); - codegen_add_arithmeticexception_ref(cd); - M_NOP; + M_BEQZ(reg, 0); + codegen_add_arithmeticexception_ref(cd); + M_NOP; #else - M_BNEZ(reg, 6); - M_NOP; + M_BNEZ(reg, 6); + M_NOP; - M_LUI(REG_ITMP3, 0); - M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); - codegen_add_arithmeticexception_ref(cd); - M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); - M_JMP(REG_ITMP3); - M_NOP; + M_LUI(REG_ITMP3, 0); + M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); + codegen_add_arithmeticexception_ref(cd); + M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); + M_JMP(REG_ITMP3); + M_NOP; #endif + } } @@ -249,9 +251,9 @@ void emit_arithmetic_check(codegendata *cd, s4 reg) *******************************************************************************/ -void emit_arrayindexoutofbounds_check(codegendata *cd, s4 s1, s4 s2) +void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2) { - if (checkbounds) { + if (INSTRUCTION_MUST_CHECK(iptr)) { M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size)); M_CMPULT(s2, REG_ITMP3, REG_ITMP3); @@ -280,23 +282,25 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, s4 s1, s4 s2) *******************************************************************************/ -void emit_arraystore_check(codegendata *cd, s4 reg) +void emit_arraystore_check(codegendata *cd, instruction *iptr, s4 reg) { + if (INSTRUCTION_MUST_CHECK(iptr)) { #if 0 - M_BEQZ(reg, 0); - codegen_add_arraystoreexception_ref(cd); - M_NOP; + M_BEQZ(reg, 0); + codegen_add_arraystoreexception_ref(cd); + M_NOP; #else - M_BNEZ(reg, 6); - M_NOP; + M_BNEZ(reg, 6); + M_NOP; - M_LUI(REG_ITMP3, 0); - M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); - codegen_add_arraystoreexception_ref(cd); - M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); - M_JMP(REG_ITMP3); - M_NOP; + M_LUI(REG_ITMP3, 0); + M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); + codegen_add_arraystoreexception_ref(cd); + M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); + M_JMP(REG_ITMP3); + M_NOP; #endif + } } @@ -306,39 +310,41 @@ void emit_arraystore_check(codegendata *cd, s4 reg) *******************************************************************************/ -void emit_classcast_check(codegendata *cd, s4 condition, s4 reg, s4 s1) +void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1) { + if (INSTRUCTION_MUST_CHECK(iptr)) { #if 0 - M_BNEZ(reg, 0); - codegen_add_classcastexception_ref(cd, s1); - M_NOP; + M_BNEZ(reg, 0); + codegen_add_classcastexception_ref(cd, s1); + M_NOP; #else - switch (condition) { - case ICMD_IFEQ: - M_BNEZ(reg, 6); - break; + switch (condition) { + case ICMD_IFEQ: + M_BNEZ(reg, 6); + break; - case ICMD_IFNE: - M_BEQZ(reg, 6); - break; + case ICMD_IFNE: + M_BEQZ(reg, 6); + break; - case ICMD_IFLE: - M_BGTZ(reg, 6); - break; + case ICMD_IFLE: + M_BGTZ(reg, 6); + break; - default: - vm_abort("emit_classcast_check: condition %d not found", condition); - } + default: + vm_abort("emit_classcast_check: condition %d not found", condition); + } - M_NOP; + M_NOP; - M_LUI(REG_ITMP3, 0); - M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); - codegen_add_classcastexception_ref(cd, s1); - M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); - M_JMP(REG_ITMP3); - M_NOP; + M_LUI(REG_ITMP3, 0); + M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); + codegen_add_classcastexception_ref(cd, s1); + M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); + M_JMP(REG_ITMP3); + M_NOP; #endif + } } @@ -348,9 +354,9 @@ void emit_classcast_check(codegendata *cd, s4 condition, s4 reg, s4 s1) *******************************************************************************/ -void emit_nullpointer_check(codegendata *cd, s4 reg) +void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg) { - if (checknull) { + if (INSTRUCTION_MUST_CHECK(iptr)) { #if 0 M_BEQZ(reg, 0); codegen_add_nullpointerexception_ref(cd); @@ -376,23 +382,25 @@ void emit_nullpointer_check(codegendata *cd, s4 reg) *******************************************************************************/ -void emit_exception_check(codegendata *cd) +void emit_exception_check(codegendata *cd, instruction *iptr) { + if (INSTRUCTION_MUST_CHECK(iptr)) { #if 0 - M_BEQZ(REG_RESULT, 0); - codegen_add_fillinstacktrace_ref(cd); - M_NOP; + M_BEQZ(REG_RESULT, 0); + codegen_add_fillinstacktrace_ref(cd); + M_NOP; #else - M_BNEZ(REG_RESULT, 6); - M_NOP; + M_BNEZ(REG_RESULT, 6); + M_NOP; - M_LUI(REG_ITMP3, 0); - M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); - codegen_add_fillinstacktrace_ref(cd); - M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); - M_JMP(REG_ITMP3); - M_NOP; + M_LUI(REG_ITMP3, 0); + M_OR_IMM(REG_ITMP3, 0, REG_ITMP3); + codegen_add_fillinstacktrace_ref(cd); + M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); + M_JMP(REG_ITMP3); + M_NOP; #endif + } } @@ -508,8 +516,6 @@ void emit_patcher_stubs(jitdata *jd) u1 *tmpmcodeptr; s4 targetdisp; s4 disp; - s4 hi; - s4 lo; /* get required compiler data */ @@ -550,27 +556,24 @@ void emit_patcher_stubs(jitdata *jd) disp = ((u4 *) savedmcodeptr) - (((u4 *) tmpmcodeptr) + 1); - if ((disp < (s4) 0xffff8000) || (disp > (s4) 0x00007fff)) { +/* if ((disp < (s4) 0xffff8000) || (disp > (s4) 0x00007fff)) { */ /* Recalculate the displacement to be relative to PV. */ disp = savedmcodeptr - cd->mcodebase; - lo = (short) disp; - hi = (short) ((disp - lo) >> 16); - - M_LUI(REG_ITMP3, hi); - M_OR_IMM(REG_ITMP3, lo, REG_ITMP3); + M_LUI(REG_ITMP3, disp >> 16); + M_OR_IMM(REG_ITMP3, disp, REG_ITMP3); M_AADD(REG_PV, REG_ITMP3, REG_ITMP3); M_JMP(REG_ITMP3); M_NOP; - } - else { - M_BR(disp); - M_NOP; - M_NOP; - M_NOP; - M_NOP; - } +/* } */ +/* else { */ +/* M_BR(disp); */ +/* M_NOP; */ +/* M_NOP; */ +/* M_NOP; */ +/* M_NOP; */ +/* } */ cd->mcodeptr = savedmcodeptr; /* restore the current mcodeptr */ diff --git a/src/vm/jit/mips/irix/md-os.c b/src/vm/jit/mips/irix/md-os.c index 9b3ecfdba..dfdd500f9 100644 --- a/src/vm/jit/mips/irix/md-os.c +++ b/src/vm/jit/mips/irix/md-os.c @@ -26,10 +26,9 @@ Authors: Andreas Krall Reinhard Grafl + Christian Thalinger - Changes: Christian Thalinger - - $Id: md-os.c 5900 2006-11-04 17:30:44Z michi $ + $Id: md-os.c 6180 2006-12-11 23:29:26Z twisti $ */ @@ -50,6 +49,7 @@ #include "vm/signallocal.h" #include "vm/stringlocal.h" #include "vm/jit/asmpart.h" +#include "vm/jit/codegen-common.h" #include "vm/jit/stacktrace.h" @@ -101,27 +101,27 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p) _uc = (struct ucontext *) _p; _mc = &_uc->uc_mcontext; + pv = (u1 *) _mc->gregs[REG_PV]; + sp = (u1 *) _mc->gregs[REG_SP]; + ra = (u1 *) _mc->gregs[REG_RA]; /* this is correct for leafs */ + xpc = (u1 *) _mc->gregs[CTX_EPC]; + instr = *((u4 *) (_mc->gregs[CTX_EPC])); addr = _mc->gregs[(instr >> 21) & 0x1f]; if (addr == 0) { - pv = (u1 *) _mc->gregs[REG_PV]; - sp = (u1 *) _mc->gregs[REG_SP]; - ra = (u1 *) _mc->gregs[REG_RA]; /* this is correct for leafs */ - xpc = (u1 *) _mc->gregs[CTX_EPC]; - _mc->gregs[REG_ITMP1_XPTR] = (ptrint) stacktrace_hardware_nullpointerexception(pv, sp, ra, xpc); _mc->gregs[REG_ITMP2_XPC] = (ptrint) xpc; _mc->gregs[CTX_EPC] = (ptrint) asm_handle_exception; + } + else { + codegen_get_pv_from_pc(xpc); - } else { - addr += (long) ((instr << 16) >> 16); + /* this should not happen */ - throw_cacao_exception_exit(string_java_lang_InternalError, - "faulting address: 0x%lx at 0x%lx\n", - addr, _mc->gregs[CTX_EPC]); + assert(0); } } diff --git a/src/vm/jit/mips/md.c b/src/vm/jit/mips/md.c index 38814713f..e9eed202b 100644 --- a/src/vm/jit/mips/md.c +++ b/src/vm/jit/mips/md.c @@ -25,10 +25,9 @@ Contact: cacao@cacaojvm.org Authors: Christian Thalinger + Edwin Steiner - Changes: Edwin Steiner - - $Id: md.c 6142 2006-12-07 23:02:52Z edwin $ + $Id: md.c 6180 2006-12-11 23:29:26Z twisti $ */ @@ -42,6 +41,7 @@ #include "vm/types.h" #include "toolbox/logging.h" +#include "vm/exceptions.h" #include "vm/global.h" #include "vm/vm.h" #include "vm/jit/stacktrace.h" -- 2.25.1