--- /dev/null
+
+-- | 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
+--
+module Platform (
+ Platform(..),
+ Arch(..),
+ OS(..),
+
+ defaultTargetPlatform,
+ osElfTarget
+)
+
+where
+
+#include "HsVersions.h"
+
+
+-- | Contains enough information for the native code generator to emit
+-- code for this platform.
+data Platform
+ = 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.
+--
+data Arch
+ = 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.
+data OS
+ = OSUnknown
+ | OSLinux
+ | OSDarwin
+ | OSSolaris2
+ | OSMinGW32
+ | OSFreeBSD
+ | OSOpenBSD
+ deriving (Show, Eq)
+
+
+-- | 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 OSSolaris2 = True
+osElfTarget _ = False
+
+-- | This is the target platform as far as the #ifdefs are concerned.
+-- These are set in includes/ghcplatform.h by the autoconf scripts
+defaultTargetPlatform :: Platform
+defaultTargetPlatform
+ = Platform defaultTargetArch defaultTargetOS
+
+
+-- | Move the evil TARGET_ARCH #ifdefs into Haskell land.
+defaultTargetArch :: Arch
+#if i386_TARGET_ARCH
+defaultTargetArch = ArchX86
+#elif x86_64_TARGET_ARCH
+defaultTargetArch = ArchX86_64
+#elif powerpc_TARGET_ARCH
+defaultTargetArch = ArchPPC
+#elif powerpc64_TARGET_ARCH
+defaultTargetArch = ArchPPC_64
+#elif sparc_TARGET_ARCH
+defaultTargetArch = ArchSPARC
+#else
+#error "Platform.buildArch: undefined"
+#endif
+
+
+-- | Move the evil TARGET_OS #ifdefs into Haskell land.
+defaultTargetOS :: OS
+#if linux_TARGET_OS
+defaultTargetOS = OSLinux
+#elif darwin_TARGET_OS
+defaultTargetOS = OSDarwin
+#elif solaris2_TARGET_OS
+defaultTargetOS = OSSolaris2
+#elif mingw32_TARGET_OS
+defaultTargetOS = OSMinGW32
+#elif freebsd_TARGET_OS
+defaultTargetOS = OSFreeBSD
+#elif openbsd_TARGET_OS
+defaultTargetOS = OSOpenBSD
+#else
+defaultTargetOS = OSUnknown
+#endif
+