From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:56203) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TK9VN-0008IS-LJ for qemu-devel@nongnu.org; Fri, 05 Oct 2012 11:07:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TK9VM-0000LV-8H for qemu-devel@nongnu.org; Fri, 05 Oct 2012 11:07:57 -0400 Received: from mail-pa0-f45.google.com ([209.85.220.45]:40968) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TK9VL-0000LM-W0 for qemu-devel@nongnu.org; Fri, 05 Oct 2012 11:07:56 -0400 Received: by mail-pa0-f45.google.com with SMTP id fb10so1870456pad.4 for ; Fri, 05 Oct 2012 08:07:55 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <506EF7C2.1030103@redhat.com> Date: Fri, 05 Oct 2012 17:07:46 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1349372021-31212-1-git-send-email-mdroth@linux.vnet.ibm.com> <1349372021-31212-22-git-send-email-mdroth@linux.vnet.ibm.com> In-Reply-To: <1349372021-31212-22-git-send-email-mdroth@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v3 21/22] qidl: qidl.h, definitions for qidl annotations List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Michael Roth Cc: kwolf@redhat.com, peter.maydell@linaro.org, aliguori@us.ibm.com, qemu-devel@nongnu.org, blauwirbel@gmail.com, eblake@redhat.com Il 04/10/2012 19:33, Michael Roth ha scritto: > Signed-off-by: Michael Roth > --- > qidl.h | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 113 insertions(+) > create mode 100644 qidl.h > > diff --git a/qidl.h b/qidl.h > new file mode 100644 > index 0000000..eae0202 > --- /dev/null > +++ b/qidl.h > @@ -0,0 +1,113 @@ > +/* > + * QEMU IDL Macros/stubs > + * > + * See docs/qidl.txt for usage information. > + * > + * Copyright IBM, Corp. 2012 > + * > + * Authors: > + * Michael Roth > + * > + * This work is licensed under the terms of the GNU GPLv2 or later. > + * See the COPYING file in the top-level directory. > + * > + */ > + > +#ifndef QIDL_H > +#define QIDL_H > + > +#include > +#include "qapi/qapi-visit-core.h" > +#include "qemu/object.h" > +#include "hw/qdev-properties.h" > + > +#ifdef QIDL_GEN > + > +/* we pass the code through the preprocessor with QIDL_GEN defined to parse > + * structures as they'd appear after preprocessing, and use the following > + * definitions mostly to re-insert the initial macros/annotations so they > + * stick around for the parser to process > + */ > +#define QIDL(...) QIDL(__VA_ARGS__) > +#define QIDL_START(name, ...) QIDL_START(name, ##__VA_ARGS__) > + > +#define QIDL_VISIT_TYPE(name, v, s, f, e) > +#define QIDL_SCHEMA_ADD_LINK(name, obj, path, errp) > +#define QIDL_PROPERTIES(name) Ok, a few questions... Why do you need these to expand to nothing in the QIDL_GEN case? > +#define QIDL_DECLARE(name, ...) \ Can QIDL_DECLARE replace QIDL_ENABLED as the magic detection string for qidl compilation? > + QIDL_START(name, ##__VA_ARGS__) \ > + struct name > + > +#else /* !QIDL_GEN */ > + > +#define QIDL(...) > +#ifdef QIDL_ENABLED > +#define QIDL_START(name, ...) \ > + static struct { \ > + void (*visitor)(Visitor *, struct name **, const char *, Error **); \ > + const char *schema_json_text; \ > + Object *schema_obj; \ > + Property *properties; \ > + } qidl_data_##name; > +#else > +#define QIDL_START(name, ...) > +#endif > + > +#define QIDL_DECLARE(name, ...) \ > + QIDL_START(name, ##__VA_ARGS__) \ > + struct name This is the same definition as in the QIDL_GEN case. Please include it just once. > +#define QIDL_VISIT_TYPE(name, v, s, f, e) \ > + g_assert(qidl_data_##name.visitor); \ > + qidl_data_##name.visitor(v, s, NULL, e) > + > +#define QIDL_SCHEMA_ADD_LINK(name, obj, path, errp) \ > + g_assert(qidl_data_##name.schema_obj); \ > + object_property_add_link(obj, path, "container", \ > + &qidl_data_##name.schema_obj, errp) Where will QIDL_SCHEMA_ADD_LINK be used? > +#define QIDL_PROPERTIES(name) \ > + qidl_data_##name.properties > + > +#endif /* QIDL_GEN */ > + > +/* must be "called" in any C files that make use of QIDL-generated code */ > +#define QIDL_ENABLE() > + > +/* QIDL annotations/markers > + * > + * q_immutable: state is fully restorable via device > + * [re-]initialization/realization > + * > + * q_derived: state can be fully reconstructed from other fields (and will be, > + * via [re-]initialization of the device or a separate hook) > + * > + * q_broken: state should (or possibly should) be saved, but isn't. mostly an aid > + * for device developers having issues with serialization of a particular > + * field, committed code should contain these except in special circumstances > + * > + * q_optional: should only be serialized if the field by the name of > + * has_ is true > + * > + * q_elsewhere: state should be serialized, but is done so elsewhere (for > + * instance, by another device with a pointer to the same data) > + * > + * q_size(field): for static/dynamically-allocated arrays. specifies the field > + * in the structure containing the number of elements that should be > + * serialized. if argument is wrapped in parenthesis it is instead interpreted > + * as an expression that should be invaluated to determine the size. > + * > + * q_property( [, ]): specifies that field is a > + * qdev-style property. all properties of the struct are then accessible via > + * QIDL_PROPERTIES() macro. > + */ > + > +#define q_immutable QIDL(immutable) > +#define q_derived QIDL(derived) > +#define q_broken QIDL(broken) > +#define q_optional QIDL(optional) > +#define q_elsewhere QIDL(elsewhere) > +#define q_size(...) QIDL(size_is, ##__VA_ARGS__) > +#define q_property(name, ...) QIDL(property, name, ##__VA_ARGS__) > + > +#endif >