From 27df3d60649a1269ed6922cec0f2a2485a2791cd Mon Sep 17 00:00:00 2001 From: Nathanael Jones Date: Wed, 11 May 2016 10:30:41 -0700 Subject: [PATCH] Align capn_segment to 64-bit boundaries on MSVC Unless capn_segment is defined with __declspec(align(64)), check_segment_alignment fails to compile in x86 mode, as (sizeof(struct capn_segment)&7) -> (44 & 7) evaluates to 4 Always compiles in x64 mode, as (sizeof(struct capn_segment)&7) -> (80 & 7) evaluates to 0 --- lib/capn-malloc.c | 5 +++++ lib/capnp_c.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/lib/capn-malloc.c b/lib/capn-malloc.c index 7a2977c..525ae99 100644 --- a/lib/capn-malloc.c +++ b/lib/capn-malloc.c @@ -14,6 +14,11 @@ #include #include +/* Visual Studio notes: + * Unless capn_segment is defined with __declspec(align(64)), check_segment_alignment + * Fails to compile in x86 mode, as (sizeof(struct capn_segment)&7) -> (44 & 7) evaluates to 4 + * Compiles in x64 mode, as (sizeof(struct capn_segment)&7) -> (80 & 7) evaluates to 0 + */ struct check_segment_alignment { unsigned int foo : (sizeof(struct capn_segment)&7) ? -1 : 1; }; diff --git a/lib/capnp_c.h b/lib/capnp_c.h index 5ccf0f5..40432ba 100644 --- a/lib/capnp_c.h +++ b/lib/capnp_c.h @@ -100,6 +100,9 @@ struct capn_tree *capn_tree_insert(struct capn_tree *root, struct capn_tree *n); * data, len, cap, and user should all set by the user. Other values * should be zero initialized. */ +#ifdef _MSC_VER +__declspec(align(64)) +#endif struct capn_segment { struct capn_tree hdr; struct capn_segment *next;