Fwd: Compiling Core Haskell using GHC API

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

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

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
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
-- Z poważaniem, Marek Wawrzos

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
: 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
participants (2)
-
Edward Z. Yang
-
Marek Wawrzos