[Vm-dev] There are something fishy with FFI plugin

Esteban Lorenzano estebanlm at gmail.com
Wed Apr 25 11:30:31 UTC 2012


Hi Eliot,

Ok, after spending 2.5 days on this (but well... now I know a lot about this stuff, he), I found that the problem with our compilation is that two flags are needed: 

STACK_ALIGN_BYTES=16
ALLOCA_LIES_SO_USE_GETSP=0 //Yep, alloca is not lying here

problem is... while first flag can be set by command line, second one is setted on preamble for ThreadedFFIPlugin, then I need to change it... 

so, here my question: 

Why is working as is for you and not for us? (I think both of us are using mingw, and I installed gcc 3.4.5 to use same version as you) Do I'm missing something?

best,
Esteban

On Apr 25, 2012, at 1:20 AM, Eliot Miranda wrote:

> 
> 
> On Tue, Apr 24, 2012 at 2:53 PM, Igor Stasenko <siguctua at gmail.com> wrote:
> 
> On 24 April 2012 19:16, Torsten Bergmann <astares at gmx.de> wrote:
> >
> > Load latest from ConfigurationOfFFI from MetacellRepository:
> >
> > For me the FFIPluginTest fails with latest Pharo 1.4 VM
> > - so at least one has a reproducable case.
> >
> Esteban spent whole day today trying to find the offending bug.
> Source code match 1:1 with Eliot's code, because there was no any
> changes in it..
> still the results is that it refuses to work correctly on windoze.
> 
> You need to understand what the ThreadedFFIPlugin tries to do with alloca and that various compilers may implement alloca in a number of different ways.  You then need to look at what the compiler actually does and figure out how to subvert it to do what you want to do.
> 
> 1.  the ThreadedFFIPlugin uses alloca to stack-allocate the space for the outgoing parameters of the FFI call.  Sicne on x86 all parameters are passed on the stack and none in registers alloca is ideal.  Notionally the plugin can call alloca to extend the stack downwards (stacks grow down, the result answered by alloca is a pointer to the start of N bytes, hence it is effectively the stack pointer. If this doesn't make sense to you *draw a picture on a whiteboard* of what you expect alloca(29) to do)
> 
> 2. some C compilers are nice and implement alloca(N) as effectively stackPointer := stackPointer - roundUpTo(N,StackAlignment).  For these compilers we don't need to do anything.  Some C compilers try and be clever and answer stackPointer + 4, or something else.  In these cases we need to get the actual stack pointer.  So see the code ThreadedFFIPlugin class>>preambleCCode.
> 
> 3.  look at what the C compiler produces for the alloca call (and/or run under gdb) to see what happens to the stack pointer and what ends up in the allocation var in ffiCall:ArgArrayOrNil:NumArgs:.
> 
> 4. update ThreadedFFIPlugin class>>preambleCCode. appropriately until you've bent alloca and the C compiler to your will.
> 
> You will not make this work without trying to understand what is going on and looking at what your C compiler produces.  This is low-level hackery that aims to avoid having to write any assembler (outside of very few C asm statements).
> 
> HTH
> Eliot
> 
> 
> > Thx
> > T.
> > --
> > NEU: FreePhone 3-fach-Flat mit kostenlosem Smartphone!
> > Jetzt informieren: http://mobile.1und1.de/?ac=OM.PW.PW003K20328T7073a
> 
> 
> 
> --
> Best regards,
> Igor Stasenko.
> 
> 
> 
> -- 
> best,
> Eliot
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20120425/eb205e90/attachment.htm


More information about the Vm-dev mailing list