X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Futils%2FPlatform.hs;h=f3749ca09c9901dece9667bc0de6afbfbf4bf046;hp=7b2502d96e104662a3bbe04662a90f51f9f40168;hb=265bedd9b4869cf5f323ab32ed1e4af0f7a0bfe0;hpb=7da235b10ab22b58d767367763139c962f348753 diff --git a/compiler/utils/Platform.hs b/compiler/utils/Platform.hs index 7b2502d..f3749ca 100644 --- a/compiler/utils/Platform.hs +++ b/compiler/utils/Platform.hs @@ -1,104 +1,120 @@ -- | A description of the platform we're compiling for. --- Used by the native code generator. --- In the future, this module should be the only one that references --- the evil #defines for each TARGET_ARCH and TARGET_OS +-- In the future, this module should be the only one that references +-- the evil #defines for each TARGET_ARCH and TARGET_OS -- module Platform ( - Platform(..), - Arch(..), - OS(..), + Platform(..), + Arch(..), + OS(..), - defaultTargetPlatform, - osElfTarget + defaultTargetPlatform, + target32Bit, + osElfTarget ) where +import Panic + #include "HsVersions.h" -- | Contains enough information for the native code generator to emit --- code for this platform. +-- code for this platform. data Platform - = Platform - { platformArch :: Arch - , platformOS :: OS } + = Platform + { platformArch :: Arch + , platformOS :: OS } -- | 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. +-- TODO: It might be nice to extend these constructors with information +-- about what instruction set extensions an architecture might support. -- data Arch - = ArchX86 - | ArchX86_64 - | ArchPPC - | ArchPPC_64 - | ArchSPARC - deriving (Show, Eq) - + = ArchUnknown + | ArchX86 + | ArchX86_64 + | ArchPPC + | ArchPPC_64 + | ArchSPARC + deriving (Show, Eq) + -- | Operating systems that the native code generator knows about. --- Having OSUnknown should produce a sensible default, but no promises. +-- Having OSUnknown should produce a sensible default, but no promises. data OS - = OSUnknown - | OSLinux - | OSDarwin - | OSSolaris2 - | OSMinGW32 - | OSFreeBSD - | OSOpenBSD - deriving (Show, Eq) + = OSUnknown + | OSLinux + | OSDarwin + | OSSolaris2 + | OSMinGW32 + | OSFreeBSD + | OSOpenBSD + deriving (Show, Eq) + + +target32Bit :: Platform -> Bool +target32Bit p = case platformArch p of + ArchUnknown -> panic "Don't know if ArchUnknown is 32bit" + ArchX86 -> True + ArchX86_64 -> False + ArchPPC -> True + ArchPPC_64 -> False + ArchSPARC -> True -- | This predicates tells us whether the OS supports ELF-like shared libraries. osElfTarget :: OS -> Bool -osElfTarget OSLinux = True -osElfTarget OSFreeBSD = True -osElfTarget OSOpenBSD = True +osElfTarget OSLinux = True +osElfTarget OSFreeBSD = True +osElfTarget OSOpenBSD = True osElfTarget OSSolaris2 = True -osElfTarget _ = False +osElfTarget OSDarwin = False +osElfTarget OSMinGW32 = False +osElfTarget OSUnknown = panic "Don't know if OSUnknown is elf" + -- | This is the target platform as far as the #ifdefs are concerned. --- These are set in includes/ghcplatform.h by the autoconf scripts +-- These are set in includes/ghcplatform.h by the autoconf scripts defaultTargetPlatform :: Platform defaultTargetPlatform - = Platform defaultTargetArch defaultTargetOS + = Platform defaultTargetArch defaultTargetOS -- | Move the evil TARGET_ARCH #ifdefs into Haskell land. defaultTargetArch :: Arch #if i386_TARGET_ARCH -defaultTargetArch = ArchX86 +defaultTargetArch = ArchX86 #elif x86_64_TARGET_ARCH -defaultTargetArch = ArchX86_64 +defaultTargetArch = ArchX86_64 #elif powerpc_TARGET_ARCH -defaultTargetArch = ArchPPC +defaultTargetArch = ArchPPC #elif powerpc64_TARGET_ARCH -defaultTargetArch = ArchPPC_64 +defaultTargetArch = ArchPPC_64 #elif sparc_TARGET_ARCH -defaultTargetArch = ArchSPARC +defaultTargetArch = ArchSPARC #else -#error "Platform.buildArch: undefined" +defaultTargetArch = ArchUnknown #endif -- | Move the evil TARGET_OS #ifdefs into Haskell land. defaultTargetOS :: OS #if linux_TARGET_OS -defaultTargetOS = OSLinux +defaultTargetOS = OSLinux #elif darwin_TARGET_OS -defaultTargetOS = OSDarwin +defaultTargetOS = OSDarwin #elif solaris2_TARGET_OS -defaultTargetOS = OSSolaris2 +defaultTargetOS = OSSolaris2 #elif mingw32_TARGET_OS -defaultTargetOS = OSMinGW32 +defaultTargetOS = OSMinGW32 #elif freebsd_TARGET_OS -defaultTargetOS = OSFreeBSD +defaultTargetOS = OSFreeBSD #elif openbsd_TARGET_OS -defaultTargetOS = OSOpenBSD +defaultTargetOS = OSOpenBSD #else -defaultTargetOS = OSUnknown +defaultTargetOS = OSUnknown #endif