[project @ 2005-10-21 14:02:17 by simonmar]
[ghc-hetmet.git] / ghc / includes / mkDerivedConstants.c
index 77a35bc..d782d04 100644 (file)
  *
  * ------------------------------------------------------------------------*/
 
-#include <stdio.h>
-
 #define IN_STG_CODE 0
 
-// We need offsets of profiled things... better be careful that this
-// doesn't affect the offsets of anything else.
+/*
+ * We need offsets of profiled things... better be careful that this
+ * doesn't affect the offsets of anything else.
+ */
 #define PROFILING
 
 #include "Rts.h"
 #include "RtsFlags.h"
 #include "Storage.h"
+#include "OSThreads.h"
+#include "Capability.h"
+
+#include <stdio.h>
 
 #define str(a,b) #a "_" #b
 
 #define field_offset(s_type, field) \
     field_offset_(str(s_type,field),s_type,field);
 
-// An access macro for use in C-- sources.  
+/* An access macro for use in C-- sources. */
 #define struct_field_macro(str) \
     printf("#define " str "(__ptr__)  REP_" str "[__ptr__+OFFSET_" str "]\n");
 
-// Outputs the byte offset and MachRep for a field
+/* Outputs the byte offset and MachRep for a field */
 #define struct_field(s_type, field)            \
     field_offset(s_type, field);               \
     field_type(s_type, field);                 \
     printf("#define SIZEOF_" str " (SIZEOF_StgHeader+%d)\n", size);
 #endif
 
+#if defined(GEN_HASKELL)
+#define def_thunk_size(str, size) /* nothing */
+#else
+#define def_thunk_size(str, size) \
+    printf("#define SIZEOF_" str " (SIZEOF_StgThunkHeader+%d)\n", size);
+#endif
+
 #define struct_size(s_type) \
     def_size(#s_type, sizeof(s_type));
 
-// Size of a closure type, minus the header, named SIZEOF_<type>_NoHdr
-// Also, we #define SIZEOF_<type> to be the size of the whole closure for .cmm.
+/*
+ * Size of a closure type, minus the header, named SIZEOF_<type>_NoHdr
+ * Also, we #define SIZEOF_<type> to be the size of the whole closure for .cmm.
+ */
 #define closure_size(s_type) \
     def_size(#s_type "_NoHdr", sizeof(s_type) - sizeof(StgHeader)); \
     def_closure_size(#s_type, sizeof(s_type) - sizeof(StgHeader));
 
-// An access macro for use in C-- sources.  
+#define thunk_size(s_type) \
+    def_size(#s_type "_NoHdr", sizeof(s_type) - sizeof(StgHeader)); \
+    def_thunk_size(#s_type, sizeof(s_type) - sizeof(StgHeader));
+
+/* An access macro for use in C-- sources. */
 #define closure_field_macro(str) \
     printf("#define " str "(__ptr__)  REP_" str "[__ptr__+SIZEOF_StgHeader+OFFSET_" str "]\n");
 
+#define thunk_field_macro(str) \
+    printf("#define " str "(__ptr__)  REP_" str "[__ptr__+SIZEOF_StgThunkHeader+OFFSET_" str "]\n");
+
 #define closure_field_offset_(str, s_type,field) \
     def_offset(str, OFFSET(s_type,field) - sizeof(StgHeader));
 
+#define thunk_field_offset_(str, s_type, field) \
+    closure_field_offset_(str, s_type, field)
+
 #define closure_field_offset(s_type,field) \
-    closure_field_offset_(str(s_type,field),s_type,field);
+    closure_field_offset_(str(s_type,field),s_type,field)
+
+#define thunk_field_offset(s_type,field) \
+    thunk_field_offset_(str(s_type,field),s_type,field)
 
 #define closure_payload_macro(str) \
     printf("#define " str "(__ptr__,__ix__)  W_[__ptr__+SIZEOF_StgHeader+OFFSET_" str " + WDS(__ix__)]\n");
 
+#define thunk_payload_macro(str) \
+    printf("#define " str "(__ptr__,__ix__)  W_[__ptr__+SIZEOF_StgThunkHeader+OFFSET_" str " + WDS(__ix__)]\n");
+
 #define closure_payload(s_type,field) \
     closure_field_offset_(str(s_type,field),s_type,field); \
     closure_payload_macro(str(s_type,field));
 
-// Byte offset and MachRep for a closure field, minus the header
+#define thunk_payload(s_type,field) \
+    thunk_field_offset_(str(s_type,field),s_type,field); \
+    thunk_payload_macro(str(s_type,field));
+
+/* Byte offset and MachRep for a closure field, minus the header */
 #define closure_field(s_type, field) \
     closure_field_offset(s_type,field) \
     field_type(s_type, field); \
     closure_field_macro(str(s_type,field))
 
-// Byte offset and MachRep for a closure field, minus the header
+#define thunk_field(s_type, field) \
+    thunk_field_offset(s_type,field) \
+    field_type(s_type, field); \
+    thunk_field_macro(str(s_type,field))
+
+/* Byte offset and MachRep for a closure field, minus the header */
 #define closure_field_(str, s_type, field) \
     closure_field_offset_(str,s_type,field) \
     field_type_(str, s_type, field); \
     closure_field_macro(str)
 
-// Byte offset and MachRep for a TSO field, minus the header and
-// variable prof bit.
+#define thunk_field_(str, s_type, field) \
+    thunk_field_offset_(str,s_type,field) \
+    field_type_(str, s_type, field); \
+    thunk_field_macro(str)
+/*
+ * Byte offset and MachRep for a TSO field, minus the header and
+ * variable prof bit.
+ */
 #define tso_offset(s_type, field) \
     def_offset(str(s_type,field), OFFSET(s_type,field) - sizeof(StgHeader) - sizeof(StgTSOProfInfo));
 
@@ -157,7 +201,7 @@ main(int argc, char *argv[])
     printf("/* This file is created automatically.  Do not edit by hand.*/\n\n");
 
     printf("#define STD_HDR_SIZE   %d\n", sizeofW(StgHeader) - sizeofW(StgProfHeader));
-    // grrr.. PROFILING is on so we need to subtract sizeofW(StgProfHeader)
+    /* grrr.. PROFILING is on so we need to subtract sizeofW(StgProfHeader) */
     printf("#define PROF_HDR_SIZE  %d\n", sizeofW(StgProfHeader));
     printf("#define GRAN_HDR_SIZE  %d\n", sizeofW(StgGranHeader));
 
@@ -190,9 +234,7 @@ main(int argc, char *argv[])
     field_offset(StgRegTable, rF4);
     field_offset(StgRegTable, rD1);
     field_offset(StgRegTable, rD2);
-#ifdef SUPPORT_LONG_LONGS
     field_offset(StgRegTable, rL1);
-#endif
     field_offset(StgRegTable, rSp);
     field_offset(StgRegTable, rSpLim);
     field_offset(StgRegTable, rHp);
@@ -201,6 +243,13 @@ main(int argc, char *argv[])
     field_offset(StgRegTable, rCurrentNursery);
     field_offset(StgRegTable, rHpAlloc);
 
+    // Needed for SMP builds
+    field_offset(StgRegTable, rmp_tmp_w);
+    field_offset(StgRegTable, rmp_tmp1);
+    field_offset(StgRegTable, rmp_tmp2);
+    field_offset(StgRegTable, rmp_result1);
+    field_offset(StgRegTable, rmp_result2);
+
     def_offset("stgGCEnter1", FUN_OFFSET(stgGCEnter1));
     def_offset("stgGCFun", FUN_OFFSET(stgGCFun));
 
@@ -215,6 +264,7 @@ main(int argc, char *argv[])
     struct_size(generation);
     struct_field(generation, mut_list);
 
+    struct_size(CostCentreStack);
     struct_field(CostCentreStack, ccsID);
     struct_field(CostCentreStack, mem_alloc);
     struct_field(CostCentreStack, scc_count);
@@ -227,6 +277,8 @@ main(int argc, char *argv[])
     struct_field_("StgHeader_ccs",  StgHeader, prof.ccs);
     struct_field_("StgHeader_ldvw", StgHeader, prof.hp.ldvw);
 
+    struct_size(StgSMPThunkHeader);
+
     closure_payload(StgClosure,payload);
 
     struct_field(StgEntCounter, allocs);
@@ -268,9 +320,6 @@ main(int argc, char *argv[])
     opt_struct_size(StgTSOGranInfo,GRAN);
     opt_struct_size(StgTSODistInfo,DIST);
 
-    closure_size(StgBlockingQueue);
-    closure_field(StgBlockingQueue, blocking_queue);
-
     closure_field(StgUpdateFrame, updatee);
 
     closure_field(StgCatchFrame, handler);
@@ -287,10 +336,10 @@ main(int argc, char *argv[])
     closure_field(StgAP, fun);
     closure_payload(StgAP, payload);
 
-    closure_size(StgAP_STACK);
-    closure_field(StgAP_STACK, size);
-    closure_field(StgAP_STACK, fun);
-    closure_payload(StgAP_STACK, payload);
+    thunk_size(StgAP_STACK);
+    thunk_field(StgAP_STACK, size);
+    thunk_field(StgAP_STACK, fun);
+    thunk_payload(StgAP_STACK, payload);
 
     closure_field(StgInd, indirectee);
 
@@ -310,9 +359,6 @@ main(int argc, char *argv[])
     closure_field(StgCatchRetryFrame, alt_code);
     closure_field(StgCatchRetryFrame, first_code_trec);
 
-    closure_size(StgForeignObj);
-    closure_field(StgForeignObj,data);
-
     closure_size(StgWeak);
     closure_field(StgWeak,link);
     closure_field(StgWeak,key);
@@ -327,10 +373,6 @@ main(int argc, char *argv[])
     closure_field(StgMVar,tail);
     closure_field(StgMVar,value);
 
-    closure_size(StgTVar);
-    closure_field(StgTVar,current_value);
-    closure_field(StgTVar,first_wait_queue_entry);
-
     closure_size(StgBCO);
     closure_field(StgBCO, instrs);
     closure_field(StgBCO, literals);
@@ -358,13 +400,13 @@ main(int argc, char *argv[])
     struct_field(StgFunInfoExtraFwd, slow_apply);
     struct_field(StgFunInfoExtraFwd, fun_type);
     struct_field(StgFunInfoExtraFwd, arity);
-    struct_field(StgFunInfoExtraFwd, bitmap);
+    struct_field_("StgFunInfoExtraFwd_bitmap", StgFunInfoExtraFwd, b.bitmap);
 
     struct_size(StgFunInfoExtraRev);
     struct_field(StgFunInfoExtraRev, slow_apply_offset);
     struct_field(StgFunInfoExtraRev, fun_type);
     struct_field(StgFunInfoExtraRev, arity);
-    struct_field(StgFunInfoExtraRev, bitmap);
+    struct_field_("StgFunInfoExtraRev_bitmap", StgFunInfoExtraRev, b.bitmap);
 
     struct_field(StgLargeBitmap, size);
     field_offset(StgLargeBitmap, bitmap);