diff options
-rw-r--r-- | compiler/cmm/CLabel.hs | 5 | ||||
-rw-r--r-- | compiler/cmm/CmmExpr.hs | 1 | ||||
-rw-r--r-- | compiler/cmm/PprC.hs | 1 | ||||
-rw-r--r-- | compiler/cmm/PprCmm.hs | 1 | ||||
-rw-r--r-- | compiler/codeGen/CgClosure.lhs | 28 | ||||
-rw-r--r-- | compiler/codeGen/CgUtils.hs | 1 | ||||
-rw-r--r-- | compiler/codeGen/ClosureInfo.lhs | 12 | ||||
-rw-r--r-- | compiler/main/DynFlags.hs | 2 | ||||
-rw-r--r-- | compiler/nativeGen/AsmCodeGen.lhs | 4 | ||||
-rw-r--r-- | includes/ClosureTypes.h | 58 | ||||
-rw-r--r-- | includes/Regs.h | 6 | ||||
-rw-r--r-- | includes/RtsConfig.h | 18 | ||||
-rw-r--r-- | includes/StgMiscClosures.h | 10 | ||||
-rw-r--r-- | includes/mkDerivedConstants.c | 1 | ||||
-rw-r--r-- | rts/Capability.c | 1 | ||||
-rw-r--r-- | rts/ClosureFlags.c | 5 | ||||
-rw-r--r-- | rts/FrontPanel.c | 3 | ||||
-rw-r--r-- | rts/LdvProfile.c | 2 | ||||
-rw-r--r-- | rts/Linker.c | 1 | ||||
-rw-r--r-- | rts/Printer.c | 8 | ||||
-rw-r--r-- | rts/ProfHeap.c | 6 | ||||
-rw-r--r-- | rts/RetainerProfile.c | 6 | ||||
-rw-r--r-- | rts/Sanity.c | 4 | ||||
-rw-r--r-- | rts/StgMiscClosures.cmm | 29 | ||||
-rw-r--r-- | rts/ThreadPaused.c | 5 | ||||
-rw-r--r-- | rts/sm/Compact.c | 2 | ||||
-rw-r--r-- | rts/sm/Evac.c | 4 | ||||
-rw-r--r-- | rts/sm/Scav.c | 6 | ||||
-rw-r--r-- | utils/genapply/GenApply.hs | 2 |
29 files changed, 92 insertions, 140 deletions
diff --git a/compiler/cmm/CLabel.hs b/compiler/cmm/CLabel.hs index 0c3c007869..1c338243ab 100644 --- a/compiler/cmm/CLabel.hs +++ b/compiler/cmm/CLabel.hs @@ -63,7 +63,6 @@ module CLabel ( mkTopTickyCtrLabel, mkCAFBlackHoleInfoTableLabel, - mkSECAFBlackHoleInfoTableLabel, mkRtsPrimOpLabel, mkRtsSlowTickyCtrLabel, @@ -348,10 +347,6 @@ mkEMPTY_MVAR_infoLabel = RtsLabel (RtsInfo (sLit "stg_EMPTY_MVAR")) mkTopTickyCtrLabel = RtsLabel (RtsData (sLit "top_ct")) mkCAFBlackHoleInfoTableLabel = RtsLabel (RtsInfo (sLit "stg_CAF_BLACKHOLE")) -mkSECAFBlackHoleInfoTableLabel = if opt_DoTickyProfiling then - RtsLabel (RtsInfo (sLit "stg_SE_CAF_BLACKHOLE")) - else -- RTS won't have info table unless -ticky is on - panic "mkSECAFBlackHoleInfoTableLabel requires -ticky" mkRtsPrimOpLabel primop = RtsLabel (RtsPrimOp primop) moduleRegdLabel = ModuleRegdLabel diff --git a/compiler/cmm/CmmExpr.hs b/compiler/cmm/CmmExpr.hs index 06149b490d..69a4952ed6 100644 --- a/compiler/cmm/CmmExpr.hs +++ b/compiler/cmm/CmmExpr.hs @@ -267,6 +267,7 @@ data GlobalReg -- We keep the address of some commonly-called -- functions in the register table, to keep code -- size down: + | EagerBlackholeInfo -- stg_EAGER_BLACKHOLE_info | GCEnter1 -- stg_gc_enter_1 | GCFun -- stg_gc_fun diff --git a/compiler/cmm/PprC.hs b/compiler/cmm/PprC.hs index 37359ed84b..2a01217803 100644 --- a/compiler/cmm/PprC.hs +++ b/compiler/cmm/PprC.hs @@ -748,6 +748,7 @@ pprGlobalReg gr = case gr of CurrentNursery -> ptext (sLit "CurrentNursery") HpAlloc -> ptext (sLit "HpAlloc") BaseReg -> ptext (sLit "BaseReg") + EagerBlackholeInfo -> ptext (sLit "stg_EAGER_BLACKHOLE_info") GCEnter1 -> ptext (sLit "stg_gc_enter_1") GCFun -> ptext (sLit "stg_gc_fun") diff --git a/compiler/cmm/PprCmm.hs b/compiler/cmm/PprCmm.hs index dbfd20e424..e801aeee26 100644 --- a/compiler/cmm/PprCmm.hs +++ b/compiler/cmm/PprCmm.hs @@ -565,6 +565,7 @@ pprGlobalReg gr CurrentTSO -> ptext (sLit "CurrentTSO") CurrentNursery -> ptext (sLit "CurrentNursery") HpAlloc -> ptext (sLit "HpAlloc") + EagerBlackholeInfo -> ptext (sLit "stg_EAGER_BLACKHOLE_info") GCEnter1 -> ptext (sLit "stg_gc_enter_1") GCFun -> ptext (sLit "stg_gc_fun") BaseReg -> ptext (sLit "BaseReg") diff --git a/compiler/codeGen/CgClosure.lhs b/compiler/codeGen/CgClosure.lhs index 902b975a91..80949e7513 100644 --- a/compiler/codeGen/CgClosure.lhs +++ b/compiler/codeGen/CgClosure.lhs @@ -50,6 +50,8 @@ import Module import ListSetOps import Util import BasicTypes +import StaticFlags +import DynFlags import Constants import Outputable import FastString @@ -452,15 +454,9 @@ blackHoleIt :: ClosureInfo -> Code blackHoleIt closure_info = emitBlackHoleCode (closureSingleEntry closure_info) emitBlackHoleCode :: Bool -> Code -emitBlackHoleCode is_single_entry - | eager_blackholing = do - tickyBlackHole (not is_single_entry) - stmtC (CmmStore (CmmReg nodeReg) (CmmLit (CmmLabel bh_lbl))) - | otherwise = - nopC - where - bh_lbl | is_single_entry = mkRtsDataLabel (sLit "stg_SE_BLACKHOLE_info") - | otherwise = mkRtsDataLabel (sLit "stg_BLACKHOLE_info") +emitBlackHoleCode is_single_entry = do + + dflags <- getDynFlags -- If we wanted to do eager blackholing with slop filling, -- we'd need to do it at the *end* of a basic block, otherwise @@ -476,7 +472,16 @@ emitBlackHoleCode is_single_entry -- to bring back minimal ticky-ticky, so now EAGER_BLACKHOLING -- is unconditionally disabled. -- krc 1/2007 - eager_blackholing = False + let eager_blackholing = not opt_SccProfilingOn + && dopt Opt_EagerBlackHoling dflags + + if eager_blackholing + then do + tickyBlackHole (not is_single_entry) + let bh_info = CmmReg (CmmGlobal EagerBlackholeInfo) + stmtC (CmmStore (CmmReg nodeReg) bh_info) + else + nopC \end{code} \begin{code} @@ -571,8 +576,7 @@ link_caf cl_info is_upd = do ; returnFC hp_rel } where bh_cl_info :: ClosureInfo - bh_cl_info | is_upd = cafBlackHoleClosureInfo cl_info - | otherwise = seCafBlackHoleClosureInfo cl_info + bh_cl_info = cafBlackHoleClosureInfo cl_info ind_static_info :: CmmExpr ind_static_info = mkLblExpr mkIndStaticInfoLabel diff --git a/compiler/codeGen/CgUtils.hs b/compiler/codeGen/CgUtils.hs index 213b9ea4a0..4de3537788 100644 --- a/compiler/codeGen/CgUtils.hs +++ b/compiler/codeGen/CgUtils.hs @@ -542,6 +542,7 @@ baseRegOffset HpLim = oFFSET_StgRegTable_rHpLim baseRegOffset CurrentTSO = oFFSET_StgRegTable_rCurrentTSO baseRegOffset CurrentNursery = oFFSET_StgRegTable_rCurrentNursery baseRegOffset HpAlloc = oFFSET_StgRegTable_rHpAlloc +baseRegOffset EagerBlackholeInfo = oFFSET_stgEagerBlackholeInfo baseRegOffset GCEnter1 = oFFSET_stgGCEnter1 baseRegOffset GCFun = oFFSET_stgGCFun baseRegOffset BaseReg = panic "baseRegOffset:BaseReg" diff --git a/compiler/codeGen/ClosureInfo.lhs b/compiler/codeGen/ClosureInfo.lhs index 07a833f5af..dcb41b4cc4 100644 --- a/compiler/codeGen/ClosureInfo.lhs +++ b/compiler/codeGen/ClosureInfo.lhs @@ -58,7 +58,7 @@ module ClosureInfo ( closureValDescr, closureTypeDescr, -- profiling isStaticClosure, - cafBlackHoleClosureInfo, seCafBlackHoleClosureInfo, + cafBlackHoleClosureInfo, staticClosureNeedsLink, ) where @@ -959,16 +959,6 @@ cafBlackHoleClosureInfo (ClosureInfo { closureName = nm, closureType = ty, closureDescr = "" } cafBlackHoleClosureInfo _ = panic "cafBlackHoleClosureInfo" - -seCafBlackHoleClosureInfo (ClosureInfo { closureName = nm, - closureType = ty }) - = ClosureInfo { closureName = nm, - closureLFInfo = LFBlackHole mkSECAFBlackHoleInfoTableLabel, - closureSMRep = BlackHoleRep, - closureSRT = NoC_SRT, - closureType = ty, - closureDescr = "" } -seCafBlackHoleClosureInfo _ = panic "seCafBlackHoleClosureInfo" \end{code} %************************************************************************ diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 9c25251b8e..ded2443845 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -275,6 +275,7 @@ data DynFlag | Opt_DryRun | Opt_DoAsmMangling | Opt_ExcessPrecision + | Opt_EagerBlackHoling | Opt_ReadUserPackageConf | Opt_NoHsMain | Opt_SplitObjs @@ -1587,6 +1588,7 @@ fFlags = [ ( "dicts-cheap", Opt_DictsCheap, const Supported ), ( "inline-if-enough-args", Opt_InlineIfEnoughArgs, const Supported ), ( "excess-precision", Opt_ExcessPrecision, const Supported ), + ( "eager-blackholing", Opt_EagerBlackHoling, const Supported ), ( "asm-mangling", Opt_DoAsmMangling, const Supported ), ( "print-bind-result", Opt_PrintBindResult, const Supported ), ( "force-recomp", Opt_ForceRecomp, const Supported ), diff --git a/compiler/nativeGen/AsmCodeGen.lhs b/compiler/nativeGen/AsmCodeGen.lhs index 4d03a284cf..ee39dcd999 100644 --- a/compiler/nativeGen/AsmCodeGen.lhs +++ b/compiler/nativeGen/AsmCodeGen.lhs @@ -768,6 +768,10 @@ cmmExprConFold referenceKind expr -- On powerpc (non-PIC), it's easier to jump directly to a label than -- to use the register table, so we replace these registers -- with the corresponding labels: + CmmReg (CmmGlobal EagerBlackholeInfo) + | not opt_PIC + -> cmmExprConFold referenceKind $ + CmmLit (CmmLabel (mkRtsCodeLabel (sLit "__stg_EAGER_BLACKHOLE_INFO"))) CmmReg (CmmGlobal GCEnter1) | not opt_PIC -> cmmExprConFold referenceKind $ diff --git a/includes/ClosureTypes.h b/includes/ClosureTypes.h index 4876931d1c..99bd3060ff 100644 --- a/includes/ClosureTypes.h +++ b/includes/ClosureTypes.h @@ -64,35 +64,33 @@ #define STOP_FRAME 40 #define CAF_BLACKHOLE 41 #define BLACKHOLE 42 -#define SE_BLACKHOLE 43 -#define SE_CAF_BLACKHOLE 44 -#define MVAR_CLEAN 45 -#define MVAR_DIRTY 46 -#define ARR_WORDS 47 -#define MUT_ARR_PTRS_CLEAN 48 -#define MUT_ARR_PTRS_DIRTY 49 -#define MUT_ARR_PTRS_FROZEN0 50 -#define MUT_ARR_PTRS_FROZEN 51 -#define MUT_VAR_CLEAN 52 -#define MUT_VAR_DIRTY 53 -#define WEAK 54 -#define STABLE_NAME 55 -#define TSO 56 -#define BLOCKED_FETCH 57 -#define FETCH_ME 58 -#define FETCH_ME_BQ 59 -#define RBH 60 -#define REMOTE_REF 62 -#define TVAR_WATCH_QUEUE 63 -#define INVARIANT_CHECK_QUEUE 64 -#define ATOMIC_INVARIANT 65 -#define TVAR 66 -#define TREC_CHUNK 67 -#define TREC_HEADER 68 -#define ATOMICALLY_FRAME 69 -#define CATCH_RETRY_FRAME 70 -#define CATCH_STM_FRAME 71 -#define WHITEHOLE 72 -#define N_CLOSURE_TYPES 73 +#define MVAR_CLEAN 43 +#define MVAR_DIRTY 44 +#define ARR_WORDS 45 +#define MUT_ARR_PTRS_CLEAN 46 +#define MUT_ARR_PTRS_DIRTY 47 +#define MUT_ARR_PTRS_FROZEN0 48 +#define MUT_ARR_PTRS_FROZEN 49 +#define MUT_VAR_CLEAN 50 +#define MUT_VAR_DIRTY 51 +#define WEAK 52 +#define STABLE_NAME 53 +#define TSO 54 +#define BLOCKED_FETCH 55 +#define FETCH_ME 56 +#define FETCH_ME_BQ 57 +#define RBH 58 +#define REMOTE_REF 59 +#define TVAR_WATCH_QUEUE 60 +#define INVARIANT_CHECK_QUEUE 61 +#define ATOMIC_INVARIANT 62 +#define TVAR 63 +#define TREC_CHUNK 64 +#define TREC_HEADER 65 +#define ATOMICALLY_FRAME 66 +#define CATCH_RETRY_FRAME 67 +#define CATCH_STM_FRAME 68 +#define WHITEHOLE 69 +#define N_CLOSURE_TYPES 70 #endif /* CLOSURETYPES_H */ diff --git a/includes/Regs.h b/includes/Regs.h index cf083c957d..49366ed342 100644 --- a/includes/Regs.h +++ b/includes/Regs.h @@ -23,6 +23,7 @@ #define REGS_H typedef struct { + StgWord stgEagerBlackholeInfo; StgFunPtr stgGCEnter1; StgFunPtr stgGCFun; } StgFunTable; @@ -399,8 +400,9 @@ GLOBAL_REG_DECL(bdescr *,HpAlloc,REG_HpAlloc) #define FunReg ((StgFunTable *)((void *)BaseReg - sizeof(StgFunTable))) -#define stg_gc_enter_1 (FunReg->stgGCEnter1) -#define stg_gc_fun (FunReg->stgGCFun) +#define stg_EAGER_BLACKHOLE_info (FunReg->stgEagerBlackholeInfo) +#define stg_gc_enter_1 (FunReg->stgGCEnter1) +#define stg_gc_fun (FunReg->stgGCFun) /* ----------------------------------------------------------------------------- For any registers which are denoted "caller-saves" by the C calling diff --git a/includes/RtsConfig.h b/includes/RtsConfig.h index caf76b32f8..2f683cb00f 100644 --- a/includes/RtsConfig.h +++ b/includes/RtsConfig.h @@ -28,24 +28,6 @@ #define USING_LIBBFD 1 #endif -/* Turn lazy blackholing and eager blackholing on/off. - * - * Using eager blackholing makes things easier to debug because - * the blackholes are more predictable - but it's slower and less sexy. - * - * For now, do lazy and not eager. - */ - -/* TICKY_TICKY needs EAGER_BLACKHOLING to verify no double-entries of - * single-entry thunks. - */ -/* #if defined(TICKY_TICKY) || defined(THREADED_RTS) */ -#if defined(TICKY_TICKY) -# define EAGER_BLACKHOLING -#else -# define LAZY_BLACKHOLING -#endif - /* ----------------------------------------------------------------------------- Labels - entry labels & info labels point to the same place in TABLES_NEXT_TO_CODE, so we only generate the _info label. Jumps diff --git a/includes/StgMiscClosures.h b/includes/StgMiscClosures.h index 9158682047..8911cf3a09 100644 --- a/includes/StgMiscClosures.h +++ b/includes/StgMiscClosures.h @@ -89,11 +89,8 @@ RTS_INFO(stg_CAF_UNENTERED_info); RTS_INFO(stg_CAF_ENTERED_info); RTS_INFO(stg_WHITEHOLE_info); RTS_INFO(stg_BLACKHOLE_info); +RTS_INFO(__stg_EAGER_BLACKHOLE_info); RTS_INFO(stg_CAF_BLACKHOLE_info); -#ifdef TICKY_TICKY -RTS_INFO(stg_SE_BLACKHOLE_info); -RTS_INFO(stg_SE_CAF_BLACKHOLE_info); -#endif #if defined(PAR) || defined(GRAN) RTS_INFO(stg_RBH_info); @@ -148,11 +145,8 @@ RTS_ENTRY(stg_CAF_UNENTERED_entry); RTS_ENTRY(stg_CAF_ENTERED_entry); RTS_ENTRY(stg_WHITEHOLE_entry); RTS_ENTRY(stg_BLACKHOLE_entry); +RTS_ENTRY(__stg_EAGER_BLACKHOLE_entry); RTS_ENTRY(stg_CAF_BLACKHOLE_entry); -#ifdef TICKY_TICKY -RTS_ENTRY(stg_SE_BLACKHOLE_entry); -RTS_ENTRY(stg_SE_CAF_BLACKHOLE_entry); -#endif #if defined(PAR) || defined(GRAN) RTS_ENTRY(stg_RBH_entry); #endif diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c index 3aa7625db2..798c6e6ab0 100644 --- a/includes/mkDerivedConstants.c +++ b/includes/mkDerivedConstants.c @@ -226,6 +226,7 @@ main(int argc, char *argv[]) field_offset(StgRegTable, rmp_result1); field_offset(StgRegTable, rmp_result2); + def_offset("stgEagerBlackholeInfo", FUN_OFFSET(stgEagerBlackholeInfo)); def_offset("stgGCEnter1", FUN_OFFSET(stgGCEnter1)); def_offset("stgGCFun", FUN_OFFSET(stgGCFun)); diff --git a/rts/Capability.c b/rts/Capability.c index 0b3c84430b..27a2d51eb4 100644 --- a/rts/Capability.c +++ b/rts/Capability.c @@ -205,6 +205,7 @@ initCapability( Capability *cap, nat i ) cap->sparks_pruned = 0; #endif + cap->f.stgEagerBlackholeInfo = (W_)&__stg_EAGER_BLACKHOLE_info; cap->f.stgGCEnter1 = (F_)__stg_gc_enter_1; cap->f.stgGCFun = (F_)__stg_gc_fun; diff --git a/rts/ClosureFlags.c b/rts/ClosureFlags.c index eea609eff7..05baad72d4 100644 --- a/rts/ClosureFlags.c +++ b/rts/ClosureFlags.c @@ -69,8 +69,6 @@ StgWord16 closure_flags[] = { /* STOP_FRAME = */ ( _BTM ), /* CAF_BLACKHOLE = */ ( _BTM|_NS| _UPT ), /* BLACKHOLE = */ ( _NS| _UPT ), -/* SE_BLACKHOLE = */ ( _NS| _UPT ), -/* SE_CAF_BLACKHOLE = */ ( _NS| _UPT ), /* MVAR_CLEAN = */ (_HNF| _NS| _MUT|_UPT ), /* MVAR_DIRTY = */ (_HNF| _NS| _MUT|_UPT ), /* ARR_WORDS = */ (_HNF| _NS| _UPT ), @@ -87,7 +85,6 @@ StgWord16 closure_flags[] = { /* FETCH_ME = */ (_HNF| _NS| _MUT|_UPT ), /* FETCH_ME_BQ = */ ( _NS| _MUT|_UPT ), /* RBH = */ ( _NS| _MUT|_UPT ), -/* EVACUATED = */ ( 0 ), /* REMOTE_REF = */ (_HNF| _NS| _UPT ), /* TVAR_WATCH_QUEUE = */ ( _NS| _MUT|_UPT ), /* INVARIANT_CHECK_QUEUE= */ ( _NS| _MUT|_UPT ), @@ -101,6 +98,6 @@ StgWord16 closure_flags[] = { /* WHITEHOLE = */ ( 0 ) }; -#if N_CLOSURE_TYPES != 73 +#if N_CLOSURE_TYPES != 70 #error Closure types changed: update ClosureFlags.c! #endif diff --git a/rts/FrontPanel.c b/rts/FrontPanel.c index 5dfe87ac33..2ce91e2c65 100644 --- a/rts/FrontPanel.c +++ b/rts/FrontPanel.c @@ -664,8 +664,7 @@ residencyCensus( void ) break; case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: + case EAGER_BLACKHOLE: case BLACKHOLE: /* case BLACKHOLE_BQ: FIXME: case does not exist */ size = sizeW_fromITBL(info); diff --git a/rts/LdvProfile.c b/rts/LdvProfile.c index 0cd80dee65..6a807cf377 100644 --- a/rts/LdvProfile.c +++ b/rts/LdvProfile.c @@ -143,9 +143,7 @@ processHeapClosureForDead( StgClosure *c ) case FUN_1_1: case FUN_0_2: case BLACKHOLE: - case SE_BLACKHOLE: case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: case IND_PERM: case IND_OLDGEN_PERM: /* diff --git a/rts/Linker.c b/rts/Linker.c index 1fbe6027d2..67a510b965 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -763,6 +763,7 @@ typedef struct _RtsSymbolVal { SymI_HasProto(stable_ptr_table) \ SymI_HasProto(stackOverflow) \ SymI_HasProto(stg_CAF_BLACKHOLE_info) \ + SymI_HasProto(__stg_EAGER_BLACKHOLE_info) \ SymI_HasProto(awakenBlockedQueue) \ SymI_HasProto(startTimer) \ SymI_HasProto(stg_CHARLIKE_closure) \ diff --git a/rts/Printer.c b/rts/Printer.c index 3e80bd1a6f..1ad63063f8 100644 --- a/rts/Printer.c +++ b/rts/Printer.c @@ -306,14 +306,6 @@ printClosure( StgClosure *obj ) debugBelch("BH\n"); break; - case SE_BLACKHOLE: - debugBelch("SE_BH\n"); - break; - - case SE_CAF_BLACKHOLE: - debugBelch("SE_CAF_BH\n"); - break; - case ARR_WORDS: { StgWord i; diff --git a/rts/ProfHeap.c b/rts/ProfHeap.c index 9cb47a19fd..36d4eb5f6f 100644 --- a/rts/ProfHeap.c +++ b/rts/ProfHeap.c @@ -144,8 +144,6 @@ static char *type_names[] = { "STOP_FRAME", "CAF_BLACKHOLE", "BLACKHOLE", - "SE_BLACKHOLE", - "SE_CAF_BLACKHOLE", "MVAR_CLEAN", "MVAR_DIRTY", "ARR_WORDS", @@ -162,7 +160,6 @@ static char *type_names[] = { "FETCH_ME", "FETCH_ME_BQ", "RBH", - "EVACUATED", "REMOTE_REF", "TVAR_WATCH_QUEUE", "INVARIANT_CHECK_QUEUE", @@ -173,6 +170,7 @@ static char *type_names[] = { "ATOMICALLY_FRAME", "CATCH_RETRY_FRAME", "CATCH_STM_FRAME", + "WHITEHOLE", "N_CLOSURE_TYPES" }; #endif @@ -960,8 +958,6 @@ heapCensusChain( Census *census, bdescr *bd ) case IND_OLDGEN: case IND_OLDGEN_PERM: case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: case BLACKHOLE: case FUN_1_0: case FUN_0_1: diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c index 8d6126af2d..2bd213ad3d 100644 --- a/rts/RetainerProfile.c +++ b/rts/RetainerProfile.c @@ -453,8 +453,6 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child ) case CONSTR_0_2: case CAF_BLACKHOLE: case BLACKHOLE: - case SE_BLACKHOLE: - case SE_CAF_BLACKHOLE: case ARR_WORDS: *first_child = NULL; return; @@ -958,8 +956,6 @@ pop( StgClosure **c, StgClosure **cp, retainer *r ) case CONSTR_0_2: case CAF_BLACKHOLE: case BLACKHOLE: - case SE_BLACKHOLE: - case SE_CAF_BLACKHOLE: case ARR_WORDS: // one child (fixed), no SRT case MUT_VAR_CLEAN: @@ -1112,8 +1108,6 @@ isRetainer( StgClosure *c ) // blackholes case CAF_BLACKHOLE: case BLACKHOLE: - case SE_BLACKHOLE: - case SE_CAF_BLACKHOLE: // indirection case IND_PERM: case IND_OLDGEN_PERM: diff --git a/rts/Sanity.c b/rts/Sanity.c index 8f3b627a2b..71eae4490c 100644 --- a/rts/Sanity.c +++ b/rts/Sanity.c @@ -312,10 +312,6 @@ checkClosure( StgClosure* p ) case IND_PERM: case IND_OLDGEN: case IND_OLDGEN_PERM: -#ifdef TICKY_TICKY - case SE_BLACKHOLE: - case SE_CAF_BLACKHOLE: -#endif case BLACKHOLE: case CAF_BLACKHOLE: case STABLE_NAME: diff --git a/rts/StgMiscClosures.cmm b/rts/StgMiscClosures.cmm index d22a880917..7f7cf78f7b 100644 --- a/rts/StgMiscClosures.cmm +++ b/rts/StgMiscClosures.cmm @@ -384,14 +384,33 @@ INFO_TABLE(stg_CAF_BLACKHOLE,0,1,CAF_BLACKHOLE,"CAF_BLACKHOLE","CAF_BLACKHOLE") jump stg_block_blackhole; } -#ifdef EAGER_BLACKHOLING -INFO_TABLE(stg_SE_BLACKHOLE,0,1,SE_BLACKHOLE,"SE_BLACKHOLE","SE_BLACKHOLE") -{ foreign "C" barf("SE_BLACKHOLE object entered!") never returns; } +INFO_TABLE(__stg_EAGER_BLACKHOLE,0,1,BLACKHOLE,"EAGER_BLACKHOLE","EAGER_BLACKHOLE") +{ + TICK_ENT_BH(); + +#ifdef THREADED_RTS + // foreign "C" debugBelch("BLACKHOLE entry\n"); +#endif -INFO_TABLE(stg_SE_CAF_BLACKHOLE,0,1,SE_CAF_BLACKHOLE,"SE_CAF_BLACKHOLE","SE_CAF_BLACKHOLE") -{ foreign "C" barf("SE_CAF_BLACKHOLE object entered!") never returns; } + /* Actually this is not necessary because R1 is about to be destroyed. */ + LDV_ENTER(R1); + +#if defined(THREADED_RTS) + ACQUIRE_LOCK(sched_mutex "ptr"); + // released in stg_block_blackhole_finally #endif + /* Put ourselves on the blackhole queue */ + StgTSO__link(CurrentTSO) = W_[blackhole_queue]; + W_[blackhole_queue] = CurrentTSO; + + /* jot down why and on what closure we are blocked */ + StgTSO_why_blocked(CurrentTSO) = BlockedOnBlackHole::I16; + StgTSO_block_info(CurrentTSO) = R1; + + jump stg_block_blackhole; +} + /* ---------------------------------------------------------------------------- Whiteholes are used for the "locked" state of a closure (see lockClosure()) ------------------------------------------------------------------------- */ diff --git a/rts/ThreadPaused.c b/rts/ThreadPaused.c index 5463deecb8..674d0d9ca3 100644 --- a/rts/ThreadPaused.c +++ b/rts/ThreadPaused.c @@ -250,9 +250,6 @@ threadPaused(Capability *cap, StgTSO *tso) } if (bh->header.info != &stg_CAF_BLACKHOLE_info) { -#if (!defined(LAZY_BLACKHOLING)) && defined(DEBUG) - debugBelch("Unexpected lazy BHing required at 0x%04lx\n",(long)bh); -#endif // zero out the slop so that the sanity checker can tell // where the next closure is. DEBUG_FILL_SLOP(bh); @@ -261,7 +258,7 @@ threadPaused(Capability *cap, StgTSO *tso) // We pretend that bh is now dead. LDV_recordDead_FILL_SLOP_DYNAMIC((StgClosure *)bh); #endif - + // an EAGER_BLACKHOLE gets turned into a BLACKHOLE here. #ifdef THREADED_RTS cur_bh_info = (const StgInfoTable *) cas((StgVolatilePtr)&bh->header.info, diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c index b43c0ea532..fcd7cb16ed 100644 --- a/rts/sm/Compact.c +++ b/rts/sm/Compact.c @@ -621,8 +621,6 @@ thread_obj (StgInfoTable *info, StgPtr p) case MUT_VAR_CLEAN: case MUT_VAR_DIRTY: case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: case BLACKHOLE: { StgPtr end; diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c index 736c6c8d88..bbb7fe5795 100644 --- a/rts/sm/Evac.c +++ b/rts/sm/Evac.c @@ -626,8 +626,6 @@ loop: return; case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: case BLACKHOLE: copyPart(p,q,BLACKHOLE_sizeW(),sizeofW(StgHeader),stp); return; @@ -1038,8 +1036,6 @@ selector_loop: case THUNK_0_2: case THUNK_STATIC: case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: case BLACKHOLE: // not evaluated yet goto bale_out; diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c index b8fb54bfcd..24f19c93e1 100644 --- a/rts/sm/Scav.c +++ b/rts/sm/Scav.c @@ -504,8 +504,6 @@ scavenge_block (bdescr *bd) break; case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: case BLACKHOLE: p += BLACKHOLE_sizeW(); break; @@ -881,8 +879,6 @@ linear_scan: } case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: case BLACKHOLE: case ARR_WORDS: break; @@ -1197,8 +1193,6 @@ scavenge_one(StgPtr p) } case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: case BLACKHOLE: break; diff --git a/utils/genapply/GenApply.hs b/utils/genapply/GenApply.hs index 017927f5fa..9d0febb59f 100644 --- a/utils/genapply/GenApply.hs +++ b/utils/genapply/GenApply.hs @@ -566,8 +566,6 @@ genApply regstatus args = text " AP_STACK,", text " CAF_BLACKHOLE,", text " BLACKHOLE,", - text " SE_BLACKHOLE,", - text " SE_CAF_BLACKHOLE,", text " THUNK,", text " THUNK_1_0,", text " THUNK_0_1,", |