From: Simon Marlow Date: Wed, 19 Nov 2008 16:29:10 +0000 (+0000) Subject: Fix regTableToCapability() if gcc introduces padding X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=1d14a6cd5f563507135d450a63cf2bd7e870fe55 Fix regTableToCapability() if gcc introduces padding Also avoid padding if possible using __attribute__((packed)) Fixes the Windows build --- diff --git a/rts/Capability.h b/rts/Capability.h index db9e1e3..8954578 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -32,7 +32,11 @@ struct Capability_ { // code. During STG execution, the BaseReg register always points // to the StgRegTable of the current Capability (&cap->r). StgFunTable f; - StgRegTable r; + StgRegTable r GNU_ATTRIBUTE(packed); + // packed eliminates any padding between f and r. Not strictly + // necessary, but it means the negative offsets for accessing + // the fields of f when we are in STG code are as small as + // possible. nat no; // capability number. @@ -140,10 +144,12 @@ 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 - sizeof(StgFunTable))); + return (Capability *)((void *)((unsigned char*)reg - OFFSET(Capability,r))); } // Initialise the available capabilities.