Fix more problems caused by padding in the Capability structure
authorSimon Marlow <marlowsd@gmail.com>
Tue, 2 Dec 2008 12:07:35 +0000 (12:07 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 2 Dec 2008 12:07:35 +0000 (12:07 +0000)
Fixes crashes on Windows and Sparc

includes/Regs.h
includes/Stg.h
rts/Capability.h
rts/Interpreter.c

index 49366ed..45f9149 100644 (file)
@@ -398,7 +398,7 @@ GLOBAL_REG_DECL(bdescr *,HpAlloc,REG_HpAlloc)
    -------------------------------------------------------------------------- */
 
 
-#define FunReg ((StgFunTable *)((void *)BaseReg - sizeof(StgFunTable)))
+#define FunReg ((StgFunTable *)((void *)BaseReg - FIELD_OFFSET(struct PartCapability_, r)))
 
 #define stg_EAGER_BLACKHOLE_info  (FunReg->stgEagerBlackholeInfo)
 #define stg_gc_enter_1            (FunReg->stgGCEnter1)
index 7ac6b1a..394c987 100644 (file)
 #define BITS_PER_BYTE 8
 #define BITS_IN(x) (BITS_PER_BYTE * sizeof(x))
 
+/* Compute offsets of struct fields
+ */
+#define FIELD_OFFSET(s_type, field) ((StgWord)&(((s_type*)0)->field))
+
 /*
  * 'Portable' inlining:
  * INLINE_HEADER is for inline functions in header files (macros)
index b6f6440..ba0695c 100644 (file)
@@ -143,12 +143,10 @@ struct Capability_ {
 
 // Converts a *StgRegTable into a *Capability.
 //
-#define OFFSET(s_type, field) ((size_t)&(((s_type*)0)->field))
-
 INLINE_HEADER Capability *
 regTableToCapability (StgRegTable *reg)
 {
-    return (Capability *)((void *)((unsigned char*)reg - OFFSET(Capability,r)));
+    return (Capability *)((void *)((unsigned char*)reg - FIELD_OFFSET(Capability,r)));
 }
 
 // Initialise the available capabilities.
index 4324f7f..1b2d730 100644 (file)
@@ -1422,7 +1422,7 @@ run_BCO:
             ffi_call(cif, fn, ret, argptrs);
 
            // And restart the thread again, popping the RET_DYN frame.
-           cap = (Capability *)((void *)((unsigned char*)resumeThread(tok) - sizeof(StgFunTable)));
+           cap = (Capability *)((void *)((unsigned char*)resumeThread(tok) - FIELD_OFFSET(Capability,r)));
            LOAD_STACK_POINTERS;
 
             // Re-load the pointer to the BCO from the RET_DYN frame,