From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60911) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TKA1x-0004pt-G4 for qemu-devel@nongnu.org; Fri, 05 Oct 2012 11:41:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TKA1r-0005AU-91 for qemu-devel@nongnu.org; Fri, 05 Oct 2012 11:41:37 -0400 Received: from mail-ob0-f173.google.com ([209.85.214.173]:58626) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TKA1r-0005AE-1d for qemu-devel@nongnu.org; Fri, 05 Oct 2012 11:41:31 -0400 Received: by mail-ob0-f173.google.com with SMTP id wc18so1713053obb.4 for ; Fri, 05 Oct 2012 08:41:30 -0700 (PDT) Sender: fluxion Date: Fri, 5 Oct 2012 10:41:19 -0500 From: Michael Roth Message-ID: <20121005154119.GL16157@illuin> References: <1349372021-31212-1-git-send-email-mdroth@linux.vnet.ibm.com> <1349372021-31212-22-git-send-email-mdroth@linux.vnet.ibm.com> <506EF7C2.1030103@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <506EF7C2.1030103@redhat.com> 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: Paolo Bonzini Cc: kwolf@redhat.com, peter.maydell@linaro.org, aliguori@us.ibm.com, qemu-devel@nongnu.org, blauwirbel@gmail.com, eblake@redhat.com On Fri, Oct 05, 2012 at 05:07:46PM +0200, Paolo Bonzini wrote: > 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? > They don't need to, I was just trying to be explicit about what directives were relevant to the parser and which ones were relevant to the actually compiled code. It was more a development "aid" than anything else though, so I think we can drop the special handling and clean these up a bit. > > +#define QIDL_DECLARE(name, ...) \ > > Can QIDL_DECLARE replace QIDL_ENABLED as the magic detection string for > qidl compilation? > In some cases the declarations will come via #include'd headers, so the only way to do that reliable is to run it through the preprocessor first, which is how things were done in v1. But running everything through cpp adds substantial overhead, and just because a QIDL-fied struct is included in a C file, it doesn't mean that the C file intends to use any qidl-generated code. So that's why the QIDL_ENABLE() directive was added, so we can scan for that before doing the pass through cpp and the qidl parser to process all the qidl declarations. > > + 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. > Will do. > > +#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? In general, in the init functions of any qom objects that expose a "state" property in the qom tree, so that in every case where we expose serialized state information for an object/device via qom, we also provide a link to a schema describing it's structure. > > > +#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 > > > >