diff --git a/.gitignore b/.gitignore index 04ffc2b..76d9560 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ Makefile Makefile.in .deps .libs +.dirstamp test-driver *.log diff --git a/lib/capn-malloc.c b/lib/capn-malloc.c index a3c2de0..7308061 100644 --- a/lib/capn-malloc.c +++ b/lib/capn-malloc.c @@ -8,6 +8,10 @@ * of the MIT license. See the LICENSE file for details. */ +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wunused-parameter" +#endif + #include "capnp_c.h" #include "capnp_priv.h" #include @@ -15,10 +19,15 @@ #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 +/* + * 8 byte alignment is required for struct capn_segment. + * This struct check_segment_alignment verifies this at compile time. + * + * Unless capn_segment is defined with 8 byte alignment, check_segment_alignment + * fails to compile in x86 mode (or on another CPU with 32-bit pointers), + * as (sizeof(struct capn_segment)&7) -> (44 & 7) evaluates to 4. + * It compiles in x64 mode (or on another CPU with 64-bit pointers), + * 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/capn.c b/lib/capn.c index 60e139c..f9d22d8 100644 --- a/lib/capn.c +++ b/lib/capn.c @@ -7,6 +7,10 @@ * of the MIT license. See the LICENSE file for details. */ +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif + #include "capnp_c.h" #include diff --git a/lib/capnp_c.h b/lib/capnp_c.h index a1133df..deb550c 100644 --- a/lib/capnp_c.h +++ b/lib/capnp_c.h @@ -13,6 +13,8 @@ #include #include +#include + #if defined(unix) && !defined(__APPLE__) #include #endif @@ -22,6 +24,14 @@ typedef intmax_t ssize_t; #endif +// Cross-platform macro ALIGNED_(x) aligns a struct by `x` bytes. +#ifdef _MSC_VER +#define ALIGNED_(x) __declspec(align(x)) +#endif +#ifdef __GNUC__ +#define ALIGNED_(x) __attribute__ ((aligned(x))) +#endif + #ifdef __cplusplus extern "C" { #endif @@ -93,20 +103,19 @@ struct capn_tree *capn_tree_insert(struct capn_tree *root, struct capn_tree *n); * * cap specifies the segment capacity. * - * When creating new structures len will be incremented until it reaces cap, + * When creating new structures len will be incremented until it reaches cap, * at which point a new segment will be requested via capn->create. The * create callback can either create a new segment or expand an existing * one by incrementing cap and returning the expanded segment. * - * data, len, and cap must all by 8 byte aligned + * data, len, and cap must all be 8 byte aligned, hence the ALIGNED_(8) macro + * on the struct definition. * - * data, len, cap, and user should all set by the user. Other values + * data, len, cap, and user should all be set by the user. Other values * should be zero initialized. */ -#ifdef _MSC_VER -__declspec(align(64)) -#endif -struct capn_segment { + +struct ALIGNED_(8) capn_segment { struct capn_tree hdr; struct capn_segment *next; struct capn *capn;