Message ID | 20190127015113.1599-1-samuel.thibault@ens-lyon.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | slirp: Replace QEMU_BUILD_BUG_ON with own macro | expand |
Hi On Sun, Jan 27, 2019 at 5:55 AM Samuel Thibault <samuel.thibault@gnu.org> wrote: > > (Which I'll fold as appropriate within Marc-André's patch series) Did you try using G_STATIC_ASSERT* instead? looks good otherwise > > Samuel Thibault, le dim. 27 janv. 2019 02:51:13 +0100, a ecrit: > > Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org> > > --- > > slirp/ip.h | 6 ++++-- > > slirp/ip6.h | 6 ++++-- > > slirp/ip6_icmp.h | 12 +++++++----- > > slirp/util.h | 25 +++++++++++++++++++++++++ > > 4 files changed, 40 insertions(+), 9 deletions(-) > > > > diff --git a/slirp/ip.h b/slirp/ip.h > > index 2baeeb9a3a..77182e61a9 100644 > > --- a/slirp/ip.h > > +++ b/slirp/ip.h > > @@ -35,6 +35,8 @@ > > > > #include <glib.h> > > > > +#include "util.h" > > + > > #if G_BYTE_ORDER == G_BIG_ENDIAN > > # undef NTOHL > > # undef NTOHS > > @@ -229,8 +231,8 @@ struct ipasfrag { > > struct ip ipf_ip; > > }; > > > > -QEMU_BUILD_BUG_ON(offsetof(struct ipq, frag_link) != > > - offsetof(struct ipasfrag, ipf_link)); > > +SLIRP_BUILD_BUG_ON(offsetof(struct ipq, frag_link) != > > + offsetof(struct ipasfrag, ipf_link)); > > > > #define ipf_off ipf_ip.ip_off > > #define ipf_tos ipf_ip.ip_tos > > diff --git a/slirp/ip6.h b/slirp/ip6.h > > index 4e7c366505..3db099acef 100644 > > --- a/slirp/ip6.h > > +++ b/slirp/ip6.h > > @@ -8,6 +8,8 @@ > > > > #include <glib.h> > > > > +#include "util.h" > > + > > #define ALLNODES_MULTICAST { .s6_addr = \ > > { 0xff, 0x02, 0x00, 0x00,\ > > 0x00, 0x00, 0x00, 0x00,\ > > @@ -152,7 +154,7 @@ struct ip6_pseudohdr { > > * If we marked the struct as packed then we would be unable to take > > * the address of any of the fields in it. > > */ > > -QEMU_BUILD_BUG_ON(sizeof(struct ip6) != 40); > > -QEMU_BUILD_BUG_ON(sizeof(struct ip6_pseudohdr) != 40); > > +SLIRP_BUILD_BUG_ON(sizeof(struct ip6) != 40); > > +SLIRP_BUILD_BUG_ON(sizeof(struct ip6_pseudohdr) != 40); > > > > #endif > > diff --git a/slirp/ip6_icmp.h b/slirp/ip6_icmp.h > > index 3f44ed2f49..ea7fcfe5e6 100644 > > --- a/slirp/ip6_icmp.h > > +++ b/slirp/ip6_icmp.h > > @@ -6,6 +6,8 @@ > > #ifndef SLIRP_IP6_ICMP_H > > #define SLIRP_IP6_ICMP_H > > > > +#include "util.h" > > + > > /* > > * Interface Control Message Protocol version 6 Definitions. > > * Per RFC 4443, March 2006. > > @@ -50,14 +52,14 @@ struct ndp_ra { /* Router Advertisement Message */ > > uint32_t retrans_time; /* Retrans Timer */ > > }; > > > > -QEMU_BUILD_BUG_ON(sizeof(struct ndp_ra) != 12); > > +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_ra) != 12); > > > > struct ndp_ns { /* Neighbor Solicitation Message */ > > uint32_t reserved; > > struct in6_addr target; /* Target Address */ > > }; > > > > -QEMU_BUILD_BUG_ON(sizeof(struct ndp_ns) != 20); > > +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_ns) != 20); > > > > struct ndp_na { /* Neighbor Advertisement Message */ > > #if G_BYTE_ORDER == G_BIG_ENDIAN > > @@ -78,7 +80,7 @@ struct ndp_na { /* Neighbor Advertisement Message */ > > struct in6_addr target; /* Target Address */ > > }; > > > > -QEMU_BUILD_BUG_ON(sizeof(struct ndp_na) != 20); > > +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_na) != 20); > > > > struct ndp_redirect { > > uint32_t reserved; > > @@ -86,7 +88,7 @@ struct ndp_redirect { > > struct in6_addr dest; /* Destination Address */ > > }; > > > > -QEMU_BUILD_BUG_ON(sizeof(struct ndp_redirect) != 36); > > +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_redirect) != 36); > > > > /* > > * Structure of an icmpv6 header. > > @@ -113,7 +115,7 @@ struct icmp6 { > > #define icmp6_redirect icmp6_body.ndp_redirect > > }; > > > > -QEMU_BUILD_BUG_ON(sizeof(struct icmp6) != 40); > > +SLIRP_BUILD_BUG_ON(sizeof(struct icmp6) != 40); > > > > #define ICMP6_MINLEN 4 > > #define ICMP6_ERROR_MINLEN 8 > > diff --git a/slirp/util.h b/slirp/util.h > > index ef75804560..fc2c2e58fe 100644 > > --- a/slirp/util.h > > +++ b/slirp/util.h > > @@ -48,6 +48,31 @@ > > # define SLIRP_PACKED __attribute__((packed)) > > #endif > > > > +#ifndef glue > > +#define xglue(x, y) x ## y > > +#define glue(x, y) xglue(x, y) > > +#endif > > + > > +#define SLIRP_BUILD_BUG_ON_STRUCT(x) \ > > + struct { \ > > + int:(x) ? -1 : 1; \ > > + } > > + > > +/* SLIRP_BUILD_BUG_MSG() emits the message given if _Static_assert is > > + * supported; otherwise, it will be omitted from the compiler error > > + * message (but as it remains present in the source code, it can still > > + * be useful when debugging). */ > > +#if defined(CONFIG_STATIC_ASSERT) > > +#define SLIRP_BUILD_BUG_MSG(x, msg) _Static_assert(!(x), msg) > > +#elif defined(__COUNTER__) > > +#define SLIRP_BUILD_BUG_MSG(x, msg) typedef SLIRP_BUILD_BUG_ON_STRUCT(x) \ > > + glue(qemu_build_bug_on__, __COUNTER__) __attribute__((unused)) > > +#else > > +#define SLIRP_BUILD_BUG_MSG(x, msg) > > +#endif > > + > > +#define SLIRP_BUILD_BUG_ON(x) SLIRP_BUILD_BUG_MSG(x, "not expecting: " #x) > > + > > #define SCALE_MS 1000000 > > > > #define ETH_ALEN 6 > > -- > > 2.20.1 > > > > -- > Samuel > Hi ! I'm a .signature virus ! Copy me into your ~/.signature, please ! >
Marc-André Lureau, le dim. 27 janv. 2019 15:37:38 +0400, a ecrit: > On Sun, Jan 27, 2019 at 5:55 AM Samuel Thibault <samuel.thibault@gnu.org> wrote: > > > > (Which I'll fold as appropriate within Marc-André's patch series) > > Did you try using G_STATIC_ASSERT* instead? Ah, right, that can be used instead, sent refined patch. Samuel
Hi Marc-André, On 1/27/19 12:37 PM, Marc-André Lureau wrote: > Hi > > On Sun, Jan 27, 2019 at 5:55 AM Samuel Thibault <samuel.thibault@gnu.org> wrote: >> >> (Which I'll fold as appropriate within Marc-André's patch series) > > Did you try using G_STATIC_ASSERT* instead? [...] Is there a same plan for QEMU codebase?
On Mon, 28 Jan 2019 at 11:22, Philippe Mathieu-Daudé <philmd@redhat.com> wrote: > On 1/27/19 12:37 PM, Marc-André Lureau wrote: > > Did you try using G_STATIC_ASSERT* instead? > [...] > > Is there a same plan for QEMU codebase? Our version uses _Static_assert where possible, which I think will give better error messages than the glib version. There are also some corner cases where the glib macros don't work: https://lists.gnu.org/archive/html/qemu-devel/2016-10/msg07090.html Broadly, our implementation works and so I don't see much need to mess with it, outside of the special case of slirp that's trying to cut its ties with QEMU. thanks -- PMM
On 1/28/19 12:25 PM, Peter Maydell wrote: > On Mon, 28 Jan 2019 at 11:22, Philippe Mathieu-Daudé <philmd@redhat.com> wrote: >> On 1/27/19 12:37 PM, Marc-André Lureau wrote: >>> Did you try using G_STATIC_ASSERT* instead? >> [...] >> >> Is there a same plan for QEMU codebase? > > Our version uses _Static_assert where possible, which I think > will give better error messages than the glib version. There are > also some corner cases where the glib macros don't work: > https://lists.gnu.org/archive/html/qemu-devel/2016-10/msg07090.html > > Broadly, our implementation works and so I don't see much need > to mess with it, outside of the special case of slirp that's > trying to cut its ties with QEMU. OK! Thanks, Phil.
diff --git a/slirp/ip.h b/slirp/ip.h index 2baeeb9a3a..77182e61a9 100644 --- a/slirp/ip.h +++ b/slirp/ip.h @@ -35,6 +35,8 @@ #include <glib.h> +#include "util.h" + #if G_BYTE_ORDER == G_BIG_ENDIAN # undef NTOHL # undef NTOHS @@ -229,8 +231,8 @@ struct ipasfrag { struct ip ipf_ip; }; -QEMU_BUILD_BUG_ON(offsetof(struct ipq, frag_link) != - offsetof(struct ipasfrag, ipf_link)); +SLIRP_BUILD_BUG_ON(offsetof(struct ipq, frag_link) != + offsetof(struct ipasfrag, ipf_link)); #define ipf_off ipf_ip.ip_off #define ipf_tos ipf_ip.ip_tos diff --git a/slirp/ip6.h b/slirp/ip6.h index 4e7c366505..3db099acef 100644 --- a/slirp/ip6.h +++ b/slirp/ip6.h @@ -8,6 +8,8 @@ #include <glib.h> +#include "util.h" + #define ALLNODES_MULTICAST { .s6_addr = \ { 0xff, 0x02, 0x00, 0x00,\ 0x00, 0x00, 0x00, 0x00,\ @@ -152,7 +154,7 @@ struct ip6_pseudohdr { * If we marked the struct as packed then we would be unable to take * the address of any of the fields in it. */ -QEMU_BUILD_BUG_ON(sizeof(struct ip6) != 40); -QEMU_BUILD_BUG_ON(sizeof(struct ip6_pseudohdr) != 40); +SLIRP_BUILD_BUG_ON(sizeof(struct ip6) != 40); +SLIRP_BUILD_BUG_ON(sizeof(struct ip6_pseudohdr) != 40); #endif diff --git a/slirp/ip6_icmp.h b/slirp/ip6_icmp.h index 3f44ed2f49..ea7fcfe5e6 100644 --- a/slirp/ip6_icmp.h +++ b/slirp/ip6_icmp.h @@ -6,6 +6,8 @@ #ifndef SLIRP_IP6_ICMP_H #define SLIRP_IP6_ICMP_H +#include "util.h" + /* * Interface Control Message Protocol version 6 Definitions. * Per RFC 4443, March 2006. @@ -50,14 +52,14 @@ struct ndp_ra { /* Router Advertisement Message */ uint32_t retrans_time; /* Retrans Timer */ }; -QEMU_BUILD_BUG_ON(sizeof(struct ndp_ra) != 12); +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_ra) != 12); struct ndp_ns { /* Neighbor Solicitation Message */ uint32_t reserved; struct in6_addr target; /* Target Address */ }; -QEMU_BUILD_BUG_ON(sizeof(struct ndp_ns) != 20); +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_ns) != 20); struct ndp_na { /* Neighbor Advertisement Message */ #if G_BYTE_ORDER == G_BIG_ENDIAN @@ -78,7 +80,7 @@ struct ndp_na { /* Neighbor Advertisement Message */ struct in6_addr target; /* Target Address */ }; -QEMU_BUILD_BUG_ON(sizeof(struct ndp_na) != 20); +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_na) != 20); struct ndp_redirect { uint32_t reserved; @@ -86,7 +88,7 @@ struct ndp_redirect { struct in6_addr dest; /* Destination Address */ }; -QEMU_BUILD_BUG_ON(sizeof(struct ndp_redirect) != 36); +SLIRP_BUILD_BUG_ON(sizeof(struct ndp_redirect) != 36); /* * Structure of an icmpv6 header. @@ -113,7 +115,7 @@ struct icmp6 { #define icmp6_redirect icmp6_body.ndp_redirect }; -QEMU_BUILD_BUG_ON(sizeof(struct icmp6) != 40); +SLIRP_BUILD_BUG_ON(sizeof(struct icmp6) != 40); #define ICMP6_MINLEN 4 #define ICMP6_ERROR_MINLEN 8 diff --git a/slirp/util.h b/slirp/util.h index ef75804560..fc2c2e58fe 100644 --- a/slirp/util.h +++ b/slirp/util.h @@ -48,6 +48,31 @@ # define SLIRP_PACKED __attribute__((packed)) #endif +#ifndef glue +#define xglue(x, y) x ## y +#define glue(x, y) xglue(x, y) +#endif + +#define SLIRP_BUILD_BUG_ON_STRUCT(x) \ + struct { \ + int:(x) ? -1 : 1; \ + } + +/* SLIRP_BUILD_BUG_MSG() emits the message given if _Static_assert is + * supported; otherwise, it will be omitted from the compiler error + * message (but as it remains present in the source code, it can still + * be useful when debugging). */ +#if defined(CONFIG_STATIC_ASSERT) +#define SLIRP_BUILD_BUG_MSG(x, msg) _Static_assert(!(x), msg) +#elif defined(__COUNTER__) +#define SLIRP_BUILD_BUG_MSG(x, msg) typedef SLIRP_BUILD_BUG_ON_STRUCT(x) \ + glue(qemu_build_bug_on__, __COUNTER__) __attribute__((unused)) +#else +#define SLIRP_BUILD_BUG_MSG(x, msg) +#endif + +#define SLIRP_BUILD_BUG_ON(x) SLIRP_BUILD_BUG_MSG(x, "not expecting: " #x) + #define SCALE_MS 1000000 #define ETH_ALEN 6
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org> --- slirp/ip.h | 6 ++++-- slirp/ip6.h | 6 ++++-- slirp/ip6_icmp.h | 12 +++++++----- slirp/util.h | 25 +++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 9 deletions(-)