Fwd: Compiling Core Haskell using GHC API

Edward Z. Yang ezyang at mit.edu
Sat Feb 20 19:55:43 UTC 2016


What version of GHC are you working with? I don't see any
compileCoreToObj function in HEAD.

Edward

Excerpts from Marek Wawrzos's message of 2016-02-20 00:39:55 -0800:
> Hello,
> 
> I am bringing back that thread to life after a while.
> 
> I've spent some time on studding GHC source code related with that topic.
> There are some conclusions I have made:
> 
>    - In my first email, I thought that execution of function
>    *compileCoreToObj *in my program produced some *.o file. I was wrong.
>    That file was produced by earlier step, that is execution of
> *compileToCoreModule
>    *function. *compileCoreToObj *has generated only *.hi file because
>    exception has been raised.
>    - I have found a way to produce valid interface file
>    - I have discovered, why *compileCoreToObj *raises exceptions. It was
>    because *stubDir* field in *DynFlags *structure has to be set for proper
>    execution.
>    - Artifacts produced by *compileCoreToObj *for a non-executable module are:
>    interface file and assembly output.
> 
> The last point is my main problem for now. I supposed that object file will
> be generated, as it is generated by GHC executed on haskell module.
> Code used for my tests is as follows:
> 
> A.hs:
> 
> import GHC
> > import DynFlags
> > import GHC.Paths
> > import qualified Debug.Trace as T
> > import Panic
> > import HscMain
> > import HscTypes
> > import Name
> > import UniqFM
> > main = do
> >     core <- getCore
> >     getLine
> >     compile HscAsm "foo" core
> > getCore = defaultErrorHandler defaultFatalMessager defaultFlushOut
> >     $ runGhc (Just libdir) $ do
> >         df <- getSessionDynFlags
> >         setSessionDynFlags df
> >         core <- compileToCoreModule "B.hs"
> >         return core
> > compile target output_fn core = defaultErrorHandler defaultFatalMessager
> > defaultFlushOut
> >     $ runGhc (Just libdir) $ do
> >         df <- getSessionDynFlags
> >         setSessionDynFlags df { hscTarget = target , stubDir = Just
> > "./stub" }
> 
>         compileCoreToObj False core output_fn "bar"
> 
> B.hs:
> 
> > module B (foo) where
> > foo ::  a -> a
> > foo = id
> > bar :: Eq a => a -> a -> Bool
> > bar = (==)
> 
> 
> *getCore *and *compile* are separated to make sure, no flags set by the
> first function were used by the second  one.
> *getLine *is used here to stop an execution of test for cleaning output
> directory form files generated by *getCore*.
> 
> Is there a way to get an object file as a result of *compileCoreToObj*?
> 
> Regards,
> MWawrzos
> 
> 2015-10-08 19:02 GMT+02:00 Edward Z. Yang <ezyang at mit.edu>:
> 
> > If we look at the source code for hscCompileCore, it would seem that it
> > creates a ModGuts with mkModGuts which has an empty mg_exports, which
> > means that in all cases there will be no exported items.  So it's not
> > very useful!  You should file a bug.
> >
> > We should fix this, but in the mean time, you could simply copypaste the
> > definition of hscCompileCore, and modify it so that you do set up
> > the ModGuts correctly with a real mg_exports field.
> >
> > Edward
> >
> > Excerpts from Marek Wawrzos's message of 2015-10-08 07:22:01 -0700:
> > > Hello,
> > >
> > > I'm trying to compile some module with GHC API. I'm going to feed GHC
> > with
> > > Core generated by me.
> > >
> > > So far is noticed, that function compileCoreToObj ends with an runtime
> > > error on each call. In spide of this function produces some *.o and *.hi
> > > files. However, produced interface file does not contain any item in
> > > exports field, what makes compiled module unusable.
> > >
> > > Because of this problem, I tried to achieve my goal by using steps
> > > described here: https://wiki.haskell.org/GHC/As_a_library (the second
> > > example)
> > > I was able to print out Core produced form file. If I'm not wrong,
> > > modifying structures passing on between sequent calls does not effect on
> > > produced *.hi and *.o files. Both files are generated by `load
> > > LoadAllTargets' call, and further calls (parseModule, loadModule, ...)
> > does
> > > not effect on generated files.
> > >
> > > Could You give me any advices in that topic? Am I right about
> > > compileCoreToObj and functions mentioned above?
> > >
> > > Best Regards,
> > > Marek
> >
> 


More information about the ghc-devs mailing list