See also this thread
http://lists.gforge.inria.fr/pipermail/pharo-project/2012-May/064140.html,
and this link http://www.shell-storm.org/papers/files/657.pdf to give
you an idea of how messy every-one-else-but-your-own low level code
can be...

Nicolas

2013/1/28 Eliot Miranda <[email protected]>:
>
>
> On Sun, Jan 27, 2013 at 2:26 PM, Ciprian Teodorov
> <[email protected]> wrote:
>>
>> Hi Guys,
>>
>> Today I wanted to test my TalkFFI project on linux, and I run into some NB
>> issue.
>> It seems that the VM crashes when trying to invoke a function returning a
>> 8 byte structure.
>> I have tried with 4 bytes structure and I get some bogus data but no crash
>> with 12 bytes structure it seems to work...
>
>
> I suspect this is a win32/linux difference that NB doesn't handle yet.  On
> win32 power-of-two structures <= 8 bytes in length are returned in
> registers.  On linux they're always returned through memory.  Here are the
> relevant defs from the ThreadedIA32FFIPlugin
>
>
> #if defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__)
> /* Both Mac OS X x86 and Win32 x86 return structs of a power of two in size
>  * less than or equal to eight bytes in length in registers. Linux never
> does so.
>  */
> # if __linux__
> # define WIN32_X86_STRUCT_RETURN 0
> # else
> # define WIN32_X86_STRUCT_RETURN 1
> # endif
>
> #define returnStructInRegisters(sz) (WIN32_X86_STRUCT_RETURN && (sz) <= 8 &&
> !((sz)&((sz)-1)))
>
>
> HTH
>
>> Attached to this mail you will find a simple test case.
>>
>> the c file I have compiled with:
>>
>> gcc -g -fPIC -Wall -c -m32 strreturn.c
>> gcc -shared -g -Wl,-soname,libret.so.1 -o libret.so -m32 strreturn.o -lc
>>
>> Cheers,
>> --
>> Dr. Ciprian TEODOROV
>> Ingénieur Développement CAO
>>
>> tél : 06 08 54 73 48
>> mail : [email protected]
>> www.teodorov.ro
>
>
>
>
> --
> best,
> Eliot

Reply via email to