summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorIan Lynagh <ian@well-typed.com>2012-08-06 17:34:12 +0100
committerIan Lynagh <ian@well-typed.com>2012-08-06 17:49:22 +0100
commit8e7fb28fc89eb9b99c747698f41995c269cd1090 (patch)
treee1180d9b772e03c41fe5058682b81bb32f610d08 /includes
parent6997bb5ec1b1e755d954e910d76322ad1963f94b (diff)
downloadhaskell-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.h2
-rw-r--r--includes/HaskellConstants.hs3
-rw-r--r--includes/Stg.h2
-rw-r--r--includes/stg/HaskellMachRegs.h47
-rw-r--r--includes/stg/MachRegs.h64
-rw-r--r--includes/stg/RtsMachRegs.h47
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 */