Commit 164be785 authored by Simon Marlow's avatar Simon Marlow
Browse files

Fix more problems caused by padding in the Capability structure

Fixes crashes on Windows and Sparc
parent c0378a27
...@@ -398,7 +398,7 @@ GLOBAL_REG_DECL(bdescr *,HpAlloc,REG_HpAlloc) ...@@ -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_EAGER_BLACKHOLE_info (FunReg->stgEagerBlackholeInfo)
#define stg_gc_enter_1 (FunReg->stgGCEnter1) #define stg_gc_enter_1 (FunReg->stgGCEnter1)
......
...@@ -74,6 +74,10 @@ ...@@ -74,6 +74,10 @@
#define BITS_PER_BYTE 8 #define BITS_PER_BYTE 8
#define BITS_IN(x) (BITS_PER_BYTE * sizeof(x)) #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: * 'Portable' inlining:
* INLINE_HEADER is for inline functions in header files (macros) * INLINE_HEADER is for inline functions in header files (macros)
......
...@@ -143,12 +143,10 @@ struct Capability_ { ...@@ -143,12 +143,10 @@ struct Capability_ {
// Converts a *StgRegTable into a *Capability. // Converts a *StgRegTable into a *Capability.
// //
#define OFFSET(s_type, field) ((size_t)&(((s_type*)0)->field))
INLINE_HEADER Capability * INLINE_HEADER Capability *
regTableToCapability (StgRegTable *reg) 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. // Initialise the available capabilities.
......
...@@ -1422,7 +1422,7 @@ run_BCO: ...@@ -1422,7 +1422,7 @@ run_BCO:
ffi_call(cif, fn, ret, argptrs); ffi_call(cif, fn, ret, argptrs);
// And restart the thread again, popping the RET_DYN frame. // 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; LOAD_STACK_POINTERS;
// Re-load the pointer to the BCO from the RET_DYN frame, // Re-load the pointer to the BCO from the RET_DYN frame,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment