GHC 6.4, Internal error: stg_ap_pp_ret

Yann Morvan morvany at cs.tcd.ie
Wed Jun 8 14:09:09 EDT 2005


The problem disapears when I use GHC to compile the c file, this somehow 
allows the linker to find the __stginit_SortPoints3() function.
I don't really understand what GHC does differently from gcc at compile 
time on c files.
Thank you for your time.

    Yann Morvan

Yann Morvan wrote:

> Hello,
> I am calling a Haskell function from C using foreign export, it works 
> fine on the first call,
> but as soon as I call it again I get:
>
> internal error: stg_ap_pp_ret
>
> and I am asked to report it as a bug.
> I don't know how much detail I should give, so I'll just reproduce the 
> relevant code (excuse the clumsyness):
> On the Haskell side:
>
> module SortPoints3 where
> [...]
> data Vect2D = Vect2D {xx,yy :: CFloat} deriving Show
>
> instance Storable Vect2D where
>  peek a = do
>             x <- peekElemOff (castPtr a) 0
>             y <- peekElemOff (castPtr a) 1
>             return (Vect2D x y)
>  poke a (Vect2D x y) = do
>                          pokeElemOff (castPtr a) 0 x
>                          pokeElemOff (castPtr a) 1 y
>  sizeOf a = let dummy = Vect2D 2.0 2.0 in
>     (sizeOf (xx dummy) + (sizeOf (yy dummy)))
>  alignment a = 4
> [...]
> foreign export ccall doIt :: (Ptr Vect2D) -> (Ptr Vect2D) -> CInt -> 
> CFloat -> IO ()
>
> doIt :: (Ptr Vect2D) -> (Ptr Vect2D) ->  CInt -> CFloat -> IO ()
> doIt pointsPtr projectedPtr n t = do
>  points <- peekArray (fromIntegral n) pointsPtr
>  (sortedPoints, sortedProjections ) <- sortPoints t points
>  pokeArray pointsPtr sortedPoints
>  pokeArray projectedPtr sortedProjections
>  return ()
>
> On the C side, the function is called from a callback function of the 
> OpenCV library.
> I pass it pointers to the OpenCV CvPoint2D32f type, which is a simple 
> struct with two floats for coordinates.
>
> I had to remove the call to hs_add_root as the linker (GHC's) couldn't 
> find __stginit_SortPoints3()
>
> I tried the following:
>
> foreign export ccall printIt :: CFloat -> IO ()
>
> printIt :: CFloat -> IO ()
> printIt f = putStr $ "\nTest\n" ++ (show f) ++ "\n"
>
> this function has no problem when called several times from the same 
> location in the c code.
>
> Please tell me what to fix if the error is on my side.
> Thank you for your time,
>
>    Yann Morvan
>
>




More information about the Glasgow-haskell-bugs mailing list