[Pharo-project] NativeBoost linux 8 byte structures
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... 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.teodorov@gmail.com www.teodorov.ro
On Sun, Jan 27, 2013 at 2:26 PM, Ciprian Teodorov < ciprian.teodorov@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.teodorov@gmail.com www.teodorov.ro
-- best, Eliot
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 <eliot.miranda@gmail.com>:
On Sun, Jan 27, 2013 at 2:26 PM, Ciprian Teodorov <ciprian.teodorov@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.teodorov@gmail.com www.teodorov.ro
-- best, Eliot
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 < nicolas.cellier.aka.nice@gmail.com> 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 <eliot.miranda@gmail.com>:
On Sun, Jan 27, 2013 at 2:26 PM, Ciprian Teodorov <ciprian.teodorov@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.teodorov@gmail.com www.teodorov.ro
-- best, Eliot
-- Dr. Ciprian TEODOROV Ingénieur Développement CAO tél : 06 08 54 73 48 mail : ciprian.teodorov@gmail.com www.teodorov.ro
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 <ciprian.teodorov@gmail.com> 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 <nicolas.cellier.aka.nice@gmail.com> 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 <eliot.miranda@gmail.com>:
On Sun, Jan 27, 2013 at 2:26 PM, Ciprian Teodorov <ciprian.teodorov@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.teodorov@gmail.com www.teodorov.ro
-- best, Eliot
-- Dr. Ciprian TEODOROV Ingénieur Développement CAO
tél : 06 08 54 73 48 mail : ciprian.teodorov@gmail.com www.teodorov.ro
-- Best regards, Igor Stasenko.
participants (4)
-
Ciprian Teodorov -
Eliot Miranda -
Igor Stasenko -
Nicolas Cellier