xref: /openbmc/qemu/scripts/cocci-macro-file.h (revision 8905770b)
13f7a899fSPaolo Bonzini /* Macro file for Coccinelle
23f7a899fSPaolo Bonzini  *
33f7a899fSPaolo Bonzini  * Copyright (C) 2015 Red Hat, Inc.
43f7a899fSPaolo Bonzini  *
53f7a899fSPaolo Bonzini  * Authors:
63f7a899fSPaolo Bonzini  *  Paolo Bonzini <pbonzini@redhat.com>
73f7a899fSPaolo Bonzini  *
83f7a899fSPaolo Bonzini  * This work is licensed under the terms of the GNU GPL, version 2 or, at your
93f7a899fSPaolo Bonzini  * option, any later version.  See the COPYING file in the top-level directory.
103f7a899fSPaolo Bonzini  */
113f7a899fSPaolo Bonzini 
123f7a899fSPaolo Bonzini /* Coccinelle only does limited parsing of headers, and chokes on some idioms
133f7a899fSPaolo Bonzini  * defined in compiler.h and queue.h.  Macros that Coccinelle must know about
143f7a899fSPaolo Bonzini  * in order to parse .c files must be in a separate macro file---which is
153f7a899fSPaolo Bonzini  * exactly what you're staring at now.
163f7a899fSPaolo Bonzini  *
173f7a899fSPaolo Bonzini  * To use this file, add the "--macro-file scripts/cocci-macro-file.h" to the
183f7a899fSPaolo Bonzini  * Coccinelle command line.
193f7a899fSPaolo Bonzini  */
203f7a899fSPaolo Bonzini 
213f7a899fSPaolo Bonzini /* From qemu/compiler.h */
22*8905770bSMarc-André Lureau #define G_NORETURN __attribute__ ((__noreturn__))
23c0840179SMarc-André Lureau #define G_GNUC_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
24887ce500SMarc-André Lureau #define G_GNUC_NULL_TERMINATED __attribute__((sentinel))
2548bb55bfSCao Jiaxi 
2648bb55bfSCao Jiaxi #if defined(_WIN32) && (defined(__x86_64__) || defined(__i386__))
273f7a899fSPaolo Bonzini # define QEMU_PACKED __attribute__((gcc_struct, packed))
2848bb55bfSCao Jiaxi #else
2948bb55bfSCao Jiaxi # define QEMU_PACKED __attribute__((packed))
3048bb55bfSCao Jiaxi #endif
313f7a899fSPaolo Bonzini 
323f7a899fSPaolo Bonzini #define cat(x,y) x ## y
333f7a899fSPaolo Bonzini #define cat2(x,y) cat(x,y)
343f7a899fSPaolo Bonzini #define QEMU_BUILD_BUG_ON(x) \
353f7a899fSPaolo Bonzini     typedef char cat2(qemu_build_bug_on__,__LINE__)[(x)?-1:1] __attribute__((unused));
363f7a899fSPaolo Bonzini 
379edc6313SMarc-André Lureau #define G_GNUC_PRINTF(n, m) __attribute__((format(gnu_printf, n, m)))
383f7a899fSPaolo Bonzini 
393f7a899fSPaolo Bonzini #define xglue(x, y) x ## y
403f7a899fSPaolo Bonzini #define glue(x, y) xglue(x, y)
413f7a899fSPaolo Bonzini #define stringify(s)	tostring(s)
423f7a899fSPaolo Bonzini #define tostring(s)	#s
433f7a899fSPaolo Bonzini 
443f7a899fSPaolo Bonzini #define typeof_field(type, field) typeof(((type *)0)->field)
453f7a899fSPaolo Bonzini #define type_check(t1,t2) ((t1*)0 - (t2*)0)
463f7a899fSPaolo Bonzini 
473f7a899fSPaolo Bonzini /* From qemu/queue.h */
483f7a899fSPaolo Bonzini 
493f7a899fSPaolo Bonzini #define QLIST_HEAD(name, type)                                          \
503f7a899fSPaolo Bonzini struct name {                                                           \
513f7a899fSPaolo Bonzini         struct type *lh_first;  /* first element */                     \
523f7a899fSPaolo Bonzini }
533f7a899fSPaolo Bonzini 
543f7a899fSPaolo Bonzini #define QLIST_HEAD_INITIALIZER(head)                                    \
553f7a899fSPaolo Bonzini         { NULL }
563f7a899fSPaolo Bonzini 
573f7a899fSPaolo Bonzini #define QLIST_ENTRY(type)                                               \
583f7a899fSPaolo Bonzini struct {                                                                \
593f7a899fSPaolo Bonzini         struct type *le_next;   /* next element */                      \
603f7a899fSPaolo Bonzini         struct type **le_prev;  /* address of previous next element */  \
613f7a899fSPaolo Bonzini }
623f7a899fSPaolo Bonzini 
633f7a899fSPaolo Bonzini /*
643f7a899fSPaolo Bonzini  * Singly-linked List definitions.
653f7a899fSPaolo Bonzini  */
663f7a899fSPaolo Bonzini #define QSLIST_HEAD(name, type)                                          \
673f7a899fSPaolo Bonzini struct name {                                                           \
683f7a899fSPaolo Bonzini         struct type *slh_first; /* first element */                     \
693f7a899fSPaolo Bonzini }
703f7a899fSPaolo Bonzini 
713f7a899fSPaolo Bonzini #define QSLIST_HEAD_INITIALIZER(head)                                    \
723f7a899fSPaolo Bonzini         { NULL }
733f7a899fSPaolo Bonzini 
743f7a899fSPaolo Bonzini #define QSLIST_ENTRY(type)                                               \
753f7a899fSPaolo Bonzini struct {                                                                \
763f7a899fSPaolo Bonzini         struct type *sle_next;  /* next element */                      \
773f7a899fSPaolo Bonzini }
783f7a899fSPaolo Bonzini 
793f7a899fSPaolo Bonzini /*
803f7a899fSPaolo Bonzini  * Simple queue definitions.
813f7a899fSPaolo Bonzini  */
823f7a899fSPaolo Bonzini #define QSIMPLEQ_HEAD(name, type)                                       \
833f7a899fSPaolo Bonzini struct name {                                                           \
843f7a899fSPaolo Bonzini     struct type *sqh_first;    /* first element */                      \
853f7a899fSPaolo Bonzini     struct type **sqh_last;    /* addr of last next element */          \
863f7a899fSPaolo Bonzini }
873f7a899fSPaolo Bonzini 
883f7a899fSPaolo Bonzini #define QSIMPLEQ_HEAD_INITIALIZER(head)                                 \
893f7a899fSPaolo Bonzini     { NULL, &(head).sqh_first }
903f7a899fSPaolo Bonzini 
913f7a899fSPaolo Bonzini #define QSIMPLEQ_ENTRY(type)                                            \
923f7a899fSPaolo Bonzini struct {                                                                \
933f7a899fSPaolo Bonzini     struct type *sqe_next;    /* next element */                        \
943f7a899fSPaolo Bonzini }
953f7a899fSPaolo Bonzini 
963f7a899fSPaolo Bonzini /*
973f7a899fSPaolo Bonzini  * Tail queue definitions.
983f7a899fSPaolo Bonzini  */
993f7a899fSPaolo Bonzini #define QTAILQ_HEAD(name, type)                                         \
1007274f01bSPaolo Bonzini union name {                                                            \
1017274f01bSPaolo Bonzini         struct type *tqh_first;       /* first element */               \
1027274f01bSPaolo Bonzini         QTailQLink tqh_circ;          /* link for last element */       \
1033f7a899fSPaolo Bonzini }
1043f7a899fSPaolo Bonzini 
1053f7a899fSPaolo Bonzini #define QTAILQ_HEAD_INITIALIZER(head)                                   \
1067274f01bSPaolo Bonzini         { .tqh_circ = { NULL, &(head).tqh_circ } }
1073f7a899fSPaolo Bonzini 
1083f7a899fSPaolo Bonzini #define QTAILQ_ENTRY(type)                                              \
1097274f01bSPaolo Bonzini union {                                                                 \
1107274f01bSPaolo Bonzini         struct type *tqe_next;        /* next element */                \
1117274f01bSPaolo Bonzini         QTailQLink tqe_circ;          /* link for prev element */       \
1123f7a899fSPaolo Bonzini }
1136ad978e9SPaolo Bonzini 
1146ad978e9SPaolo Bonzini /* From glib */
1156ad978e9SPaolo Bonzini #define g_assert_cmpint(a, op, b)   g_assert(a op b)
1166ad978e9SPaolo Bonzini #define g_assert_cmpuint(a, op, b)   g_assert(a op b)
1176ad978e9SPaolo Bonzini #define g_assert_cmphex(a, op, b)   g_assert(a op b)
1186ad978e9SPaolo Bonzini #define g_assert_cmpstr(a, op, b)   g_assert(strcmp(a, b) op 0)
119