Multiple instancing of functions with FFI
I am having trouble exporting multiple instances of a polymorphic function similar to the example in the "Haskell 98 Foreign Function Interface 1.0 addendum" (page 6). My specific code is below: -----------------------begin test.hs---------------------------------
module Test() where
import Foreign
import Foreign.C
foreign export stdcall "addByte" (+):: Int8->Int8->Int8
foreign export stdcall "addInt" (+):: Int16->Int16->Int16
foreign export stdcall "addLong" (+):: Int32->Int32->Int32
-----------------------end test.hs--------------------------------- This somewhat contrived example should export three foreign implementations of integer addition (one for each of 8, 16 and 32 byte integers). I am compiling to a Win 32 DLL with GHC 6.61 using the following set of commands: -------------------------------------------------------- ghc -c adder.hs -fglasgow-exts -ffi ghc -c dllMain.c ghc -static --mk-dll -optdll--def=test.def -o test.dll test.o test_stub.o dllMain.o -------------------------------------------------------- where dllMain.c declares my entry point for the DLL, and is as follows --------------------begin dllMain.c------------------------------------ #include <windows.h> #include <Rts.h> extern void __stginit_Adder(void); static char* args[] = { "ghcDll", NULL }; BOOL STDCALL DllMain ( HANDLE hModule, DWORD reason, void* reserved ) { if (reason == DLL_PROCESS_ATTACH) { startupHaskell(1, args, __stginit_Adder); return TRUE; } if (reason == DLL_PROCESS_DETACH) { shutdownHaskell(); return TRUE; } return TRUE; } ----------------------------end dllMain.c---------------------------- and I have declared the exported function names explicitly in test.def: ---------------------------begin test.def----------------------------- EXPORTS addByte addInt addLong ----------------------------end test.def---------------------------- Upon compilation, I receive a long list of errors including things like "error:redefinition of 'stginit_export_Test_zdfzp' was here", etc. Any help would be appreciated. Darrell
Hi Darrell, On Mon, Jul 09, 2007 at 05:48:47PM -0700, Lewis-Sandy, Darrell wrote:
I am having trouble exporting multiple instances of a polymorphic function similar to the example in the "Haskell 98 Foreign Function Interface 1.0 addendum" (page 6). My specific code is below:
Thanks for the detailed bug report! I've put it in the bug tracker here: http://hackage.haskell.org/trac/ghc/ticket/1533 milestoned to be fixed in the next release, and also added a test to the testsuite for it.
foreign export stdcall "addByte" (+):: Int8->Int8->Int8 foreign export stdcall "addInt" (+):: Int16->Int16->Int16 foreign export stdcall "addLong" (+):: Int32->Int32->Int32
In the mean time, as a workaround, you can use >addByte :: Int8->Int8->Int8 >addByte = (+) >addInt :: Int16->Int16->Int16 >addInt = (+) >addLong :: Int32->Int32->Int32 >addLong = (+) >foreign export stdcall "addByte" addByte :: Int8->Int8->Int8 >foreign export stdcall "addInt" addInt :: Int16->Int16->Int16 >foreign export stdcall "addLong" addLong :: Int32->Int32->Int32 Thanks Ian
participants (2)
-
Ian Lynagh -
Lewis-Sandy, Darrell