Platform.hs 2.93 KB
Newer Older
1
2

-- | A description of the platform we're compiling for.
3
4
--      In the future, this module should be the only one that references
--      the evil #defines for each TARGET_ARCH and TARGET_OS
5
6
--
module Platform (
7
8
9
        Platform(..),
        Arch(..),
        OS(..),
10

11
        defaultTargetPlatform,
12
        target32Bit,
13
        osElfTarget
14
15
16
17
)

where

18
19
import Panic

20
21
22
23
#include "HsVersions.h"


-- | Contains enough information for the native code generator to emit
24
--      code for this platform.
25
data Platform
26
27
28
        = Platform
        { platformArch  :: Arch
        , platformOS    :: OS }
29
30
31


-- | Architectures that the native code generator knows about.
32
33
--      TODO: It might be nice to extend these constructors with information
--      about what instruction set extensions an architecture might support.
34
35
--
data Arch
36
37
38
39
40
41
42
43
        = ArchUnknown
        | ArchX86
        | ArchX86_64
        | ArchPPC
        | ArchPPC_64
        | ArchSPARC
        deriving (Show, Eq)

44
45

-- | Operating systems that the native code generator knows about.
46
--      Having OSUnknown should produce a sensible default, but no promises.
47
data OS
48
49
50
51
52
53
54
55
        = OSUnknown
        | OSLinux
        | OSDarwin
        | OSSolaris2
        | OSMinGW32
        | OSFreeBSD
        | OSOpenBSD
        deriving (Show, Eq)
56
57


58
59
60
61
62
63
64
65
66
67
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


68
69
70
71
-- | This predicates tells us whether the OS supports ELF-like shared libraries.
osElfTarget :: OS -> Bool
osElfTarget OSLinux   = True
osElfTarget OSFreeBSD = True
kili's avatar
kili committed
72
osElfTarget OSOpenBSD = True
73
osElfTarget OSSolaris2 = True
74
75
osElfTarget _         = False

76
-- | This is the target platform as far as the #ifdefs are concerned.
77
--      These are set in includes/ghcplatform.h by the autoconf scripts
78
79
defaultTargetPlatform :: Platform
defaultTargetPlatform
80
        = Platform defaultTargetArch defaultTargetOS
81
82
83
84


-- | Move the evil TARGET_ARCH #ifdefs into Haskell land.
defaultTargetArch :: Arch
85
#if i386_TARGET_ARCH
86
defaultTargetArch       = ArchX86
87
#elif x86_64_TARGET_ARCH
88
defaultTargetArch       = ArchX86_64
89
#elif powerpc_TARGET_ARCH
90
defaultTargetArch       = ArchPPC
91
#elif powerpc64_TARGET_ARCH
92
defaultTargetArch       = ArchPPC_64
93
#elif sparc_TARGET_ARCH
94
defaultTargetArch       = ArchSPARC
95
#else
96
defaultTargetArch       = ArchUnknown
97
98
99
100
101
102
#endif


-- | Move the evil TARGET_OS #ifdefs into Haskell land.
defaultTargetOS :: OS
#if   linux_TARGET_OS
103
defaultTargetOS = OSLinux
104
#elif darwin_TARGET_OS
105
defaultTargetOS = OSDarwin
kgardas's avatar
kgardas committed
106
#elif solaris2_TARGET_OS
107
defaultTargetOS = OSSolaris2
108
#elif mingw32_TARGET_OS
109
defaultTargetOS = OSMinGW32
110
#elif freebsd_TARGET_OS
111
defaultTargetOS = OSFreeBSD
kili's avatar
kili committed
112
#elif openbsd_TARGET_OS
113
defaultTargetOS = OSOpenBSD
114
#else
115
defaultTargetOS = OSUnknown
116
117
#endif