`foreign label foo :: Addr' was simply mapped to `foo' on the C side,
but this is wrong, resp. only works for C *functions*, not *variables*
(praise the implicit conversions of C!). It now correctly maps to `(&foo)'.
ATTENTION: I'm not sure if this fix breaks some SW which depends on
the old (wrong) behaviour (H/Direct?).
dsFLabel :: Id -> ExtName -> DsM CoreBind
dsFLabel nm ext_name = returnDs (NonRec nm fo_rhs)
where
dsFLabel :: Id -> ExtName -> DsM CoreBind
dsFLabel nm ext_name = returnDs (NonRec nm fo_rhs)
where
- fo_rhs = mkConApp addrDataCon [mkLit (MachLitLit enm addrPrimTy)]
+ fo_rhs = mkConApp addrDataCon [mkLit (MachLitLit addr addrPrimTy)]
enm = extNameStatic ext_name
enm = extNameStatic ext_name
+ addr = SLIT("(&") _APPEND_ enm _APPEND_ SLIT(")")
\end{code}
The function that does most of the work for `@foreign export@' declarations.
\end{code}
The function that does most of the work for `@foreign export@' declarations.