[project @ 2002-07-17 09:21:48 by simonmar]
[ghc-hetmet.git] / ghc / includes / StgMacros.h
index 17c3110..86d99da 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: StgMacros.h,v 1.43 2001/11/23 11:58:00 simonmar Exp $
+ * $Id: StgMacros.h,v 1.47 2002/07/16 14:56:08 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -228,7 +228,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; }
     GEN_HP_CHK_ALT(headroom,stg_gc_d1,tag_assts);
 
 #define HP_CHK_L1(headroom,tag_assts)       \
-    GEN_HP_CHK_ALT(headroom,stg_gc_d1,tag_assts);
+    GEN_HP_CHK_ALT(headroom,stg_gc_l1,tag_assts);
 
 #define HP_CHK_UT_ALT(headroom, ptrs, nptrs, r, ret, tag_assts) \
     GEN_HP_CHK_ALT(headroom, stg_gc_ut_##ptrs##_##nptrs, \
@@ -410,8 +410,8 @@ EXTINFO_RTS(stg_gen_chk_info);
         TICK_UPD_BH_UPDATABLE();                               \
         {                                                      \
          bdescr *bd = Bdescr(R1.p);                            \
-          if (bd->back != (bdescr *)BaseReg) {                 \
-             if (bd->gen->no >= 1 || bd->step->no >= 1) {      \
+          if (bd->u.back != (bdescr *)BaseReg) {               \
+             if (bd->gen_no >= 1 || bd->step->no >= 1) {       \
                 LOCK_THUNK(info);                              \
              } else {                                          \
                 EXTFUN_RTS(stg_gc_enter_1_hponly);             \
@@ -424,8 +424,8 @@ EXTINFO_RTS(stg_gen_chk_info);
         TICK_UPD_BH_SINGLE_ENTRY();                            \
         {                                                      \
          bdescr *bd = Bdescr(R1.p);                            \
-          if (bd->back != (bdescr *)BaseReg) {                 \
-             if (bd->gen->no >= 1 || bd->step->no >= 1) {      \
+          if (bd->u.back != (bdescr *)BaseReg) {               \
+             if (bd->gen_no >= 1 || bd->step->no >= 1) {       \
                 LOCK_THUNK(info);                              \
              } else {                                          \
                 EXTFUN_RTS(stg_gc_enter_1_hponly);             \
@@ -774,6 +774,33 @@ LoadThreadState (void)
 
 /* -----------------------------------------------------------------------------
    Module initialisation
+
+   The module initialisation code looks like this, roughly:
+
+       FN(__stginit_Foo) {
+         JMP_(__stginit_Foo_1_p)
+       }
+
+       FN(__stginit_Foo_1_p) {
+       ...
+       }
+
+   We have one version of the init code with a module version and the
+   'way' attached to it.  The version number helps to catch cases
+   where modules are not compiled in dependency order before being
+   linked: if a module has been compiled since any modules which depend on
+   it, then the latter modules will refer to a different version in their
+   init blocks and a link error will ensue.
+
+   The 'way' suffix helps to catch cases where modules compiled in different
+   ways are linked together (eg. profiled and non-profiled).
+
+   We provide a plain, unadorned, version of the module init code
+   which just jumps to the version with the label and way attached.  The
+   reason for this is that when using foreign exports, the caller of
+   startupHaskell() must supply the name of the init function for the "top"
+   module in the program, and we don't want to require that this name
+   has the version and way info appended to it.
    -------------------------------------------------------------------------- */
 
 #define PUSH_INIT_STACK(reg_function)          \
@@ -782,9 +809,18 @@ LoadThreadState (void)
 #define POP_INIT_STACK()                       \
        *(--Sp)
 
-#define START_MOD_INIT(reg_mod_name)           \
+#define MOD_INIT_WRAPPER(label,real_init)      \
+
+
+#define START_MOD_INIT(plain_lbl, real_lbl)    \
        static int _module_registered = 0;      \
-       FN_(reg_mod_name) {                     \
+       EF_(real_lbl);                          \
+       FN_(plain_lbl) {                        \
+            FB_                                        \
+            JMP_(real_lbl);                    \
+           FE_                                 \
+        }                                      \
+       FN_(real_lbl) {                 \
            FB_;                                \
            if (! _module_registered) {         \
                _module_registered = 1;         \
@@ -810,20 +846,20 @@ LoadThreadState (void)
  * Suspending/resuming threads for doing external C-calls (_ccall_GC).
  * These functions are defined in rts/Schedule.c.
  */
-StgInt        suspendThread ( StgRegTable * );
-StgRegTable * resumeThread  ( StgInt );
+StgInt        suspendThread ( StgRegTable *, rtsBool);
+StgRegTable * resumeThread  ( StgInt, rtsBool );
 
-#define SUSPEND_THREAD(token)                  \
+#define SUSPEND_THREAD(token,threaded)         \
    SaveThreadState();                          \
-   token = suspendThread(BaseReg);
+   token = suspendThread(BaseReg,threaded);
 
 #ifdef SMP
-#define RESUME_THREAD(token)                   \
-    BaseReg = resumeThread(token);             \
+#define RESUME_THREAD(token,threaded)          \
+    BaseReg = resumeThread(token,threaded);    \
     LoadThreadState();
 #else
-#define RESUME_THREAD(token)                   \
-   (void)resumeThread(token);                  \
+#define RESUME_THREAD(token,threaded)          \
+   (void)resumeThread(token,threaded);         \
    LoadThreadState();
 #endif