i guess bets would be to detect that programmatically, i.e. make a function which returns struct (inside VM/plugin) and check the result, instead of relying on ifdefs..
and yes, this is a mess :) On 28 January 2013 23:58, Ciprian Teodorov <[email protected]> wrote: > Thank you guys, > > you got me started... I've submitted a quick fix... however we'll need to > write some linux tests... > > Cheers, > > > On Mon, Jan 28, 2013 at 11:20 PM, Nicolas Cellier > <[email protected]> wrote: >> >> 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 >> > > > > -- > Dr. Ciprian TEODOROV > Ingénieur Développement CAO > > tél : 06 08 54 73 48 > mail : [email protected] > www.teodorov.ro -- Best regards, Igor Stasenko.
