[Vm-dev] [Pharo-dev] FFICallback crashes windows spur i386 vm

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Tue Jan 17 21:03:56 UTC 2017


2017-01-17 19:43 GMT+01:00 Eliot Miranda <eliot.miranda at gmail.com>:

>
> Hi Nicolas, Hi Esteban,
>
>     so is it feasible to insist on clang?  The mingw compiler is ancient,
> so my preference is to move to clang.  If so, could someone update the
> HowToBuild to describe the problem with mingw and how to install the
> clang-based toolchain?
>
>
Hi Eliot,
from a recent cygwin, it's simple, detect the clang packages among:

https://cygwin.com/cgi-bin2/package-grep.cgi?grep=clang&

then load:
mingw64-i686-clang-3.8.1-1
<https://cygwin.com/cgi-bin2/package-cat.cgi?file=x86_64%2Fmingw64-i686-clang%2Fmingw64-i686-clang-3.8.1-1&grep=clang>
for 32 bits
mingw64-x86_64-clang-3.8.1-1
<https://cygwin.com/cgi-bin2/package-cat.cgi?file=x86_64%2Fmingw64-x86_64-clang%2Fmingw64-x86_64-clang-3.8.1-1&grep=clang>
for 64 bits

https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/.appveyor.yml
contains an example for installing such package from a cygwin setup command
line.

Note: it does not matter whether a 32bits or 64bits cygwin is installed,
those packages enable cross-compilation.
However, it matters for gdb if ever we have to debug at such low level...


AFAIU, Pharo depends on extra libs that have no builtin cygwin compilation
support, so Esteban is using mingw/msys.
I don't know how to install clang on such brand (except recompiling from
sources which is not super for a bot like appveyor)
Maybe Esteban has a solution?



> On Tue, Jan 17, 2017 at 6:47 AM, Nicolas Cellier <
> nicolas.cellier.aka.nice at gmail.com> wrote:
>
>>
>> I've reproduced the crash in squeak.stack.spur Win32 with latest vm
>> sources (SHA aa11221d9ebb5d60b0b88a2f1f8e27f19909d718)
>> This crashing VM is compiled with gcc via ./mvm -f
>>
>> The Win64 version passes correctly. But it is compiled with clang by
>> default.
>> The Win32 compiled with clang also passes correctly for me.
>>
>> The test is translated in pure Alien for purpose of testing on Squeak 5.0
>> (see instructions below).
>>
>> --------------------------------------------------------------
>>
>> from cygwin (or cygwin64) shell:
>>
>> $ i686-w64-mingw32-gcc --version
>> i686-w64-mingw32-gcc (GCC) 5.4.0
>> Copyright (C) 2015 Free Software Foundation, Inc.
>> This is free software; see the source for copying conditions.  There is NO
>> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
>> PURPOSE.
>>
>> $ i686-w64-mingw32-clang --version
>> clang version 3.8.1 (tags/RELEASE_381/final)
>> Target: i686-w64-windows-gnu
>> Thread model: posix
>> InstalledDir: /usr/bin
>>
>> $ x86_64-w64-mingw32-clang --version
>> clang version 3.8.1 (tags/RELEASE_381/final)
>> Target: x86_64-w64-windows-gnu
>> Thread model: posix
>> InstalledDir: /usr/bin
>>
>> --------------------------------------------------------------
>>
>> $ cd build.win32x86/squeak.stack.spur
>> $ ./mvm -f -- CC=i686-w64-mingw32-clang
>>
>> or for 64 bits:
>>
>> $ cd build.win64x64/squeak.stack.spur
>> $ ./mvm -f
>>
>> --------------------------------------------------------------
>>
>> $ cat >test.c << END
>> #include "stdint.h"
>> int8_t test(int8_t(*function)(int8_t), int8_t value) {
>>        return function(value);
>>     }
>> END
>>
>> $ i686-w64-mingw32-clang -c test.c
>> $ i686-w64-mingw32-clang -shared -o build/vm/test.dll test.o
>> $ build/vm/Squeak.exe
>>
>> --------------------------------------------------------------
>>
>> then from Smalltalk image with Alien properly loaded (Alien-eem.39):
>>
>> Callback>>int8RetInt8: callbackContext regs: regsAlien
>>     <signature: #(int8 (*)(int8))>
>>     ^callbackContext wordResult:
>>         (block value: (regsAlien signedCharAt: 1) asInteger)
>>
>> (for now, above method must be compiled in each Callback subclass since
>> we do not ask Pragma to scan superclass for signatures)
>>
>> TestCase subclass: #AlienCallbackSunit
>>     instanceVariableNames: ''
>>     classVariableNames: ''
>>     poolDictionaries: ''
>>     category: 'Alien-CoreTest'
>>
>> AlienCallbackSunit>>createCallback
>>        ^Callback
>>           signature: #(int8 (*)(int8))
>>           block: [ :value | value ]
>>
>> AlienCallbackSunit>>primCall: aCallback int8: aNumber
>>        | r |
>>     (Alien lookup: 'test'  inLibrary: 'test.dll')
>>         primFFICallResult: (r := Alien new: 1)
>>         with: aCallback thunk
>>         with: aNumber.
>>     ^(r signedCharAt: 1) asInteger
>>
>> AlienCallbackSunit>>test
>>       self
>>         assert: (self primCall: self createCallback int8: 0)
>>         equals: 0
>>
>> AlienCallbackSunit new test.
>>
>>
>> 2017-01-14 2:53 GMT+01:00 Eliot Miranda <eliot.miranda at gmail.com>:
>>
>>> Hi Aliaksei,
>>>
>>> On Jan 13, 2017, at 10:27 AM, Aliaksei Syrel <alex.syrel at gmail.com>
>>> wrote:
>>>
>>> Hi
>>>
>>> The following code crashes windows spur32 VM without crash.dmp:
>>> (crashes not only in case of int8, but ulong, int16/32 and so on...)
>>>
>>> Callback instantiation:
>>>
>>> createCallback
>>>>    ^ FFICallback
>>>>   signature: #(int8 (int8))
>>>>   block: [ :value | value ]
>>>
>>>
>>> C function:
>>>
>>> int8_t test(int8_t(*function)(int8_t), int8_t value) {
>>>>    return function(value);
>>>> }
>>>
>>>
>>> FFI call:
>>>
>>> primCall: aCallback int8: aNumber
>>>>    ^ self ffiCall: #(int8 test(FFICallback aCallback, int8 aNumber))
>>>
>>>
>>> Test case:
>>>
>>> test
>>>>   self
>>>>     assert: (self primCall: self createCallback int8: 0)
>>>>     equals: 0
>>>
>>>
>>>
>>> Windows 10.
>>> VM from today:
>>> http://files.pharo.org/vm/pharo-spur32/win/pharo-win-i386-20
>>> 1701130756-83c0ef1.zip
>>> Image 60343:
>>> http://files.pharo.org/image/60/60343.zip
>>>
>>> P.S. what is the best place to report FFI / Alien issues?
>>>
>>>
>>> vm-dev
>>>
>>> P.P.S Iceberg works
>>>
>>> Cheers,
>>> Alex
>>>
>>>
>>
>>
>
>
> --
> _,,,^..^,,,_
> best, Eliot
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20170117/7947f485/attachment.html>


More information about the Vm-dev mailing list