BC-breaking changes to C-- CLOSURE syntax.
authorEdward Z. Yang <ezyang@mit.edu>
Mon, 26 Aug 2013 21:52:37 +0000 (14:52 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Thu, 2 Oct 2014 05:26:38 +0000 (22:26 -0700)
Summary:
Previously, there were two variants of CLOSURE in C--:

    - Top-level CLOSURE(foo_closure, foo, lits...), which defines a new
      static closure and gives it a name, and

    - Array CLOSURE(foo, lits...), which was used for the static char
      and integer arrays.

They used the same name, were confusing, and didn't even generate
the correct internal label representation!  So now, we have two
new forms:

    - Top-level CLOSURE(foo, lits...) which automatically generates
      foo_closure (along with foo_info, which we were doing already)

    - Array ANONYMOUS_CLOSURE(foo, lits...) which doesn't generate
      a foo_closure identifier.

Part of remove HEAP_ALLOCED patch set (#8199)

Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
Test Plan: validate

Reviewers: simonmar, austin

Subscribers: simonmar, ezyang, carter, thomie

Differential Revision: https://phabricator.haskell.org/D264

GHC Trac Issues: #8199

compiler/cmm/CLabel.hs
compiler/cmm/CmmLex.x
compiler/cmm/CmmParse.y
rts/StgMiscClosures.cmm

index 0f2c0ae..c5afa09 100644 (file)
@@ -333,9 +333,9 @@ data CmmLabelInfo
   | CmmEntry                    -- ^ misc rts entry points,     suffix _entry
   | CmmRetInfo                  -- ^ misc rts ret info tables,  suffix _info
   | CmmRet                      -- ^ misc rts return points,    suffix _ret
-  | CmmData                     -- ^ misc rts data bits, eg CHARLIKE_closure
+  | CmmData                     -- ^ misc rts data bits
   | CmmCode                     -- ^ misc rts code
-  | CmmClosure                  -- ^ closures eg CHARLIKE_closure
+  | CmmClosure                  -- ^ misc rts closures,         suffix _closure
   | CmmPrimCall                 -- ^ a prim call to some hand written Cmm code
   deriving (Eq, Ord)
 
index f56db7b..dfbb751 100644 (file)
@@ -135,6 +135,7 @@ data CmmToken
   | CmmT_Ne
   | CmmT_BoolAnd
   | CmmT_BoolOr
+  | CmmT_ANONYMOUS_CLOSURE
   | CmmT_CLOSURE
   | CmmT_INFO_TABLE
   | CmmT_INFO_TABLE_RET
@@ -218,6 +219,7 @@ name span buf len =
 
 reservedWordsFM = listToUFM $
         map (\(x, y) -> (mkFastString x, y)) [
+        ( "ANONYMOUS_CLOSURE",  CmmT_ANONYMOUS_CLOSURE ),
         ( "CLOSURE",            CmmT_CLOSURE ),
         ( "INFO_TABLE",         CmmT_INFO_TABLE ),
         ( "INFO_TABLE_RET",     CmmT_INFO_TABLE_RET ),
index db6cc49..3bd0053 100644 (file)
@@ -300,6 +300,7 @@ import Data.Maybe
         '||'    { L _ (CmmT_BoolOr) }
 
         'CLOSURE'       { L _ (CmmT_CLOSURE) }
+        'ANONYMOUS_CLOSURE'{ L _ (CmmT_ANONYMOUS_CLOSURE) }
         'INFO_TABLE'    { L _ (CmmT_INFO_TABLE) }
         'INFO_TABLE_RET'{ L _ (CmmT_INFO_TABLE_RET) }
         'INFO_TABLE_FUN'{ L _ (CmmT_INFO_TABLE_FUN) }
@@ -369,10 +370,10 @@ cmmtop  :: { CmmParse () }
         : cmmproc                       { $1 }
         | cmmdata                       { $1 }
         | decl                          { $1 } 
-        | 'CLOSURE' '(' NAME ',' NAME lits ')' ';'  
+        | 'CLOSURE' '(' NAME lits ')' ';'  
                 {% withThisPackage $ \pkg -> 
-                   do lits <- sequence $6;
-                      staticClosure pkg $3 $5 (map getLit lits) }
+                   do lits <- sequence $4;
+                      staticClosure pkg $3 (map getLit lits) }
 
 -- The only static closures in the RTS are dummy closures like
 -- stg_END_TSO_QUEUE_closure and stg_dummy_ret.  We don't need
@@ -411,7 +412,7 @@ static  :: { CmmParse [CmmStatic] }
         | typenot8 '[' INT ']' ';'      { return [CmmUninitialised 
                                                 (widthInBytes (typeWidth $1) * 
                                                         fromIntegral $3)] }
-        | 'CLOSURE' '(' NAME lits ')'
+        | 'ANONYMOUS_CLOSURE' '(' NAME lits ')'
                 { do { lits <- sequence $4
                 ; dflags <- getDynFlags
                      ; return $ map CmmStaticLit $
@@ -1101,11 +1102,11 @@ profilingInfo dflags desc_str ty_str
     else ProfilingInfo (stringToWord8s desc_str)
                        (stringToWord8s ty_str)
 
-staticClosure :: PackageKey -> FastString -> FastString -> [CmmLit] -> CmmParse ()
-staticClosure pkg cl_label info payload
+staticClosure :: PackageKey -> FastString -> [CmmLit] -> CmmParse ()
+staticClosure pkg label payload
   = do dflags <- getDynFlags
-       let lits = mkStaticClosure dflags (mkCmmInfoLabel pkg info) dontCareCCS payload [] [] []
-       code $ emitStaticClosure (mkCmmDataLabel pkg cl_label) lits
+       let lits = mkStaticClosure dflags (mkCmmInfoLabel pkg label) dontCareCCS payload [] [] []
+       code $ emitStaticClosure (mkCmmClosureLabel pkg label) lits
 
 foreignCall
         :: String
index 42ef39e..85ecb5e 100644 (file)
@@ -457,7 +457,7 @@ INFO_TABLE_CONSTR(stg_C_FINALIZER_LIST,1,4,0,CONSTR,"C_FINALIZER_LIST","C_FINALI
 INFO_TABLE_CONSTR(stg_NO_FINALIZER,0,0,0,CONSTR_NOCAF_STATIC,"NO_FINALIZER","NO_FINALIZER")
 { foreign "C" barf("NO_FINALIZER object entered!") never returns; }
 
-CLOSURE(stg_NO_FINALIZER_closure,stg_NO_FINALIZER);
+CLOSURE(stg_NO_FINALIZER);
 
 /* ----------------------------------------------------------------------------
    Stable Names are unlifted too.
@@ -516,13 +516,13 @@ INFO_TABLE_CONSTR(stg_END_STM_CHUNK_LIST,0,0,0,CONSTR_NOCAF_STATIC,"END_STM_CHUN
 INFO_TABLE_CONSTR(stg_NO_TREC,0,0,0,CONSTR_NOCAF_STATIC,"NO_TREC","NO_TREC")
 { foreign "C" barf("NO_TREC object entered!") never returns; }
 
-CLOSURE(stg_END_STM_WATCH_QUEUE_closure,stg_END_STM_WATCH_QUEUE);
+CLOSURE(stg_END_STM_WATCH_QUEUE);
 
-CLOSURE(stg_END_INVARIANT_CHECK_QUEUE_closure,stg_END_INVARIANT_CHECK_QUEUE);
+CLOSURE(stg_END_INVARIANT_CHECK_QUEUE);
 
-CLOSURE(stg_END_STM_CHUNK_LIST_closure,stg_END_STM_CHUNK_LIST);
+CLOSURE(stg_END_STM_CHUNK_LIST);
 
-CLOSURE(stg_NO_TREC_closure,stg_NO_TREC);
+CLOSURE(stg_NO_TREC);
 
 /* ----------------------------------------------------------------------------
    Messages
@@ -553,7 +553,7 @@ INFO_TABLE_CONSTR(stg_MSG_NULL,1,0,0,PRIM,"MSG_NULL","MSG_NULL")
 INFO_TABLE_CONSTR(stg_END_TSO_QUEUE,0,0,0,CONSTR_NOCAF_STATIC,"END_TSO_QUEUE","END_TSO_QUEUE")
 { foreign "C" barf("END_TSO_QUEUE object entered!") never returns; }
 
-CLOSURE(stg_END_TSO_QUEUE_closure,stg_END_TSO_QUEUE);
+CLOSURE(stg_END_TSO_QUEUE);
 
 /* ----------------------------------------------------------------------------
    GCD_CAF
@@ -572,7 +572,7 @@ INFO_TABLE_CONSTR(stg_GCD_CAF,0,0,0,CONSTR_NOCAF_STATIC,"GCD_CAF","GCD_CAF")
 INFO_TABLE_CONSTR(stg_STM_AWOKEN,0,0,0,CONSTR_NOCAF_STATIC,"STM_AWOKEN","STM_AWOKEN")
 { foreign "C" barf("STM_AWOKEN object entered!") never returns; }
 
-CLOSURE(stg_STM_AWOKEN_closure,stg_STM_AWOKEN);
+CLOSURE(stg_STM_AWOKEN);
 
 /* ----------------------------------------------------------------------------
    Arrays
@@ -638,7 +638,7 @@ INFO_TABLE( stg_dummy_ret, 0, 0, CONSTR_NOCAF_STATIC, "DUMMY_RET", "DUMMY_RET")
 {
     return ();
 }
-CLOSURE(stg_dummy_ret_closure,stg_dummy_ret);
+CLOSURE(stg_dummy_ret);
 
 /* ----------------------------------------------------------------------------
    MVAR_TSO_QUEUE
@@ -673,8 +673,8 @@ INFO_TABLE_CONSTR(stg_MVAR_TSO_QUEUE,2,0,0,PRIM,"MVAR_TSO_QUEUE","MVAR_TSO_QUEUE
 #endif
 
 
-#define CHARLIKE_HDR(n)  CLOSURE(Char_hash_static_info, n)
-#define INTLIKE_HDR(n)   CLOSURE(Int_hash_static_info, n)
+#define CHARLIKE_HDR(n)  ANONYMOUS_CLOSURE(Char_hash_static_info, n)
+#define INTLIKE_HDR(n)   ANONYMOUS_CLOSURE(Int_hash_static_info, n)
 
 /* put these in the *data* section, since the garbage collector relies
  * on the fact that static closures live in the data section.