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