Fill out the osElfTarget definition
[ghc-hetmet.git] / compiler / utils / Platform.hs
index e4f97bd..f3749ca 100644 (file)
 
 -- | 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
-       = ArchUnknown
-       | 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
-defaultTargetArch      = ArchUnknown
+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