Define cTargetArch and start to use it rather than ifdefs
authorIan Lynagh <igloo@earth.li>
Tue, 4 Jan 2011 22:00:13 +0000 (22:00 +0000)
committerIan Lynagh <igloo@earth.li>
Tue, 4 Jan 2011 22:00:13 +0000 (22:00 +0000)
Using Haskell conditionals means the compiler sees all the code, so
there should be less rot of code specific to uncommon arches. Code
for other platforms should still be optimised away, although if we want
to support targetting other arches then we'll need to compile it
for-real anyway.

compiler/ghc.mk
compiler/nativeGen/AsmCodeGen.lhs
configure.ac

index 44ac382..978835f 100644 (file)
@@ -49,6 +49,8 @@ compiler/stage%/build/Config.hs : mk/config.mk mk/project.mk | $$(dir $$@)/.
        @echo '{-# LANGUAGE CPP #-}'                                        >> $@
        @echo 'module Config where'                                         >> $@
        @echo                                                               >> $@
+       @echo 'import Distribution.System'                                  >> $@
+       @echo                                                               >> $@
        @echo '#include "ghc_boot_platform.h"'                              >> $@
        @echo                                                               >> $@
        @echo 'cBuildPlatformString :: String'                              >> $@
@@ -58,6 +60,42 @@ compiler/stage%/build/Config.hs : mk/config.mk mk/project.mk | $$(dir $$@)/.
        @echo 'cTargetPlatformString :: String'                             >> $@
        @echo 'cTargetPlatformString = TargetPlatform_NAME'                 >> $@
        @echo                                                               >> $@
+# Sync this with checkArch in configure.ac
+       @echo 'cTargetArch :: Arch'                                         >> $@
+       @echo '#if i386_TARGET_ARCH'                                        >> $@
+       @echo 'cTargetArch = I386'                                          >> $@
+       @echo '#elif x86_64_TARGET_ARCH'                                    >> $@
+       @echo 'cTargetArch = X86_64'                                        >> $@
+       @echo '#elif powerpc_TARGET_ARCH'                                   >> $@
+       @echo 'cTargetArch = PPC'                                           >> $@
+       @echo '#elif powerpc64_TARGET_ARCH'                                 >> $@
+       @echo 'cTargetArch = PPC64'                                         >> $@
+       @echo '#elif sparc_TARGET_ARCH || sparc64_TARGET_ARCH'              >> $@
+       @echo 'cTargetArch = Sparc'                                         >> $@
+       @echo '#elif arm_TARGET_ARCH'                                       >> $@
+       @echo 'cTargetArch = Arm'                                           >> $@
+       @echo '#elif mips_TARGET_ARCH || mipseb_TARGET_ARCH || mipsel_TARGET_ARCH' >> $@
+       @echo 'cTargetArch = Mips'                                          >> $@
+       @echo '#elif 0'                                                     >> $@
+       @echo 'cTargetArch = SH'                                            >> $@
+       @echo '#elif ia64_TARGET_ARCH'                                      >> $@
+       @echo 'cTargetArch = IA64'                                          >> $@
+       @echo '#elif s390_TARGET_ARCH'                                      >> $@
+       @echo 'cTargetArch = S390'                                          >> $@
+       @echo '#elif alpha_TARGET_ARCH'                                     >> $@
+       @echo 'cTargetArch = Alpha'                                         >> $@
+       @echo '#elif hppa_TARGET_ARCH || hppa1_1_TARGET_ARCH'               >> $@
+       @echo 'cTargetArch = Hppa'                                          >> $@
+       @echo '#elif rs6000_TARGET_ARCH'                                    >> $@
+       @echo 'cTargetArch = Rs6000'                                        >> $@
+       @echo '#elif m68k_TARGET_ARCH'                                      >> $@
+       @echo 'cTargetArch = M68k'                                          >> $@
+       @echo '#elif vax_TARGET_ARCH'                                       >> $@
+       @echo 'cTargetArch = Vax'                                           >> $@
+       @echo '#else'                                                       >> $@
+       @echo '#error Unknown target arch'                                  >> $@
+       @echo '#endif'                                                      >> $@
+       @echo                                                               >> $@
        @echo 'cProjectName          :: String'                             >> $@
        @echo 'cProjectName          = "$(ProjectName)"'                    >> $@
        @echo 'cProjectVersion       :: String'                             >> $@
index 3a6d97f..9ba3dfd 100644 (file)
@@ -72,13 +72,9 @@ import UniqFM
 import Unique          ( Unique, getUnique )
 import UniqSupply
 import DynFlags
-#if powerpc_TARGET_ARCH
-import StaticFlags     ( opt_Static, opt_PIC )
-#endif
+import StaticFlags
 import Util
-#if !defined(darwin_TARGET_OS)
-import Config           ( cProjectVersion )
-#endif
+import Config
 
 import Digraph
 import qualified Pretty
@@ -96,6 +92,7 @@ import Data.List
 import Data.Maybe
 import Control.Monad
 import System.IO
+import Distribution.System
 
 {-
 The native-code generator has machine-independent and
@@ -836,23 +833,21 @@ cmmExprConFold referenceKind expr
                      (CmmLit $ CmmInt (fromIntegral off) wordWidth)
                    ]
 
-#if powerpc_TARGET_ARCH
-           -- On powerpc (non-PIC), it's easier to jump directly to a label than
-           -- to use the register table, so we replace these registers
-           -- with the corresponding labels:
+        -- On powerpc (non-PIC), it's easier to jump directly to a label than
+        -- to use the register table, so we replace these registers
+        -- with the corresponding labels:
         CmmReg (CmmGlobal EagerBlackholeInfo)
-          | not opt_PIC
+          | cTargetArch == PPC && not opt_PIC
           -> cmmExprConFold referenceKind $
              CmmLit (CmmLabel (mkCmmCodeLabel rtsPackageId (fsLit "__stg_EAGER_BLACKHOLE_info")))
         CmmReg (CmmGlobal GCEnter1)
-          | not opt_PIC
+          | cTargetArch == PPC && not opt_PIC
           -> cmmExprConFold referenceKind $
              CmmLit (CmmLabel (mkCmmCodeLabel rtsPackageId (fsLit "__stg_gc_enter_1"))) 
         CmmReg (CmmGlobal GCFun)
-          | not opt_PIC
+          | cTargetArch == PPC && not opt_PIC
           -> cmmExprConFold referenceKind $
              CmmLit (CmmLabel (mkCmmCodeLabel rtsPackageId (fsLit "__stg_gc_fun")))
-#endif
 
         other
            -> return other
index a18f2f7..5bf773b 100644 (file)
@@ -282,6 +282,7 @@ x86_64-apple-darwin)
     ;;
 esac
 
+# Sync this with cTargetArch in compiler/ghc.mk
 checkArch() {
     case $1 in
     alpha|arm|hppa|hppa1_1|i386|ia64|m68k|mips|mipseb|mipsel|powerpc|powerpc64|rs6000|s390|sparc|sparc64|vax|x86_64)