diff mbox series

slirp: Replace QEMU_BUILD_BUG_ON with own macro

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

Commit Message

Samuel Thibault Jan. 27, 2019, 1:51 a.m. UTC
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(-)

Comments

Marc-André Lureau Jan. 27, 2019, 11:37 a.m. UTC | #1
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 !
>
Samuel Thibault Jan. 27, 2019, 11:47 a.m. UTC | #2
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
Philippe Mathieu-Daudé Jan. 28, 2019, 11:18 a.m. UTC | #3
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?
Peter Maydell Jan. 28, 2019, 11:25 a.m. UTC | #4
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
Philippe Mathieu-Daudé Jan. 28, 2019, 11:35 a.m. UTC | #5
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 mbox series

Patch

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