From a36e7c66712406b00bb6227f625eddd8e12a57e3 Mon Sep 17 00:00:00 2001 From: edwin Date: Thu, 7 Dec 2006 22:25:42 +0000 Subject: [PATCH] * src/vm/jit/powerpc/emit.c (emit_replacement_stubs): Prepared for 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. --- src/vm/jit/alpha/emit.c | 30 ++++++++++++++++-------------- src/vm/jit/i386/emit.c | 27 ++++++++++++++++++--------- src/vm/jit/mips/emit.c | 39 ++++++++++++++++----------------------- src/vm/jit/powerpc/emit.c | 30 ++++++++++++++++-------------- src/vm/jit/x86_64/emit.c | 36 ++++++++++++++++++++++-------------- 5 files changed, 88 insertions(+), 74 deletions(-) diff --git a/src/vm/jit/alpha/emit.c b/src/vm/jit/alpha/emit.c index 133e91695..019ed4f34 100644 --- a/src/vm/jit/alpha/emit.c +++ b/src/vm/jit/alpha/emit.c @@ -468,10 +468,11 @@ void emit_replacement_stubs(jitdata *jd) codegendata *cd; codeinfo *code; rplpoint *rplp; - u1 *savedmcodeptr; s4 disp; s4 i; - u1 *outcode; +#if !defined(NDEBUG) + u1 *savedmcodeptr; +#endif /* get required compiler data */ @@ -480,24 +481,23 @@ void emit_replacement_stubs(jitdata *jd) 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 */ @@ -514,6 +514,8 @@ void emit_replacement_stubs(jitdata *jd) 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); } } diff --git a/src/vm/jit/i386/emit.c b/src/vm/jit/i386/emit.c index 424363fda..a83cc4c8a 100644 --- a/src/vm/jit/i386/emit.c +++ b/src/vm/jit/i386/emit.c @@ -26,7 +26,7 @@ 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 $ */ @@ -546,7 +546,9 @@ void emit_replacement_stubs(jitdata *jd) rplpoint *rplp; s4 disp; s4 i; - u1 *outcode; +#if !defined(NDEBUG) + u1 *savedmcodeptr; +#endif /* get required compiler data */ @@ -555,20 +557,25 @@ void emit_replacement_stubs(jitdata *jd) 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 */ @@ -578,6 +585,8 @@ void emit_replacement_stubs(jitdata *jd) M_PUSH_IMM(asm_replacement_out); M_RET; + + assert((cd->mcodeptr - savedmcodeptr) == REPLACEMENT_STUB_SIZE); } } diff --git a/src/vm/jit/mips/emit.c b/src/vm/jit/mips/emit.c index 08043a8fe..273e99684 100644 --- a/src/vm/jit/mips/emit.c +++ b/src/vm/jit/mips/emit.c @@ -667,10 +667,11 @@ void emit_replacement_stubs(jitdata *jd) codegendata *cd; codeinfo *code; rplpoint *rplp; - u1 *savedmcodeptr; s4 disp; s4 i; - u1 *outcode; +#if !defined(NDEBUG) + u1 *savedmcodeptr; +#endif /* get required compiler data */ @@ -679,33 +680,23 @@ void emit_replacement_stubs(jitdata *jd) 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 */ @@ -723,6 +714,8 @@ void emit_replacement_stubs(jitdata *jd) M_ALD(REG_ITMP3, REG_PV, disp); M_JMP(REG_ITMP3); M_NOP; /* delay slot */ + + assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE); } } diff --git a/src/vm/jit/powerpc/emit.c b/src/vm/jit/powerpc/emit.c index d95c47e0d..b6e060a5a 100644 --- a/src/vm/jit/powerpc/emit.c +++ b/src/vm/jit/powerpc/emit.c @@ -537,10 +537,11 @@ void emit_replacement_stubs(jitdata *jd) codegendata *cd; codeinfo *code; rplpoint *rplp; - u1 *savedmcodeptr; s4 disp; s4 i; - u1 *outcode; +#if !defined(NDEBUG) + u1 *savedmcodeptr; +#endif /* get required compiler data */ @@ -549,24 +550,23 @@ void emit_replacement_stubs(jitdata *jd) 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 */ @@ -584,6 +584,8 @@ void emit_replacement_stubs(jitdata *jd) M_ALD(REG_ITMP3, REG_PV, disp); M_MTCTR(REG_ITMP3); M_RTS; + + assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE); } } diff --git a/src/vm/jit/x86_64/emit.c b/src/vm/jit/x86_64/emit.c index 227f03090..d7cad9f4c 100644 --- a/src/vm/jit/x86_64/emit.c +++ b/src/vm/jit/x86_64/emit.c @@ -26,7 +26,7 @@ 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 $ */ @@ -466,7 +466,9 @@ void emit_replacement_stubs(jitdata *jd) rplpoint *rplp; s4 disp; s4 i; - u1 *outcode; +#if !defined(NDEBUG) + u1 *savedmcodeptr; +#endif /* get required compiler data */ @@ -475,33 +477,39 @@ void emit_replacement_stubs(jitdata *jd) 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 ****************************************************** -- 2.25.1