diff options
Diffstat (limited to 'libraries')
-rw-r--r-- | libraries/ghc-boot/GHC/Platform.hs | 190 | ||||
-rw-r--r-- | libraries/ghc-boot/ghc-boot.cabal.in | 1 |
2 files changed, 191 insertions, 0 deletions
diff --git a/libraries/ghc-boot/GHC/Platform.hs b/libraries/ghc-boot/GHC/Platform.hs new file mode 100644 index 0000000000..8344778ea9 --- /dev/null +++ b/libraries/ghc-boot/GHC/Platform.hs @@ -0,0 +1,190 @@ + +-- | A description of the platform we're compiling for. +-- +module GHC.Platform ( + Platform(..), + Arch(..), + OS(..), + ArmISA(..), + ArmISAExt(..), + ArmABI(..), + PPC_64ABI(..), + + target32Bit, + isARM, + osElfTarget, + osMachOTarget, + osSubsectionsViaSymbols, + platformUsesFrameworks, + + PlatformMisc(..), + IntegerLibrary(..), +) + +where + +import Prelude -- See Note [Why do we import Prelude here?] + +-- | Contains enough information for the native code generator to emit +-- code for this platform. +data Platform + = Platform { + platformArch :: Arch, + platformOS :: OS, + -- Word size in bytes (i.e. normally 4 or 8, + -- for 32bit and 64bit platforms respectively) + platformWordSize :: {-# UNPACK #-} !Int, + platformUnregisterised :: Bool, + platformHasGnuNonexecStack :: Bool, + platformHasIdentDirective :: Bool, + platformHasSubsectionsViaSymbols :: Bool, + platformIsCrossCompiling :: Bool + } + deriving (Read, Show, Eq) + + +-- | Architectures that the native code generator knows about. +-- TODO: It might be nice to extend these constructors with information +-- about what instruction set extensions an architecture might support. +-- +data Arch + = ArchUnknown + | ArchX86 + | ArchX86_64 + | ArchPPC + | ArchPPC_64 + { ppc_64ABI :: PPC_64ABI + } + | ArchSPARC + | ArchSPARC64 + | ArchARM + { armISA :: ArmISA + , armISAExt :: [ArmISAExt] + , armABI :: ArmABI + } + | ArchARM64 + | ArchAlpha + | ArchMipseb + | ArchMipsel + | ArchJavaScript + deriving (Read, Show, Eq) + +isARM :: Arch -> Bool +isARM (ArchARM {}) = True +isARM ArchARM64 = True +isARM _ = False + +-- | Operating systems that the native code generator knows about. +-- Having OSUnknown should produce a sensible default, but no promises. +data OS + = OSUnknown + | OSLinux + | OSDarwin + | OSSolaris2 + | OSMinGW32 + | OSFreeBSD + | OSDragonFly + | OSOpenBSD + | OSNetBSD + | OSKFreeBSD + | OSHaiku + | OSQNXNTO + | OSAIX + | OSHurd + deriving (Read, Show, Eq) + +-- | ARM Instruction Set Architecture, Extensions and ABI +-- +data ArmISA + = ARMv5 + | ARMv6 + | ARMv7 + deriving (Read, Show, Eq) + +data ArmISAExt + = VFPv2 + | VFPv3 + | VFPv3D16 + | NEON + | IWMMX2 + deriving (Read, Show, Eq) + +data ArmABI + = SOFT + | SOFTFP + | HARD + deriving (Read, Show, Eq) + +-- | PowerPC 64-bit ABI +-- +data PPC_64ABI + = ELF_V1 + | ELF_V2 + deriving (Read, Show, Eq) + +-- | This predicate tells us whether the platform is 32-bit. +target32Bit :: Platform -> Bool +target32Bit p = platformWordSize p == 4 + +-- | This predicate tells us whether the OS supports ELF-like shared libraries. +osElfTarget :: OS -> Bool +osElfTarget OSLinux = True +osElfTarget OSFreeBSD = True +osElfTarget OSDragonFly = True +osElfTarget OSOpenBSD = True +osElfTarget OSNetBSD = True +osElfTarget OSSolaris2 = True +osElfTarget OSDarwin = False +osElfTarget OSMinGW32 = False +osElfTarget OSKFreeBSD = True +osElfTarget OSHaiku = True +osElfTarget OSQNXNTO = False +osElfTarget OSAIX = False +osElfTarget OSHurd = True +osElfTarget OSUnknown = False + -- Defaulting to False is safe; it means don't rely on any + -- ELF-specific functionality. It is important to have a default for + -- portability, otherwise we have to answer this question for every + -- new platform we compile on (even unreg). + +-- | This predicate tells us whether the OS support Mach-O shared libraries. +osMachOTarget :: OS -> Bool +osMachOTarget OSDarwin = True +osMachOTarget _ = False + +osUsesFrameworks :: OS -> Bool +osUsesFrameworks OSDarwin = True +osUsesFrameworks _ = False + +platformUsesFrameworks :: Platform -> Bool +platformUsesFrameworks = osUsesFrameworks . platformOS + +osSubsectionsViaSymbols :: OS -> Bool +osSubsectionsViaSymbols OSDarwin = True +osSubsectionsViaSymbols _ = False + +-- | Platform-specific settings formerly hard-coded in Config.hs. +-- +-- These should probably be all be triaged whether they can be computed from +-- other settings or belong in another another place (like 'Platform' above). +data PlatformMisc = PlatformMisc + { -- TODO Recalculate string from richer info? + platformMisc_targetPlatformString :: String + , platformMisc_integerLibrary :: String + , platformMisc_integerLibraryType :: IntegerLibrary + , platformMisc_ghcWithInterpreter :: Bool + , platformMisc_ghcWithNativeCodeGen :: Bool + , platformMisc_ghcWithSMP :: Bool + , platformMisc_ghcRTSWays :: String + , platformMisc_tablesNextToCode :: Bool + , platformMisc_leadingUnderscore :: Bool + , platformMisc_libFFI :: Bool + , platformMisc_ghcThreaded :: Bool + , platformMisc_ghcDebugged :: Bool + , platformMisc_ghcRtsWithLibdw :: Bool + } + +data IntegerLibrary + = IntegerGMP + | IntegerSimple + deriving (Read, Show, Eq) diff --git a/libraries/ghc-boot/ghc-boot.cabal.in b/libraries/ghc-boot/ghc-boot.cabal.in index 97872c15f7..15721b1489 100644 --- a/libraries/ghc-boot/ghc-boot.cabal.in +++ b/libraries/ghc-boot/ghc-boot.cabal.in @@ -43,6 +43,7 @@ Library GHC.Serialized GHC.ForeignSrcLang GHC.HandleEncoding + GHC.Platform build-depends: base >= 4.7 && < 4.14, binary == 0.8.*, |