qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-block] [PATCH v2 12/54] qapi: change enum lookup structure


From: Marc-André Lureau
Subject: [Qemu-block] [PATCH v2 12/54] qapi: change enum lookup structure
Date: Tue, 22 Aug 2017 15:22:13 +0200

Store the length in the lookup table, i.e. change it from
const char *const[] to struct { int n, const char *const s[] }.

The following conditional enum entry change will create "hole"
elements in the generated lookup array, that should be skipped.

Signed-off-by: Marc-André Lureau <address@hidden>
---
 include/qapi/visitor.h              |  2 +-
 scripts/qapi.py                     | 11 +++++--
 scripts/qapi-types.py               |  6 ++++
 scripts/qapi-visit.py               |  2 +-
 include/hw/qdev-core.h              |  2 +-
 include/qapi/util.h                 |  6 ++--
 include/qom/object.h                |  4 +--
 qapi/qapi-visit-core.c              | 24 +++++++-------
 backends/hostmem.c                  |  4 +--
 block.c                             |  3 +-
 block/backup.c                      |  2 +-
 block/blkdebug.c                    |  4 +--
 block/file-posix.c                  | 17 +++++-----
 block/file-win32.c                  |  6 ++--
 block/gluster.c                     | 12 +++----
 block/iscsi.c                       |  2 +-
 block/nfs.c                         |  2 +-
 block/parallels.c                   | 10 ++++--
 block/qcow2.c                       | 14 ++++----
 block/qed.c                         |  2 +-
 block/quorum.c                      |  4 +--
 block/rbd.c                         |  2 +-
 block/sheepdog.c                    |  2 +-
 blockdev.c                          |  7 ++--
 blockjob.c                          |  6 ++--
 chardev/char.c                      |  4 +--
 crypto/block-luks.c                 | 38 +++++++++-------------
 crypto/block.c                      |  4 +--
 crypto/cipher-afalg.c               |  2 +-
 crypto/cipher-builtin.c             |  8 ++---
 crypto/cipher-gcrypt.c              |  4 +--
 crypto/cipher-nettle.c              |  8 ++---
 crypto/hmac-gcrypt.c                |  2 +-
 crypto/hmac-glib.c                  |  2 +-
 crypto/hmac-nettle.c                |  2 +-
 crypto/pbkdf-gcrypt.c               |  2 +-
 crypto/pbkdf-nettle.c               |  2 +-
 crypto/secret.c                     |  2 +-
 crypto/tlscreds.c                   |  2 +-
 hmp.c                               | 64 +++++++++++++++++--------------------
 hw/block/fdc.c                      |  6 ++--
 hw/char/escc.c                      |  2 +-
 hw/core/qdev-properties.c           | 10 +++---
 hw/input/virtio-input-hid.c         |  4 +--
 migration/colo-failover.c           |  4 +--
 migration/colo.c                    | 14 ++++----
 migration/global_state.c            |  5 ++-
 monitor.c                           | 20 ++++++------
 net/filter.c                        |  2 +-
 net/net.c                           |  4 +--
 qapi/qapi-util.c                    | 13 ++++----
 qapi/qmp-dispatch.c                 |  2 +-
 qemu-img.c                          |  6 ++--
 qemu-nbd.c                          |  3 +-
 qom/object.c                        | 16 +++++-----
 tests/check-qom-proplist.c          |  7 +++-
 tests/test-qapi-util.c              | 17 ++++------
 tests/test-qobject-input-visitor.c  |  8 ++---
 tests/test-qobject-output-visitor.c |  2 +-
 tests/test-string-input-visitor.c   |  4 +--
 tests/test-string-output-visitor.c  |  4 +--
 tpm.c                               |  4 +--
 ui/input-legacy.c                   |  6 ++--
 ui/input.c                          | 12 +++----
 ui/vnc.c                            |  6 ++--
 vl.c                                |  6 ++--
 66 files changed, 241 insertions(+), 248 deletions(-)

diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
index 0f3b8cb459..62a51a54cb 100644
--- a/include/qapi/visitor.h
+++ b/include/qapi/visitor.h
@@ -469,7 +469,7 @@ bool visit_optional(Visitor *v, const char *name, bool 
*present);
  * that visit_type_str() must have no unwelcome side effects.
  */
 void visit_type_enum(Visitor *v, const char *name, int *obj,
-                     const char *const strings[], Error **errp);
+                     const QEnumLookup *lookup, Error **errp);
 
 /*
  * Check if visitor is an input visitor.
diff --git a/scripts/qapi.py b/scripts/qapi.py
index a3ac799535..314d7e0365 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -1851,7 +1851,7 @@ def guardend(name):
 def gen_enum_lookup(name, values, prefix=None):
     ret = mcgen('''
 
-const char *const %(c_name)s_lookup[] = {
+static const char *const %(c_name)s_array[] = {
 ''',
                 c_name=c_name(name))
     for value in values:
@@ -1865,8 +1865,13 @@ const char *const %(c_name)s_lookup[] = {
     ret += mcgen('''
     [%(max_index)s] = NULL,
 };
+
+const QEnumLookup %(c_name)s_lookup = {
+    .array = %(c_name)s_array,
+    .size = %(max_index)s
+};
 ''',
-                 max_index=max_index)
+                 max_index=max_index, c_name=c_name(name))
     return ret
 
 
@@ -1896,7 +1901,7 @@ typedef enum %(c_name)s {
 
     ret += mcgen('''
 
-extern const char *const %(c_name)s_lookup[];
+extern const QEnumLookup %(c_name)s_lookup;
 ''',
                  c_name=c_name(name))
     return ret
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index b45e7b5634..dc05268917 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -179,6 +179,12 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
         self.defn = ''
         self._fwdecl = ''
         self._btin = guardstart('QAPI_TYPES_BUILTIN')
+        self._btin += '''
+typedef struct QEnumLookup {
+    const char *const *array;
+    int size;
+} QEnumLookup;
+'''
 
     def visit_end(self):
         self.decl = self._fwdecl + self.decl
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index bd0b742236..7e1cfc13f0 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -153,7 +153,7 @@ def gen_visit_enum(name):
 void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, 
Error **errp)
 {
     int value = *obj;
-    visit_type_enum(v, name, &value, %(c_name)s_lookup, errp);
+    visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp);
     *obj = value;
 }
 ''',
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index ae317286a4..089146197f 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -249,7 +249,7 @@ struct Property {
 struct PropertyInfo {
     const char *name;
     const char *description;
-    const char * const *enum_table;
+    const QEnumLookup *enum_table;
     int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
     void (*set_default_value)(Object *obj, const Property *prop);
     void (*create)(Object *obj, Property *prop, Error **errp);
diff --git a/include/qapi/util.h b/include/qapi/util.h
index 60733b6a80..613f82bdcd 100644
--- a/include/qapi/util.h
+++ b/include/qapi/util.h
@@ -11,10 +11,10 @@
 #ifndef QAPI_UTIL_H
 #define QAPI_UTIL_H
 
-const char *qapi_enum_lookup(const char * const lookup[], int val);
+const char *qapi_enum_lookup(const QEnumLookup *lookup, int val);
 
-int qapi_enum_parse(const char * const lookup[], const char *buf,
-                    int max, int def, Error **errp);
+int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
+                    int def, Error **errp);
 
 int parse_qapi_name(const char *name, bool complete);
 
diff --git a/include/qom/object.h b/include/qom/object.h
index 1b828994fa..f3e5cff37a 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1415,14 +1415,14 @@ void object_class_property_add_bool(ObjectClass *klass, 
const char *name,
  */
 void object_property_add_enum(Object *obj, const char *name,
                               const char *typename,
-                              const char * const *strings,
+                              const QEnumLookup *lookup,
                               int (*get)(Object *, Error **),
                               void (*set)(Object *, int, Error **),
                               Error **errp);
 
 void object_class_property_add_enum(ObjectClass *klass, const char *name,
                                     const char *typename,
-                                    const char * const *strings,
+                                    const QEnumLookup *lookup,
                                     int (*get)(Object *, Error **),
                                     void (*set)(Object *, int, Error **),
                                     Error **errp);
diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
index ed6d2af462..8876ecf0cd 100644
--- a/qapi/qapi-visit-core.c
+++ b/qapi/qapi-visit-core.c
@@ -333,24 +333,22 @@ void visit_type_null(Visitor *v, const char *name, QNull 
**obj,
 }
 
 static void output_type_enum(Visitor *v, const char *name, int *obj,
-                             const char *const strings[], Error **errp)
+                             const QEnumLookup *lookup, Error **errp)
 {
-    int i = 0;
     int value = *obj;
     char *enum_str;
 
-    while (strings[i++] != NULL);
-    if (value < 0 || value >= i - 1) {
+    if (value < 0 || value > lookup->size || !lookup->array[value]) {
         error_setg(errp, QERR_INVALID_PARAMETER, name ? name : "null");
         return;
     }
 
-    enum_str = (char *)strings[value];
+    enum_str = (char *)lookup->array[value];
     visit_type_str(v, name, &enum_str, errp);
 }
 
 static void input_type_enum(Visitor *v, const char *name, int *obj,
-                            const char *const strings[], Error **errp)
+                            const QEnumLookup *lookup, Error **errp)
 {
     Error *local_err = NULL;
     int64_t value = 0;
@@ -362,14 +360,14 @@ static void input_type_enum(Visitor *v, const char *name, 
int *obj,
         return;
     }
 
-    while (strings[value] != NULL) {
-        if (strcmp(strings[value], enum_str) == 0) {
+    while (value < lookup->size) {
+        if (!g_strcmp0(lookup->array[value], enum_str)) {
             break;
         }
         value++;
     }
 
-    if (strings[value] == NULL) {
+    if (value == lookup->size) {
         error_setg(errp, QERR_INVALID_PARAMETER, enum_str);
         g_free(enum_str);
         return;
@@ -380,16 +378,16 @@ static void input_type_enum(Visitor *v, const char *name, 
int *obj,
 }
 
 void visit_type_enum(Visitor *v, const char *name, int *obj,
-                     const char *const strings[], Error **errp)
+                     const QEnumLookup *lookup, Error **errp)
 {
-    assert(obj && strings);
+    assert(obj && lookup);
     trace_visit_type_enum(v, name, obj);
     switch (v->type) {
     case VISITOR_INPUT:
-        input_type_enum(v, name, obj, strings, errp);
+        input_type_enum(v, name, obj, lookup, errp);
         break;
     case VISITOR_OUTPUT:
-        output_type_enum(v, name, obj, strings, errp);
+        output_type_enum(v, name, obj, lookup, errp);
         break;
     case VISITOR_CLONE:
         /* nothing further to do, scalar value was already copied by
diff --git a/backends/hostmem.c b/backends/hostmem.c
index c4f795475c..ce430f1d14 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -305,7 +305,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, 
Error **errp)
             return;
         } else if (maxnode == 0 && backend->policy != MPOL_DEFAULT) {
             error_setg(errp, "host-nodes must be set for policy %s",
-                qapi_enum_lookup(HostMemPolicy_lookup, backend->policy));
+                qapi_enum_lookup(&HostMemPolicy_lookup, backend->policy));
             return;
         }
 
@@ -396,7 +396,7 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
         host_memory_backend_set_host_nodes,
         NULL, NULL, &error_abort);
     object_class_property_add_enum(oc, "policy", "HostMemPolicy",
-        HostMemPolicy_lookup,
+        &HostMemPolicy_lookup,
         host_memory_backend_get_policy,
         host_memory_backend_set_policy, &error_abort);
     object_class_property_add_str(oc, "id", get_id, set_id, &error_abort);
diff --git a/block.c b/block.c
index 3615a6809e..ffb1f8db13 100644
--- a/block.c
+++ b/block.c
@@ -1333,9 +1333,8 @@ static int bdrv_open_common(BlockDriverState *bs, 
BlockBackend *file,
     detect_zeroes = qemu_opt_get(opts, "detect-zeroes");
     if (detect_zeroes) {
         BlockdevDetectZeroesOptions value =
-            qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,
+            qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,
                             detect_zeroes,
-                            BLOCKDEV_DETECT_ZEROES_OPTIONS__MAX,
                             BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
                             &local_err);
         if (local_err) {
diff --git a/block/backup.c b/block/backup.c
index a700cc0315..8d4f3bcc13 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -597,7 +597,7 @@ BlockJob *backup_job_create(const char *job_id, 
BlockDriverState *bs,
         error_setg(errp,
                    "a sync_bitmap was provided to backup_run, "
                    "but received an incompatible sync_mode (%s)",
-                   qapi_enum_lookup(MirrorSyncMode_lookup, sync_mode));
+                   qapi_enum_lookup(&MirrorSyncMode_lookup, sync_mode));
         return NULL;
     }
 
diff --git a/block/blkdebug.c b/block/blkdebug.c
index 50edda2a31..94068156dc 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -170,7 +170,7 @@ static int add_rule(void *opaque, QemuOpts *opts, Error 
**errp)
         error_setg(errp, "Missing event name for rule");
         return -1;
     }
-    event = qapi_enum_parse(BlkdebugEvent_lookup, event_name, BLKDBG__MAX, -1, 
errp);
+    event = qapi_enum_parse(&BlkdebugEvent_lookup, event_name, -1, errp);
     if (event < 0) {
         return -1;
     }
@@ -733,7 +733,7 @@ static int blkdebug_debug_breakpoint(BlockDriverState *bs, 
const char *event,
     struct BlkdebugRule *rule;
     int blkdebug_event;
 
-    blkdebug_event = qapi_enum_parse(BlkdebugEvent_lookup, event, BLKDBG__MAX, 
-1, NULL);
+    blkdebug_event = qapi_enum_parse(&BlkdebugEvent_lookup, event, -1, NULL);
     if (blkdebug_event < 0) {
         return -ENOENT;
     }
diff --git a/block/file-posix.c b/block/file-posix.c
index 48200aef0b..578f9aae39 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -438,8 +438,8 @@ static int raw_open_common(BlockDriverState *bs, QDict 
*options,
     aio_default = (bdrv_flags & BDRV_O_NATIVE_AIO)
                   ? BLOCKDEV_AIO_OPTIONS_NATIVE
                   : BLOCKDEV_AIO_OPTIONS_THREADS;
-    aio = qapi_enum_parse(BlockdevAioOptions_lookup, qemu_opt_get(opts, "aio"),
-                          BLOCKDEV_AIO_OPTIONS__MAX, aio_default, &local_err);
+    aio = qapi_enum_parse(&BlockdevAioOptions_lookup, qemu_opt_get(opts, 
"aio"),
+                          aio_default, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         ret = -EINVAL;
@@ -447,8 +447,8 @@ static int raw_open_common(BlockDriverState *bs, QDict 
*options,
     }
     s->use_linux_aio = (aio == BLOCKDEV_AIO_OPTIONS_NATIVE);
 
-    locking = qapi_enum_parse(OnOffAuto_lookup, qemu_opt_get(opts, "locking"),
-                              ON_OFF_AUTO__MAX, ON_OFF_AUTO_AUTO, &local_err);
+    locking = qapi_enum_parse(&OnOffAuto_lookup, qemu_opt_get(opts, "locking"),
+                              ON_OFF_AUTO_AUTO, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         ret = -EINVAL;
@@ -1725,7 +1725,7 @@ static int raw_regular_truncate(int fd, int64_t offset, 
PreallocMode prealloc,
     default:
         result = -ENOTSUP;
         error_setg(errp, "Unsupported preallocation mode: %s",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         return result;
     }
 
@@ -1760,7 +1760,7 @@ static int raw_truncate(BlockDriverState *bs, int64_t 
offset,
 
     if (prealloc != PREALLOC_MODE_OFF) {
         error_setg(errp, "Preallocation mode '%s' unsupported for this "
-                   "non-regular file", qapi_enum_lookup(PreallocMode_lookup,
+                   "non-regular file", qapi_enum_lookup(&PreallocMode_lookup,
                                                         prealloc));
         return -ENOTSUP;
     }
@@ -1975,9 +1975,8 @@ static int raw_create(const char *filename, QemuOpts 
*opts, Error **errp)
                           BDRV_SECTOR_SIZE);
     nocow = qemu_opt_get_bool(opts, BLOCK_OPT_NOCOW, false);
     buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
-    prealloc = qapi_enum_parse(PreallocMode_lookup, buf,
-                               PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
-                               &local_err);
+    prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
+                               PREALLOC_MODE_OFF, &local_err);
     g_free(buf);
     if (local_err) {
         error_propagate(errp, local_err);
diff --git a/block/file-win32.c b/block/file-win32.c
index 2f3975f040..be4146e030 100644
--- a/block/file-win32.c
+++ b/block/file-win32.c
@@ -303,8 +303,8 @@ static bool get_aio_option(QemuOpts *opts, int flags, Error 
**errp)
 
     aio_default = (flags & BDRV_O_NATIVE_AIO) ? BLOCKDEV_AIO_OPTIONS_NATIVE
                                               : BLOCKDEV_AIO_OPTIONS_THREADS;
-    aio = qapi_enum_parse(BlockdevAioOptions_lookup, qemu_opt_get(opts, "aio"),
-                          BLOCKDEV_AIO_OPTIONS__MAX, aio_default, errp);
+    aio = qapi_enum_parse(&BlockdevAioOptions_lookup, qemu_opt_get(opts, 
"aio"),
+                          aio_default, errp);
 
     switch (aio) {
     case BLOCKDEV_AIO_OPTIONS_NATIVE:
@@ -470,7 +470,7 @@ static int raw_truncate(BlockDriverState *bs, int64_t 
offset,
 
     if (prealloc != PREALLOC_MODE_OFF) {
         error_setg(errp, "Unsupported preallocation mode '%s'",
-                   qapi_enum_lookup(reallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&reallocMode_lookup, prealloc));
         return -ENOTSUP;
     }
 
diff --git a/block/gluster.c b/block/gluster.c
index 934f459014..bc8eff5dd3 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -544,8 +544,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster 
*gconf,
         if (!strcmp(ptr, "tcp")) {
             ptr = "inet";       /* accept legacy "tcp" */
         }
-        type = qapi_enum_parse(SocketAddressType_lookup, ptr,
-                               SOCKET_ADDRESS_TYPE__MAX, -1, NULL);
+        type = qapi_enum_parse(&SocketAddressType_lookup, ptr, -1, NULL);
         if (type != SOCKET_ADDRESS_TYPE_INET
             && type != SOCKET_ADDRESS_TYPE_UNIX) {
             error_setg(&local_err,
@@ -1002,9 +1001,8 @@ static int qemu_gluster_create(const char *filename,
                           BDRV_SECTOR_SIZE);
 
     tmp = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
-    prealloc = qapi_enum_parse(PreallocMode_lookup, tmp,
-                               PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
-                               &local_err);
+    prealloc = qapi_enum_parse(&PreallocMode_lookup, tmp,
+                               PREALLOC_MODE_OFF, &local_err);
     g_free(tmp);
     if (local_err) {
         error_propagate(errp, local_err);
@@ -1050,7 +1048,7 @@ static int qemu_gluster_create(const char *filename,
     default:
         ret = -EINVAL;
         error_setg(errp, "Unsupported preallocation mode: %s",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         break;
     }
 
@@ -1102,7 +1100,7 @@ static int qemu_gluster_truncate(BlockDriverState *bs, 
int64_t offset,
 
     if (prealloc != PREALLOC_MODE_OFF) {
         error_setg(errp, "Unsupported preallocation mode '%s'",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         return -ENOTSUP;
     }
 
diff --git a/block/iscsi.c b/block/iscsi.c
index 5c1870340b..c6bb0049bf 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -2088,7 +2088,7 @@ static int iscsi_truncate(BlockDriverState *bs, int64_t 
offset,
 
     if (prealloc != PREALLOC_MODE_OFF) {
         error_setg(errp, "Unsupported preallocation mode '%s'",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         return -ENOTSUP;
     }
 
diff --git a/block/nfs.c b/block/nfs.c
index 953728ae31..f0ac050169 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -773,7 +773,7 @@ static int nfs_file_truncate(BlockDriverState *bs, int64_t 
offset,
 
     if (prealloc != PREALLOC_MODE_OFF) {
         error_setg(errp, "Unsupported preallocation mode '%s'",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         return -ENOTSUP;
     }
 
diff --git a/block/parallels.c b/block/parallels.c
index e1e06d23cc..f870bbac3e 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -69,12 +69,16 @@ typedef enum ParallelsPreallocMode {
     PRL_PREALLOC_MODE__MAX = 2,
 } ParallelsPreallocMode;
 
-static const char *prealloc_mode_lookup[] = {
+static const char *prealloc_mode_array[] = {
     "falloc",
     "truncate",
     NULL,
 };
 
+static QEnumLookup prealloc_mode_lookup = {
+    .array = prealloc_mode_array,
+    .size = G_N_ELEMENTS(prealloc_mode_array),
+};
 
 typedef struct BDRVParallelsState {
     /** Locking is conservative, the lock protects
@@ -696,8 +700,8 @@ static int parallels_open(BlockDriverState *bs, QDict 
*options, int flags,
         qemu_opt_get_size_del(opts, PARALLELS_OPT_PREALLOC_SIZE, 0);
     s->prealloc_size = MAX(s->tracks, s->prealloc_size >> BDRV_SECTOR_BITS);
     buf = qemu_opt_get_del(opts, PARALLELS_OPT_PREALLOC_MODE);
-    s->prealloc_mode = qapi_enum_parse(prealloc_mode_lookup, buf,
-            PRL_PREALLOC_MODE__MAX, PRL_PREALLOC_MODE_FALLOCATE, &local_err);
+    s->prealloc_mode = qapi_enum_parse(&prealloc_mode_lookup, buf,
+                                       PRL_PREALLOC_MODE_FALLOCATE, 
&local_err);
     g_free(buf);
     if (local_err != NULL) {
         goto fail_options;
diff --git a/block/qcow2.c b/block/qcow2.c
index 45b0579caa..c72fa2b476 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2733,7 +2733,7 @@ static int qcow2_create2(const char *filename, int64_t 
total_size,
             qcow2_calc_prealloc_size(total_size, cluster_size, refcount_order);
         qemu_opt_set_number(opts, BLOCK_OPT_SIZE, prealloc_size, &error_abort);
         qemu_opt_set(opts, BLOCK_OPT_PREALLOC,
-                     qapi_enum_lookup(PreallocMode_lookup, prealloc),
+                     qapi_enum_lookup(&PreallocMode_lookup, prealloc),
                      &error_abort);
     }
 
@@ -2933,9 +2933,8 @@ static int qcow2_create(const char *filename, QemuOpts 
*opts, Error **errp)
         goto finish;
     }
     buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
-    prealloc = qapi_enum_parse(PreallocMode_lookup, buf,
-                               PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
-                               &local_err);
+    prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
+                               PREALLOC_MODE_OFF, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         ret = -EINVAL;
@@ -3099,7 +3098,7 @@ static int qcow2_truncate(BlockDriverState *bs, int64_t 
offset,
         prealloc != PREALLOC_MODE_FALLOC && prealloc != PREALLOC_MODE_FULL)
     {
         error_setg(errp, "Unsupported preallocation mode '%s'",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         return -ENOTSUP;
     }
 
@@ -3624,9 +3623,8 @@ static BlockMeasureInfo *qcow2_measure(QemuOpts *opts, 
BlockDriverState *in_bs,
     }
 
     optstr = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
-    prealloc = qapi_enum_parse(PreallocMode_lookup, optstr,
-                               PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
-                               &local_err);
+    prealloc = qapi_enum_parse(&PreallocMode_lookup, optstr,
+                               PREALLOC_MODE_OFF, &local_err);
     g_free(optstr);
     if (local_err) {
         goto err;
diff --git a/block/qed.c b/block/qed.c
index 756fcb85a7..aec2a559ce 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -1400,7 +1400,7 @@ static int bdrv_qed_truncate(BlockDriverState *bs, 
int64_t offset,
 
     if (prealloc != PREALLOC_MODE_OFF) {
         error_setg(errp, "Unsupported preallocation mode '%s'",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         return -ENOTSUP;
     }
 
diff --git a/block/quorum.c b/block/quorum.c
index e4271caa7a..44acd2702c 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -911,9 +911,9 @@ static int quorum_open(BlockDriverState *bs, QDict 
*options, int flags,
     if (!qemu_opt_get(opts, QUORUM_OPT_READ_PATTERN)) {
         ret = QUORUM_READ_PATTERN_QUORUM;
     } else {
-        ret = qapi_enum_parse(QuorumReadPattern_lookup,
+        ret = qapi_enum_parse(&QuorumReadPattern_lookup,
                               qemu_opt_get(opts, QUORUM_OPT_READ_PATTERN),
-                              QUORUM_READ_PATTERN__MAX, -EINVAL, NULL);
+                              -EINVAL, NULL);
     }
     if (ret < 0) {
         error_setg(&local_err, "Please set read-pattern as fifo or quorum");
diff --git a/block/rbd.c b/block/rbd.c
index 09f8d18d1b..ff71259f05 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -945,7 +945,7 @@ static int qemu_rbd_truncate(BlockDriverState *bs, int64_t 
offset,
 
     if (prealloc != PREALLOC_MODE_OFF) {
         error_setg(errp, "Unsupported preallocation mode '%s'",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         return -ENOTSUP;
     }
 
diff --git a/block/sheepdog.c b/block/sheepdog.c
index 69d49fb720..9eac7c0ec7 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -2177,7 +2177,7 @@ static int sd_truncate(BlockDriverState *bs, int64_t 
offset,
 
     if (prealloc != PREALLOC_MODE_OFF) {
         error_setg(errp, "Unsupported preallocation mode '%s'",
-                   qapi_enum_lookup(PreallocMode_lookup, prealloc));
+                   qapi_enum_lookup(&PreallocMode_lookup, prealloc));
         return -ENOTSUP;
     }
 
diff --git a/blockdev.c b/blockdev.c
index 6a067e81bf..7834b8830e 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -438,9 +438,8 @@ static void extract_common_blockdev_options(QemuOpts *opts, 
int *bdrv_flags,
 
     if (detect_zeroes) {
         *detect_zeroes =
-            qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,
+            qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,
                             qemu_opt_get(opts, "detect-zeroes"),
-                            BLOCKDEV_DETECT_ZEROES_OPTIONS__MAX,
                             BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
                             &local_error);
         if (local_error) {
@@ -1468,9 +1467,9 @@ static int action_check_completion_mode(BlkActionState 
*s, Error **errp)
         error_setg(errp,
                    "Action '%s' does not support Transaction property "
                    "completion-mode = %s",
-                   qapi_enum_lookup(TransactionActionKind_lookup,
+                   qapi_enum_lookup(&TransactionActionKind_lookup,
                                     s->action->type),
-                   qapi_enum_lookup(ActionCompletionMode_lookup,
+                   qapi_enum_lookup(&ActionCompletionMode_lookup,
                                     s->txn_props->completion_mode));
         return -1;
     }
diff --git a/blockjob.c b/blockjob.c
index fca71123e0..3c815b89e4 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -209,7 +209,7 @@ static char *child_job_get_parent_desc(BdrvChild *c)
 {
     BlockJob *job = c->opaque;
     return g_strdup_printf("%s job '%s'",
-                           qapi_enum_lookup(BlockJobType_lookup,
+                           qapi_enum_lookup(&BlockJobType_lookup,
                                             job->driver->job_type),
                            job->id);
 }
@@ -555,7 +555,7 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
         return NULL;
     }
     info = g_new0(BlockJobInfo, 1);
-    info->type      = g_strdup(qapi_enum_lookup(BlockJobType_lookup,
+    info->type      = g_strdup(qapi_enum_lookup(&BlockJobType_lookup,
                                                 job->driver->job_type));
     info->device    = g_strdup(job->id);
     info->len       = job->len;
@@ -669,7 +669,7 @@ void *block_job_create(const char *job_id, const 
BlockJobDriver *driver,
     job->refcnt        = 1;
 
     error_setg(&job->blocker, "block device is in use by block job: %s",
-               qapi_enum_lookup(BlockJobType_lookup, driver->job_type));
+               qapi_enum_lookup(&BlockJobType_lookup, driver->job_type));
     block_job_add_bdrv(job, "main node", bs, 0, BLK_PERM_ALL, &error_abort);
     bs->job = job;
 
diff --git a/chardev/char.c b/chardev/char.c
index 4408d12a08..ba2d110ae5 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -932,7 +932,7 @@ ChardevReturn *qmp_chardev_add(const char *id, 
ChardevBackend *backend,
     ChardevReturn *ret;
     Chardev *chr;
 
-    cc = char_get_class(qapi_enum_lookup(ChardevBackendKind_lookup,
+    cc = char_get_class(qapi_enum_lookup(&ChardevBackendKind_lookup,
                                          backend->type), errp);
     if (!cc) {
         return NULL;
@@ -991,7 +991,7 @@ ChardevReturn *qmp_chardev_change(const char *id, 
ChardevBackend *backend,
         return NULL;
     }
 
-    cc = char_get_class(qapi_enum_lookup(ChardevBackendKind_lookup,
+    cc = char_get_class(qapi_enum_lookup(&ChardevBackendKind_lookup,
                                          backend->type), errp);
     if (!cc) {
         return NULL;
diff --git a/crypto/block-luks.c b/crypto/block-luks.c
index b78a6345f3..a3c96d768b 100644
--- a/crypto/block-luks.c
+++ b/crypto/block-luks.c
@@ -258,47 +258,39 @@ 
qcrypto_block_luks_cipher_alg_lookup(QCryptoCipherAlgorithm alg,
     }
 
     error_setg(errp, "Algorithm '%s' not supported",
-               qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
+               qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
     return NULL;
 }
 
-/* XXX replace with qapi_enum_parse() in future, when we can
+/* XXX replace with qapi_enum_parse(&) in future, when we can
  * make that function emit a more friendly error message */
 static int qcrypto_block_luks_name_lookup(const char *name,
-                                          const char *const *map,
-                                          size_t maplen,
+                                          const QEnumLookup *lookup,
                                           const char *type,
                                           Error **errp)
 {
-    size_t i;
-    for (i = 0; i < maplen; i++) {
-        if (g_str_equal(map[i], name)) {
-            return i;
-        }
+    int i = qapi_enum_parse(lookup, name, -1, NULL);
+    if (i < 0) {
+        error_setg(errp, "%s %s not supported", type, name);
     }
-
-    error_setg(errp, "%s %s not supported", type, name);
-    return 0;
+    return i;
 }
 
 #define qcrypto_block_luks_cipher_mode_lookup(name, errp)               \
     qcrypto_block_luks_name_lookup(name,                                \
-                                   QCryptoCipherMode_lookup,            \
-                                   QCRYPTO_CIPHER_MODE__MAX,            \
+                                   &QCryptoCipherMode_lookup,            \
                                    "Cipher mode",                       \
                                    errp)
 
 #define qcrypto_block_luks_hash_name_lookup(name, errp)                 \
     qcrypto_block_luks_name_lookup(name,                                \
-                                   QCryptoHashAlgorithm_lookup,         \
-                                   QCRYPTO_HASH_ALG__MAX,               \
+                                   &QCryptoHashAlgorithm_lookup,         \
                                    "Hash algorithm",                    \
                                    errp)
 
 #define qcrypto_block_luks_ivgen_name_lookup(name, errp)                \
     qcrypto_block_luks_name_lookup(name,                                \
-                                   QCryptoIVGenAlgorithm_lookup,        \
-                                   QCRYPTO_IVGEN_ALG__MAX,              \
+                                   &QCryptoIVGenAlgorithm_lookup,        \
                                    "IV generator",                      \
                                    errp)
 
@@ -399,7 +391,7 @@ qcrypto_block_luks_essiv_cipher(QCryptoCipherAlgorithm 
cipher,
         break;
     default:
         error_setg(errp, "Cipher %s not supported with essiv",
-                   qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, cipher));
+                   qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, cipher));
         return 0;
     }
 }
@@ -969,19 +961,19 @@ qcrypto_block_luks_create(QCryptoBlock *block,
         goto error;
     }
 
-    cipher_mode = qapi_enum_lookup(QCryptoCipherMode_lookup,
+    cipher_mode = qapi_enum_lookup(&QCryptoCipherMode_lookup,
                                    luks_opts.cipher_mode);
-    ivgen_alg = qapi_enum_lookup(QCryptoIVGenAlgorithm_lookup,
+    ivgen_alg = qapi_enum_lookup(&QCryptoIVGenAlgorithm_lookup,
                                  luks_opts.ivgen_alg);
     if (luks_opts.has_ivgen_hash_alg) {
-        ivgen_hash_alg = qapi_enum_lookup(QCryptoHashAlgorithm_lookup,
+        ivgen_hash_alg = qapi_enum_lookup(&QCryptoHashAlgorithm_lookup,
                                           luks_opts.ivgen_hash_alg);
         cipher_mode_spec = g_strdup_printf("%s-%s:%s", cipher_mode, ivgen_alg,
                                            ivgen_hash_alg);
     } else {
         cipher_mode_spec = g_strdup_printf("%s-%s", cipher_mode, ivgen_alg);
     }
-    hash_alg = qapi_enum_lookup(QCryptoHashAlgorithm_lookup,
+    hash_alg = qapi_enum_lookup(&QCryptoHashAlgorithm_lookup,
                                 luks_opts.hash_alg);
 
 
diff --git a/crypto/block.c b/crypto/block.c
index 2140e55426..99606fe63a 100644
--- a/crypto/block.c
+++ b/crypto/block.c
@@ -62,7 +62,7 @@ QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions 
*options,
     if (options->format >= G_N_ELEMENTS(qcrypto_block_drivers) ||
         !qcrypto_block_drivers[options->format]) {
         error_setg(errp, "Unsupported block driver %s",
-            qapi_enum_lookup(QCryptoBlockFormat_lookup, options->format));
+            qapi_enum_lookup(&QCryptoBlockFormat_lookup, options->format));
         g_free(block);
         return NULL;
     }
@@ -93,7 +93,7 @@ QCryptoBlock *qcrypto_block_create(QCryptoBlockCreateOptions 
*options,
     if (options->format >= G_N_ELEMENTS(qcrypto_block_drivers) ||
         !qcrypto_block_drivers[options->format]) {
         error_setg(errp, "Unsupported block driver %s",
-            qapi_enum_lookup(QCryptoBlockFormat_lookup, options->format));
+            qapi_enum_lookup(&QCryptoBlockFormat_lookup, options->format));
         g_free(block);
         return NULL;
     }
diff --git a/crypto/cipher-afalg.c b/crypto/cipher-afalg.c
index 24d7ba8277..f15fb2a9c8 100644
--- a/crypto/cipher-afalg.c
+++ b/crypto/cipher-afalg.c
@@ -52,7 +52,7 @@ qcrypto_afalg_cipher_format_name(QCryptoCipherAlgorithm alg,
         return NULL;
     }
 
-    mode_name = qapi_enum_lookup(QCryptoCipherMode_lookup, mode);
+    mode_name = qapi_enum_lookup(&QCryptoCipherMode_lookup, mode);
     name = g_strdup_printf("%s(%s)", mode_name, alg_name);
 
     return name;
diff --git a/crypto/cipher-builtin.c b/crypto/cipher-builtin.c
index 76c76fb05b..e956cc5a53 100644
--- a/crypto/cipher-builtin.c
+++ b/crypto/cipher-builtin.c
@@ -247,7 +247,7 @@ qcrypto_cipher_init_aes(QCryptoCipherMode mode,
         mode != QCRYPTO_CIPHER_MODE_ECB &&
         mode != QCRYPTO_CIPHER_MODE_XTS) {
         error_setg(errp, "Unsupported cipher mode %s",
-                   qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+                   qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
         return NULL;
     }
 
@@ -379,7 +379,7 @@ qcrypto_cipher_init_des_rfb(QCryptoCipherMode mode,
 
     if (mode != QCRYPTO_CIPHER_MODE_ECB) {
         error_setg(errp, "Unsupported cipher mode %s",
-                   qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+                   qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
         return NULL;
     }
 
@@ -440,7 +440,7 @@ static QCryptoCipherBuiltin 
*qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
         break;
     default:
         error_setg(errp, "Unsupported cipher mode %s",
-                   qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+                   qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
         return NULL;
     }
 
@@ -460,7 +460,7 @@ static QCryptoCipherBuiltin 
*qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
     default:
         error_setg(errp,
                    "Unsupported cipher algorithm %s",
-                   qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
+                   qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
         return NULL;
     }
 
diff --git a/crypto/cipher-gcrypt.c b/crypto/cipher-gcrypt.c
index 09210195a4..3e46ee7502 100644
--- a/crypto/cipher-gcrypt.c
+++ b/crypto/cipher-gcrypt.c
@@ -105,7 +105,7 @@ static QCryptoCipherGcrypt 
*qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
         break;
     default:
         error_setg(errp, "Unsupported cipher mode %s",
-                   qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+                   qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
         return NULL;
     }
 
@@ -160,7 +160,7 @@ static QCryptoCipherGcrypt 
*qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
 
     default:
         error_setg(errp, "Unsupported cipher algorithm %s",
-                   qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
+                   qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
         return NULL;
     }
 
diff --git a/crypto/cipher-nettle.c b/crypto/cipher-nettle.c
index 7c02b3e7a2..5e70c7984a 100644
--- a/crypto/cipher-nettle.c
+++ b/crypto/cipher-nettle.c
@@ -281,7 +281,7 @@ static QCryptoCipherNettle 
*qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
         break;
     default:
         error_setg(errp, "Unsupported cipher mode %s",
-                   qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+                   qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
         return NULL;
     }
 
@@ -420,7 +420,7 @@ static QCryptoCipherNettle 
*qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
 
     default:
         error_setg(errp, "Unsupported cipher algorithm %s",
-                   qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
+                   qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
         goto error;
     }
 
@@ -491,7 +491,7 @@ qcrypto_nettle_cipher_encrypt(QCryptoCipher *cipher,
 
     default:
         error_setg(errp, "Unsupported cipher mode %s",
-                   qapi_enum_lookup(QCryptoCipherMode_lookup, cipher->mode));
+                   qapi_enum_lookup(&QCryptoCipherMode_lookup, cipher->mode));
         return -1;
     }
     return 0;
@@ -537,7 +537,7 @@ qcrypto_nettle_cipher_decrypt(QCryptoCipher *cipher,
 
     default:
         error_setg(errp, "Unsupported cipher mode %s",
-                   qapi_enum_lookup(QCryptoCipherMode_lookup, cipher->mode));
+                   qapi_enum_lookup(&QCryptoCipherMode_lookup, cipher->mode));
         return -1;
     }
     return 0;
diff --git a/crypto/hmac-gcrypt.c b/crypto/hmac-gcrypt.c
index 0784795269..f24d5a48c2 100644
--- a/crypto/hmac-gcrypt.c
+++ b/crypto/hmac-gcrypt.c
@@ -52,7 +52,7 @@ void *qcrypto_hmac_ctx_new(QCryptoHashAlgorithm alg,
 
     if (!qcrypto_hmac_supports(alg)) {
         error_setg(errp, "Unsupported hmac algorithm %s",
-                   qapi_enum_lookup(QCryptoHashAlgorithm_lookup, alg));
+                   qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, alg));
         return NULL;
     }
 
diff --git a/crypto/hmac-glib.c b/crypto/hmac-glib.c
index 56b71dbf85..aac4b217c0 100644
--- a/crypto/hmac-glib.c
+++ b/crypto/hmac-glib.c
@@ -59,7 +59,7 @@ void *qcrypto_hmac_ctx_new(QCryptoHashAlgorithm alg,
 
     if (!qcrypto_hmac_supports(alg)) {
         error_setg(errp, "Unsupported hmac algorithm %s",
-                   qapi_enum_lookup(QCryptoHashAlgorithm_lookup, alg));
+                   qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, alg));
         return NULL;
     }
 
diff --git a/crypto/hmac-nettle.c b/crypto/hmac-nettle.c
index be43511252..07cc8af9b9 100644
--- a/crypto/hmac-nettle.c
+++ b/crypto/hmac-nettle.c
@@ -107,7 +107,7 @@ void *qcrypto_hmac_ctx_new(QCryptoHashAlgorithm alg,
 
     if (!qcrypto_hmac_supports(alg)) {
         error_setg(errp, "Unsupported hmac algorithm %s",
-                   qapi_enum_lookup(QCryptoHashAlgorithm_lookup, alg));
+                   qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, alg));
         return NULL;
     }
 
diff --git a/crypto/pbkdf-gcrypt.c b/crypto/pbkdf-gcrypt.c
index a815138c46..eff037f08f 100644
--- a/crypto/pbkdf-gcrypt.c
+++ b/crypto/pbkdf-gcrypt.c
@@ -69,7 +69,7 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,
         hash_map[hash] == GCRY_MD_NONE) {
         error_setg_errno(errp, ENOSYS,
                          "PBKDF does not support hash algorithm %s",
-                         qapi_enum_lookup(QCryptoHashAlgorithm_lookup, hash));
+                         qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, hash));
         return -1;
     }
 
diff --git a/crypto/pbkdf-nettle.c b/crypto/pbkdf-nettle.c
index 84977fdd69..bb6454b80c 100644
--- a/crypto/pbkdf-nettle.c
+++ b/crypto/pbkdf-nettle.c
@@ -110,7 +110,7 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,
     default:
         error_setg_errno(errp, ENOSYS,
                          "PBKDF does not support hash algorithm %s",
-                         qapi_enum_lookup(QCryptoHashAlgorithm_lookup, hash));
+                         qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, hash));
         return -1;
     }
     return 0;
diff --git a/crypto/secret.c b/crypto/secret.c
index 285ab7a63c..388abd7df5 100644
--- a/crypto/secret.c
+++ b/crypto/secret.c
@@ -378,7 +378,7 @@ qcrypto_secret_class_init(ObjectClass *oc, void *data)
                                    NULL);
     object_class_property_add_enum(oc, "format",
                                    "QCryptoSecretFormat",
-                                   QCryptoSecretFormat_lookup,
+                                   &QCryptoSecretFormat_lookup,
                                    qcrypto_secret_prop_get_format,
                                    qcrypto_secret_prop_set_format,
                                    NULL);
diff --git a/crypto/tlscreds.c b/crypto/tlscreds.c
index a8965531b6..3cd41035bb 100644
--- a/crypto/tlscreds.c
+++ b/crypto/tlscreds.c
@@ -233,7 +233,7 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, void *data)
                                   NULL);
     object_class_property_add_enum(oc, "endpoint",
                                    "QCryptoTLSCredsEndpoint",
-                                   QCryptoTLSCredsEndpoint_lookup,
+                                   &QCryptoTLSCredsEndpoint_lookup,
                                    qcrypto_tls_creds_prop_get_endpoint,
                                    qcrypto_tls_creds_prop_set_endpoint,
                                    NULL);
diff --git a/hmp.c b/hmp.c
index ccc58e6d88..0eb318f938 100644
--- a/hmp.c
+++ b/hmp.c
@@ -108,7 +108,7 @@ void hmp_info_status(Monitor *mon, const QDict *qdict)
 
     if (!info->running && info->status != RUN_STATE_PAUSED) {
         monitor_printf(mon, " (%s)",
-                       qapi_enum_lookup(RunState_lookup, info->status));
+                       qapi_enum_lookup(&RunState_lookup, info->status));
     }
 
     monitor_printf(mon, "\n");
@@ -173,7 +173,7 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
         monitor_printf(mon, "capabilities: ");
         for (cap = caps; cap; cap = cap->next) {
             monitor_printf(mon, "%s: %s ",
-                           qapi_enum_lookup(MigrationCapability_lookup,
+                           qapi_enum_lookup(&MigrationCapability_lookup,
                                             cap->value->capability),
                            cap->value->state ? "on" : "off");
         }
@@ -182,7 +182,7 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
 
     if (info->has_status) {
         monitor_printf(mon, "Migration status: %s",
-                       qapi_enum_lookup(MigrationStatus_lookup, info->status));
+                       qapi_enum_lookup(&MigrationStatus_lookup, 
info->status));
         if (info->status == MIGRATION_STATUS_FAILED &&
             info->has_error_desc) {
             monitor_printf(mon, " (%s)\n", info->error_desc);
@@ -280,7 +280,7 @@ void hmp_info_migrate_capabilities(Monitor *mon, const 
QDict *qdict)
     if (caps) {
         for (cap = caps; cap; cap = cap->next) {
             monitor_printf(mon, "%s: %s\n",
-                           qapi_enum_lookup(MigrationCapability_lookup,
+                           qapi_enum_lookup(&MigrationCapability_lookup,
                                             cap->value->capability),
                            cap->value->state ? "on" : "off");
         }
@@ -298,57 +298,57 @@ void hmp_info_migrate_parameters(Monitor *mon, const 
QDict *qdict)
     if (params) {
         assert(params->has_compress_level);
         monitor_printf(mon, "%s: %" PRId64 "\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_COMPRESS_LEVEL),
             params->compress_level);
         assert(params->has_compress_threads);
         monitor_printf(mon, "%s: %" PRId64 "\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_COMPRESS_THREADS),
             params->compress_threads);
         assert(params->has_decompress_threads);
         monitor_printf(mon, "%s: %" PRId64 "\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_DECOMPRESS_THREADS),
             params->decompress_threads);
         assert(params->has_cpu_throttle_initial);
         monitor_printf(mon, "%s: %" PRId64 "\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_CPU_THROTTLE_INITIAL),
             params->cpu_throttle_initial);
         assert(params->has_cpu_throttle_increment);
         monitor_printf(mon, "%s: %" PRId64 "\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT),
             params->cpu_throttle_increment);
         assert(params->has_tls_creds);
         monitor_printf(mon, "%s: '%s'\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_TLS_CREDS),
             params->tls_creds);
         assert(params->has_tls_hostname);
         monitor_printf(mon, "%s: '%s'\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_TLS_HOSTNAME),
             params->tls_hostname);
         assert(params->has_max_bandwidth);
         monitor_printf(mon, "%s: %" PRId64 " bytes/second\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_MAX_BANDWIDTH),
             params->max_bandwidth);
         assert(params->has_downtime_limit);
         monitor_printf(mon, "%s: %" PRId64 " milliseconds\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_DOWNTIME_LIMIT),
             params->downtime_limit);
         assert(params->has_x_checkpoint_delay);
         monitor_printf(mon, "%s: %" PRId64 "\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_X_CHECKPOINT_DELAY),
             params->x_checkpoint_delay);
         assert(params->has_block_incremental);
         monitor_printf(mon, "%s: %s\n",
-            qapi_enum_lookup(MigrationParameter_lookup,
+            qapi_enum_lookup(&MigrationParameter_lookup,
                              MIGRATION_PARAMETER_BLOCK_INCREMENTAL),
             params->block_incremental ? "on" : "off");
     }
@@ -446,7 +446,7 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
         }
         if (info->has_io_status && info->io_status != 
BLOCK_DEVICE_IO_STATUS_OK) {
             monitor_printf(mon, "    I/O status:       %s\n",
-                qapi_enum_lookup(BlockDeviceIoStatus_lookup, info->io_status));
+                qapi_enum_lookup(&BlockDeviceIoStatus_lookup, 
info->io_status));
         }
 
         if (info->removable) {
@@ -476,7 +476,7 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
 
     if (inserted->detect_zeroes != BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF) {
         monitor_printf(mon, "    Detect zeroes:    %s\n",
-            qapi_enum_lookup(BlockdevDetectZeroesOptions_lookup,
+            qapi_enum_lookup(&BlockdevDetectZeroesOptions_lookup,
                              inserted->detect_zeroes));
     }
 
@@ -628,7 +628,7 @@ static void hmp_info_VncBasicInfo(Monitor *mon, 
VncBasicInfo *info,
                    name,
                    info->host,
                    info->service,
-                   qapi_enum_lookup(NetworkAddressFamily_lookup, info->family),
+                   qapi_enum_lookup(&NetworkAddressFamily_lookup, 
info->family),
                    info->websocket ? " (Websocket)" : "");
 }
 
@@ -638,8 +638,8 @@ static void hmp_info_vnc_authcrypt(Monitor *mon, const char 
*indent,
                                    VncVencryptSubAuth *vencrypt)
 {
     monitor_printf(mon, "%sAuth: %s (Sub: %s)\n", indent,
-        qapi_enum_lookup(VncPrimaryAuth_lookup, auth),
-        vencrypt ? qapi_enum_lookup(VncVencryptSubAuth_lookup, *vencrypt)
+        qapi_enum_lookup(&VncPrimaryAuth_lookup, auth),
+        vencrypt ? qapi_enum_lookup(&VncVencryptSubAuth_lookup, *vencrypt)
                    : "none");
 }
 
@@ -755,7 +755,7 @@ void hmp_info_spice(Monitor *mon, const QDict *qdict)
     monitor_printf(mon, "        auth: %s\n", info->auth);
     monitor_printf(mon, "    compiled: %s\n", info->compiled_version);
     monitor_printf(mon, "  mouse-mode: %s\n",
-        qapi_enum_lookup(SpiceQueryMouseMode_lookup, info->mouse_mode));
+        qapi_enum_lookup(&SpiceQueryMouseMode_lookup, info->mouse_mode));
 
     if (!info->has_channels || info->channels == NULL) {
         monitor_printf(mon, "Channels: none\n");
@@ -1026,10 +1026,10 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict)
     for (info = info_list; info; info = info->next) {
         TPMInfo *ti = info->value;
         monitor_printf(mon, " tpm%d: model=%s\n",
-                       c, qapi_enum_lookup(TpmModel_lookup, ti->model));
+                       c, qapi_enum_lookup(&TpmModel_lookup, ti->model));
 
         monitor_printf(mon, "  \\ %s: type=%s",
-                       ti->id, qapi_enum_lookup(TpmTypeOptionsKind_lookup,
+                       ti->id, qapi_enum_lookup(&TpmTypeOptionsKind_lookup,
                                                 ti->options->type));
 
         switch (ti->options->type) {
@@ -1546,8 +1546,7 @@ void hmp_migrate_set_capability(Monitor *mon, const QDict 
*qdict)
     MigrationCapabilityStatusList *caps = g_malloc0(sizeof(*caps));
     int val;
 
-    val = qapi_enum_parse(MigrationCapability_lookup, cap,
-                          MIGRATION_CAPABILITY__MAX, -1, &err);
+    val = qapi_enum_parse(&MigrationCapability_lookup, cap, -1, &err);
     if (val < 0) {
         goto end;
     }
@@ -1576,8 +1575,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict 
*qdict)
     Error *err = NULL;
     int val, ret;
 
-    val = qapi_enum_parse(MigrationParameter_lookup, param,
-                          MIGRATION_PARAMETER__MAX,  -1, &err);
+    val = qapi_enum_parse(&MigrationParameter_lookup, param, -1, &err);
     if (val < 0) {
         goto cleanup;
     }
@@ -1752,10 +1750,8 @@ void hmp_change(Monitor *mon, const QDict *qdict)
         qmp_change("vnc", target, !!arg, arg, &err);
     } else {
         if (read_only) {
-            read_only_mode =
-                qapi_enum_parse(BlockdevChangeReadOnlyMode_lookup,
-                                read_only, BLOCKDEV_CHANGE_READ_ONLY_MODE__MAX,
-                                BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN, &err);
+            read_only_mode = 
qapi_enum_parse(&BlockdevChangeReadOnlyMode_lookup,
+                read_only, BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN, &err);
             if (err) {
                 hmp_handle_error(mon, &err);
                 return;
@@ -2386,7 +2382,7 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
         monitor_printf(mon, "  prealloc: %s\n",
                        m->value->prealloc ? "true" : "false");
         monitor_printf(mon, "  policy: %s\n",
-            qapi_enum_lookup(HostMemPolicy_lookup, m->value->policy));
+            qapi_enum_lookup(&HostMemPolicy_lookup, m->value->policy));
         visit_complete(v, &str);
         monitor_printf(mon, "  host nodes: %s\n", str);
 
@@ -2417,7 +2413,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict 
*qdict)
                 di = value->u.dimm.data;
 
                 monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
-                    qapi_enum_lookup(MemoryDeviceInfoKind_lookup, value->type),
+                    qapi_enum_lookup(&MemoryDeviceInfoKind_lookup, 
value->type),
                     di->id ? di->id : "");
                 monitor_printf(mon, "  addr: 0x%" PRIx64 "\n", di->addr);
                 monitor_printf(mon, "  slot: %" PRId64 "\n", di->slot);
@@ -2812,7 +2808,7 @@ void hmp_info_dump(Monitor *mon, const QDict *qdict)
 
     assert(result && result->status < DUMP_STATUS__MAX);
     monitor_printf(mon, "Status: %s\n",
-                   qapi_enum_lookup(DumpStatus_lookup, result->status));
+                   qapi_enum_lookup(&DumpStatus_lookup, result->status));
 
     if (result->status == DUMP_STATUS_ACTIVE) {
         float percent = 0;
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 8ebe08d1af..df35f3e1cc 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -393,10 +393,10 @@ static int pick_geometry(FDrive *drv)
             FLOPPY_DPRINTF("User requested floppy drive type '%s', "
                            "but inserted medium appears to be a "
                            "%"PRId64" sector '%s' type\n",
-                           qapi_enum_lookup(FloppyDriveType_lookup,
+                           qapi_enum_lookup(&FloppyDriveType_lookup,
                                             drv->drive),
                            nb_sectors,
-                           qapi_enum_lookup(FloppyDriveType_lookup,
+                           qapi_enum_lookup(&FloppyDriveType_lookup,
                                             parse->drive));
         }
         match = type_match;
@@ -406,7 +406,7 @@ static int pick_geometry(FDrive *drv)
     if (match == -1) {
         error_setg(&error_abort, "No candidate geometries present in table "
                    " for floppy drive type '%s'",
-                   qapi_enum_lookup(FloppyDriveType_lookup, drv->drive));
+                   qapi_enum_lookup(&FloppyDriveType_lookup, drv->drive));
     }
 
     parse = &(fd_formats[match]);
diff --git a/hw/char/escc.c b/hw/char/escc.c
index 5c1d7b0e29..d5aba2a8a4 100644
--- a/hw/char/escc.c
+++ b/hw/char/escc.c
@@ -849,7 +849,7 @@ static void sunkbd_handle_event(DeviceState *dev, 
QemuConsole *src,
     assert(evt->type == INPUT_EVENT_KIND_KEY);
     key = evt->u.key.data;
     qcode = qemu_input_key_value_to_qcode(key->key);
-    trace_escc_sunkbd_event_in(qcode, qapi_enum_lookup(QKeyCode_lookup, qcode),
+    trace_escc_sunkbd_event_in(qcode, qapi_enum_lookup(&QKeyCode_lookup, 
qcode),
                                key->down);
 
     if (qcode == Q_KEY_CODE_CAPS_LOCK) {
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index c82c693bca..ee4fc9812b 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -587,7 +587,7 @@ const PropertyInfo qdev_prop_macaddr = {
 const PropertyInfo qdev_prop_on_off_auto = {
     .name = "OnOffAuto",
     .description = "on/off/auto",
-    .enum_table = OnOffAuto_lookup,
+    .enum_table = &OnOffAuto_lookup,
     .get = get_enum,
     .set = set_enum,
     .set_default_value = set_default_value_enum,
@@ -599,7 +599,7 @@ QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
 
 const PropertyInfo qdev_prop_losttickpolicy = {
     .name  = "LostTickPolicy",
-    .enum_table  = LostTickPolicy_lookup,
+    .enum_table  = &LostTickPolicy_lookup,
     .get   = get_enum,
     .set   = set_enum,
     .set_default_value = set_default_value_enum,
@@ -613,7 +613,7 @@ const PropertyInfo qdev_prop_blockdev_on_error = {
     .name = "BlockdevOnError",
     .description = "Error handling policy, "
                    "report/ignore/enospc/stop/auto",
-    .enum_table = BlockdevOnError_lookup,
+    .enum_table = &BlockdevOnError_lookup,
     .get = get_enum,
     .set = set_enum,
     .set_default_value = set_default_value_enum,
@@ -627,7 +627,7 @@ const PropertyInfo qdev_prop_bios_chs_trans = {
     .name = "BiosAtaTranslation",
     .description = "Logical CHS translation algorithm, "
                    "auto/none/lba/large/rechs",
-    .enum_table = BiosAtaTranslation_lookup,
+    .enum_table = &BiosAtaTranslation_lookup,
     .get = get_enum,
     .set = set_enum,
     .set_default_value = set_default_value_enum,
@@ -639,7 +639,7 @@ const PropertyInfo qdev_prop_fdc_drive_type = {
     .name = "FdcDriveType",
     .description = "FDC drive type, "
                    "144/288/120/none/auto",
-    .enum_table = FloppyDriveType_lookup,
+    .enum_table = &FloppyDriveType_lookup,
     .get = get_enum,
     .set = set_enum,
     .set_default_value = set_default_value_enum,
diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
index 64039236f1..235b11082f 100644
--- a/hw/input/virtio-input-hid.c
+++ b/hw/input/virtio-input-hid.c
@@ -210,7 +210,7 @@ static void virtio_input_handle_event(DeviceState *dev, 
QemuConsole *src,
         } else {
             if (key->down) {
                 fprintf(stderr, "%s: unmapped key: %d [%s]\n", __func__,
-                        qcode, qapi_enum_lookup(QKeyCode_lookup, qcode));
+                        qcode, qapi_enum_lookup(&QKeyCode_lookup, qcode));
             }
         }
         break;
@@ -225,7 +225,7 @@ static void virtio_input_handle_event(DeviceState *dev, 
QemuConsole *src,
             if (btn->down) {
                 fprintf(stderr, "%s: unmapped button: %d [%s]\n", __func__,
                         btn->button,
-                        qapi_enum_lookup(InputButton_lookup, btn->button));
+                        qapi_enum_lookup(&InputButton_lookup, btn->button));
             }
         }
         break;
diff --git a/migration/colo-failover.c b/migration/colo-failover.c
index e5394ba631..c3dd0969d6 100644
--- a/migration/colo-failover.c
+++ b/migration/colo-failover.c
@@ -35,7 +35,7 @@ static void colo_failover_bh(void *opaque)
                                    FAILOVER_STATUS_ACTIVE);
     if (old_state != FAILOVER_STATUS_REQUIRE) {
         error_report("Unknown error for failover, old_state = %s",
-                     qapi_enum_lookup(FailoverStatus_lookup, old_state));
+                     qapi_enum_lookup(&FailoverStatus_lookup, old_state));
         return;
     }
 
@@ -65,7 +65,7 @@ FailoverStatus failover_set_state(FailoverStatus old_state,
 
     old = atomic_cmpxchg(&failover_state, old_state, new_state);
     if (old == old_state) {
-        trace_colo_failover_set_state(qapi_enum_lookup(FailoverStatus_lookup,
+        trace_colo_failover_set_state(qapi_enum_lookup(&FailoverStatus_lookup,
                                                        new_state));
     }
     return old;
diff --git a/migration/colo.c b/migration/colo.c
index 2b683a0afc..8bd7ef0531 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -63,7 +63,7 @@ static void secondary_vm_do_failover(void)
         if (old_state != FAILOVER_STATUS_ACTIVE) {
             error_report("Unknown error while do failover for secondary VM,"
                          "old_state: %s",
-                         qapi_enum_lookup(FailoverStatus_lookup, old_state));
+                         qapi_enum_lookup(&FailoverStatus_lookup, old_state));
         }
         return;
     }
@@ -94,7 +94,7 @@ static void secondary_vm_do_failover(void)
     if (old_state != FAILOVER_STATUS_ACTIVE) {
         error_report("Incorrect state (%s) while doing failover for "
                      "secondary VM",
-                     qapi_enum_lookup(FailoverStatus_lookup, old_state));
+                     qapi_enum_lookup(&FailoverStatus_lookup, old_state));
         return;
     }
     /* Notify COLO incoming thread that failover work is finished */
@@ -129,7 +129,7 @@ static void primary_vm_do_failover(void)
                                    FAILOVER_STATUS_COMPLETED);
     if (old_state != FAILOVER_STATUS_ACTIVE) {
         error_report("Incorrect state (%s) while doing failover for Primary 
VM",
-                     qapi_enum_lookup(FailoverStatus_lookup, old_state));
+                     qapi_enum_lookup(&FailoverStatus_lookup, old_state));
         return;
     }
     /* Notify COLO thread that failover work is finished */
@@ -225,7 +225,7 @@ static void colo_send_message(QEMUFile *f, COLOMessage msg,
     if (ret < 0) {
         error_setg_errno(errp, -ret, "Can't send COLO message");
     }
-    trace_colo_send_message(qapi_enum_lookup(COLOMessage_lookup, msg));
+    trace_colo_send_message(qapi_enum_lookup(&COLOMessage_lookup, msg));
 }
 
 static void colo_send_message_value(QEMUFile *f, COLOMessage msg,
@@ -245,7 +245,7 @@ static void colo_send_message_value(QEMUFile *f, 
COLOMessage msg,
     ret = qemu_file_get_error(f);
     if (ret < 0) {
         error_setg_errno(errp, -ret, "Failed to send value for message:%s",
-                         qapi_enum_lookup(COLOMessage_lookup, msg));
+                         qapi_enum_lookup(&COLOMessage_lookup, msg));
     }
 }
 
@@ -264,7 +264,7 @@ static COLOMessage colo_receive_message(QEMUFile *f, Error 
**errp)
         error_setg(errp, "%s: Invalid message", __func__);
         return msg;
     }
-    trace_colo_receive_message(qapi_enum_lookup(COLOMessage_lookup, msg));
+    trace_colo_receive_message(qapi_enum_lookup(&COLOMessage_lookup, msg));
     return msg;
 }
 
@@ -302,7 +302,7 @@ static uint64_t colo_receive_message_value(QEMUFile *f, 
uint32_t expect_msg,
     ret = qemu_file_get_error(f);
     if (ret < 0) {
         error_setg_errno(errp, -ret, "Failed to get value for COLO message: 
%s",
-                         qapi_enum_lookup(COLOMessage_lookup, expect_msg));
+                         qapi_enum_lookup(&COLOMessage_lookup, expect_msg));
     }
     return value;
 }
diff --git a/migration/global_state.c b/migration/global_state.c
index 4d57a9c5f2..486979c4cc 100644
--- a/migration/global_state.c
+++ b/migration/global_state.c
@@ -42,7 +42,7 @@ int global_state_store(void)
 
 void global_state_store_running(void)
 {
-    const char *state = qapi_enum_lookup(RunState_lookup, RUN_STATE_RUNNING);
+    const char *state = qapi_enum_lookup(&RunState_lookup, RUN_STATE_RUNNING);
     strncpy((char *)global_state.runstate,
            state, sizeof(global_state.runstate));
 }
@@ -89,8 +89,7 @@ static int global_state_post_load(void *opaque, int 
version_id)
     s->received = true;
     trace_migrate_global_state_post_load(runstate);
 
-    r = qapi_enum_parse(RunState_lookup, runstate, RUN_STATE__MAX,
-                                -1, &local_err);
+    r = qapi_enum_parse(&RunState_lookup, runstate, -1, &local_err);
 
     if (r == -1) {
         if (local_err) {
diff --git a/monitor.c b/monitor.c
index ee2fdfd4f1..228f246fcc 100644
--- a/monitor.c
+++ b/monitor.c
@@ -929,7 +929,7 @@ EventInfoList *qmp_query_events(Error **errp)
     QAPIEvent e;
 
     for (e = 0 ; e < QAPI_EVENT__MAX ; e++) {
-        const char *event_name = qapi_enum_lookup(QAPIEvent_lookup, e);
+        const char *event_name = qapi_enum_lookup(&QAPIEvent_lookup, e);
         assert(event_name != NULL);
         info = g_malloc0(sizeof(*info));
         info->value = g_malloc0(sizeof(*info->value));
@@ -3250,9 +3250,9 @@ void netdev_add_completion(ReadLineState *rs, int 
nb_args, const char *str)
     }
     len = strlen(str);
     readline_set_completion_index(rs, len);
-    for (i = 0; qapi_enum_lookup(NetClientDriver_lookup, i); i++) {
+    for (i = 0; qapi_enum_lookup(&NetClientDriver_lookup, i); i++) {
         add_completion_option(rs, str,
-                              qapi_enum_lookup(NetClientDriver_lookup, i));
+                              qapi_enum_lookup(&NetClientDriver_lookup, i));
     }
 }
 
@@ -3436,8 +3436,8 @@ void sendkey_completion(ReadLineState *rs, int nb_args, 
const char *str)
     len = strlen(str);
     readline_set_completion_index(rs, len);
     for (i = 0; i < Q_KEY_CODE__MAX; i++) {
-        if (!strncmp(str, qapi_enum_lookup(QKeyCode_lookup, i), len)) {
-            readline_add_completion(rs, qapi_enum_lookup(QKeyCode_lookup, i));
+        if (!strncmp(str, qapi_enum_lookup(&QKeyCode_lookup, i), len)) {
+            readline_add_completion(rs, qapi_enum_lookup(&QKeyCode_lookup, i));
         }
     }
 }
@@ -3539,9 +3539,9 @@ void watchdog_action_completion(ReadLineState *rs, int 
nb_args, const char *str)
         return;
     }
     readline_set_completion_index(rs, strlen(str));
-    for (i = 0; qapi_enum_lookup(WatchdogExpirationAction_lookup, i); i++) {
+    for (i = 0; qapi_enum_lookup(&WatchdogExpirationAction_lookup, i); i++) {
         add_completion_option(rs, str,
-            qapi_enum_lookup(WatchdogExpirationAction_lookup, i));
+            qapi_enum_lookup(&WatchdogExpirationAction_lookup, i));
     }
 }
 
@@ -3555,7 +3555,7 @@ void migrate_set_capability_completion(ReadLineState *rs, 
int nb_args,
     if (nb_args == 2) {
         int i;
         for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
-            const char *name = qapi_enum_lookup(MigrationCapability_lookup, i);
+            const char *name = qapi_enum_lookup(&MigrationCapability_lookup, 
i);
             if (!strncmp(str, name, len)) {
                 readline_add_completion(rs, name);
             }
@@ -3576,7 +3576,7 @@ void migrate_set_parameter_completion(ReadLineState *rs, 
int nb_args,
     if (nb_args == 2) {
         int i;
         for (i = 0; i < MIGRATION_PARAMETER__MAX; i++) {
-            const char *name = qapi_enum_lookup(MigrationParameter_lookup, i);
+            const char *name = qapi_enum_lookup(&MigrationParameter_lookup, i);
             if (!strncmp(str, name, len)) {
                 readline_add_completion(rs, name);
             }
@@ -3855,7 +3855,7 @@ static void handle_qmp_command(JSONMessageParser *parser, 
GQueue *tokens)
         qdict = qdict_get_qdict(qobject_to_qdict(rsp), "error");
         if (qdict
             && !g_strcmp0(qdict_get_try_str(qdict, "class"),
-                          qapi_enum_lookup(QapiErrorClass_lookup,
+                          qapi_enum_lookup(&QapiErrorClass_lookup,
                                            ERROR_CLASS_COMMAND_NOT_FOUND))) {
             /* Provide a more useful error message */
             qdict_del(qdict, "desc");
diff --git a/net/filter.c b/net/filter.c
index 1dfd2caa23..2fd7d7d663 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -179,7 +179,7 @@ static void netfilter_init(Object *obj)
                             netfilter_get_netdev_id, netfilter_set_netdev_id,
                             NULL);
     object_property_add_enum(obj, "queue", "NetFilterDirection",
-                             NetFilterDirection_lookup,
+                             &NetFilterDirection_lookup,
                              netfilter_get_direction, netfilter_set_direction,
                              NULL);
     object_property_add_str(obj, "status",
diff --git a/net/net.c b/net/net.c
index efe2252c59..f4b8739b0b 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1065,7 +1065,7 @@ static int net_client_init1(const void *object, bool 
is_netdev, Error **errp)
         /* FIXME drop when all init functions store an Error */
         if (errp && !*errp) {
             error_setg(errp, QERR_DEVICE_INIT_FAILED,
-                       qapi_enum_lookup(NetClientDriver_lookup, netdev->type));
+                       qapi_enum_lookup(&NetClientDriver_lookup, 
netdev->type));
         }
         return -1;
     }
@@ -1289,7 +1289,7 @@ void print_net_client(Monitor *mon, NetClientState *nc)
 
     monitor_printf(mon, "%s: index=%d,type=%s,%s\n", nc->name,
                    nc->queue_index,
-                   qapi_enum_lookup(NetClientDriver_lookup, nc->info->type),
+                   qapi_enum_lookup(&NetClientDriver_lookup, nc->info->type),
                    nc->info_str);
     if (!QTAILQ_EMPTY(&nc->filters)) {
         monitor_printf(mon, "filters:\n");
diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
index 7677caa51e..363214efb1 100644
--- a/qapi/qapi-util.c
+++ b/qapi/qapi-util.c
@@ -15,8 +15,8 @@
 #include "qemu-common.h"
 #include "qapi/util.h"
 
-int qapi_enum_parse(const char * const lookup[], const char *buf,
-                    int max, int def, Error **errp)
+int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
+                    int def, Error **errp)
 {
     int i;
 
@@ -24,8 +24,8 @@ int qapi_enum_parse(const char * const lookup[], const char 
*buf,
         return def;
     }
 
-    for (i = 0; i < max; i++) {
-        if (!strcmp(buf, lookup[i])) {
+    for (i = 0; i < lookup->size; i++) {
+        if (!g_strcmp0(buf, lookup->array[i])) {
             return i;
         }
     }
@@ -34,11 +34,12 @@ int qapi_enum_parse(const char * const lookup[], const char 
*buf,
     return def;
 }
 
-const char *qapi_enum_lookup(const char * const lookup[], int val)
+const char *qapi_enum_lookup(const QEnumLookup *lookup, int val)
 {
     assert(val >= 0);
+    assert(val < lookup->size);
 
-    return lookup[val];
+    return lookup->array[val];
 }
 
 /*
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 06f1470516..7f3302ad3c 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -119,7 +119,7 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, 
QObject *request,
 QObject *qmp_build_error_object(Error *err)
 {
     return qobject_from_jsonf("{ 'class': %s, 'desc': %s }",
-                              qapi_enum_lookup(QapiErrorClass_lookup,
+                              qapi_enum_lookup(&QapiErrorClass_lookup,
                                                error_get_class(err)),
                               error_get_pretty(err));
 }
diff --git a/qemu-img.c b/qemu-img.c
index 56ef49e214..19f1996f90 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3490,10 +3490,8 @@ static int img_resize(int argc, char **argv)
             image_opts = true;
             break;
         case OPTION_PREALLOCATION:
-            prealloc = qapi_enum_parse(PreallocMode_lookup, optarg,
-                                       PREALLOC_MODE__MAX, PREALLOC_MODE__MAX,
-                                       NULL);
-            if (prealloc == PREALLOC_MODE__MAX) {
+            prealloc = qapi_enum_parse(&PreallocMode_lookup, optarg, -1, NULL);
+            if (prealloc == -1) {
                 error_report("Invalid preallocation mode '%s'", optarg);
                 return 1;
             }
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 27164b8205..0dda0cce05 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -639,9 +639,8 @@ int main(int argc, char **argv)
             break;
         case QEMU_NBD_OPT_DETECT_ZEROES:
             detect_zeroes =
-                qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,
+                qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,
                                 optarg,
-                                BLOCKDEV_DETECT_ZEROES_OPTIONS__MAX,
                                 BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
                                 &local_err);
             if (local_err) {
diff --git a/qom/object.c b/qom/object.c
index fe6e744b4d..3e18537e9b 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1246,7 +1246,7 @@ uint64_t object_property_get_uint(Object *obj, const char 
*name,
 }
 
 typedef struct EnumProperty {
-    const char * const *strings;
+    const QEnumLookup *lookup;
     int (*get)(Object *, Error **);
     void (*set)(Object *, int, Error **);
 } EnumProperty;
@@ -1284,7 +1284,7 @@ int object_property_get_enum(Object *obj, const char 
*name,
     visit_complete(v, &str);
     visit_free(v);
     v = string_input_visitor_new(str);
-    visit_type_enum(v, name, &ret, enumprop->strings, errp);
+    visit_type_enum(v, name, &ret, enumprop->lookup, errp);
 
     g_free(str);
     visit_free(v);
@@ -1950,7 +1950,7 @@ static void property_get_enum(Object *obj, Visitor *v, 
const char *name,
         return;
     }
 
-    visit_type_enum(v, name, &value, prop->strings, errp);
+    visit_type_enum(v, name, &value, prop->lookup, errp);
 }
 
 static void property_set_enum(Object *obj, Visitor *v, const char *name,
@@ -1960,7 +1960,7 @@ static void property_set_enum(Object *obj, Visitor *v, 
const char *name,
     int value;
     Error *err = NULL;
 
-    visit_type_enum(v, name, &value, prop->strings, &err);
+    visit_type_enum(v, name, &value, prop->lookup, &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -1977,7 +1977,7 @@ static void property_release_enum(Object *obj, const char 
*name,
 
 void object_property_add_enum(Object *obj, const char *name,
                               const char *typename,
-                              const char * const *strings,
+                              const QEnumLookup *lookup,
                               int (*get)(Object *, Error **),
                               void (*set)(Object *, int, Error **),
                               Error **errp)
@@ -1985,7 +1985,7 @@ void object_property_add_enum(Object *obj, const char 
*name,
     Error *local_err = NULL;
     EnumProperty *prop = g_malloc(sizeof(*prop));
 
-    prop->strings = strings;
+    prop->lookup = lookup;
     prop->get = get;
     prop->set = set;
 
@@ -2002,7 +2002,7 @@ void object_property_add_enum(Object *obj, const char 
*name,
 
 void object_class_property_add_enum(ObjectClass *klass, const char *name,
                                     const char *typename,
-                                    const char * const *strings,
+                                    const QEnumLookup *lookup,
                                     int (*get)(Object *, Error **),
                                     void (*set)(Object *, int, Error **),
                                     Error **errp)
@@ -2010,7 +2010,7 @@ void object_class_property_add_enum(ObjectClass *klass, 
const char *name,
     Error *local_err = NULL;
     EnumProperty *prop = g_malloc(sizeof(*prop));
 
-    prop->strings = strings;
+    prop->lookup = lookup;
     prop->get = get;
     prop->set = set;
 
diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
index c51e6e734d..0ba8b55ce1 100644
--- a/tests/check-qom-proplist.c
+++ b/tests/check-qom-proplist.c
@@ -53,6 +53,11 @@ static const char *const dummy_animal_map[DUMMY_LAST + 1] = {
     [DUMMY_LAST] = NULL,
 };
 
+const QEnumLookup dummy_animal_lookup = {
+    .array = dummy_animal_map,
+    .size = DUMMY_LAST
+};
+
 struct DummyObject {
     Object parent_obj;
 
@@ -142,7 +147,7 @@ static void dummy_class_init(ObjectClass *cls, void *data)
                                   NULL);
     object_class_property_add_enum(cls, "av",
                                    "DummyAnimal",
-                                   dummy_animal_map,
+                                   &dummy_animal_lookup,
                                    dummy_get_av,
                                    dummy_set_av,
                                    NULL);
diff --git a/tests/test-qapi-util.c b/tests/test-qapi-util.c
index e8697577a5..fc9436ff94 100644
--- a/tests/test-qapi-util.c
+++ b/tests/test-qapi-util.c
@@ -20,24 +20,21 @@ static void test_qapi_enum_parse(void)
     Error *err = NULL;
     int ret;
 
-    ret = qapi_enum_parse(QType_lookup, NULL, QTYPE__MAX, QTYPE_NONE,
-                          &error_abort);
+    ret = qapi_enum_parse(&QType_lookup, NULL, QTYPE_NONE, &error_abort);
     g_assert_cmpint(ret, ==, QTYPE_NONE);
 
-    ret = qapi_enum_parse(QType_lookup, "junk", QTYPE__MAX, -1,
-                          NULL);
+    ret = qapi_enum_parse(&QType_lookup, "junk", -1, NULL);
     g_assert_cmpint(ret, ==, -1);
 
-    ret = qapi_enum_parse(QType_lookup, "junk", QTYPE__MAX, -1,
-                          &err);
+    ret = qapi_enum_parse(&QType_lookup, "junk", -1, &err);
     error_free_or_abort(&err);
 
-    ret = qapi_enum_parse(QType_lookup, "none", QTYPE__MAX, -1,
-                          &error_abort);
+    ret = qapi_enum_parse(&QType_lookup, "none", -1, &error_abort);
     g_assert_cmpint(ret, ==, QTYPE_NONE);
 
-    ret = qapi_enum_parse(QType_lookup, QType_lookup[QTYPE__MAX - 1],
-                          QTYPE__MAX, QTYPE__MAX - 1,
+    ret = qapi_enum_parse(&QType_lookup,
+                          qapi_enum_lookup(&QType_lookup, QTYPE__MAX - 1),
+                          QTYPE__MAX - 1,
                           &error_abort);
     g_assert_cmpint(ret, ==, QTYPE__MAX - 1);
 }
diff --git a/tests/test-qobject-input-visitor.c 
b/tests/test-qobject-input-visitor.c
index bdd00f6bd8..be7d7ea654 100644
--- a/tests/test-qobject-input-visitor.c
+++ b/tests/test-qobject-input-visitor.c
@@ -382,10 +382,10 @@ static void test_visitor_in_enum(TestInputVisitorData 
*data,
     Visitor *v;
     EnumOne i;
 
-    for (i = 0; EnumOne_lookup[i]; i++) {
+    for (i = 0; i < EnumOne_lookup.size; i++) {
         EnumOne res = -1;
 
-        v = visitor_input_test_init(data, "%s", EnumOne_lookup[i]);
+        v = visitor_input_test_init(data, "%s", EnumOne_lookup.array[i]);
 
         visit_type_EnumOne(v, NULL, &res, &error_abort);
         g_assert_cmpint(i, ==, res);
@@ -699,7 +699,7 @@ static void 
test_native_list_integer_helper(TestInputVisitorData *data,
         }
     }
     g_string_append_printf(gstr_union,  "{ 'type': '%s', 'data': [ %s ] }",
-                           UserDefNativeListUnionKind_lookup[kind],
+                           UserDefNativeListUnionKind_lookup.array[kind],
                            gstr_list->str);
     v = visitor_input_test_init_raw(data,  gstr_union->str);
 
@@ -1110,7 +1110,7 @@ static void 
test_visitor_in_fail_struct_missing(TestInputVisitorData *data,
     error_free_or_abort(&err);
     visit_optional(v, "optional", &present);
     g_assert(!present);
-    visit_type_enum(v, "enum", &en, EnumOne_lookup, &err);
+    visit_type_enum(v, "enum", &en, &EnumOne_lookup, &err);
     error_free_or_abort(&err);
     visit_type_int(v, "i64", &i64, &err);
     error_free_or_abort(&err);
diff --git a/tests/test-qobject-output-visitor.c 
b/tests/test-qobject-output-visitor.c
index bb2d66b666..55a8c932e0 100644
--- a/tests/test-qobject-output-visitor.c
+++ b/tests/test-qobject-output-visitor.c
@@ -135,7 +135,7 @@ static void test_visitor_out_enum(TestOutputVisitorData 
*data,
         qstr = qobject_to_qstring(visitor_get(data));
         g_assert(qstr);
         g_assert_cmpstr(qstring_get_str(qstr), ==,
-                        qapi_enum_lookup(EnumOne_lookup, i));
+                        qapi_enum_lookup(&EnumOne_lookup, i));
         visitor_reset(data);
     }
 }
diff --git a/tests/test-string-input-visitor.c 
b/tests/test-string-input-visitor.c
index 79313a7f7a..5828359830 100644
--- a/tests/test-string-input-visitor.c
+++ b/tests/test-string-input-visitor.c
@@ -279,10 +279,10 @@ static void test_visitor_in_enum(TestInputVisitorData 
*data,
     Visitor *v;
     EnumOne i;
 
-    for (i = 0; EnumOne_lookup[i]; i++) {
+    for (i = 0; i < EnumOne_lookup.size; i++) {
         EnumOne res = -1;
 
-        v = visitor_input_test_init(data, EnumOne_lookup[i]);
+        v = visitor_input_test_init(data, EnumOne_lookup.array[i]);
 
         visit_type_EnumOne(v, NULL, &res, &err);
         g_assert(!err);
diff --git a/tests/test-string-output-visitor.c 
b/tests/test-string-output-visitor.c
index 0b2087d312..a5d26ac0ca 100644
--- a/tests/test-string-output-visitor.c
+++ b/tests/test-string-output-visitor.c
@@ -196,12 +196,12 @@ static void test_visitor_out_enum(TestOutputVisitorData 
*data,
         str = visitor_get(data);
         if (data->human) {
             char *str_human =
-                g_strdup_printf("\"%s\"", qapi_enum_lookup(EnumOne_lookup, i));
+                g_strdup_printf("\"%s\"", qapi_enum_lookup(&EnumOne_lookup, 
i));
 
             g_assert_cmpstr(str, ==, str_human);
             g_free(str_human);
         } else {
-            g_assert_cmpstr(str, ==, qapi_enum_lookup(EnumOne_lookup, i));
+            g_assert_cmpstr(str, ==, qapi_enum_lookup(&EnumOne_lookup, i));
         }
         visitor_reset(data);
     }
diff --git a/tpm.c b/tpm.c
index f175661bfe..3ddd889906 100644
--- a/tpm.c
+++ b/tpm.c
@@ -63,7 +63,7 @@ static bool tpm_model_is_registered(enum TpmModel model)
 
 const TPMDriverOps *tpm_get_backend_driver(const char *type)
 {
-    int i = qapi_enum_parse(TpmType_lookup, type, TPM_TYPE__MAX, -1, NULL);
+    int i = qapi_enum_parse(&TpmType_lookup, type, -1, NULL);
 
     return i >= 0 ? be_drivers[i] : NULL;
 }
@@ -92,7 +92,7 @@ static void tpm_display_backend_drivers(void)
             continue;
         }
         fprintf(stderr, "%12s   %s\n",
-                qapi_enum_lookup(TpmType_lookup, i),
+                qapi_enum_lookup(&TpmType_lookup, i),
                 be_drivers[i]->desc());
     }
     fprintf(stderr, "\n");
diff --git a/ui/input-legacy.c b/ui/input-legacy.c
index 7159747404..c597bdc711 100644
--- a/ui/input-legacy.c
+++ b/ui/input-legacy.c
@@ -61,9 +61,9 @@ int index_from_key(const char *key, size_t key_length)
 {
     int i;
 
-    for (i = 0; QKeyCode_lookup[i] != NULL; i++) {
-        if (!strncmp(key, QKeyCode_lookup[i], key_length) &&
-            !QKeyCode_lookup[i][key_length]) {
+    for (i = 0; QKeyCode_lookup.array[i] != NULL; i++) {
+        if (!strncmp(key, QKeyCode_lookup.array[i], key_length) &&
+            !QKeyCode_lookup.array[i][key_length]) {
             break;
         }
     }
diff --git a/ui/input.c b/ui/input.c
index 6bceb6b825..dfae347154 100644
--- a/ui/input.c
+++ b/ui/input.c
@@ -152,7 +152,7 @@ void qmp_input_send_event(bool has_device, const char 
*device,
         if (!qemu_input_find_handler(1 << event->type, con)) {
             error_setg(errp, "Input handler not found for "
                              "event type %s",
-                       qapi_enum_lookup(InputEventKind_lookup, event->type));
+                       qapi_enum_lookup(&InputEventKind_lookup, event->type));
             return;
         }
     }
@@ -214,12 +214,12 @@ static void qemu_input_event_trace(QemuConsole *src, 
InputEvent *evt)
         switch (key->key->type) {
         case KEY_VALUE_KIND_NUMBER:
             qcode = qemu_input_key_number_to_qcode(key->key->u.number.data);
-            name = qapi_enum_lookup(QKeyCode_lookup, qcode);
+            name = qapi_enum_lookup(&QKeyCode_lookup, qcode);
             trace_input_event_key_number(idx, key->key->u.number.data,
                                          name, key->down);
             break;
         case KEY_VALUE_KIND_QCODE:
-            name = qapi_enum_lookup(QKeyCode_lookup, key->key->u.qcode.data);
+            name = qapi_enum_lookup(&QKeyCode_lookup, key->key->u.qcode.data);
             trace_input_event_key_qcode(idx, name, key->down);
             break;
         case KEY_VALUE_KIND__MAX:
@@ -229,17 +229,17 @@ static void qemu_input_event_trace(QemuConsole *src, 
InputEvent *evt)
         break;
     case INPUT_EVENT_KIND_BTN:
         btn = evt->u.btn.data;
-        name = qapi_enum_lookup(InputButton_lookup, btn->button);
+        name = qapi_enum_lookup(&InputButton_lookup, btn->button);
         trace_input_event_btn(idx, name, btn->down);
         break;
     case INPUT_EVENT_KIND_REL:
         move = evt->u.rel.data;
-        name = qapi_enum_lookup(InputAxis_lookup, move->axis);
+        name = qapi_enum_lookup(&InputAxis_lookup, move->axis);
         trace_input_event_rel(idx, name, move->value);
         break;
     case INPUT_EVENT_KIND_ABS:
         move = evt->u.abs.data;
-        name = qapi_enum_lookup(InputAxis_lookup, move->axis);
+        name = qapi_enum_lookup(&InputAxis_lookup, move->axis);
         trace_input_event_abs(idx, name, move->value);
         break;
     case INPUT_EVENT_KIND__MAX:
diff --git a/ui/vnc.c b/ui/vnc.c
index 20a45a7241..afe46dd8ae 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -132,7 +132,7 @@ static void vnc_init_basic_info(SocketAddress *addr,
     case SOCKET_ADDRESS_TYPE_VSOCK:
     case SOCKET_ADDRESS_TYPE_FD:
         error_setg(errp, "Unsupported socket address type %s",
-                   qapi_enum_lookup(SocketAddressType_lookup, addr->type));
+                   qapi_enum_lookup(&SocketAddressType_lookup, addr->type));
         break;
     default:
         abort();
@@ -417,7 +417,7 @@ VncInfo *qmp_query_vnc(Error **errp)
         case SOCKET_ADDRESS_TYPE_VSOCK:
         case SOCKET_ADDRESS_TYPE_FD:
             error_setg(errp, "Unsupported socket address type %s",
-                       qapi_enum_lookup(SocketAddressType_lookup, addr->type));
+                       qapi_enum_lookup(&SocketAddressType_lookup, 
addr->type));
             goto out_error;
         default:
             abort();
@@ -1840,7 +1840,7 @@ static void vnc_release_modifiers(VncState *vs)
 
 static const char *code2name(int keycode)
 {
-    return qapi_enum_lookup(QKeyCode_lookup,
+    return qapi_enum_lookup(&QKeyCode_lookup,
                             qemu_input_key_number_to_qcode(keycode));
 }
 
diff --git a/vl.c b/vl.c
index def4f5f05f..adeb6ed479 100644
--- a/vl.c
+++ b/vl.c
@@ -689,7 +689,7 @@ bool runstate_check(RunState state)
 
 bool runstate_store(char *str, size_t size)
 {
-    const char *state = qapi_enum_lookup(RunState_lookup, current_run_state);
+    const char *state = qapi_enum_lookup(&RunState_lookup, current_run_state);
     size_t len = strlen(state) + 1;
 
     if (len > size) {
@@ -722,8 +722,8 @@ void runstate_set(RunState new_state)
 
     if (!runstate_valid_transitions[current_run_state][new_state]) {
         error_report("invalid runstate transition: '%s' -> '%s'",
-                     qapi_enum_lookup(RunState_lookup, current_run_state),
-                     qapi_enum_lookup(RunState_lookup, new_state));
+                     qapi_enum_lookup(&RunState_lookup, current_run_state),
+                     qapi_enum_lookup(&RunState_lookup, new_state));
         abort();
     }
     trace_runstate_set(new_state);
-- 
2.14.1.146.gd35faa819




reply via email to

[Prev in Thread] Current Thread [Next in Thread]