diff options
-rw-r--r-- | compiler/cmm/CLabel.hs | 4 | ||||
-rw-r--r-- | compiler/cmm/CmmLex.x | 2 | ||||
-rw-r--r-- | compiler/cmm/CmmParse.y | 17 | ||||
-rw-r--r-- | rts/StgMiscClosures.cmm | 20 |
4 files changed, 23 insertions, 20 deletions
diff --git a/compiler/cmm/CLabel.hs b/compiler/cmm/CLabel.hs index 0f2c0ae7fa..c5afa09d75 100644 --- a/compiler/cmm/CLabel.hs +++ b/compiler/cmm/CLabel.hs @@ -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) diff --git a/compiler/cmm/CmmLex.x b/compiler/cmm/CmmLex.x index f56db7bd4c..dfbb751021 100644 --- a/compiler/cmm/CmmLex.x +++ b/compiler/cmm/CmmLex.x @@ -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 ), diff --git a/compiler/cmm/CmmParse.y b/compiler/cmm/CmmParse.y index db6cc49927..3bd0053cfc 100644 --- a/compiler/cmm/CmmParse.y +++ b/compiler/cmm/CmmParse.y @@ -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 diff --git a/rts/StgMiscClosures.cmm b/rts/StgMiscClosures.cmm index 42ef39e134..85ecb5e0e3 100644 --- a/rts/StgMiscClosures.cmm +++ b/rts/StgMiscClosures.cmm @@ -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. |