[commit: ghc] master: Add some LDV_* constants to platformConstants (62bb618)

Ian Lynagh <[email protected]>
Newsgroups gmane.comp.lang.haskell.cvs.ghc
Message-ID <[email protected]>
Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/62bb618911c3bfe11a989ed6397434ca89a628d7

>---------------------------------------------------------------

commit 62bb618911c3bfe11a989ed6397434ca89a628d7
Author: Ian Lynagh <[email protected]>
Date:   Wed Sep 19 00:15:15 2012 +0100

    Add some LDV_* constants to platformConstants

>---------------------------------------------------------------

 compiler/codeGen/CgProf.hs     |   18 +++-----------
 compiler/codeGen/StgCmmProf.hs |   18 +++-----------
 includes/mkDerivedConstants.c  |   50 +++++++++++++++++++++++++--------------
 3 files changed, 40 insertions(+), 46 deletions(-)

diff --git a/compiler/codeGen/CgProf.hs b/compiler/codeGen/CgProf.hs
index 9848d34..b21ae26 100644
--- a/compiler/codeGen/CgProf.hs
+++ b/compiler/codeGen/CgProf.hs
@@ -25,9 +25,6 @@ module CgProf (
 #include "HsVersions.h"
 #include "../includes/MachDeps.h"
  -- For WORD_SIZE_IN_BITS only.
-#include "../includes/rts/Constants.h"
-        -- For LDV_CREATE_MASK, LDV_STATE_USE
-        -- which are StgWords
 #include "../includes/dist-derivedconstants/header/DerivedConstants.h"
         -- For REP_xxx constants, which are MachReps
 
@@ -265,7 +262,7 @@ staticLdvInit = zeroCLit
 dynLdvInit :: DynFlags -> CmmExpr
 dynLdvInit dflags =     -- (era << LDV_SHIFT) | LDV_STATE_CREATE
   CmmMachOp (mo_wordOr dflags) [
-      CmmMachOp (mo_wordShl dflags) [loadEra dflags, mkIntExpr dflags lDV_SHIFT ],
+      CmmMachOp (mo_wordShl dflags) [loadEra dflags, mkIntExpr dflags (lDV_SHIFT dflags)],
       CmmLit (mkWordCLit dflags (lDV_STATE_CREATE dflags))
   ]
 
@@ -316,17 +313,10 @@ ldvWord :: DynFlags -> CmmExpr -> CmmExpr
 ldvWord dflags closure_ptr
     = cmmOffsetB dflags closure_ptr (oFFSET_StgHeader_ldvw dflags)
 
--- LDV constants, from ghc/includes/Constants.h
-lDV_SHIFT :: Int
-lDV_SHIFT = LDV_SHIFT
---lDV_STATE_MASK :: StgWord
---lDV_STATE_MASK   = LDV_STATE_MASK
 lDV_CREATE_MASK :: DynFlags -> StgWord
-lDV_CREATE_MASK dflags = toStgWord dflags LDV_CREATE_MASK
---lDV_LAST_MASK    :: StgWord
---lDV_LAST_MASK    = LDV_LAST_MASK
+lDV_CREATE_MASK dflags = toStgWord dflags (iLDV_CREATE_MASK dflags)
 lDV_STATE_CREATE :: DynFlags -> StgWord
-lDV_STATE_CREATE dflags = toStgWord dflags LDV_STATE_CREATE
+lDV_STATE_CREATE dflags = toStgWord dflags (iLDV_STATE_CREATE dflags)
 lDV_STATE_USE :: DynFlags -> StgWord
-lDV_STATE_USE dflags = toStgWord dflags LDV_STATE_USE
+lDV_STATE_USE dflags = toStgWord dflags (iLDV_STATE_USE dflags)
 
diff --git a/compiler/codeGen/StgCmmProf.hs b/compiler/codeGen/StgCmmProf.hs
index 30ced9a..56c182d 100644
--- a/compiler/codeGen/StgCmmProf.hs
+++ b/compiler/codeGen/StgCmmProf.hs
@@ -33,9 +33,6 @@ module StgCmmProf (
 #include "HsVersions.h"
 #include "../includes/MachDeps.h"
  -- For WORD_SIZE_IN_BITS only.
-#include "../includes/rts/Constants.h"
-	-- For LDV_CREATE_MASK, LDV_STATE_USE
-	-- which are StgWords
 #include "../includes/dist-derivedconstants/header/DerivedConstants.h"
 	-- For REP_xxx constants, which are MachReps
 
@@ -328,7 +325,7 @@ staticLdvInit = zeroCLit
 dynLdvInit :: DynFlags -> CmmExpr
 dynLdvInit dflags =     -- (era << LDV_SHIFT) | LDV_STATE_CREATE  
   CmmMachOp (mo_wordOr dflags) [
-      CmmMachOp (mo_wordShl dflags) [loadEra dflags, mkIntExpr dflags lDV_SHIFT ],
+      CmmMachOp (mo_wordShl dflags) [loadEra dflags, mkIntExpr dflags (lDV_SHIFT dflags)],
       CmmLit (mkWordCLit dflags (lDV_STATE_CREATE dflags))
   ]
         
@@ -379,17 +376,10 @@ ldvWord :: DynFlags -> CmmExpr -> CmmExpr
 ldvWord dflags closure_ptr
     = cmmOffsetB dflags closure_ptr (oFFSET_StgHeader_ldvw dflags)
 
--- LDV constants, from ghc/includes/Constants.h
-lDV_SHIFT :: Int
-lDV_SHIFT = LDV_SHIFT
---lDV_STATE_MASK :: StgWord
---lDV_STATE_MASK   = LDV_STATE_MASK
 lDV_CREATE_MASK :: DynFlags -> StgWord
-lDV_CREATE_MASK dflags = toStgWord dflags LDV_CREATE_MASK
---lDV_LAST_MASK :: StgWord
---lDV_LAST_MASK    = LDV_LAST_MASK
+lDV_CREATE_MASK dflags = toStgWord dflags (iLDV_CREATE_MASK dflags)
 lDV_STATE_CREATE :: DynFlags -> StgWord
-lDV_STATE_CREATE dflags = toStgWord dflags LDV_STATE_CREATE
+lDV_STATE_CREATE dflags = toStgWord dflags (iLDV_STATE_CREATE dflags)
 lDV_STATE_USE :: DynFlags -> StgWord
-lDV_STATE_USE dflags = toStgWord dflags LDV_STATE_USE
+lDV_STATE_USE dflags = toStgWord dflags (iLDV_STATE_USE dflags)
 
diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c
index c732332..62c5ae8 100644
--- a/includes/mkDerivedConstants.c
+++ b/includes/mkDerivedConstants.c
@@ -314,30 +314,17 @@ void constantBool(char *haskellName, int val) {
     }
 }
 
-void constantIntC(char *cName, char *haskellName, intptr_t val) {
-    /* If the value is larger than 2^28 or smaller than -2^28, then fail.
-       This test is a bit conservative, but if any constants are roughly
-       maxBoun or minBound then we probably need them to be Integer
-       rather than Int so that cross-compiling between 32bit and 64bit
-       platforms works. */
-    if (val > 268435456) {
-        printf("Value too large for constantInt: %" PRIdPTR "\n", val);
-        exit(1);
-    }
-    if (val < -268435456) {
-        printf("Value too small for constantInt: %" PRIdPTR "\n", val);
-        exit(1);
-    }
-
+void constantIntegralC(char *haskellType, char *cName, char *haskellName,
+                       intptr_t val) {
     switch (mode) {
     case Gen_Haskell_Type:
-        printf("    , pc_%s :: Int\n", haskellName);
+        printf("    , pc_%s :: %s\n", haskellName, haskellType);
         break;
     case Gen_Haskell_Value:
         printf("    , pc_%s = %" PRIdPTR "\n", haskellName, val);
         break;
     case Gen_Haskell_Wrappers:
-        printf("%s :: DynFlags -> Int\n", haskellName);
+        printf("%s :: DynFlags -> %s\n", haskellName, haskellType);
         printf("%s dflags = pc_%s (sPlatformConstants (settings dflags))\n",
                haskellName, haskellName);
         break;
@@ -352,8 +339,30 @@ void constantIntC(char *cName, char *haskellName, intptr_t val) {
     }
 }
 
+void constantIntC(char *cName, char *haskellName, intptr_t val) {
+    /* If the value is larger than 2^28 or smaller than -2^28, then fail.
+       This test is a bit conservative, but if any constants are roughly
+       maxBoun or minBound then we probably need them to be Integer
+       rather than Int so that cross-compiling between 32bit and 64bit
+       platforms works. */
+    if (val > 268435456) {
+        printf("Value too large for constantInt: %" PRIdPTR "\n", val);
+        exit(1);
+    }
+    if (val < -268435456) {
+        printf("Value too small for constantInt: %" PRIdPTR "\n", val);
+        exit(1);
+    }
+
+    constantIntegralC("Int", cName, haskellName, val);
+}
+
 void constantInt(char *name, intptr_t val) {
-    constantIntC (NULL, name, val);
+    constantIntC(NULL, name, val);
+}
+
+void constantInteger(char *name, intptr_t val) {
+    constantIntegralC("Integer", NULL, name, val);
 }
 
 int
@@ -729,6 +738,11 @@ main(int argc, char *argv[])
 #endif
                                          );
 
+    constantInt("lDV_SHIFT", LDV_SHIFT);
+    constantInteger("iLDV_CREATE_MASK",  LDV_CREATE_MASK);
+    constantInteger("iLDV_STATE_CREATE", LDV_STATE_CREATE);
+    constantInteger("iLDV_STATE_USE",    LDV_STATE_USE);
+
     switch (mode) {
     case Gen_Haskell_Type:
         printf("  } deriving (Read, Show)\n");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.