Kiyo Inaba wrote:
| >There are two problems with this code:
| >
| >1. Registers d2-d7/a2-a5 are clobbered by JIT-generated code, but are not saved
| >   here.  GCC puts automatic variables in registers, and expects them to
| >   survive function calls.  In particular, the `success' variable tested at
| >   line 464 of classMethod.c is clobbered.  This is why the static class
| >   constructor of java.lang.Runtime() "fails".
| 
| True. That is the main problem why pizza does not work. But the
| work around is simple. Just compile everything without any
| optimization. I've posted a progress report to the Kaffe porting
| database.
| 
| >2. At no point is the location of the arguments indicated to the JIT code.
| >   We build an argument vector in the automatic variable `extraargs', but
| >   we don't pass its address to the called code, so I'm not sure how the code
| >   can ever find it.
| 
| Well...
| You are right that 'extraargs' is not passed, EXPLICITLY...
| The magic is, when a function is called via 'sysdepCallMethod',
| the callee assumes "arguments are on stack". On the other hand,
| 'sysdepCallMethod' macro does not push any arguments on stack,
| explicitly. So the callee fetches the arguments from the closest
| local variables. In this case, it is 'extraargs' array, built
| on top of stack. I stole this idea from some other port (may
| be i386) and works fine for m68k.
| 
| # This magic is fully CPU and compiler dependent.

It also assumes that the arguments are located at a well-known offset from
the top of the stack.  This is not true if you save and restore d2-d7/a2-a5
as I mention above.

Since compiling with optimization off is not a solution, IMHO, I will have
to go back and rewrite the invoker if I cannot otherwise get it to work.

I find this code a bit too "cute" for my tastes.  May I suggest that when
someone makes use of the stack layout like this, that at least a comment is
put in the code, so that I don't break anything later?

Reply via email to