Commit 03dc2dd3 authored by panne's avatar panne

[project @ 2005-03-27 13:41:13 by panne]

* Some preprocessors don't like the C99/C++ '//' comments after a
  directive, so use '/* */' instead. For consistency, a lot of '//' in
  the include files were converted, too.

* UnDOSified libraries/base/cbits/runProcess.c.

* My favourite sport: Killed $Id$s.
parent c0cca2ea
/* -----------------------------------------------------------------------------
* $Id: Block.h,v 1.18 2005/02/10 13:02:00 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
......@@ -143,7 +142,7 @@ INLINE_HEADER bdescr *Bdescr(StgPtr p)
#ifndef CMINUSMINUS
// to the end...
/* to the end... */
/* Double-linked block lists: --------------------------------------------- */
......
/* -----------------------------------------------------------------------------
* $Id: Bytecodes.h,v 1.10 2004/09/07 10:10:07 simonmar Exp $
*
* (c) The GHC Team, 1998-2002
*
......
......@@ -114,7 +114,7 @@
#define SET_PROF_HDR(c,ccs_) \
((c)->header.prof.ccs = ccs_, \
LDV_RECORD_CREATE((c)))
#endif // DEBUG_RETAINER
#endif /* DEBUG_RETAINER */
#define SET_STATIC_PROF_HDR(ccs_) \
prof : { ccs : (CostCentreStack *)ccs_, hp : { rs : NULL } },
#else
......
/* ----------------------------------------------------------------------------
* $Id: ClosureTypes.h,v 1.20 2005/02/10 13:02:02 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
......
......@@ -21,8 +21,8 @@
typedef struct {
CostCentreStack *ccs;
union {
struct _RetainerSet *rs; // Retainer Set
StgWord ldvw; // Lag/Drag/Void Word
struct _RetainerSet *rs; /* Retainer Set */
StgWord ldvw; /* Lag/Drag/Void Word */
} hp;
} StgProfHeader;
......@@ -79,14 +79,14 @@ typedef struct {
StgClosure *payload[FLEXIBLE_ARRAY];
} StgPAP;
// AP closures have the same layout, for convenience
/* AP closures have the same layout, for convenience */
typedef StgPAP StgAP;
typedef struct {
StgHeader header;
StgWord size; // number of words in payload
StgWord size; /* number of words in payload */
StgClosure *fun;
StgClosure *payload[FLEXIBLE_ARRAY]; // contains a chunk of *stack*
StgClosure *payload[FLEXIBLE_ARRAY]; /* contains a chunk of *stack* */
} StgAP_STACK;
typedef struct {
......@@ -194,13 +194,13 @@ typedef struct _StgDeadWeak { /* Weak v */
typedef struct {
StgHeader header;
StgArrWords *instrs; // a pointer to an ArrWords
StgArrWords *literals; // a pointer to an ArrWords
StgMutArrPtrs *ptrs; // a pointer to a MutArrPtrs
StgArrWords *itbls; // a pointer to an ArrWords
StgHalfWord arity; // arity of this BCO
StgHalfWord size; // size of this BCO (in words)
StgWord bitmap[FLEXIBLE_ARRAY]; // an StgLargeBitmap
StgArrWords *instrs; /* a pointer to an ArrWords */
StgArrWords *literals; /* a pointer to an ArrWords */
StgMutArrPtrs *ptrs; /* a pointer to a MutArrPtrs */
StgArrWords *itbls; /* a pointer to an ArrWords */
StgHalfWord arity; /* arity of this BCO */
StgHalfWord size; /* size of this BCO (in words) */
StgWord bitmap[FLEXIBLE_ARRAY]; /* an StgLargeBitmap */
} StgBCO;
#define BCO_BITMAP(bco) ((StgLargeBitmap *)((StgBCO *)(bco))->bitmap)
......@@ -317,8 +317,8 @@ typedef struct {
StgTVarWaitQueue *first_wait_queue_entry;
} StgTVar;
// new_value == expected_value for read-only accesses
// new_value is a StgTVarWaitQueue entry when trec in state TREC_WAITING
/* new_value == expected_value for read-only accesses */
/* new_value is a StgTVarWaitQueue entry when trec in state TREC_WAITING */
typedef struct {
StgTVar *tvar;
StgClosure *expected_value;
......@@ -335,12 +335,12 @@ typedef struct StgTRecChunk_ {
} StgTRecChunk;
typedef enum {
TREC_ACTIVE, // Transaction in progress, outcome undecided
TREC_CANNOT_COMMIT, // Transaction in progress, inconsistent writes performed
TREC_MUST_ABORT, // Transaction in progress, inconsistent / out of date reads
TREC_COMMITTED, // Transaction has committed, now updating tvars
TREC_ABORTED, // Transaction has aborted, now reverting tvars
TREC_WAITING, // Transaction currently waiting
TREC_ACTIVE, /* Transaction in progress, outcome undecided */
TREC_CANNOT_COMMIT, /* Transaction in progress, inconsistent writes performed */
TREC_MUST_ABORT, /* Transaction in progress, inconsistent / out of date reads */
TREC_COMMITTED, /* Transaction has committed, now updating tvars */
TREC_ABORTED, /* Transaction has aborted, now reverting tvars */
TREC_WAITING, /* Transaction currently waiting */
} TRecState;
typedef struct StgTRecHeader_ {
......
......@@ -58,9 +58,11 @@
#ifndef CMM_H
#define CMM_H
// In files that are included into both C and C-- (and perhaps
// Haskell) sources, we sometimes need to conditionally compile bits
// depending on the language. CMINUSMINUS==1 in .cmm sources:
/*
* In files that are included into both C and C-- (and perhaps
* Haskell) sources, we sometimes need to conditionally compile bits
* depending on the language. CMINUSMINUS==1 in .cmm sources:
*/
#define CMINUSMINUS 1
#include "ghcconfig.h"
......@@ -146,15 +148,17 @@
#define W_SHIFT 4
#endif
// Converting quantities of words to bytes
/* Converting quantities of words to bytes */
#define WDS(n) ((n)*SIZEOF_W)
// Converting quantities of bytes to words
// NB. these work on *unsigned* values only
/*
* Converting quantities of bytes to words
* NB. these work on *unsigned* values only
*/
#define BYTES_TO_WDS(n) ((n) / SIZEOF_W)
#define ROUNDUP_BYTES_TO_WDS(n) (((n) + SIZEOF_W - 1) / SIZEOF_W)
// TO_W_(n) converts n to W_ type from a smaller type
/* TO_W_(n) converts n to W_ type from a smaller type */
#if SIZEOF_W == 4
#define TO_W_(x) %sx32(x)
#define HALF_W_(x) %lobits16(x)
......@@ -200,15 +204,15 @@
#define DEBUG_ONLY(s) /* nothing */
#endif
//
// The IF_DEBUG macro is useful for debug messages that depend on one
// of the RTS debug options. For example:
//
// IF_DEBUG(RtsFlags_DebugFlags_apply,
// foreign "C" fprintf(stderr, stg_ap_0_ret_str));
//
// Note the syntax is slightly different to the C version of this macro.
//
/*
* The IF_DEBUG macro is useful for debug messages that depend on one
* of the RTS debug options. For example:
*
* IF_DEBUG(RtsFlags_DebugFlags_apply,
* foreign "C" fprintf(stderr, stg_ap_0_ret_str));
*
* Note the syntax is slightly different to the C version of this macro.
*/
#ifdef DEBUG
#define IF_DEBUG(c,s) if (RtsFlags_DebugFlags_##c(RtsFlags)) { s; }
#else
......@@ -268,10 +272,10 @@
#include "ClosureTypes.h"
#include "StgFun.h"
//
// Need MachRegs, because some of the RTS code is conditionally
// compiled based on REG_R1, REG_R2, etc.
//
/*
* Need MachRegs, because some of the RTS code is conditionally
* compiled based on REG_R1, REG_R2, etc.
*/
#define STOLEN_X86_REGS 4
#include "MachRegs.h"
......@@ -280,10 +284,10 @@
#undef BLOCK_SIZE
#undef MBLOCK_SIZE
#include "Block.h" // For Bdescr()
#include "Block.h" /* For Bdescr() */
// Can't think of a better place to put this.
/* Can't think of a better place to put this. */
#if SIZEOF_mp_limb_t != SIZEOF_VOID_P
#error mp_limb_t != StgWord: assumptions in PrimOps.cmm are now false
#endif
......@@ -292,20 +296,21 @@
Allocation and garbage collection
------------------------------------------------------------------------- */
// ALLOC_PRIM is for allocating memory on the heap for a primitive
// object. It is used all over PrimOps.cmm.
//
// We make the simplifying assumption that the "admin" part of a
// primitive closure is just the header when calculating sizes for
// ticky-ticky. It's not clear whether eg. the size field of an array
// should be counted as "admin", or the various fields of a BCO.
//
/*
* ALLOC_PRIM is for allocating memory on the heap for a primitive
* object. It is used all over PrimOps.cmm.
*
* We make the simplifying assumption that the "admin" part of a
* primitive closure is just the header when calculating sizes for
* ticky-ticky. It's not clear whether eg. the size field of an array
* should be counted as "admin", or the various fields of a BCO.
*/
#define ALLOC_PRIM(bytes,liveness,reentry) \
HP_CHK_GEN_TICKY(bytes,liveness,reentry); \
TICK_ALLOC_PRIM(SIZEOF_StgHeader,bytes-SIZEOF_StgHeader,0); \
CCCS_ALLOC(bytes);
// CCS_ALLOC wants the size in words, because ccs->mem_alloc is in words
/* CCS_ALLOC wants the size in words, because ccs->mem_alloc is in words */
#define CCCS_ALLOC(__alloc) CCS_ALLOC(BYTES_TO_WDS(__alloc), W_[CCCS])
#define HP_CHK_GEN_TICKY(alloc,liveness,reentry) \
......@@ -323,22 +328,22 @@
Closures
-------------------------------------------------------------------------- */
// The offset of the payload of an array
/* The offset of the payload of an array */
#define BYTE_ARR_CTS(arr) ((arr) + SIZEOF_StgArrWords)
// Getting/setting the info pointer of a closure
/* Getting/setting the info pointer of a closure */
#define SET_INFO(p,info) StgHeader_info(p) = info
#define GET_INFO(p) StgHeader_info(p)
// Determine the size of an ordinary closure from its info table
/* Determine the size of an ordinary closure from its info table */
#define sizeW_fromITBL(itbl) \
SIZEOF_StgHeader + WDS(%INFO_PTRS(itbl)) + WDS(%INFO_NPTRS(itbl))
// NB. duplicated from InfoTables.h!
/* NB. duplicated from InfoTables.h! */
#define BITMAP_SIZE(bitmap) ((bitmap) & BITMAP_SIZE_MASK)
#define BITMAP_BITS(bitmap) ((bitmap) >> BITMAP_BITS_SHIFT)
// Debugging macros
/* Debugging macros */
#define LOOKS_LIKE_INFO_PTR(p) \
((p) != NULL && \
(TO_W_(%INFO_TYPE(%STD_INFO(p))) != INVALID_OBJECT) && \
......@@ -346,14 +351,16 @@
#define LOOKS_LIKE_CLOSURE_PTR(p) (LOOKS_LIKE_INFO_PTR(GET_INFO(p)))
//
// The layout of the StgFunInfoExtra part of an info table changes
// depending on TABLES_NEXT_TO_CODE. So we define field access
// macros which use the appropriate version here:
//
/*
* The layout of the StgFunInfoExtra part of an info table changes
* depending on TABLES_NEXT_TO_CODE. So we define field access
* macros which use the appropriate version here:
*/
#ifdef TABLES_NEXT_TO_CODE
// when TABLES_NEXT_TO_CODE, slow_apply is stored as an offset
// instead of the normal pointer.
/*
* when TABLES_NEXT_TO_CODE, slow_apply is stored as an offset
* instead of the normal pointer.
*/
#define StgFunInfoExtra_slow_apply(fun_info) \
(StgFunInfoExtraRev_slow_apply_offset(fun_info) \
......@@ -447,25 +454,29 @@
#define TICK_HISTO(histo,n) TICK_HISTO_BY(histo,n,1)
// An unboxed tuple with n components.
/* An unboxed tuple with n components. */
#define TICK_RET_UNBOXED_TUP(n) \
TICK_BUMP(RET_UNBOXED_TUP_ctr++); \
TICK_HISTO(RET_UNBOXED_TUP,n)
// A slow call with n arguments. In the unevald case, this call has
// already been counted once, so don't count it again.
/*
* A slow call with n arguments. In the unevald case, this call has
* already been counted once, so don't count it again.
*/
#define TICK_SLOW_CALL(n) \
TICK_BUMP(SLOW_CALL_ctr); \
TICK_HISTO(SLOW_CALL,n)
// This slow call was found to be to an unevaluated function; undo the
// ticks we did in TICK_SLOW_CALL.
/*
* This slow call was found to be to an unevaluated function; undo the
* ticks we did in TICK_SLOW_CALL.
*/
#define TICK_SLOW_CALL_UNEVALD(n) \
TICK_BUMP(SLOW_CALL_UNEVALD_ctr); \
TICK_BUMP_BY(SLOW_CALL_ctr,-1); \
TICK_HISTO_BY(SLOW_CALL,n,-1);
// Updating a closure with a new CON
/* Updating a closure with a new CON */
#define TICK_UPD_CON_IN_NEW(n) \
TICK_BUMP(UPD_CON_IN_NEW_ctr); \
TICK_HISTO(UPD_CON_IN_NEW,n)
......@@ -474,4 +485,4 @@
TICK_BUMP(ALLOC_HEAP_ctr); \
TICK_BUMP_BY(ALLOC_HEAP_tot,n)
#endif // CMM_H
#endif /* CMM_H */
/* ----------------------------------------------------------------------------
* $Id: Constants.h,v 1.28 2005/02/10 13:02:03 simonmar Exp $
*
* (c) The GHC Team, 1998-2002
*
......@@ -196,7 +195,7 @@
#define LDV_LAST_MASK 0x00007FFF
#define LDV_STATE_CREATE 0x00000000
#define LDV_STATE_USE 0x40000000
#endif // SIZEOF_VOID_P
#endif /* SIZEOF_VOID_P */
/* -----------------------------------------------------------------------------
TSO related constants
......
/*
Time-stamp: <Fri Mar 24 2000 23:55:42 Stardate: [-30]4554.98 hwloidl>
$Id: GranSim.h,v 1.4 2004/11/10 04:17:50 wolfgang Exp $
Headers for GranSim specific objects.
Note that in GranSim we have one run-queue and blocking-queue for each
......@@ -31,21 +28,23 @@
extern StgTSO *CurrentTSO;
//@node Headers for GranSim specific objects, , ,
//@section Headers for GranSim specific objects
//@menu
//* Externs and prototypes::
//* Run and blocking queues::
//* Spark queues::
//* Processor related stuff::
//* GranSim costs::
//* STG called GranSim functions::
//* STG-called routines::
//@end menu
//@node Externs and prototypes, Run and blocking queues, Includes, Headers for GranSim specific objects
//@subsection Externs and prototypes
/*
* @node Headers for GranSim specific objects, , ,
* @section Headers for GranSim specific objects
*
* @menu
* * Externs and prototypes::
* * Run and blocking queues::
* * Spark queues::
* * Processor related stuff::
* * GranSim costs::
* * STG called GranSim functions::
* * STG-called routines::
* @end menu
*
* @node Externs and prototypes, Run and blocking queues, Includes, Headers for GranSim specific objects
* @subsection Externs and prototypes
*/
/* Global constants */
extern char *gran_event_names[];
......@@ -64,8 +63,10 @@ extern nat SparksAvail; /* How many sparks are available */
extern nat SurplusThreads; /* How many excess threads are there */
extern nat sparksIgnored, sparksCreated;
//@node Run and blocking queues, Spark queues, Externs and prototypes, Headers for GranSim specific objects
//@subsection Run and blocking queues
/*
* @node Run and blocking queues, Spark queues, Externs and prototypes, Headers for GranSim specific objects
* @subsection Run and blocking queues
*/
/* declared in Schedule.c */
extern StgTSO *run_queue_hds[], *run_queue_tls[];
......@@ -80,8 +81,10 @@ extern StgTSO *ccalling_threadss[];
#define pending_sparks_tl pending_sparks_tls[CurrentProc]
#define ccalling_threads ccalling_threadss[CurrentProc]
//@node Spark queues, Processor related stuff, Run and blocking queues, Headers for GranSim specific objects
//@subsection Spark queues
/*
* @node Spark queues, Processor related stuff, Run and blocking queues, Headers for GranSim specific objects
* @subsection Spark queues
*/
/*
In GranSim we use a double linked list to represent spark queues.
......@@ -113,22 +116,26 @@ extern rtsSparkQ pending_sparks_tls[];
rtsSpark *newSpark(StgClosure *node,
nat name, nat gran_info, nat size_info,
nat par_info, nat local);
// void add_to_spark_queue(rtsSpark *spark);
/* void add_to_spark_queue(rtsSpark *spark); */
//@node Processor related stuff, GranSim costs, Spark queues, Headers for GranSim specific objects
//@subsection Processor related stuff
/*
* @node Processor related stuff, GranSim costs, Spark queues, Headers for GranSim specific objects
* @subsection Processor related stuff
*/
extern PEs CurrentProc;
extern rtsTime CurrentTime[];
/* Maximum number of PEs that can be simulated */
#define MAX_PROC 32 /* (BITS_IN(StgWord)) */ // ToDo: fix this!!
//#if MAX_PROC==16
//#else
//#error MAX_PROC should be 32 on this architecture
//#endif
#define MAX_PROC 32 /* (BITS_IN(StgWord)) */ /* ToDo: fix this!! */
/*
#if MAX_PROC==16
#else
#error MAX_PROC should be 32 on this architecture
#endif
*/
// #define CurrentTSO CurrentTSOs[CurrentProc]
/* #define CurrentTSO CurrentTSOs[CurrentProc] */
/* Processor numbers to bitmasks and vice-versa */
#define MainProc 0 /* Id of main processor */
......@@ -148,8 +155,10 @@ extern rtsTime CurrentTime[];
#define GRAN_TIME_SLICE 1000 /* max time between 2 ReSchedules */
//@node GranSim costs, STG called GranSim functions, Processor related stuff, Headers for GranSim specific objects
//@subsection GranSim costs
/*
* @node GranSim costs, STG called GranSim functions, Processor related stuff, Headers for GranSim specific objects
* @subsection GranSim costs
*/
/* Default constants for communication (see RtsFlags on how to change them) */
......@@ -194,8 +203,10 @@ extern rtsTime CurrentTime[];
#define PRI_SPARK_OVERHEAD 5
#define PRI_SCHED_OVERHEAD 5
//@node STG called GranSim functions, STG-called routines, GranSim costs, Headers for GranSim specific objects
//@subsection STG called GranSim functions
/*
* @node STG called GranSim functions, STG-called routines, GranSim costs, Headers for GranSim specific objects
* @subsection STG called GranSim functions
*/
/* STG called GranSim functions */
void GranSimAllocate(StgInt n);
......@@ -208,8 +219,10 @@ void GranSimSparkAtAbs(rtsSpark *spark, PEs proc, StgInt identifier);
void GranSimBlock(StgTSO *tso, PEs proc, StgClosure *node);
//@node STG-called routines, , STG called GranSim functions, Headers for GranSim specific objects
//@subsection STG-called routines
/*
* @node STG-called routines, , STG called GranSim functions, Headers for GranSim specific objects
* @subsection STG-called routines
*/
/* Wrapped version of calls to GranSim-specific STG routines */
......@@ -224,13 +237,13 @@ void GranSimBlock(StgTSO *tso, PEs proc, StgClosure *node);
/*
ToDo: Clean up this mess of GRAN macros!!! -- HWL
*/
// DO_GRAN_FETCH((StgClosure*)R1.p);
/* DO_GRAN_FETCH((StgClosure*)R1.p); */
#define GRAN_FETCH() /* nothing */
#define GRAN_FETCH_AND_RESCHEDULE(liveness,reenter) \
DO_GRAN_FETCH((StgClosure*)R1.p); \
DO_GRAN_YIELD(liveness,ENTRY_CODE((D_)(*R1.p)));
// RESTORE_EVERYTHING is done implicitly before entering threaded world agian
/* RESTORE_EVERYTHING is done implicitly before entering threaded world again */
/*
This is the only macro currently enabled;
......@@ -262,11 +275,11 @@ void GranSimBlock(StgTSO *tso, PEs proc, StgClosure *node);
}
// YIELD(liveness,reenter)
/* YIELD(liveness,reenter) */
// GRAN_YIELD(liveness_mask);
/* GRAN_YIELD(liveness_mask); */
// GRAN_FETCH_AND_RESCHEDULE(liveness_mask,reenter)
/* GRAN_FETCH_AND_RESCHEDULE(liveness_mask,reenter) */
#define THREAD_CONTEXT_SWITCH(liveness_mask,reenter) \
do { \
......
/* -----------------------------------------------------------------------------
* $Id: Hooks.h,v 1.7 2004/02/15 13:29:44 krasimir Exp $
*
* (c) The GHC Team, 1998-1999
*
......
/* -----------------------------------------------------------------------------
* $Id: HsFFI.h,v 1.20 2004/08/13 13:09:13 simonmar Exp $
*
* (c) The GHC Team, 2000
*
......
/* ----------------------------------------------------------------------------
* $Id: InfoTables.h,v 1.35 2004/11/08 12:26:55 simonmar Exp $
*
* (c) The GHC Team, 1998-2002
*
......@@ -25,8 +24,8 @@ typedef struct {
#if 0 && (defined(PAR) || defined(GRAN))
// CURRENTLY UNUSED
// ToDo: use this in StgInfoTable (mutually recursive) -- HWL
/* CURRENTLY UNUSED
ToDo: use this in StgInfoTable (mutually recursive) -- HWL */
typedef struct {
StgInfoTable *rbh_infoptr; /* infoptr to the RBH */
......@@ -71,13 +70,15 @@ typedef struct {
# endif
/* see ParallelRts.h */
// EXTFUN(RBH_entry);
//StgClosure *convertToRBH(StgClosure *closure);
//#if defined(GRAN)
//void convertFromRBH(StgClosure *closure);
//#elif defined(PAR)
//void convertToFetchMe(StgPtr closure, globalAddr *ga);
//#endif
/*
EXTFUN(RBH_entry);
StgClosure *convertToRBH(StgClosure *closure);
#if defined(GRAN)
void convertFromRBH(StgClosure *closure);
#elif defined(PAR)
void convertToFetchMe(StgPtr closure, globalAddr *ga);
#endif
*/
#endif
......@@ -99,7 +100,7 @@ typedef struct {
#else /* !DEBUG_CLOSURE */
// There is no DEBUG-specific stuff in an info table at this time.
/* There is no DEBUG-specific stuff in an info table at this time. */
#endif /* DEBUG_CLOSURE */
......@@ -165,19 +166,19 @@ extern StgWord16 closure_flags[];
In these bitmaps: 0 == ptr, 1 == non-ptr.
-------------------------------------------------------------------------- */
//
// Small bitmaps: for a small bitmap, we store the size and bitmap in
// the same word, using the following macros. If the bitmap doesn't
// fit in a single word, we use a pointer to an StgLargeBitmap below.
//
/*
* Small bitmaps: for a small bitmap, we store the size and bitmap in
* the same word, using the following macros. If the bitmap doesn't
* fit in a single word, we use a pointer to an StgLargeBitmap below.
*/
#define MK_SMALL_BITMAP(size,bits) (((bits)<<BITMAP_BITS_SHIFT) | (size))
#define BITMAP_SIZE(bitmap) ((bitmap) & BITMAP_SIZE_MASK)
#define BITMAP_BITS(bitmap) ((bitmap) >> BITMAP_BITS_SHIFT)
//
// A large bitmap.
//
/*
* A large bitmap.
*/
typedef struct {
StgWord size;
StgWord bitmap[FLEXIBLE_ARRAY];
......@@ -192,15 +193,17 @@ typedef struct {
garbage-collect CAFs.
-------------------------------------------------------------------------- */
// An SRT is just an array of closure pointers:
/* An SRT is just an array of closure pointers: */
typedef StgClosure* StgSRT[];
// Each info table refers to some subset of the closure pointers in an
// SRT. It does this using a pair of an StgSRT pointer and a
// half-word bitmap. If the half-word bitmap isn't large enough, then
// we fall back to a large SRT, including an unbounded bitmap. If the
// half-word bitmap is set to all ones (0xffff), then the StgSRT
// pointer instead points to an StgLargeSRT:
/*
* Each info table refers to some subset of the closure pointers in an
* SRT. It does this using a pair of an StgSRT pointer and a
* half-word bitmap. If the half-word bitmap isn't large enough, then
* we fall back to a large SRT, including an unbounded bitmap. If the
* half-word bitmap is set to all ones (0xffff), then the StgSRT
* pointer instead points to an StgLargeSRT:
*/
typedef struct StgLargeSRT_ {
StgSRT *srt;
StgLargeBitmap l;
......@@ -210,38 +213,38 @@ typedef struct StgLargeSRT_ {
Info Tables
------------------------------------------------------------------------- */