From 8e7fb28fc89eb9b99c747698f41995c269cd1090 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Mon, 6 Aug 2012 17:34:12 +0100 Subject: [PATCH] Start separating out the RTS and Haskell imports of MachRegs.h No functional differences yet --- compiler/codeGen/CgUtils.hs | 2 +- compiler/codeGen/StgCmmUtils.hs | 2 +- compiler/nativeGen/PPC/Regs.hs | 2 +- compiler/nativeGen/RegAlloc/Linear/Main.hs | 2 +- compiler/nativeGen/SPARC/RegPlate.hs | 2 +- compiler/nativeGen/X86/Regs.hs | 2 +- includes/Cmm.h | 2 +- includes/HaskellConstants.hs | 3 +- includes/Stg.h | 2 +- includes/stg/HaskellMachRegs.h | 47 ++++++++++++++++ includes/stg/MachRegs.h | 64 ++++++++-------------- includes/stg/RtsMachRegs.h | 47 ++++++++++++++++ utils/genapply/GenApply.hs | 2 +- 13 files changed, 128 insertions(+), 51 deletions(-) create mode 100644 includes/stg/HaskellMachRegs.h create mode 100644 includes/stg/RtsMachRegs.h diff --git a/compiler/codeGen/CgUtils.hs b/compiler/codeGen/CgUtils.hs index 08b6fb893958..b7acc1c54c2b 100644 --- a/compiler/codeGen/CgUtils.hs +++ b/compiler/codeGen/CgUtils.hs @@ -45,7 +45,7 @@ module CgUtils ( ) where #include "HsVersions.h" -#include "../includes/stg/MachRegs.h" +#include "../includes/stg/HaskellMachRegs.h" import BlockId import CgMonad diff --git a/compiler/codeGen/StgCmmUtils.hs b/compiler/codeGen/StgCmmUtils.hs index 4798c65a4ace..caecff923b1a 100644 --- a/compiler/codeGen/StgCmmUtils.hs +++ b/compiler/codeGen/StgCmmUtils.hs @@ -50,7 +50,7 @@ module StgCmmUtils ( ) where #include "HsVersions.h" -#include "../includes/stg/MachRegs.h" +#include "../includes/stg/HaskellMachRegs.h" import StgCmmMonad import StgCmmClosure diff --git a/compiler/nativeGen/PPC/Regs.hs b/compiler/nativeGen/PPC/Regs.hs index fe4e06fcc5f9..0d1c5705afd3 100644 --- a/compiler/nativeGen/PPC/Regs.hs +++ b/compiler/nativeGen/PPC/Regs.hs @@ -55,7 +55,7 @@ where #include "nativeGen/NCG.h" #include "HsVersions.h" -#include "../includes/stg/MachRegs.h" +#include "../includes/stg/HaskellMachRegs.h" import Reg import RegClass diff --git a/compiler/nativeGen/RegAlloc/Linear/Main.hs b/compiler/nativeGen/RegAlloc/Linear/Main.hs index 0d3f7485c33d..07b6e33d2562 100644 --- a/compiler/nativeGen/RegAlloc/Linear/Main.hs +++ b/compiler/nativeGen/RegAlloc/Linear/Main.hs @@ -130,7 +130,7 @@ import Data.Maybe import Data.List import Control.Monad -#include "../includes/stg/MachRegs.h" +#include "../includes/stg/HaskellMachRegs.h" -- ----------------------------------------------------------------------------- diff --git a/compiler/nativeGen/SPARC/RegPlate.hs b/compiler/nativeGen/SPARC/RegPlate.hs index 32d2da187fcc..be638a934b77 100644 --- a/compiler/nativeGen/SPARC/RegPlate.hs +++ b/compiler/nativeGen/SPARC/RegPlate.hs @@ -100,7 +100,7 @@ import FastBool #define f31 63 -#include "../includes/stg/MachRegs.h" +#include "../includes/stg/HaskellMachRegs.h" -- | Check whether a machine register is free for allocation. freeReg :: RegNo -> FastBool diff --git a/compiler/nativeGen/X86/Regs.hs b/compiler/nativeGen/X86/Regs.hs index 854df0d0022b..44052582b639 100644 --- a/compiler/nativeGen/X86/Regs.hs +++ b/compiler/nativeGen/X86/Regs.hs @@ -51,7 +51,7 @@ where #include "nativeGen/NCG.h" #include "HsVersions.h" -#include "../includes/stg/MachRegs.h" +#include "../includes/stg/HaskellMachRegs.h" import Reg import RegClass diff --git a/includes/Cmm.h b/includes/Cmm.h index c7f34b66d391..edcf46e7c014 100644 --- a/includes/Cmm.h +++ b/includes/Cmm.h @@ -346,7 +346,7 @@ * Need MachRegs, because some of the RTS code is conditionally * compiled based on REG_R1, REG_R2, etc. */ -#include "stg/MachRegs.h" +#include "stg/RtsMachRegs.h" #include "rts/storage/Liveness.h" #include "rts/prof/LDV.h" diff --git a/includes/HaskellConstants.hs b/includes/HaskellConstants.hs index fc541c58b74a..1cf6de5d1988 100644 --- a/includes/HaskellConstants.hs +++ b/includes/HaskellConstants.hs @@ -16,7 +16,8 @@ settings for the target plat instead). -} #include "../includes/ghcautoconf.h" -#include "stg/MachRegs.h" +#include "stg/HaskellMachRegs.h" + #include "rts/Constants.h" #include "MachDeps.h" #include "../includes/dist-derivedconstants/header/DerivedConstants.h" diff --git a/includes/Stg.h b/includes/Stg.h index 76067de45180..ba0c4cfa793e 100644 --- a/includes/Stg.h +++ b/includes/Stg.h @@ -229,7 +229,7 @@ typedef StgFunPtr F_; -------------------------------------------------------------------------- */ #include "stg/DLL.h" -#include "stg/MachRegs.h" +#include "stg/RtsMachRegs.h" #include "stg/Regs.h" #include "stg/Ticky.h" diff --git a/includes/stg/HaskellMachRegs.h b/includes/stg/HaskellMachRegs.h new file mode 100644 index 000000000000..7a16f47fde04 --- /dev/null +++ b/includes/stg/HaskellMachRegs.h @@ -0,0 +1,47 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team, 1998-2011 + * + * Registers used in STG code. Might or might not correspond to + * actual machine registers. + * + * Do not #include this file directly: #include "Rts.h" instead. + * + * To understand the structure of the RTS headers, see the wiki: + * http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes + * + * ---------------------------------------------------------------------------*/ + +#ifndef HASKELLMACHREGS_H +#define HASKELLMACHREGS_H + +/* + * Defining NO_REGS causes no global registers to be used. NO_REGS is + * typically defined by GHC, via a command-line option passed to gcc, + * when the -funregisterised flag is given. + * + * NB. When NO_REGS is on, calling & return conventions may be + * different. For example, all function arguments will be passed on + * the stack, and components of an unboxed tuple will be returned on + * the stack rather than in registers. + */ +#ifdef NO_REGS + +#define MACHREGS_NO_REGS 1 + +#else + +#define MACHREGS_NO_REGS 0 + +#define MACHREGS_i386 i386_TARGET_ARCH +#define MACHREGS_x86_64 x86_64_TARGET_ARCH +#define MACHREGS_powerpc (powerpc_TARGET_ARCH || powerpc64_TARGET_ARCH || rs6000_TARGET_ARCH) +#define MACHREGS_sparc sparc_TARGET_ARCH +#define MACHREGS_arm arm_TARGET_ARCH +#define MACHREGS_darwin darwin_TARGET_OS + +#endif + +#include "stg/MachRegs.h" + +#endif /* HASKELLMACHREGS_H */ diff --git a/includes/stg/MachRegs.h b/includes/stg/MachRegs.h index 91c1f89022d2..6a70d08d6693 100644 --- a/includes/stg/MachRegs.h +++ b/includes/stg/MachRegs.h @@ -20,38 +20,21 @@ */ /* - * Defining NO_REGS causes no global registers to be used. NO_REGS is + * Defining MACHREGS_NO_REGS to 1 causes no global registers to be used. + * MACHREGS_NO_REGS is typically controlled by NO_REGS, which is * typically defined by GHC, via a command-line option passed to gcc, * when the -funregisterised flag is given. * - * NB. When NO_REGS is on, calling & return conventions may be + * NB. When MACHREGS_NO_REGS to 1, calling & return conventions may be * different. For example, all function arguments will be passed on * the stack, and components of an unboxed tuple will be returned on * the stack rather than in registers. */ -#ifndef NO_REGS +#if MACHREGS_NO_REGS == 1 -/* NOTE: when testing the platform in this file we must test either - * *_HOST_ARCH and *_TARGET_ARCH, depending on whether COMPILING_GHC - * is set. This is because when we're compiling the RTS and HC code, - * the platform we're running on is the HOST, but when compiling GHC - * we want to know about the register mapping on the TARGET platform. - */ -#ifdef COMPILING_GHC -#define i386_REGS i386_TARGET_ARCH -#define x86_64_REGS x86_64_TARGET_ARCH -#define powerpc_REGS (powerpc_TARGET_ARCH || powerpc64_TARGET_ARCH || rs6000_TARGET_ARCH) -#define sparc_REGS sparc_TARGET_ARCH -#define arm_REGS arm_TARGET_ARCH -#define darwin_REGS darwin_TARGET_OS -#else -#define i386_REGS i386_HOST_ARCH -#define x86_64_REGS x86_64_HOST_ARCH -#define powerpc_REGS (powerpc_HOST_ARCH || powerpc64_HOST_ARCH || rs6000_HOST_ARCH) -#define sparc_REGS sparc_HOST_ARCH -#define arm_REGS arm_HOST_ARCH -#define darwin_REGS darwin_HOST_OS -#endif +/* Nothing */ + +#elif MACHREGS_NO_REGS == 0 /* ---------------------------------------------------------------------------- Caller saves and callee-saves regs. @@ -84,7 +67,7 @@ Leaving SpLim out of the picture. -------------------------------------------------------------------------- */ -#if i386_REGS +#if MACHREGS_i386 #define REG(x) __asm__("%" #x) @@ -110,8 +93,6 @@ #define MAX_REAL_DOUBLE_REG 0 #define MAX_REAL_LONG_REG 0 -#endif /* iX86 */ - /* ----------------------------------------------------------------------------- The x86-64 register mapping @@ -141,7 +122,7 @@ --------------------------------------------------------------------------- */ -#if x86_64_REGS +#elif MACHREGS_x86_64 #define REG(x) __asm__("%" #x) @@ -186,8 +167,6 @@ #define MAX_REAL_DOUBLE_REG 2 #define MAX_REAL_LONG_REG 0 -#endif /* x86_64 */ - /* ----------------------------------------------------------------------------- The PowerPC register mapping @@ -218,7 +197,7 @@ We can do the Whole Business with callee-save registers only! -------------------------------------------------------------------------- */ -#if powerpc_REGS +#elif MACHREGS_powerpc #define REG(x) __asm__(#x) @@ -231,7 +210,7 @@ #define REG_R7 r20 #define REG_R8 r21 -#if darwin_REGS +#if MACHREGS_darwin #define REG_F1 f14 #define REG_F2 f15 @@ -260,8 +239,6 @@ #define REG_Base r27 -#endif /* powerpc */ - /* ----------------------------------------------------------------------------- The Sun SPARC register mapping @@ -353,7 +330,7 @@ -------------------------------------------------------------------------- */ -#if sparc_REGS +#elif MACHREGS_sparc #define REG(x) __asm__("%" #x) @@ -396,8 +373,6 @@ #define NCG_FirstFloatReg f22 -#endif /* sparc */ - /* ----------------------------------------------------------------------------- The ARM EABI register mapping @@ -433,8 +408,7 @@ d16-d31/q8-q15 Argument / result/ scratch registers ----------------------------------------------------------------------------- */ - -#if arm_REGS +#elif MACHREGS_arm #define REG(x) __asm__(#x) @@ -459,9 +433,17 @@ #define REG_D2 d11 #endif -#endif /* arm */ +#else + +#error Cannot find platform to give register info for + +#endif -#endif /* NO_REGS */ +#else + +#error Bad MACHREGS_NO_REGS value + +#endif /* ----------------------------------------------------------------------------- * These constants define how many stg registers will be used for diff --git a/includes/stg/RtsMachRegs.h b/includes/stg/RtsMachRegs.h new file mode 100644 index 000000000000..f78cb1f6b717 --- /dev/null +++ b/includes/stg/RtsMachRegs.h @@ -0,0 +1,47 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team, 1998-2011 + * + * Registers used in STG code. Might or might not correspond to + * actual machine registers. + * + * Do not #include this file directly: #include "Rts.h" instead. + * + * To understand the structure of the RTS headers, see the wiki: + * http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes + * + * ---------------------------------------------------------------------------*/ + +#ifndef RTSMACHREGS_H +#define RTSMACHREGS_H + +/* + * Defining NO_REGS causes no global registers to be used. NO_REGS is + * typically defined by GHC, via a command-line option passed to gcc, + * when the -funregisterised flag is given. + * + * NB. When NO_REGS is on, calling & return conventions may be + * different. For example, all function arguments will be passed on + * the stack, and components of an unboxed tuple will be returned on + * the stack rather than in registers. + */ +#ifdef NO_REGS + +#define MACHREGS_NO_REGS 1 + +#else + +#define MACHREGS_NO_REGS 0 + +#define MACHREGS_i386 i386_HOST_ARCH +#define MACHREGS_x86_64 x86_64_HOST_ARCH +#define MACHREGS_powerpc (powerpc_HOST_ARCH || powerpc64_HOST_ARCH || rs6000_HOST_ARCH) +#define MACHREGS_sparc sparc_HOST_ARCH +#define MACHREGS_arm arm_HOST_ARCH +#define MACHREGS_darwin darwin_HOST_OS + +#endif + +#include "stg/MachRegs.h" + +#endif /* RTSMACHREGS_H */ diff --git a/utils/genapply/GenApply.hs b/utils/genapply/GenApply.hs index e39f42ec5f47..18a2f85a1218 100644 --- a/utils/genapply/GenApply.hs +++ b/utils/genapply/GenApply.hs @@ -8,7 +8,7 @@ module Main(main) where #include "../../includes/ghcconfig.h" -#include "../../includes/stg/MachRegs.h" +#include "../../includes/stg/RtsMachRegs.h" #include "../../includes/rts/Constants.h" -- Needed for TAG_BITS