diff options
author | Ian Lynagh <ian@well-typed.com> | 2012-08-06 17:34:12 +0100 |
---|---|---|
committer | Ian Lynagh <ian@well-typed.com> | 2012-08-06 17:49:22 +0100 |
commit | 8e7fb28fc89eb9b99c747698f41995c269cd1090 (patch) | |
tree | e1180d9b772e03c41fe5058682b81bb32f610d08 /includes | |
parent | 6997bb5ec1b1e755d954e910d76322ad1963f94b (diff) | |
download | haskell-8e7fb28fc89eb9b99c747698f41995c269cd1090.tar.gz |
Start separating out the RTS and Haskell imports of MachRegs.h
No functional differences yet
Diffstat (limited to 'includes')
-rw-r--r-- | includes/Cmm.h | 2 | ||||
-rw-r--r-- | includes/HaskellConstants.hs | 3 | ||||
-rw-r--r-- | includes/Stg.h | 2 | ||||
-rw-r--r-- | includes/stg/HaskellMachRegs.h | 47 | ||||
-rw-r--r-- | includes/stg/MachRegs.h | 64 | ||||
-rw-r--r-- | includes/stg/RtsMachRegs.h | 47 |
6 files changed, 121 insertions, 44 deletions
diff --git a/includes/Cmm.h b/includes/Cmm.h index c7f34b66d3..edcf46e7c0 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 fc541c58b7..1cf6de5d19 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 76067de451..ba0c4cfa79 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 0000000000..7a16f47fde --- /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 91c1f89022..6a70d08d66 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 0000000000..f78cb1f6b7 --- /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 */ |