Hi Zoltan,

I'm a little confused – maybe I'm misunderstanding you, but the JIT does just subtract a fixed amount from the stack pointer on entry (28 on x86, for a total frame size including return address, caller frame pointer and callee preserved registers of 48, a multiple of 16 to preserve stack alignment). All JIT code then runs at the same stack depth. The only pops in the JIT are simply removing the the return address implicitly pushed on x86, and the only pushes (bar a function call in put property access transition realloc) are restoring the return address prior to a return (or a tail call). It is not clear to me what you're envisaging 'fake_sp' would be used for.

I've just landed a patch to move the pushes & pops in wrapper functions, and to switch put transition realloc to use a regular function call, hopefully this tidies things up a little.

cheers,
G.


On Jun 4, 2009, at 1:19 AM, Zoltan Herczeg wrote:

Hi,

actually there was a bug which took me a day to find out what happened. It
was somewhere deep in libc, called by a function in DateMath.cpp. It
seemed that the stack was overwritten. By libc??? I can't belive it.
Finally I realized that gcc's alloca realigned the stack (to 8 bytes on
ARM), so everything was in a wrong place (looked overwritten at first
sight).

My fake stack pointer idea:
fake_sp: any non-volatile general purpose register

JIT_entry:
 mov fake_sp, sp
 sub sp, sp, 32   ; I belive this is enough for the JIT,
                  ; correct me if I am wrong
 ; use fake_sp instead of sp for push/pops

JIT_leava:
 add sp, sp, 32

I hope this even works for PPC (if someone ever wants to port the JIT to
old macs).

Zoltan

Zoltan,
I filed a bug here: https://bugs.webkit.org/show_bug.cgi?id=26164
Stack is originally aligned then jit code destroys it; and, some data
structure or point to double is not aligned and I'm still trying to find
where they are.
I'm not sure how the fake stack would be, would you mind explains a bit
more?
Did you face same problem?
Thanks also for your articles that gives new ideas.
rgds
joe

--- On Wed, 6/3/09, Zoltan Herczeg <[email protected]> wrote:

From: Zoltan Herczeg <[email protected]>
Subject: Re: [webkit-dev] stack alignment bug
To: "x yz" <[email protected]>
Cc: [email protected]
Date: Wednesday, June 3, 2009, 7:35 PM
Hi,

true, some architectures have strict policies for stack
handling. Perhaps
the worst one is PowerPC with its organized stack frame
(back chains,
pre-defined register save areas, etc). I think a fake stack
pointer for
JIT can solve the x86 compatibility problem.

1) allocate enough aligned stack space for the worst case
when you enter
to JIT
2) the fake stack pointer should use this pre-allocated
stack frame.

Zoltan

I don't know how to file bug so I posted here.
In privateCompileCTIMachineTrampolines() there are
multiple align() to
align code on 16byte margin, yet, the stack can be put
on 32bit margin
that causes crush.
Suppose original stack is aligned to 8/16bytes, the
above function
frequently pop/push regT3 that makes stack
mis-aligned. Then int to double
conversion uses stack that will fail.
rgds
joe


_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

Reply via email to