From 5500a5e912372de6a52bb4cf14b99f01e4afa2fe Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 9 Mar 2018 10:00:47 -0500 Subject: [PATCH] Include less of the generated modular QAPI headers In my "build everything" tree, a change to the types in qapi-schema.json triggers a recompile of about 4800 out of 5100 objects. The previous commit split up qmp-commands.h, qmp-event.h, qmp-visit.h, qapi-types.h. Each of these headers still includes all its shards. Reduce compile time by including just the shards we actually need. To illustrate the benefits: adding a type to qapi/migration.json now recompiles some 2300 instead of 4800 objects. The next commit will improve it further. Backports commit 9af2398977a78d37bf184d6ff6bd04c72bfbf006 from qemu --- .gitignore | 2 ++ qemu/hw/i386/pc.c | 3 ++- qemu/include/qapi/qmp/qobject.h | 4 +--- qemu/include/qapi/visitor.h | 5 +---- qemu/include/qom/object.h | 2 +- qemu/qom/object.c | 2 +- qemu/scripts/qapi/events.py | 11 +++++++---- qemu/scripts/qapi/types.py | 8 +++++--- qemu/scripts/qapi/visit.py | 10 ++++++---- 9 files changed, 26 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index 87b0608e..5e9092bd 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ qemu/x86_64-softmmu/ qemu/qapi-builtin-types.[ch] qemu/qapi-builtin-visit.[ch] +qemu/qapi/qapi-types-common.[ch] +qemu/qapi/qapi-visit-common.[ch] qemu/qapi-types.[ch] qemu/qapi-visit.[ch] qemu/qapi-gen-timestamp diff --git a/qemu/hw/i386/pc.c b/qemu/hw/i386/pc.c index d2ac8ae2..12a35d40 100644 --- a/qemu/hw/i386/pc.c +++ b/qemu/hw/i386/pc.c @@ -31,7 +31,8 @@ #include "sysemu/sysemu.h" #include "target/i386/topology.h" #include "qapi/error.h" -#include "qapi-visit.h" +#include "qapi/qapi-visit-common.h" +#include "qapi/visitor.h" /* XXX: add IGNNE support */ diff --git a/qemu/include/qapi/qmp/qobject.h b/qemu/include/qapi/qmp/qobject.h index 029e6e81..d5cf320b 100644 --- a/qemu/include/qapi/qmp/qobject.h +++ b/qemu/include/qapi/qmp/qobject.h @@ -32,9 +32,7 @@ #ifndef QOBJECT_H #define QOBJECT_H -#include -#include -#include "qapi-types.h" +#include "qapi-builtin-types.h" struct QObject { QType type; diff --git a/qemu/include/qapi/visitor.h b/qemu/include/qapi/visitor.h index 62d0346d..73d9f4b5 100644 --- a/qemu/include/qapi/visitor.h +++ b/qemu/include/qapi/visitor.h @@ -14,10 +14,7 @@ #ifndef QAPI_VISITOR_H #define QAPI_VISITOR_H -#include "qemu/typedefs.h" -#include "qapi-types.h" -#include "qapi/error.h" -#include +#include "qapi-builtin-types.h" /* * The QAPI schema defines both a set of C data types, and a QMP wire diff --git a/qemu/include/qom/object.h b/qemu/include/qom/object.h index 18074cfa..17746f65 100644 --- a/qemu/include/qom/object.h +++ b/qemu/include/qom/object.h @@ -16,7 +16,7 @@ #include "glib_compat.h" #include "unicorn/platform.h" -#include "qapi-types.h" +#include "qapi-builtin-types.h" #include "qemu/queue.h" #include "qemu/typedefs.h" #include "qapi/error.h" diff --git a/qemu/qom/object.c b/qemu/qom/object.c index c8eb892d..b160c4e8 100644 --- a/qemu/qom/object.c +++ b/qemu/qom/object.c @@ -15,8 +15,8 @@ #include "qom/object.h" #include "qemu/cutils.h" #include "qapi/visitor.h" -#include "qapi-visit.h" #include "qapi/string-input-visitor.h" +#include "qapi-builtin-visit.h" #include "qapi/qmp/qerror.h" /* TODO: replace QObject with a simpler visitor to avoid a dependency diff --git a/qemu/scripts/qapi/events.py b/qemu/scripts/qapi/events.py index f5a3aff8..a8c2d3bd 100644 --- a/qemu/scripts/qapi/events.py +++ b/qemu/scripts/qapi/events.py @@ -165,23 +165,26 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor): return basename def _begin_module(self, name): + types = self._module_basename('qapi-types', name) + visit = self._module_basename('qapi-visit', name) self._genc.add(mcgen(''' #include "qemu-common.h" #include "%(prefix)sqapi-event.h" -#include "%(prefix)sqapi-visit.h" +#include "%(visit)s.h" #include "qapi/error.h" #include "qapi/qmp/qdict.h" #include "qapi/qobject-output-visitor.h" #include "qapi/qmp-event.h" ''', - prefix=self._prefix)) + visit=visit, prefix=self._prefix)) self._genh.add(mcgen(''' -#include "%(prefix)sqapi-types.h" +/* #include "qapi/util.h" */ +#include "%(types)s.h" ''', - prefix=self._prefix)) + types=types)) def visit_end(self): self._genh.add(gen_enum(self._enum_name, self._event_names)) diff --git a/qemu/scripts/qapi/types.py b/qemu/scripts/qapi/types.py index 19bac122..dfc6cf6a 100644 --- a/qemu/scripts/qapi/types.py +++ b/qemu/scripts/qapi/types.py @@ -185,13 +185,15 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor): ''')) def _begin_module(self, name): + types = self._module_basename('qapi-types', name) + visit = self._module_basename('qapi-visit', name) self._genc.preamble_add(mcgen(''' #include "qemu/osdep.h" #include "qapi/dealloc-visitor.h" -#include "%(prefix)sqapi-types.h" -#include "%(prefix)sqapi-visit.h" +#include "%(types)s.h" +#include "%(visit)s.h" ''', - prefix=self._prefix)) + types=types, visit=visit)) self._genh.preamble_add(mcgen(''' #include "qapi-builtin-types.h" ''')) diff --git a/qemu/scripts/qapi/visit.py b/qemu/scripts/qapi/visit.py index f0eaa8f6..eec1973e 100644 --- a/qemu/scripts/qapi/visit.py +++ b/qemu/scripts/qapi/visit.py @@ -284,20 +284,22 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor): prefix=prefix)) def _begin_module(self, name): + types = self._module_basename('qapi-types', name) + visit = self._module_basename('qapi-visit', name) self._genc.preamble_add(mcgen(''' #include "qemu/osdep.h" #include "qemu-common.h" #include "qapi/error.h" #include "qapi/qmp/qerror.h" -#include "%(prefix)sqapi-visit.h" +#include "%(visit)s.h" ''', - prefix=self._prefix)) + visit=visit, prefix=self._prefix)) self._genh.preamble_add(mcgen(''' #include "qapi-builtin-visit.h" -#include "%(prefix)sqapi-types.h" +#include "%(types)s.h" ''', - prefix=self._prefix)) + types=types)) def visit_enum_type(self, name, info, values, prefix): self._genh.add(gen_visit_decl(name, scalar=True))