Hi,

JIT is currently broken on x86 Windows using optimized Visual C++ builds.

Here's the reason why.  Hopefully someone more familiar with the JIT can
pick this up.

...
04e45c9a 68f06fe604      push    4E66FF0h
04e45c9f e8370a1c0b      call    _Parrot_set_returns_pc
04e45ca4 83c404          add     esp,4
04e45ca7 68f86fe604      push    4E66FF8h
04e45cac e8e6481c0b      call    _Parrot_returncc
04e45cb1 83c404          add     esp,4
...

Both functions(C<Parrot_set_returns_pc> and C<Parrot_returncc>) take
C<opcode_t *cur_opcode, Parrot_Interp interp> as arguments.

The stack top contains a pointer to the interpreter, C<4E66FF0h> and
C<4E66FF8h> are pointers to the opcodes.

As you can see, the code is heavily optimized.  The pointer to the
interpreter is kept on the stack as it should stay the same, only the
opcode is exchanged.  *should* is the key word here.

Visual C++ seems to optimize quite heavily, and it looks like it reuses
the memory on the stack where arguments are passed for local variables.

libparrot!Parrot_set_returns_pc:
push    ebp
mov     ebp,esp

At this point, the stack looks like so.

* stack frame pointer save (ebp+0h)
* return address (ebp+4h)
* cur_opcode (ebp+8h)
* interp (ebp+Ch)

mov     eax,dword ptr [ebp+0Ch]
mov     ecx,dword ptr [eax]

ecx now contains interp.

push    esi
mov     esi,dword ptr [ebp+8]
mov     edx,dword ptr [esi+4]
push    edi
mov     edi,dword ptr [ecx+58h]
mov     edx,dword ptr [edi+edx*4]
mov     edx,dword ptr [edx+8]
mov     dword ptr [eax+0E8h],esi
mov     edi,dword ptr [ecx+3Ch]
mov     dword ptr [ebp+0Ch],edx

I won't decode above in detail here, but it's the following code.

    opcode_t * const _this = CUR_OPCODE;
    parrot_context_t *ctx;
    PMC *ccont;
    PMC *signature = $1;
    INTVAL argc;
    opcode_t *src_indexes, *dest_indexes;

    interp->current_returns = _this;
    ctx = CONTEXT(interp->ctx);
    ccont = ctx->current_cont;

Notice the last mov.  This means ccont reuses the memory previously used
by interp.  That's why returncc does not receive the correct interp.

Ron

Reply via email to