removal of rplpoint.mcode.
* src/vm/jit/alpha/emit.c: Likewise.
* src/vm/jit/mips/emit.c: Likewise.
* src/vm/jit/i386/emit.c: Likewise.
* src/vm/jit/x86_64/emit.c: Likewise.
codegendata *cd;
codeinfo *code;
rplpoint *rplp;
- u1 *savedmcodeptr;
s4 disp;
s4 i;
- u1 *outcode;
+#if !defined(NDEBUG)
+ u1 *savedmcodeptr;
+#endif
/* get required compiler data */
rplp = code->rplpoints;
- for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
- /* check code segment size */
-
- MCODECHECK(100);
+ /* store beginning of replacement stubs */
- /* note start of stub code */
+ code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
- outcode = (u1 *) (ptrint) (cd->mcodeptr - cd->mcodebase);
+ for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
+ /* do not generate stubs for non-trappable points */
- /* make machine code for patching */
+ if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
+ continue;
- savedmcodeptr = cd->mcodeptr;
- cd->mcodeptr = (u1 *) &(rplp->mcode);
+ /* check code segment size */
- disp = (ptrint) ((s4 *) outcode - (s4 *) rplp->pc) - 1;
- M_BR(disp);
+ MCODECHECK(100);
- cd->mcodeptr = savedmcodeptr;
+#if !defined(NDEBUG)
+ savedmcodeptr = cd->mcodeptr;
+#endif
/* create stack frame - 16-byte aligned */
disp = dseg_add_functionptr(cd, asm_replacement_out);
M_ALD(REG_ITMP3, REG_PV, disp);
M_JMP(REG_ZERO, REG_ITMP3);
+
+ assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
}
}
Authors: Christian Thalinger
- $Id: emit.c 6136 2006-12-07 22:19:12Z edwin $
+ $Id: emit.c 6137 2006-12-07 22:25:42Z edwin $
*/
rplpoint *rplp;
s4 disp;
s4 i;
- u1 *outcode;
+#if !defined(NDEBUG)
+ u1 *savedmcodeptr;
+#endif
/* get required compiler data */
rplp = code->rplpoints;
+ /* store beginning of replacement stubs */
+
+ code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
+
for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
+ /* do not generate stubs for non-trappable points */
+
+ if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
+ continue;
+
/* check code segment size */
MCODECHECK(512);
/* note start of stub code */
- outcode = (u1 *) (ptrint) (cd->mcodeptr - cd->mcodebase);
-
- /* make machine code for patching */
-
- disp = (ptrint) (outcode - rplp->pc) - 5;
-
- rplp->mcode = 0xe9 | ((u8) disp << 8);
+#if !defined(NDEBUG)
+ savedmcodeptr = cd->mcodeptr;
+#endif
/* push address of `rplpoint` struct */
M_PUSH_IMM(asm_replacement_out);
M_RET;
+
+ assert((cd->mcodeptr - savedmcodeptr) == REPLACEMENT_STUB_SIZE);
}
}
codegendata *cd;
codeinfo *code;
rplpoint *rplp;
- u1 *savedmcodeptr;
s4 disp;
s4 i;
- u1 *outcode;
+#if !defined(NDEBUG)
+ u1 *savedmcodeptr;
+#endif
/* get required compiler data */
rplp = code->rplpoints;
- for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
- /* check code segment size */
+ /* store beginning of replacement stubs */
- MCODECHECK(100);
-
- /* note start of stub code */
-
- outcode = (u1 *) (ptrint) (cd->mcodeptr - cd->mcodebase);
+ code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
- /* make machine code for patching */
-
- savedmcodeptr = cd->mcodeptr;
- cd->mcodeptr = (u1 *) &(rplp->mcode);
+ for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
+ /* do not generate stubs for non-trappable points */
- disp = (ptrint) ((s4 *) outcode - (s4 *) rplp->pc) - 1;
+ if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
+ continue;
- if ((disp < (s4) 0xffff8000) || (disp > (s4) 0x00007fff)) {
- *exceptionptr =
- new_internalerror("Jump offset is out of range: %d > +/-%d",
- disp, 0x00007fff);
- return;
- }
+ /* check code segment size */
- M_BR(disp);
- M_NOP; /* delay slot */
+ MCODECHECK(100);
- cd->mcodeptr = savedmcodeptr;
+#if !defined(NDEBUG)
+ savedmcodeptr = cd->mcodeptr;
+#endif
/* create stack frame - 16-byte aligned */
M_ALD(REG_ITMP3, REG_PV, disp);
M_JMP(REG_ITMP3);
M_NOP; /* delay slot */
+
+ assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
}
}
codegendata *cd;
codeinfo *code;
rplpoint *rplp;
- u1 *savedmcodeptr;
s4 disp;
s4 i;
- u1 *outcode;
+#if !defined(NDEBUG)
+ u1 *savedmcodeptr;
+#endif
/* get required compiler data */
rplp = code->rplpoints;
- for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
- /* check code segment size */
-
- MCODECHECK(100);
+ /* store beginning of replacement stubs */
- /* note start of stub code */
+ code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
- outcode = (u1 *) (cd->mcodeptr - cd->mcodebase);
+ for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
+ /* do not generate stubs for non-trappable points */
- /* make machine code for patching */
+ if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
+ continue;
- savedmcodeptr = cd->mcodeptr;
- cd->mcodeptr = (u1 *) &(rplp->mcode) + 1; /* big-endian */
+ /* check code segment size */
- disp = (ptrint) ((s4 *) outcode - (s4 *) rplp->pc) - 1;
- M_BR(disp);
+ MCODECHECK(100);
- cd->mcodeptr = savedmcodeptr;
+#if !defined(NDEBUG)
+ savedmcodeptr = cd->mcodeptr;
+#endif
/* create stack frame - keep 16-byte aligned */
M_ALD(REG_ITMP3, REG_PV, disp);
M_MTCTR(REG_ITMP3);
M_RTS;
+
+ assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
}
}
Authors: Christian Thalinger
- $Id: emit.c 6136 2006-12-07 22:19:12Z edwin $
+ $Id: emit.c 6137 2006-12-07 22:25:42Z edwin $
*/
rplpoint *rplp;
s4 disp;
s4 i;
- u1 *outcode;
+#if !defined(NDEBUG)
+ u1 *savedmcodeptr;
+#endif
/* get required compiler data */
rplp = code->rplpoints;
+ /* store beginning of replacement stubs */
+
+ code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
+
for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
+ /* do not generate stubs for non-trappable points */
+
+ if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
+ continue;
+
/* check code segment size */
MCODECHECK(512);
/* note start of stub code */
- outcode = (u1 *) (ptrint) (cd->mcodeptr - cd->mcodebase);
-
- /* make machine code for patching */
-
- disp = (ptrint) (outcode - rplp->pc) - 5;
-
- rplp->mcode = 0xe9 | ((u8) disp << 8);
+#if !defined(NDEBUG)
+ savedmcodeptr = cd->mcodeptr;
+#endif
/* push address of `rplpoint` struct */
- M_MOV_IMM(rplp, REG_ITMP3);
- M_PUSH(REG_ITMP3);
+ M_PUSH_IMM(rplp);
/* jump to replacement function */
- M_MOV_IMM(asm_replacement_out, REG_ITMP3);
- M_JMP(REG_ITMP3);
+ M_PUSH_IMM(asm_replacement_out);
+ M_RET;
+
+ assert((cd->mcodeptr - savedmcodeptr) == REPLACEMENT_STUB_SIZE);
}
}
-
+
/* emit_verbosecall_enter ******************************************************