From 030a1217712fb01f9feeee436efd6c0523aa3b43 Mon Sep 17 00:00:00 2001 From: simonm Date: Mon, 15 Mar 1999 16:30:29 +0000 Subject: [PATCH] [project @ 1999-03-15 16:30:24 by simonm] Remove flags field from info tables; create a separate table of flags indexed by the closure type in the RTS. --- ghc/includes/ClosureTypes.h | 5 +- ghc/includes/InfoMacros.h | 9 +-- ghc/includes/InfoTables.h | 175 ++++--------------------------------------- ghc/includes/Stg.h | 17 +---- ghc/rts/ClosureFlags.c | 82 ++++++++++++++++++++ ghc/rts/GC.c | 4 +- ghc/rts/Printer.c | 8 +- ghc/rts/StgMiscClosures.hc | 10 ++- 8 files changed, 117 insertions(+), 193 deletions(-) create mode 100644 ghc/rts/ClosureFlags.c diff --git a/ghc/includes/ClosureTypes.h b/ghc/includes/ClosureTypes.h index 544bc76..e53c3fe 100644 --- a/ghc/includes/ClosureTypes.h +++ b/ghc/includes/ClosureTypes.h @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------- - * $Id: ClosureTypes.h,v 1.9 1999/02/05 16:02:20 simonm Exp $ + * $Id: ClosureTypes.h,v 1.10 1999/03/15 16:30:24 simonm Exp $ * * (c) The GHC Team, 1998-1999 * @@ -72,7 +72,8 @@ #define STABLE_NAME 56 #define TSO 57 #define BLOCKED_FETCH 58 -#define FETCH_ME 69 +#define FETCH_ME 59 #define EVACUATED 60 +#define N_CLOSURE_TYPES 61 #endif CLOSURETYPES_H diff --git a/ghc/includes/InfoMacros.h b/ghc/includes/InfoMacros.h index c56ab94..033ff90 100644 --- a/ghc/includes/InfoMacros.h +++ b/ghc/includes/InfoMacros.h @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------- - * $Id: InfoMacros.h,v 1.4 1999/03/02 19:44:09 sof Exp $ + * $Id: InfoMacros.h,v 1.5 1999/03/15 16:30:25 simonm Exp $ * * (c) The GHC Team, 1998-1999 * @@ -13,14 +13,12 @@ #define STD_INFO(type_) \ srt : 0, \ srt_len : 0, \ - type : type_, \ - flags: FLAGS_##type_ + type : type_ #define SRT_INFO(type_,srt_,srt_off_,srt_len_) \ srt : (StgSRT *)((StgClosure **)srt_+srt_off_), \ srt_len : srt_len_, \ - type : type_, \ - flags: FLAGS_##type_ + type : type_ /* function/thunk info tables --------------------------------------------- */ @@ -87,7 +85,6 @@ INFO_TABLE_CONSTR(info, entry, ptrs, nptrs, tag_,type_,info_class, \ layout : { payload : {ptrs,nptrs} }, \ srt_len : tag_, \ type : type_, \ - flags : FLAGS_##type_, \ INIT_ENTRY(entry) \ } diff --git a/ghc/includes/InfoTables.h b/ghc/includes/InfoTables.h index e99dabb..c1e28d6 100644 --- a/ghc/includes/InfoTables.h +++ b/ghc/includes/InfoTables.h @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------- - * $Id: InfoTables.h,v 1.12 1999/03/02 19:44:10 sof Exp $ + * $Id: InfoTables.h,v 1.13 1999/03/15 16:30:25 simonm Exp $ * * (c) The GHC Team, 1998-1999 * @@ -76,98 +76,6 @@ typedef struct { #endif /* DEBUG_CLOSURE */ -/* ----------------------------------------------------------------------------- - Closure Types - - If you add or delete any closure types, don't forget to update - ClosureTypes.h for the native code generator. This is a temporary - measure (I hope). - -------------------------------------------------------------------------- */ - -typedef enum { - - INVALID_OBJECT /* Object tag 0 raises an internal error */ - - , CONSTR - , CONSTR_1_0 - , CONSTR_0_1 - , CONSTR_2_0 - , CONSTR_1_1 - , CONSTR_0_2 - , CONSTR_INTLIKE - , CONSTR_CHARLIKE - , CONSTR_STATIC - , CONSTR_NOCAF_STATIC - - , FUN - , FUN_1_0 - , FUN_0_1 - , FUN_2_0 - , FUN_1_1 - , FUN_0_2 - , FUN_STATIC - - , THUNK - , THUNK_1_0 - , THUNK_0_1 - , THUNK_2_0 - , THUNK_1_1 - , THUNK_0_2 - , THUNK_STATIC - , THUNK_SELECTOR - - , BCO - , AP_UPD - - , PAP /* should be called AP_NUPD */ - - , IND - , IND_OLDGEN - , IND_PERM - , IND_OLDGEN_PERM - , IND_STATIC - - , CAF_UNENTERED - , CAF_ENTERED - , CAF_BLACKHOLE - - , RET_BCO - , RET_SMALL - , RET_VEC_SMALL - , RET_BIG - , RET_VEC_BIG - , RET_DYN - , UPDATE_FRAME - , CATCH_FRAME - , STOP_FRAME - , SEQ_FRAME - - , BLACKHOLE - , BLACKHOLE_BQ - - , MVAR - - , ARR_WORDS - , MUT_ARR_PTRS - , MUT_ARR_PTRS_FROZEN - - , MUT_VAR - - , WEAK - , FOREIGN - , STABLE_NAME - - , TSO - - , BLOCKED_FETCH - , FETCH_ME - - , EVACUATED - - , N_CLOSURE_TYPES /* number of distinct closure types */ - -} StgClosureType; - /* The type flags provide quick access to certain properties of a closure. */ #define _HNF (1<<0) /* head normal form? */ @@ -186,70 +94,15 @@ typedef enum { #define isUNPOINTED(flags) ((flags) &_UPT) #define hasSRT(flags) ((flags) &_SRT) -#define closure_STATIC(closure) ( get_itbl(closure)->flags & _STA) -#define closure_SHOULD_SPARK(closure) (!(get_itbl(closure)->flags & _NS)) -#define closure_MUTABLE(closure) ( get_itbl(closure)->flags & _MUT) -#define closure_UNPOINTED(closure) ( get_itbl(closure)->flags & _UPT) - -/* HNF BTM NS STA THU MUT UPT SRT */ - -#define FLAGS_CONSTR (_HNF| _NS ) -#define FLAGS_CONSTR_1_0 (_HNF| _NS ) -#define FLAGS_CONSTR_0_1 (_HNF| _NS ) -#define FLAGS_CONSTR_2_0 (_HNF| _NS ) -#define FLAGS_CONSTR_1_1 (_HNF| _NS ) -#define FLAGS_CONSTR_0_2 (_HNF| _NS ) -#define FLAGS_CONSTR_STATIC (_HNF| _NS|_STA ) -#define FLAGS_CONSTR_NOCAF_STATIC (_HNF| _NS|_STA ) -#define FLAGS_FUN (_HNF| _NS| _SRT ) -#define FLAGS_FUN_1_0 (_HNF| _NS ) -#define FLAGS_FUN_0_1 (_HNF| _NS ) -#define FLAGS_FUN_2_0 (_HNF| _NS ) -#define FLAGS_FUN_1_1 (_HNF| _NS ) -#define FLAGS_FUN_0_2 (_HNF| _NS ) -#define FLAGS_FUN_STATIC (_HNF| _NS|_STA| _SRT ) -#define FLAGS_THUNK ( _BTM| _THU| _SRT ) -#define FLAGS_THUNK_1_0 ( _BTM| _THU| _SRT ) -#define FLAGS_THUNK_0_1 ( _BTM| _THU| _SRT ) -#define FLAGS_THUNK_2_0 ( _BTM| _THU| _SRT ) -#define FLAGS_THUNK_1_1 ( _BTM| _THU| _SRT ) -#define FLAGS_THUNK_0_2 ( _BTM| _THU| _SRT ) -#define FLAGS_THUNK_STATIC ( _BTM| _STA|_THU| _SRT ) -#define FLAGS_THUNK_SELECTOR ( _BTM| _THU| _SRT ) -#define FLAGS_BCO (_HNF| _NS ) -#define FLAGS_CAF_UNENTERED 0 /* Do we still use these? */ -#define FLAGS_CAF_ENTERED 0 -#define FLAGS_CAF_BLACKHOLE ( _BTM|_NS| _UPT ) -#define FLAGS_AP_UPD ( _BTM| _THU ) -#define FLAGS_PAP (_HNF| _NS ) -#define FLAGS_IND 0 -#define FLAGS_IND_OLDGEN 0 -#define FLAGS_IND_PERM 0 -#define FLAGS_IND_OLDGEN_PERM 0 -#define FLAGS_IND_STATIC ( _STA ) -#define FLAGS_EVACUATED 0 -#define FLAGS_ARR_WORDS (_HNF| _NS| _UPT ) -#define FLAGS_MUT_ARR_PTRS (_HNF| _NS| _MUT|_UPT ) -#define FLAGS_MUT_ARR_PTRS_FROZEN (_HNF| _NS| _MUT|_UPT ) -#define FLAGS_MUT_VAR (_HNF| _NS| _MUT|_UPT ) -#define FLAGS_FOREIGN (_HNF| _NS| _UPT ) -#define FLAGS_STABLE_NAME (_HNF| _NS| _UPT ) -#define FLAGS_WEAK (_HNF| _NS| _UPT ) -#define FLAGS_BLACKHOLE ( _NS| _UPT ) -#define FLAGS_BLACKHOLE_BQ ( _NS| _MUT|_UPT ) -#define FLAGS_MVAR (_HNF| _NS| _MUT|_UPT ) -#define FLAGS_FETCH_ME (_HNF| _NS ) -#define FLAGS_TSO (_HNF| _NS| _MUT|_UPT ) -#define FLAGS_RET_BCO ( _BTM ) -#define FLAGS_RET_SMALL ( _BTM| _SRT) -#define FLAGS_RET_VEC_SMALL ( _BTM| _SRT) -#define FLAGS_RET_BIG ( _SRT) -#define FLAGS_RET_VEC_BIG ( _SRT) -#define FLAGS_RET_DYN ( _SRT) -#define FLAGS_CATCH_FRAME ( _BTM ) -#define FLAGS_STOP_FRAME ( _BTM ) -#define FLAGS_SEQ_FRAME ( _BTM ) -#define FLAGS_UPDATE_FRAME ( _BTM ) +extern StgWord16 closure_flags[]; + +#define closureFlags(c) (closure_flags[get_itbl(c)->type]) + +#define closure_STATIC(c) ( closureFlags(c) & _STA) +#define closure_SHOULD_SPARK(c) (!(closureFlags(c) & _NS)) +#define closure_MUTABLE(c) ( closureFlags(c) & _MUT) +#define closure_UNPOINTED(c) ( closureFlags(c) & _UPT) + /* ----------------------------------------------------------------------------- Info Tables @@ -314,13 +167,11 @@ typedef struct _StgInfoTable { #endif StgClosureInfo layout; /* closure layout info (pointer-sized) */ #if SIZEOF_VOID_P == 8 - StgWord16 flags; /* } */ - StgClosureType type : 16; /* } These 4 elements fit into 64 bits */ + StgWord32 type; /* } These 2 elements fit into 64 bits */ StgWord32 srt_len; /* } */ #else - StgWord8 flags; /* } */ - StgClosureType type : 8; /* } These 4 elements fit into 32 bits */ - StgWord16 srt_len; /* } */ + StgWord type : 16; /* } These 2 elements fit into 32 bits */ + StgWord srt_len : 16; /* } */ #endif #if USE_MINIINTERPRETER StgFunPtr (*vector)[]; diff --git a/ghc/includes/Stg.h b/ghc/includes/Stg.h index 6443c0c..d5fde9e 100644 --- a/ghc/includes/Stg.h +++ b/ghc/includes/Stg.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Stg.h,v 1.8 1999/03/03 19:28:23 sof Exp $ + * $Id: Stg.h,v 1.9 1999/03/15 16:30:25 simonm Exp $ * * (c) The GHC Team, 1998-1999 * @@ -96,6 +96,7 @@ void _stgAssert (char *, unsigned int); /* Storage format definitions */ #include "Closures.h" +#include "ClosureTypes.h" #include "InfoTables.h" #include "TSO.h" @@ -104,20 +105,6 @@ void _stgAssert (char *, unsigned int); #include "Regs.h" #include "TailCalls.h" -/** - * Added by Ian McDonald 7/5/98 - * XXX The position of this code is very - * important - it must come after the - * Regs.h include - **/ -#ifdef nemesis_TARGET_OS -#define _NEMESIS_OS_ -#ifndef __LANGUAGE_C -#define __LANGUAGE_C -#endif -#include -#endif - /* these are all ANSI C headers */ #include #include diff --git a/ghc/rts/ClosureFlags.c b/ghc/rts/ClosureFlags.c new file mode 100644 index 0000000..ded6c03 --- /dev/null +++ b/ghc/rts/ClosureFlags.c @@ -0,0 +1,82 @@ +/* ----------------------------------------------------------------------------- + * $Id: ClosureFlags.c,v 1.1 1999/03/15 16:30:27 simonm Exp $ + * + * (c) The GHC Team 1998-1999 + * + * Closure type flags + * + * ---------------------------------------------------------------------------*/ + +#include "Rts.h" + +StgWord16 closure_flags[] = { + +/* + * These *must* be in the same order as the closure types in + * ClosureTypes.h. + */ + +/* HNF BTM NS STA THU MUT UPT SRT */ + +/* INVALID_OBJECT */ ( 0 ), +/* CONSTR */ (_HNF| _NS ), +/* CONSTR_1_0 */ (_HNF| _NS ), +/* CONSTR_0_1 */ (_HNF| _NS ), +/* CONSTR_2_0 */ (_HNF| _NS ), +/* CONSTR_1_1 */ (_HNF| _NS ), +/* CONSTR_0_2 */ (_HNF| _NS ), +/* CONSTR_INTLIKE */ (_HNF| _NS|_STA ), +/* CONSTR_CHARLIKE */ (_HNF| _NS|_STA ), +/* CONSTR_STATIC */ (_HNF| _NS|_STA ), +/* CONSTR_NOCAF_STATIC */ (_HNF| _NS|_STA ), +/* FUN */ (_HNF| _NS| _SRT ), +/* FUN_1_0 */ (_HNF| _NS ), +/* FUN_0_1 */ (_HNF| _NS ), +/* FUN_2_0 */ (_HNF| _NS ), +/* FUN_1_1 */ (_HNF| _NS ), +/* FUN_0_2 */ (_HNF| _NS ), +/* FUN_STATIC */ (_HNF| _NS|_STA| _SRT ), +/* THUNK */ ( _BTM| _THU| _SRT ), +/* THUNK_1_0 */ ( _BTM| _THU| _SRT ), +/* THUNK_0_1 */ ( _BTM| _THU| _SRT ), +/* THUNK_2_0 */ ( _BTM| _THU| _SRT ), +/* THUNK_1_1 */ ( _BTM| _THU| _SRT ), +/* THUNK_0_2 */ ( _BTM| _THU| _SRT ), +/* THUNK_STATIC */ ( _BTM| _STA|_THU| _SRT ), +/* THUNK_SELECTOR */ ( _BTM| _THU| _SRT ), +/* BCO */ (_HNF| _NS ), +/* AP_UPD */ ( _BTM| _THU ), +/* PAP */ (_HNF| _NS ), +/* IND */ ( 0 ), +/* IND_OLDGEN */ ( 0 ), +/* IND_PERM */ ( 0 ), +/* IND_OLDGEN_PERM */ ( 0 ), +/* IND_STATIC */ ( _STA ), +/* CAF_UNENTERED */ ( 0 ), +/* CAF_ENTERED */ ( 0 ), +/* CAF_BLACKHOLE */ ( _BTM|_NS| _UPT ), +/* RET_BCO */ ( _BTM ), +/* RET_SMALL */ ( _BTM| _SRT), +/* RET_VEC_SMALL */ ( _BTM| _SRT), +/* RET_BIG */ ( _SRT), +/* RET_VEC_BIG */ ( _SRT), +/* RET_DYN */ ( _SRT), +/* UPDATE_FRAME */ ( _BTM ), +/* CATCH_FRAME */ ( _BTM ), +/* STOP_FRAME */ ( _BTM ), +/* SEQ_FRAME */ ( _BTM ), +/* BLACKHOLE */ ( _NS| _UPT ), +/* BLACKHOLE_BQ */ ( _NS| _MUT|_UPT ), +/* MVAR */ (_HNF| _NS| _MUT|_UPT ), +/* ARR_WORDS */ (_HNF| _NS| _UPT ), +/* MUT_ARR_PTRS */ (_HNF| _NS| _MUT|_UPT ), +/* MUT_ARR_PTRS_FROZEN */ (_HNF| _NS| _MUT|_UPT ), +/* MUT_VAR */ (_HNF| _NS| _MUT|_UPT ), +/* WEAK */ (_HNF| _NS| _UPT ), +/* FOREIGN */ (_HNF| _NS| _UPT ), +/* STABLE_NAME */ (_HNF| _NS| _UPT ), +/* TSO */ (_HNF| _NS| _MUT|_UPT ), +/* BLOCKED_FETCH */ (_HNF| _NS ), +/* FETCH_ME */ (_HNF| _NS ), +/* EVACUATED */ ( 0 ) +}; diff --git a/ghc/rts/GC.c b/ghc/rts/GC.c index f2191a9..59a3da1 100644 --- a/ghc/rts/GC.c +++ b/ghc/rts/GC.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: GC.c,v 1.50 1999/03/11 09:31:53 simonm Exp $ + * $Id: GC.c,v 1.51 1999/03/15 16:30:27 simonm Exp $ * * (c) The GHC Team 1998-1999 * @@ -2330,7 +2330,7 @@ scavenge_stack(StgPtr p, StgPtr stack_end) { StgUpdateFrame *frame = (StgUpdateFrame *)p; StgClosure *to; - StgClosureType type = get_itbl(frame->updatee)->type; + nat type = get_itbl(frame->updatee)->type; p += sizeofW(StgUpdateFrame); if (type == EVACUATED) { diff --git a/ghc/rts/Printer.c b/ghc/rts/Printer.c index 48fed99..7ebf193 100644 --- a/ghc/rts/Printer.c +++ b/ghc/rts/Printer.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------------- - * $Id: Printer.c,v 1.9 1999/03/09 14:51:23 sewardj Exp $ + * $Id: Printer.c,v 1.10 1999/03/15 16:30:29 simonm Exp $ * * Copyright (c) 1994-1999. * @@ -40,6 +40,7 @@ static void printZcoded ( const char *raw ); * ------------------------------------------------------------------------*/ +#ifdef INTERPRETER extern void* itblNames[]; extern int nItblNames; char* lookupHugsItblName ( void* v ) @@ -49,6 +50,7 @@ char* lookupHugsItblName ( void* v ) if (itblNames[i] == v) return itblNames[i+1]; return NULL; } +#endif extern void printPtr( StgPtr p ) { @@ -59,9 +61,9 @@ extern void printPtr( StgPtr p ) #ifdef INTERPRETER } else if ((raw = lookupHugsName(p)) != 0) { fprintf(stderr, "%s", raw); -#endif } else if ((str = lookupHugsItblName(p)) != 0) { fprintf(stderr, "%p=%s", p, str); +#endif } else { fprintf(stderr, "%p", p); } @@ -348,6 +350,7 @@ StgPtr printStackObj( StgPtr sp ) } else { StgClosure* c = (StgClosure*)(*sp); printPtr((StgPtr)*sp); +#ifdef INTERPRETER if (c == &ret_bco_info) { fprintf(stderr, "\t\t"); fprintf(stderr, "ret_bco_info\n" ); @@ -356,6 +359,7 @@ StgPtr printStackObj( StgPtr sp ) fprintf(stderr, "\t\t\t"); fprintf(stderr, "ConstrInfoTable\n" ); } else +#endif if (get_itbl(c)->type == BCO) { fprintf(stderr, "\t\t\t"); fprintf(stderr, "BCO(...)\n"); diff --git a/ghc/rts/StgMiscClosures.hc b/ghc/rts/StgMiscClosures.hc index 1058a2d..cc6b2b6 100644 --- a/ghc/rts/StgMiscClosures.hc +++ b/ghc/rts/StgMiscClosures.hc @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgMiscClosures.hc,v 1.16 1999/03/09 14:24:45 sewardj Exp $ + * $Id: StgMiscClosures.hc,v 1.17 1999/03/15 16:30:29 simonm Exp $ * * (c) The GHC Team, 1998-1999 * @@ -325,13 +325,15 @@ NON_ENTERABLE_ENTRY_CODE(MUT_CONS); -------------------------------------------------------------------------- */ -#define ArrayInfo(type) \ -INFO_TABLE(type##_info, type##_entry, 0, 0, type, const, EF_,0,0); \ -NON_ENTERABLE_ENTRY_CODE(type); +#define ArrayInfo(type) \ +INFO_TABLE(type##_info, type##_entry, 0, 0, type, const, EF_,0,0); ArrayInfo(ARR_WORDS); +NON_ENTERABLE_ENTRY_CODE(ARR_WORDS); ArrayInfo(MUT_ARR_PTRS); +NON_ENTERABLE_ENTRY_CODE(MUT_ARR_PTRS); ArrayInfo(MUT_ARR_PTRS_FROZEN); +NON_ENTERABLE_ENTRY_CODE(MUT_ARR_PTRS_FROZEN); #undef ArrayInfo -- 1.7.10.4