[project @ 2002-06-03 11:31:55 by simonmar]
[ghc-hetmet.git] / ghc / includes / InfoMacros.h
index 91900d4..b181ce5 100644 (file)
@@ -1,5 +1,5 @@
 /* ----------------------------------------------------------------------------
- * $Id: InfoMacros.h,v 1.8 1999/11/30 11:44:32 simonmar Exp $
+ * $Id: InfoMacros.h,v 1.18 2002/02/26 05:03:27 sof Exp $
  * 
  * (c) The GHC Team, 1998-1999
  *
                srt_len : tag_,                 \
                type : type_
 
+#ifdef PROFILING
+#define PROF_INFO(type_str, desc_str)          \
+               prof: {                         \
+                  closure_type: type_str,      \
+                  closure_desc: desc_str,      \
+               },
+#else
+#define PROF_INFO(type_str, desc_str)
+#endif
+
+/* Why no empty array initializer in the 'else' branch? sof 2/02 */
 #ifdef USE_MINIINTERPRETER
-#define INIT_VECTOR {}
+#define INIT_VECTOR vector : {}
 #else
 #define INIT_VECTOR
 #endif
 
+/*
+  On the GranSim/GUM specific parts of the InfoTables (GRAN/PAR):
+
+  In both GranSim and GUM we use revertible black holes (RBH) when putting
+  an updatable closure into a packet for communication. The entry code for
+  an RBH performs standard blocking (as with any kind of BH). The info
+  table for the RBH resides just before the one for the std info
+  table. (NB: there is one RBH ITBL for every ITBL of an updatable
+  closure.) The @rbh_infoptr@ field in the ITBL points from the std ITBL to
+  the RBH ITBL and vice versa. This is used by the RBH_INFOPTR and
+  REVERT_INFOPTR macros to turn an updatable node into an RBH and vice
+  versa. Note, that the only case where we have to revert the RBH in its
+  original form is when a packet is sent back because of garbage collection
+  on another PE. In the RTS for GdH we will use this reversion mechanism in 
+  order to deal with faults in the system. 
+  ToDo: Check that RBHs are needed for all the info tables below. From a quick
+  check of the macros generated in the libs it seems that all of them are used
+  for generating THUNKs.
+  Possible optimisation: Note that any RBH ITBL is a fixed distance away from 
+  the actual ITBL. We could inline this offset as a constant into the RTS and
+  avoid the rbh_infoptr fields altogether (Jim did that in the old RTS).
+  -- HWL
+*/
+
+
 /* function/thunk info tables --------------------------------------------- */
 
+#if defined(GRAN) || defined(PAR)
+
 #define \
 INFO_TABLE_SRT(info,                           /* info-table label */  \
               entry,                           /* entry code label */  \
@@ -41,63 +79,206 @@ INFO_TABLE_SRT(info,                               /* info-table label */  \
               type,                            /* closure type */      \
               info_class, entry_class,         /* C storage classes */ \
               prof_descr, prof_type)           /* profiling info */    \
+        entry_class(stg_RBH_##entry);                                          \
         entry_class(entry);                                             \
+       ED_RO_ StgInfoTable info;                                       \
+       info_class INFO_TBL_CONST StgInfoTable stg_RBH_##info = {               \
+               layout : { payload : {ptrs,nptrs} },                    \
+                PROF_INFO(prof_type, prof_descr)                       \
+               SRT_INFO(RBH,srt_,srt_off_,srt_len_),                   \
+                INCLUDE_RBH_INFO(info),                                        \
+                INIT_ENTRY(stg_RBH_##entry),                                   \
+                INIT_VECTOR                                             \
+       } ;                                                             \
+        StgFunPtr stg_RBH_##entry (void) {                                  \
+          FB_                                                           \
+            JMP_(stg_RBH_entry);                                            \
+          FE_                                                           \
+        } ;                                                             \
        info_class INFO_TBL_CONST StgInfoTable info = {                 \
                layout : { payload : {ptrs,nptrs} },                    \
+                PROF_INFO(prof_type, prof_descr)                       \
                SRT_INFO(type,srt_,srt_off_,srt_len_),                  \
+                INCLUDE_RBH_INFO(stg_RBH_##info),                              \
                 INIT_ENTRY(entry),                                      \
                 INIT_VECTOR                                             \
        }
 
+#else
+
+#define \
+INFO_TABLE_SRT(info,                           /* info-table label */  \
+              entry,                           /* entry code label */  \
+              ptrs, nptrs,                     /* closure layout info */\
+              srt_, srt_off_, srt_len_,        /* SRT info */          \
+              type,                            /* closure type */      \
+              info_class, entry_class,         /* C storage classes */ \
+              prof_descr, prof_type)           /* profiling info */    \
+        entry_class(entry);                                             \
+       info_class INFO_TBL_CONST StgInfoTable info = {                 \
+               layout : { payload : {ptrs,nptrs} },                    \
+                PROF_INFO(prof_type, prof_descr)                       \
+               SRT_INFO(type,srt_,srt_off_,srt_len_),                  \
+                INIT_ENTRY(entry),                                      \
+                INIT_VECTOR                                             \
+       }
+
+#endif
 
 /* direct-return address info tables  --------------------------------------*/
 
+#if defined(GRAN) || defined(PAR)
+
+#define                                                                        \
+INFO_TABLE_SRT_BITMAP(info, entry, bitmap_, srt_, srt_off_, srt_len_,  \
+                     type, info_class, entry_class,                    \
+                     prof_descr, prof_type)                            \
+        entry_class(stg_RBH_##entry);                                  \
+        entry_class(entry);                                            \
+       ED_RO_ StgInfoTable info;                                       \
+       info_class INFO_TBL_CONST StgInfoTable stg_RBH_##info = {       \
+               layout : { bitmap : (StgWord)bitmap_ },                 \
+                PROF_INFO(prof_type, prof_descr)                       \
+               SRT_INFO(RBH,srt_,srt_off_,srt_len_),                   \
+                INCLUDE_RBH_INFO(info),                                        \
+                INIT_ENTRY(stg_RBH_##entry),                           \
+                INIT_VECTOR                                            \
+       };                                                              \
+        StgFunPtr stg_RBH_##entry (void) {                              \
+          FB_                                                           \
+            JMP_(stg_RBH_entry);                                        \
+          FE_                                                           \
+        } ;                                                             \
+       info_class INFO_TBL_CONST StgInfoTable info = {                 \
+               layout : { bitmap : (StgWord)bitmap_ },                 \
+                PROF_INFO(prof_type, prof_descr)                       \
+               SRT_INFO(type,srt_,srt_off_,srt_len_),                  \
+                INCLUDE_RBH_INFO(stg_RBH_##info),                      \
+                INIT_ENTRY(entry),                                     \
+                INIT_VECTOR                                            \
+       }
+
+#else
+
 #define                                                                        \
 INFO_TABLE_SRT_BITMAP(info, entry, bitmap_, srt_, srt_off_, srt_len_,  \
                      type, info_class, entry_class,                    \
                      prof_descr, prof_type)                            \
         entry_class(entry);                                            \
        info_class INFO_TBL_CONST StgInfoTable info = {                 \
-               layout : { bitmap : (StgWord32)bitmap_ },               \
+               layout : { bitmap : (StgWord)bitmap_ },                 \
+                PROF_INFO(prof_type, prof_descr)                       \
                SRT_INFO(type,srt_,srt_off_,srt_len_),                  \
                 INIT_ENTRY(entry),                                     \
                 INIT_VECTOR                                            \
        }
+#endif
 
 /* info-table without an SRT -----------------------------------------------*/
 
+#if defined(GRAN) || defined(PAR)
+
+#define                                                                \
+INFO_TABLE(info, entry, ptrs, nptrs, type, info_class,         \
+          entry_class, prof_descr, prof_type)                  \
+        entry_class(stg_RBH_##entry);                          \
+        entry_class(entry);                                    \
+       ED_ StgInfoTable info;                          \
+       info_class INFO_TBL_CONST StgInfoTable stg_RBH_##info = {       \
+               layout : { payload : {ptrs,nptrs} },            \
+                PROF_INFO(prof_type, prof_descr)               \
+               STD_INFO(RBH),                                  \
+                INCLUDE_RBH_INFO(info),                                \
+                INIT_ENTRY(stg_RBH_##entry),                   \
+                INIT_VECTOR                                    \
+       } ;                                                     \
+        StgFunPtr stg_RBH_##entry (void) {                          \
+          FB_                                                   \
+            JMP_(stg_RBH_entry);                                    \
+          FE_                                                   \
+        } ;                                                     \
+       info_class INFO_TBL_CONST StgInfoTable info = { \
+               layout : { payload : {ptrs,nptrs} },            \
+                PROF_INFO(prof_type, prof_descr)               \
+               STD_INFO(type),                                 \
+                INCLUDE_RBH_INFO(stg_RBH_##info),                      \
+                INIT_ENTRY(entry),                             \
+                INIT_VECTOR                                    \
+       }
+
+#else
+
 #define                                                        \
 INFO_TABLE(info, entry, ptrs, nptrs, type, info_class, \
           entry_class, prof_descr, prof_type)          \
         entry_class(entry);                            \
        info_class INFO_TBL_CONST StgInfoTable info = { \
                layout : { payload : {ptrs,nptrs} },    \
+                PROF_INFO(prof_type, prof_descr)       \
                STD_INFO(type),                         \
                 INIT_ENTRY(entry),                     \
                 INIT_VECTOR                            \
        }
 
+#endif
+
 /* special selector-thunk info table ---------------------------------------*/
 
+#if defined(GRAN) || defined(PAR)
+
+#define                                                                \
+INFO_TABLE_SELECTOR(info, entry, offset, info_class,           \
+                   entry_class, prof_descr, prof_type)         \
+        entry_class(stg_RBH_##entry);                          \
+        entry_class(entry);                                    \
+       ED_RO_ StgInfoTable info;                               \
+       info_class INFO_TBL_CONST StgInfoTable stg_RBH_##info = {       \
+               layout : { selector_offset : offset },          \
+                PROF_INFO(prof_type, prof_descr)               \
+               STD_INFO(RBH),                                  \
+                INCLUDE_RBH_INFO(info),                                \
+                INIT_ENTRY(stg_RBH_##entry),                   \
+                INIT_VECTOR                                    \
+       };                                                      \
+        StgFunPtr stg_RBH_##entry (void) {                          \
+          FB_                                                   \
+            JMP_(stg_RBH_entry);                                    \
+          FE_                                                   \
+        } ;                                                     \
+       info_class INFO_TBL_CONST StgInfoTable info = {         \
+               layout : { selector_offset : offset },          \
+                PROF_INFO(prof_type, prof_descr)               \
+               STD_INFO(THUNK_SELECTOR),                       \
+                INCLUDE_RBH_INFO(stg_RBH_##info),                      \
+                INIT_ENTRY(entry),                             \
+                INIT_VECTOR                                    \
+       }
+
+#else
+
 #define                                                        \
 INFO_TABLE_SELECTOR(info, entry, offset, info_class,   \
                    entry_class, prof_descr, prof_type) \
         entry_class(entry);                            \
        info_class INFO_TBL_CONST StgInfoTable info = { \
                layout : { selector_offset : offset },  \
+                PROF_INFO(prof_type, prof_descr)       \
                STD_INFO(THUNK_SELECTOR),               \
                 INIT_ENTRY(entry),                     \
                 INIT_VECTOR                            \
        }
 
+#endif
+
 /* constructor info table --------------------------------------------------*/
 
-#define \
+#define                                                                        \
 INFO_TABLE_CONSTR(info, entry, ptrs, nptrs, tag_,type_,info_class,     \
                  entry_class, prof_descr, prof_type)                   \
         entry_class(entry);                                            \
        info_class INFO_TBL_CONST StgInfoTable info = {                 \
                layout : { payload : {ptrs,nptrs} },                    \
+                PROF_INFO(prof_type, prof_descr)                       \
                 CONSTR_INFO(type_,tag_),                               \
                 INIT_ENTRY(entry),                                     \
                 INIT_VECTOR                                            \
@@ -157,7 +338,7 @@ typedef struct {
        info_class INFO_TBL_CONST vec_info_2 info = {           \
                { alt_2, alt_1 },                               \
                i : {                                           \
-                  layout : { bitmap : (StgWord32)bitmap_ },    \
+                  layout : { bitmap : (StgWord)bitmap_ },      \
                   SRT_INFO(type,srt_,srt_off_,srt_len_)        \
                }                                               \
        }
@@ -169,7 +350,7 @@ typedef struct {
        info_class INFO_TBL_CONST vec_info_3 info = {           \
                { alt_3, alt_2, alt_1 },                        \
                i : {                                           \
-                  layout : { bitmap : (StgWord32)bitmap_ },    \
+                  layout : { bitmap : (StgWord)bitmap_ },      \
                   SRT_INFO(type,srt_,srt_off_,srt_len_)        \
                }                                               \
        }
@@ -181,7 +362,7 @@ typedef struct {
        info_class INFO_TBL_CONST vec_info_4 info = {           \
                { alt_4, alt_3, alt_2, alt_1 },                 \
                i : {                                           \
-                  layout : { bitmap : (StgWord32)bitmap_ },    \
+                  layout : { bitmap : (StgWord)bitmap_ },      \
                   SRT_INFO(type,srt_,srt_off_,srt_len_)        \
                }                                               \
        }
@@ -195,7 +376,7 @@ typedef struct {
                { alt_5, alt_4, alt_3, alt_2,                   \
                  alt_1 },                                      \
                i : {                                           \
-                  layout : { bitmap : (StgWord32)bitmap_ },    \
+                  layout : { bitmap : (StgWord)bitmap_ },      \
                   SRT_INFO(type,srt_,srt_off_,srt_len_)        \
                }                                               \
        }
@@ -209,7 +390,7 @@ typedef struct {
                { alt_6, alt_5, alt_4, alt_3,                   \
                  alt_2, alt_1 },                               \
                i : {                                           \
-                  layout : { bitmap : (StgWord32)bitmap_ },    \
+                  layout : { bitmap : (StgWord)bitmap_ },      \
                   SRT_INFO(type,srt_,srt_off_,srt_len_)        \
                }                                               \
        }
@@ -223,7 +404,7 @@ typedef struct {
                { alt_7, alt_6, alt_5, alt_4,                   \
                  alt_3, alt_2, alt_1 },                        \
                i : {                                           \
-                  layout : { bitmap : (StgWord32)bitmap_ },    \
+                  layout : { bitmap : (StgWord)bitmap_ },      \
                   SRT_INFO(type,srt_,srt_off_,srt_len_)        \
                }                                               \
        }
@@ -237,7 +418,7 @@ typedef struct {
                { alt_8, alt_7, alt_6, alt_5,                   \
                  alt_4, alt_3, alt_2, alt_1 },                 \
                i : {                                           \
-                  layout : { bitmap : (StgWord32)bitmap_ },    \
+                  layout : { bitmap : (StgWord)bitmap_ },      \
                   SRT_INFO(type,srt_,srt_off_,srt_len_)        \
                }                                               \
        }
@@ -290,7 +471,7 @@ typedef struct {
                   type, info_class,                            \
                   alt_1, alt_2)                                \
        info_class INFO_TBL_CONST vec_info_2 info = {           \
-               i : { layout : { bitmap : (StgWord32)bitmap_ }, \
+               i : { layout : { bitmap : (StgWord)bitmap_ },   \
                      SRT_INFO(type,srt_,srt_off_,srt_len_),    \
                      INIT_ENTRY(NULL),                         \
                },                                              \
@@ -302,7 +483,7 @@ typedef struct {
                   alt_1, alt_2, alt_3                          \
                  )                                             \
        info_class INFO_TBL_CONST vec_info_3 info = {           \
-               i : { layout : { bitmap : (StgWord32)bitmap_ }, \
+               i : { layout : { bitmap : (StgWord)bitmap_ },   \
                      SRT_INFO(type,srt_,srt_off_,srt_len_),    \
                      INIT_ENTRY(NULL),                         \
                },                                              \
@@ -314,7 +495,7 @@ typedef struct {
                   alt_1, alt_2, alt_3, alt_4                   \
                  )                                             \
        info_class INFO_TBL_CONST vec_info_4 info = {           \
-               i : { layout : { bitmap : (StgWord32)bitmap_ }, \
+               i : { layout : { bitmap : (StgWord)bitmap_ },   \
                      SRT_INFO(type,srt_,srt_off_,srt_len_),    \
                      INIT_ENTRY(NULL),                         \
                },                                              \
@@ -327,7 +508,7 @@ typedef struct {
                   alt_5                                        \
                  )                                             \
        info_class INFO_TBL_CONST vec_info_5 info = {           \
-               i : { layout : { bitmap : (StgWord32)bitmap_ }, \
+               i : { layout : { bitmap : (StgWord)bitmap_ },   \
                      SRT_INFO(type,srt_,srt_off_,srt_len_),    \
                      INIT_ENTRY(NULL),                         \
                },                                              \
@@ -341,7 +522,7 @@ typedef struct {
                   alt_5, alt_6                                 \
                  )                                             \
        info_class INFO_TBL_CONST vec_info_6 info = {           \
-               i : { layout : { bitmap : (StgWord32)bitmap_ }, \
+               i : { layout : { bitmap : (StgWord)bitmap_ },   \
                      SRT_INFO(type,srt_,srt_off_,srt_len_),    \
                      INIT_ENTRY(NULL),                         \
                },                                              \
@@ -355,7 +536,7 @@ typedef struct {
                   alt_5, alt_6, alt_7                          \
                  )                                             \
        info_class INFO_TBL_CONST vec_info_7 info = {           \
-               i : { layout : { bitmap : (StgWord32)bitmap_ }, \
+               i : { layout : { bitmap : (StgWord)bitmap_ },   \
                      SRT_INFO(type,srt_,srt_off_,srt_len_),    \
                      INIT_ENTRY(NULL),                         \
                },                                              \
@@ -369,7 +550,7 @@ typedef struct {
                   alt_5, alt_6, alt_7, alt_8                   \
                  )                                             \
        info_class INFO_TBL_CONST vec_info_8 info = {           \
-               i : { layout : { bitmap : (StgWord32)bitmap_ }, \
+               i : { layout : { bitmap : (StgWord)bitmap_ },   \
                      SRT_INFO(type,srt_,srt_off_,srt_len_),    \
                      INIT_ENTRY(NULL),                         \
                },                                              \
@@ -392,7 +573,7 @@ typedef vec_info_8 StgPolyInfoTable;
                           type, info_class, entry_class        \
                           )                                    \
   info_class INFO_TBL_CONST vec_info_8 nm##_info = {           \
-               i : { layout : { bitmap : (StgWord32)bitmap_ }, \
+               i : { layout : { bitmap : (StgWord)bitmap_ },   \
                      SRT_INFO(type,srt_,srt_off_,srt_len_),    \
                       INIT_ENTRY(nm##_entry),                  \
                      INIT_VECTOR                               \
@@ -426,7 +607,7 @@ typedef vec_info_8 StgPolyInfoTable;
                        (F_) nm##_0_entry                       \
                },                                              \
                i : {                                           \
-                  layout : { bitmap : (StgWord32)bitmap_ },    \
+                  layout : { bitmap : (StgWord)bitmap_ },      \
                   SRT_INFO(type,srt_,srt_off_,srt_len_),       \
                    INIT_ENTRY(nm##_entry)                      \
                }                                               \
@@ -437,8 +618,20 @@ typedef vec_info_8 StgPolyInfoTable;
 #define SRT(lbl) \
   static const StgSRT lbl = {
 
-#define BITMAP(lbl,size) \
-  static const StgLargeBitmap lbl = { size, {
+#define BITMAP(lbl,size,contents) \
+  static const StgLargeBitmap lbl = { \
+      (size*4+SIZEOF_VOID_P-1)/SIZEOF_VOID_P, { contents } };
+
+#if SIZEOF_VOID_P == 8
+#define BITMAP_SWITCH64(small, large)  small
+#define BITMAP64(first, second)                \
+  (((StgWord32)(first)) | ((StgWord)(StgWord32)(second) << 32))
+#else
+#define BITMAP_SWITCH64(small, large)  large
+#define BITMAP64(first, second)                first, second
+#endif
+#define BITMAP32(x)                    ((StgWord32)(x))
+#define COMMA                          ,
 
 /* DLL_SRT_ENTRY is used on the Win32 side when filling initialising
    an entry in an SRT table with a reference to a closure that's
@@ -446,7 +639,7 @@ typedef vec_info_8 StgPolyInfoTable;
    to distinguish these kinds of references.
    (ToDo: fill in a more precise href.)
 */
-#ifdef HAVE_WIN32_DLL_SUPPORT
+#ifdef ENABLE_WIN32_DLL_SUPPORT /* mingw DietHEP doesn't seem to care either way */
 #define DLL_SRT_ENTRY(x) ((StgClosure*)(((char*)&DLL_IMPORT_DATA_VAR(x)) + 1))
 #else
 #define DLL_SRT_ENTRY(x) no-can-do