[m-rev.] for review: fix float field structure padding/packing problems

Peter Wang novalazy at gmail.com
Tue Dec 6 10:32:19 AEDT 2011


On 2011-12-06, Julien Fischer <juliensf at csse.unimelb.edu.au> wrote:
> >
> >You didn't really think it would be that easy, did you? ;-)
> >
> >s/_declspec/__declspec/
> >
> >and apparently the argument of the align attribute must be an integer
> >constant, so we can't use an expression such as sizeof(MR_Word).
> >(This is with MSVC 2008, I haven't yet tried a later version.)
> >
> >I think the appropriate thing to do here is add MR_BYTES_PER_WORD back
> >to the runtime and use that in the above.  (I say add back, because the
> >only place it appears is in mercury_conf_bootstrap.h.)
> >
> >In the meantime I've just hardcoded a value in there - I'll let you know
> >how that went once my workspace finishes building.
> 
> By itself the above does not work with MSVC.  We also need to pass the -Zp4
> as a flag to cl, then the test case works.

Thanks.  It looks like __declspec(align) didn't do what I thought
and is actually unnecessary here.

Instead of passing -Zp4 we can write:

    #ifdef MR_MSVC
      #pragma pack(push, MR_BYTES_PER_WORD)
    #endif
    struct s { ... };
    #ifdef MR_MSVC
      #pragma pack(pop)
    #endif

Or hidden behind macros:

    #define MR_PUSH_PRAGMA_PACK  __pragma(pack(push, MR_BYTES_PER_WORD))
    #define MR_POP_PRAGMA_PACK	 __pragma(pack(pop))

I'm reading that __pragma was only introduced in VS2008/VC9 so it may be
too recent for us to use.

Peter
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list