summaryrefslogtreecommitdiff
path: root/compiler/GHC/Driver/Phases.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Driver/Phases.hs')
-rw-r--r--compiler/GHC/Driver/Phases.hs93
1 files changed, 24 insertions, 69 deletions
diff --git a/compiler/GHC/Driver/Phases.hs b/compiler/GHC/Driver/Phases.hs
index 4892b20c60..40aa2055c3 100644
--- a/compiler/GHC/Driver/Phases.hs
+++ b/compiler/GHC/Driver/Phases.hs
@@ -9,7 +9,6 @@
-----------------------------------------------------------------------------
module GHC.Driver.Phases (
- HscSource(..), isHsBootOrSig, isHsigFile, hscSourceString,
Phase(..),
happensBefore, eqPhase, anyHsc, isStopLn,
startPhase,
@@ -34,20 +33,27 @@ module GHC.Driver.Phases (
isCishFilename,
isDynLibFilename,
isHaskellUserSrcFilename,
- isSourceFilename
+ isSourceFilename,
+
+ phaseForeignLanguage
) where
#include "HsVersions.h"
import GHC.Prelude
+import GHC.Platform
+
+import GHC.ForeignSrcLang
+
+import GHC.Types.SourceFile
+
import GHC.Utils.Outputable
import GHC.Utils.Panic
-import GHC.Platform
-import System.FilePath
-import GHC.Utils.Binary
import GHC.Utils.Misc
+import System.FilePath
+
-----------------------------------------------------------------------------
-- Phases
@@ -63,70 +69,6 @@ import GHC.Utils.Misc
linker | other | - | a.out
-}
--- Note [HscSource types]
--- ~~~~~~~~~~~~~~~~~~~~~~
--- There are three types of source file for Haskell code:
---
--- * HsSrcFile is an ordinary hs file which contains code,
---
--- * HsBootFile is an hs-boot file, which is used to break
--- recursive module imports (there will always be an
--- HsSrcFile associated with it), and
---
--- * HsigFile is an hsig file, which contains only type
--- signatures and is used to specify signatures for
--- modules.
---
--- Syntactically, hs-boot files and hsig files are quite similar: they
--- only include type signatures and must be associated with an
--- actual HsSrcFile. isHsBootOrSig allows us to abstract over code
--- which is indifferent to which. However, there are some important
--- differences, mostly owing to the fact that hsigs are proper
--- modules (you `import Sig` directly) whereas HsBootFiles are
--- temporary placeholders (you `import {-# SOURCE #-} Mod).
--- When we finish compiling the true implementation of an hs-boot,
--- we replace the HomeModInfo with the real HsSrcFile. An HsigFile, on the
--- other hand, is never replaced (in particular, we *cannot* use the
--- HomeModInfo of the original HsSrcFile backing the signature, since it
--- will export too many symbols.)
---
--- Additionally, while HsSrcFile is the only Haskell file
--- which has *code*, we do generate .o files for HsigFile, because
--- this is how the recompilation checker figures out if a file
--- needs to be recompiled. These are fake object files which
--- should NOT be linked against.
-
-data HscSource
- = HsSrcFile | HsBootFile | HsigFile
- deriving( Eq, Ord, Show )
- -- Ord needed for the finite maps we build in CompManager
-
-instance Binary HscSource where
- put_ bh HsSrcFile = putByte bh 0
- put_ bh HsBootFile = putByte bh 1
- put_ bh HsigFile = putByte bh 2
- get bh = do
- h <- getByte bh
- case h of
- 0 -> return HsSrcFile
- 1 -> return HsBootFile
- _ -> return HsigFile
-
-hscSourceString :: HscSource -> String
-hscSourceString HsSrcFile = ""
-hscSourceString HsBootFile = "[boot]"
-hscSourceString HsigFile = "[sig]"
-
--- See Note [isHsBootOrSig]
-isHsBootOrSig :: HscSource -> Bool
-isHsBootOrSig HsBootFile = True
-isHsBootOrSig HsigFile = True
-isHsBootOrSig _ = False
-
-isHsigFile :: HscSource -> Bool
-isHsigFile HsigFile = True
-isHsigFile _ = False
-
data Phase
= Unlit HscSource
| Cpp HscSource
@@ -368,3 +310,16 @@ isHaskellSigFilename f = isHaskellSigSuffix (drop 1 $ takeExtension f)
isObjectFilename, isDynLibFilename :: Platform -> FilePath -> Bool
isObjectFilename platform f = isObjectSuffix platform (drop 1 $ takeExtension f)
isDynLibFilename platform f = isDynLibSuffix platform (drop 1 $ takeExtension f)
+
+-- | Foreign language of the phase if the phase deals with a foreign code
+phaseForeignLanguage :: Phase -> Maybe ForeignSrcLang
+phaseForeignLanguage phase = case phase of
+ Cc -> Just LangC
+ Ccxx -> Just LangCxx
+ Cobjc -> Just LangObjc
+ Cobjcxx -> Just LangObjcxx
+ HCc -> Just LangC
+ As _ -> Just LangAsm
+ MergeForeign -> Just RawObject
+ _ -> Nothing
+