On Sun, Jan 27, 2013 at 2:26 PM, Ciprian Teodorov <
ciprian.teodo...@gmail.com> 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 : ciprian.teodo...@gmail.com
> www.teodorov.ro




-- 
best,
Eliot

Reply via email to