slirp/ip.h | 6 ++++-- slirp/ip6.h | 6 ++++-- slirp/ip6_icmp.h | 12 +++++++----- slirp/util.h | 25 +++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 9 deletions(-)
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
(Which I'll fold as appropriate within Marc-André's patch series)
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 !
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
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.
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
© 2016 - 2025 Red Hat, Inc.