From patchwork Fri Sep 21 14:07:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Roth X-Patchwork-Id: 185755 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id CA8082C0085 for ; Sat, 22 Sep 2012 00:45:40 +1000 (EST) Received: from localhost ([::1]:48951 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF4U6-0001kx-WA for incoming@patchwork.ozlabs.org; Fri, 21 Sep 2012 10:45:38 -0400 Received: from eggs.gnu.org ([208.118.235.92]:41434) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF3ub-0002NH-9J for qemu-devel@nongnu.org; Fri, 21 Sep 2012 10:09:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TF3uU-0007Pi-D7 for qemu-devel@nongnu.org; Fri, 21 Sep 2012 10:08:57 -0400 Received: from mail-ie0-f173.google.com ([209.85.223.173]:34534) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF3uU-0007Cw-4d for qemu-devel@nongnu.org; Fri, 21 Sep 2012 10:08:50 -0400 Received: by mail-ie0-f173.google.com with SMTP id 17so990551iea.4 for ; Fri, 21 Sep 2012 07:08:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=b8UaUW4PJBruKYdii1ACPjYvMH6R2KImAYCpBkymFJ4=; b=OwBNq2GRDkoc/a04V58EOocHZRVr57le2cv2s5kP8OcneI2/Eftz8L3/8B4DA+TnXi kiMYLR+h6z9cyv3sa8DLm6fpT048AV+TI5TMvjgqlYymYSFiRqoJ0UMXZDUIex/Kzlhf 6OA8zYnN4IZS8fd8W/E2q8ScIcJ+MaUoDIB9czsxksYUyhnMK3D7cNKkLQ4pu750eO/q dZgZhFKHqRqHLiGtn+qo+rbPbgqKEpGCTF9w4cPnePZSwrrTvMRnOLUygLxiN+U4fsx6 GOEBhgyfahF4Z8x3vpnutElXsyJ9GKpQPrI6X52p8QtL4bwCCRc+HC3gOHsbmkqr9uEP +atg== Received: by 10.50.160.228 with SMTP id xn4mr1544437igb.1.1348236529897; Fri, 21 Sep 2012 07:08:49 -0700 (PDT) Received: from loki.morrigu.org (cpe-72-179-62-111.austin.res.rr.com. [72.179.62.111]) by mx.google.com with ESMTPS id ua5sm17301156igb.10.2012.09.21.07.08.48 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 21 Sep 2012 07:08:48 -0700 (PDT) From: Michael Roth To: qemu-devel@nongnu.org Date: Fri, 21 Sep 2012 09:07:44 -0500 Message-Id: <1348236465-23124-22-git-send-email-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1348236465-23124-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1348236465-23124-1-git-send-email-mdroth@linux.vnet.ibm.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.223.173 Cc: blauwirbel@gmail.com, peter.maydell@linaro.org, aliguori@us.ibm.com, eblake@redhat.com Subject: [Qemu-devel] [PATCH 21/22] qidl: qidl.h, definitions for qidl annotations X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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..5fa2180 --- /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) +#define QIDL_DECLARE(name, ...) \ + 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 + +#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) + +#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 + * + * qImmutable: state is fully restorable via device + * [re-]initialization/realization + * + * qDerived: state can be fully reconstructed from other fields (and will be, + * via [re-]initialization of the device or a separate hook) + * + * qBroken: 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 + * + * qOptional: should only be serialized if the field by the name of + * has_ is true + * + * qElsewhere: state should be serialized, but is done so elsewhere (for + * instance, by another device with a pointer to the same data) + * + * qSize(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. + * + * qProperty( [, ]): specifies that field is a + * qdev-style property. all properties of the struct are then accessible via + * QIDL_PROPERTIES() macro. + */ + +#define qImmutable QIDL(immutable) +#define qDerived QIDL(derived) +#define qBroken QIDL(broken) +#define qOptional QIDL(optional) +#define qElsewhere QIDL(elsewhere) +#define qSize(...) QIDL(size_is, ##__VA_ARGS__) +#define qProperty(name, ...) QIDL(property, name, ##__VA_ARGS__) + +#endif