diff mbox series

[v2,2/3] util: enum: Add NULL 'label' arg VIR_ENUM_IMPL calls

Message ID 892aba0a84a1a0354bfff4615b555afb99f31775.1555363505.git.crobinso@redhat.com
State New
Headers show
Series Add 'label' arg to VIR_ENUM_IMPL | expand

Commit Message

Cole Robinson April 15, 2019, 9:26 p.m. UTC
Allow passing in a 'label' string for raising errors from
ToString/FromString calls. Adjust all VIR_ENUM_IMPL calls to
pass in NULL to disable error reporting. We will add strings at
a later time.

Signed-off-by: Cole Robinson <crobinso@redhat.com>

---
 docs/apibuild.py                  |  14 ++
 src/access/viraccessperm.c        |  20 +--
 src/conf/capabilities.c           |   2 +-
 src/conf/cpu_conf.c               |  14 +-
 src/conf/device_conf.c            |   2 +-
 src/conf/domain_capabilities.c    |   2 +-
 src/conf/domain_conf.c            | 240 +++++++++++++++---------------
 src/conf/interface_conf.c         |   2 +-
 src/conf/netdev_vlan_conf.c       |   2 +-
 src/conf/network_conf.c           |  10 +-
 src/conf/node_device_conf.c       |   8 +-
 src/conf/numa_conf.c              |   6 +-
 src/conf/nwfilter_conf.c          |  14 +-
 src/conf/snapshot_conf.c          |   4 +-
 src/conf/storage_adapter_conf.c   |   2 +-
 src/conf/storage_conf.c           |  18 +--
 src/libxl/libxl_domain.c          |   2 +-
 src/locking/lock_daemon.c         |   2 +-
 src/logging/log_daemon.c          |   2 +-
 src/lxc/lxc_domain.c              |   6 +-
 src/lxc/lxc_native.c              |   2 +-
 src/network/leaseshelper.c        |   2 +-
 src/qemu/qemu_agent.c             |   4 +-
 src/qemu/qemu_capabilities.c      |   2 +-
 src/qemu/qemu_command.c           |  18 +--
 src/qemu/qemu_domain.c            |   8 +-
 src/qemu/qemu_driver.c            |   4 +-
 src/qemu/qemu_firmware.c          |   6 +-
 src/qemu/qemu_migration.c         |   2 +-
 src/qemu/qemu_migration_cookie.c  |   2 +-
 src/qemu/qemu_migration_params.c  |   6 +-
 src/qemu/qemu_monitor.c           |   8 +-
 src/qemu/qemu_monitor_json.c      |   8 +-
 src/remote/remote_daemon.c        |   2 +-
 src/util/vircgroup.c              |   2 +-
 src/util/vircgroupbackend.c       |   2 +-
 src/util/vircgroupv1.c            |   2 +-
 src/util/vircgroupv2.c            |   2 +-
 src/util/virconf.c                |   2 +-
 src/util/virenum.c                |   4 +-
 src/util/virenum.h                |   6 +-
 src/util/virerror.c               |   2 +-
 src/util/virfirewall.c            |   2 +-
 src/util/virfirewalld.c           |   4 +-
 src/util/virgic.c                 |   2 +-
 src/util/virhook.c                |  14 +-
 src/util/virkeycode.c             |   2 +-
 src/util/virlog.c                 |   2 +-
 src/util/virmdev.c                |   2 +-
 src/util/virnetdev.c              |   6 +-
 src/util/virnetdevmacvlan.c       |   2 +-
 src/util/virnetdevvportprofile.c  |   4 +-
 src/util/virpci.c                 |   6 +-
 src/util/virperf.c                |   2 +-
 src/util/virprocess.c             |   2 +-
 src/util/virresctrl.c             |   8 +-
 src/util/virsecret.c              |   2 +-
 src/util/virstorageencryption.c   |   4 +-
 src/util/virstoragefile.c         |  14 +-
 src/util/virsysinfo.c             |   2 +-
 src/util/virtypedparam.c          |   2 +-
 src/vmware/vmware_conf.c          |   2 +-
 src/vmx/vmx.c                     |   2 +-
 tools/virsh-domain-monitor.c      |  24 +--
 tools/virsh-domain.c              |  54 +++----
 tools/virsh-host.c                |   2 +-
 tools/virsh-network.c             |   8 +-
 tools/virsh-nodedev.c             |   2 +-
 tools/virsh-pool.c                |   4 +-
 tools/virsh-secret.c              |   2 +-
 tools/virsh-volume.c              |   4 +-
 tools/virt-admin.c                |   2 +-
 tools/virt-host-validate-common.c |   2 +-
 73 files changed, 336 insertions(+), 322 deletions(-)

-- 
2.21.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Comments

Peter Krempa April 16, 2019, 6:32 a.m. UTC | #1
On Mon, Apr 15, 2019 at 17:26:41 -0400, Cole Robinson wrote:
> Allow passing in a 'label' string for raising errors from

> ToString/FromString calls. Adjust all VIR_ENUM_IMPL calls to

> pass in NULL to disable error reporting. We will add strings at

> a later time.


I think that rather than changing every single VIR_ENUM_IMPL you should
rather add VIR_ENUM_IMPL_TYPE or VIR_ENUM_IMPL_MSG or something like
that which will allow to use the type string.

That way it will also be far simpler to identify the places which need
fixing.
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Michal Prívozník April 16, 2019, 9:11 a.m. UTC | #2
On 4/16/19 8:32 AM, Peter Krempa wrote:
> On Mon, Apr 15, 2019 at 17:26:41 -0400, Cole Robinson wrote:

>> Allow passing in a 'label' string for raising errors from

>> ToString/FromString calls. Adjust all VIR_ENUM_IMPL calls to

>> pass in NULL to disable error reporting. We will add strings at

>> a later time.

> 

> I think that rather than changing every single VIR_ENUM_IMPL you should

> rather add VIR_ENUM_IMPL_TYPE or VIR_ENUM_IMPL_MSG or something like

> that which will allow to use the type string.

> 

> That way it will also be far simpler to identify the places which need

> fixing.


Yes, that sounds like a better idea. For instance:

VIR_ENUM_IMPL_TYPE(virDomainVirt,
                    _("invalid domain type %s"),
                    VIR_DOMAIN_VIRT_LAST,
                    "none",
                    "qemu",
                    ...
);


Moreover, after all enums are converted then we can drop the _TYPE or 
_MSG suffix.

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Cole Robinson April 16, 2019, 4:02 p.m. UTC | #3
On 4/16/19 5:11 AM, Michal Privoznik wrote:
> On 4/16/19 8:32 AM, Peter Krempa wrote:

>> On Mon, Apr 15, 2019 at 17:26:41 -0400, Cole Robinson wrote:

>>> Allow passing in a 'label' string for raising errors from

>>> ToString/FromString calls. Adjust all VIR_ENUM_IMPL calls to

>>> pass in NULL to disable error reporting. We will add strings at

>>> a later time.

>>

>> I think that rather than changing every single VIR_ENUM_IMPL you should

>> rather add VIR_ENUM_IMPL_TYPE or VIR_ENUM_IMPL_MSG or something like

>> that which will allow to use the type string.

>>


This was the approach I took in the original RFC:

https://www.redhat.com/archives/libvir-list/2018-July/msg01815.html

I switched approaches for reasons I laid out in the last cover letter:

https://www.redhat.com/archives/libvir-list/2019-April/msg00589.html

Summary: I thought the original approach would make it more likely that
we would end up in a half converted state. Then devs would need need to
check whether use of a preexisting enum in new code is converted to
raise an error or not, increasing the likely hood we accidentally double
raise an error, or worse forget to raise an error when it's required.

The v1 approach added error strings to all labels with the intent of
turning on error reporting at a later time. Then the code would be fully
converted, and we would just need to strip out the double error
reporting which is the lesser of two evils than failing to raise an
error IMO. Dan suggested the NULL approach and incremental conversion
which is this v2.

I still prefer the v1 approach (error strings all added, then turn on
error reporting later). It will avoid the risk of new code forgetting to
raise an error, worst case is double error reporting which is not that
bad IMO. Once we turn on error reporting we can patch out
ToString/FromString errors by whole file rather than individual enum,
which will generate less patches that will be both easier to write and
easier to review (no searching around the code to see if someone missed
an enum usage). It front loads the interesting review part of
determining the string labels rather than sprinkling them over
potentially 200+ enum conversion patches.

So I'm interested in both your thoughts on all the above

>> That way it will also be far simpler to identify the places which need

>> fixing.

> 


IMO it's similar effort to identify places that need fixing: its grep of
'VIR_ENUM_IMPL_TYPE' vs 'VIR_ENUM_IMPL.*NULL'.


> Yes, that sounds like a better idea. For instance:

> 

> VIR_ENUM_IMPL_TYPE(virDomainVirt,

>                    _("invalid domain type %s"),


One of the benefits of centralizing error reporting is that we can reuse
a single translated string with a common format. Requiring translation
of every enum string is a waste IMO. And I don't think the label part
should be translatable as it is largely referencing XML element names,
or some API bit which is english only. I explained a bit more here:

https://www.redhat.com/archives/libvir-list/2019-April/msg00814.html

Thanks,
Cole

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Peter Krempa April 17, 2019, 7:29 a.m. UTC | #4
On Tue, Apr 16, 2019 at 12:02:41 -0400, Cole Robinson wrote:
> On 4/16/19 5:11 AM, Michal Privoznik wrote:

> > On 4/16/19 8:32 AM, Peter Krempa wrote:

> >> On Mon, Apr 15, 2019 at 17:26:41 -0400, Cole Robinson wrote:

> >>> Allow passing in a 'label' string for raising errors from

> >>> ToString/FromString calls. Adjust all VIR_ENUM_IMPL calls to

> >>> pass in NULL to disable error reporting. We will add strings at

> >>> a later time.

> >>

> >> I think that rather than changing every single VIR_ENUM_IMPL you should

> >> rather add VIR_ENUM_IMPL_TYPE or VIR_ENUM_IMPL_MSG or something like

> >> that which will allow to use the type string.

> >>

> 

> This was the approach I took in the original RFC:

> 

> https://www.redhat.com/archives/libvir-list/2018-July/msg01815.html

> 

> I switched approaches for reasons I laid out in the last cover letter:

> 

> https://www.redhat.com/archives/libvir-list/2019-April/msg00589.html

> 

> Summary: I thought the original approach would make it more likely that

> we would end up in a half converted state. Then devs would need need to


We will still end up in a half covered state if you don't make the
second argument mandatory and fix all callers. This way you still get a
majority of enum declarations which still pass NULL as 3/3 fixes exactly
one of them.

> check whether use of a preexisting enum in new code is converted to

> raise an error or not, increasing the likely hood we accidentally double

> raise an error, or worse forget to raise an error when it's required.


Also exactly the same is going to happen here as well. Caller of the
From/ToString function needs to check whether the second argument in
VIR_ENUM_DECL is NULL or not.

This can be avoided only by refactoring everything. Any other solution
will get forgotten eventually and stay in half finished state forever.

> The v1 approach added error strings to all labels with the intent of

> turning on error reporting at a later time. Then the code would be fully

> converted, and we would just need to strip out the double error

> reporting which is the lesser of two evils than failing to raise an

> error IMO. Dan suggested the NULL approach and incremental conversion

> which is this v2.

> 

> I still prefer the v1 approach (error strings all added, then turn on

> error reporting later). It will avoid the risk of new code forgetting to

> raise an error, worst case is double error reporting which is not that

> bad IMO. Once we turn on error reporting we can patch out

> ToString/FromString errors by whole file rather than individual enum,

> which will generate less patches that will be both easier to write and

> easier to review (no searching around the code to see if someone missed

> an enum usage). It front loads the interesting review part of

> determining the string labels rather than sprinkling them over

> potentially 200+ enum conversion patches.


There is also the problem that in some cases the pre-fabricated error
string may not be desirable. An example is virStorageType.

Due to historical reasons the storage backend for a disk is an attribute
of the <disk> xml whereas e.g. backingStore has somewhat saner design.

For <disk> we report "unknown disk type %s", for disk in side of
<snapshot> "unknown disk snapshot type" is used and for <backingStore>
and all other uses we have "unknown storage source" type.

In this case we probably could go with the last option but I can see
that there will be instances where it will not be possible.

Thus it seems that we also need "Quiet" versions of the functions so
that in case when a custom error is necessary it can be used without
double-reporting an error.
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Cole Robinson April 17, 2019, 3:56 p.m. UTC | #5
On 4/17/19 3:29 AM, Peter Krempa wrote:
> On Tue, Apr 16, 2019 at 12:02:41 -0400, Cole Robinson wrote:

>> On 4/16/19 5:11 AM, Michal Privoznik wrote:

>>> On 4/16/19 8:32 AM, Peter Krempa wrote:

>>>> On Mon, Apr 15, 2019 at 17:26:41 -0400, Cole Robinson wrote:

>>>>> Allow passing in a 'label' string for raising errors from

>>>>> ToString/FromString calls. Adjust all VIR_ENUM_IMPL calls to

>>>>> pass in NULL to disable error reporting. We will add strings at

>>>>> a later time.

>>>>

>>>> I think that rather than changing every single VIR_ENUM_IMPL you should

>>>> rather add VIR_ENUM_IMPL_TYPE or VIR_ENUM_IMPL_MSG or something like

>>>> that which will allow to use the type string.

>>>>

>>

>> This was the approach I took in the original RFC:

>>

>> https://www.redhat.com/archives/libvir-list/2018-July/msg01815.html

>>

>> I switched approaches for reasons I laid out in the last cover letter:

>>

>> https://www.redhat.com/archives/libvir-list/2019-April/msg00589.html

>>

>> Summary: I thought the original approach would make it more likely that

>> we would end up in a half converted state. Then devs would need need to

> 

> We will still end up in a half covered state if you don't make the

> second argument mandatory and fix all callers. This way you still get a

> majority of enum declarations which still pass NULL as 3/3 fixes exactly

> one of them.

> 

>> check whether use of a preexisting enum in new code is converted to

>> raise an error or not, increasing the likely hood we accidentally double

>> raise an error, or worse forget to raise an error when it's required.

> 

> Also exactly the same is going to happen here as well. Caller of the

> From/ToString function needs to check whether the second argument in

> VIR_ENUM_DECL is NULL or not.

> 

> This can be avoided only by refactoring everything. Any other solution

> will get forgotten eventually and stay in half finished state forever.

> 


I think we are in agreement then. This NULL approach has all the same
problems with the RFE approach basically, it lends itself to an
incremental approach. The main difference with this approach is that it
still gives us an easy option to splice in strings en mass if we want.

>> The v1 approach added error strings to all labels with the intent of

>> turning on error reporting at a later time. Then the code would be fully

>> converted, and we would just need to strip out the double error

>> reporting which is the lesser of two evils than failing to raise an

>> error IMO. Dan suggested the NULL approach and incremental conversion

>> which is this v2.

>>

>> I still prefer the v1 approach (error strings all added, then turn on

>> error reporting later). It will avoid the risk of new code forgetting to

>> raise an error, worst case is double error reporting which is not that

>> bad IMO. Once we turn on error reporting we can patch out

>> ToString/FromString errors by whole file rather than individual enum,

>> which will generate less patches that will be both easier to write and

>> easier to review (no searching around the code to see if someone missed

>> an enum usage). It front loads the interesting review part of

>> determining the string labels rather than sprinkling them over

>> potentially 200+ enum conversion patches.

> 

> There is also the problem that in some cases the pre-fabricated error

> string may not be desirable. An example is virStorageType.

> 

> Due to historical reasons the storage backend for a disk is an attribute

> of the <disk> xml whereas e.g. backingStore has somewhat saner design.

> 

> For <disk> we report "unknown disk type %s", for disk in side of

> <snapshot> "unknown disk snapshot type" is used and for <backingStore>

> and all other uses we have "unknown storage source" type.

> 

> In this case we probably could go with the last option but I can see

> that there will be instances where it will not be possible.

> 

> Thus it seems that we also need "Quiet" versions of the functions so

> that in case when a custom error is necessary it can be used without

> double-reporting an error.

> 


Yes I've had similar thoughts. Another major one is virTristate*, the
error reporting would give virtually no context. I figure for that case
we could implement the String functions manually, but require
virTristateTo/From callers to pass in a label field. Or maybe have
VIR_ENUM_IMPL_QUIET which generates only To/FromStringQuiet functions so
callers won't get confused.

So broadly I think the options are

- Flip the switch. Double error reporting until we remove now redundant
calls. Worse error reporting in some cases like tristate and
virstoragetype without special consideration. No or less issues with
having half converted codebase. IMO Easier to patch out the redundant
calls and easier to review the removals because we can do it per file
rather than per enum usage which might be spread across multiple files.

- Do it incrementally: will force us to consider each case individually
resulting in better overall error reporting. Until codebase is
converted, possible dev confusion and risk of new code neglecting to
raise an error. IMO the total dev and reviewer time is likely to be
significantly higher

I definitely favor 'flip the switch' mostly because I think it will get
this done the quickest, and once it's in git it distributes the load of
working out the kinks to the whole dev team. Depending on uptake the
incremental approach might never get finished, it's not clear. But
beyond that I'm not tied to any specific naming or method so I'm open to
ideas.

If consensus is to go for the incremental approach then I will support that

Thanks,
Cole

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Eric Blake April 17, 2019, 4:03 p.m. UTC | #6
On 4/17/19 10:56 AM, Cole Robinson wrote:

> 

> So broadly I think the options are

> 

> - Flip the switch. Double error reporting until we remove now redundant

> calls. Worse error reporting in some cases like tristate and

> virstoragetype without special consideration. No or less issues with

> having half converted codebase. IMO Easier to patch out the redundant

> calls and easier to review the removals because we can do it per file

> rather than per enum usage which might be spread across multiple files.

> 

> - Do it incrementally: will force us to consider each case individually

> resulting in better overall error reporting. Until codebase is

> converted, possible dev confusion and risk of new code neglecting to

> raise an error. IMO the total dev and reviewer time is likely to be

> significantly higher

> 

> I definitely favor 'flip the switch' mostly because I think it will get

> this done the quickest, and once it's in git it distributes the load of

> working out the kinks to the whole dev team. Depending on uptake the

> incremental approach might never get finished, it's not clear. But

> beyond that I'm not tied to any specific naming or method so I'm open to

> ideas.

> 

> If consensus is to go for the incremental approach then I will support that


I can live with 'flip the switch'. I know my incremental backup patches
will have to rebase to the new style, but that's true for either style
(and more a question of whether we can detect unconverted code via
compilation failure or syntax-check once the bulk of the code base is
converted).

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
diff mbox series

Patch

diff --git a/docs/apibuild.py b/docs/apibuild.py
index 9e04871220..82e103ccbc 100755
--- a/docs/apibuild.py
+++ b/docs/apibuild.py
@@ -1404,6 +1404,20 @@  class CParser:
             self.error("parsing VIR_ENUM_IMPL: expecting ','", token)
         token = self.token()
 
+        # The 'label' field
+        if (token[0] != "string" and not
+            (token[0] == "name" and token[1] == "NULL")):
+            self.error("parsing VIR_ENUM_IMPL: expecting string or NULL",
+                       token)
+        token = self.token()
+
+        if token[0] != "sep":
+            self.error("parsing VIR_ENUM_IMPL: expecting ','", token)
+
+        if token[1] != ',':
+            self.error("parsing VIR_ENUM_IMPL: expecting ','", token)
+        token = self.token()
+
         # Now the sentinel name
         if token[0] != "name":
             self.error("parsing VIR_ENUM_IMPL: expecting name", token)
diff --git a/src/access/viraccessperm.c b/src/access/viraccessperm.c
index 67f751ef9c..a2aa5406b7 100644
--- a/src/access/viraccessperm.c
+++ b/src/access/viraccessperm.c
@@ -23,7 +23,7 @@ 
 #include "viraccessperm.h"
 
 
-VIR_ENUM_IMPL(virAccessPermConnect,
+VIR_ENUM_IMPL(virAccessPermConnect, NULL,
               VIR_ACCESS_PERM_CONNECT_LAST,
               "getattr", "read", "write",
               "search_domains", "search_networks",
@@ -34,7 +34,7 @@  VIR_ENUM_IMPL(virAccessPermConnect,
               "interface_transaction",
 );
 
-VIR_ENUM_IMPL(virAccessPermDomain,
+VIR_ENUM_IMPL(virAccessPermDomain, NULL,
               VIR_ACCESS_PERM_DOMAIN_LAST,
               "getattr", "read", "write", "read_secure",
               "start", "stop", "reset",
@@ -47,44 +47,44 @@  VIR_ENUM_IMPL(virAccessPermDomain,
               "open_namespace", "set_time", "set_password",
 );
 
-VIR_ENUM_IMPL(virAccessPermInterface,
+VIR_ENUM_IMPL(virAccessPermInterface, NULL,
               VIR_ACCESS_PERM_INTERFACE_LAST,
               "getattr", "read", "write", "save",
               "delete", "start", "stop",
 );
 
-VIR_ENUM_IMPL(virAccessPermNetwork,
+VIR_ENUM_IMPL(virAccessPermNetwork, NULL,
               VIR_ACCESS_PERM_NETWORK_LAST,
               "getattr", "read", "write",
               "save", "delete", "start", "stop",
 );
 
-VIR_ENUM_IMPL(virAccessPermNodeDevice,
+VIR_ENUM_IMPL(virAccessPermNodeDevice, NULL,
               VIR_ACCESS_PERM_NODE_DEVICE_LAST,
               "getattr", "read", "write",
               "start", "stop",
               "detach",
 );
 
-VIR_ENUM_IMPL(virAccessPermNWFilter,
+VIR_ENUM_IMPL(virAccessPermNWFilter, NULL,
               VIR_ACCESS_PERM_NWFILTER_LAST,
               "getattr", "read", "write",
               "save", "delete",
 );
 
-VIR_ENUM_IMPL(virAccessPermNWFilterBinding,
+VIR_ENUM_IMPL(virAccessPermNWFilterBinding, NULL,
               VIR_ACCESS_PERM_NWFILTER_BINDING_LAST,
               "getattr", "read",
               "create", "delete",
 );
 
-VIR_ENUM_IMPL(virAccessPermSecret,
+VIR_ENUM_IMPL(virAccessPermSecret, NULL,
               VIR_ACCESS_PERM_SECRET_LAST,
               "getattr", "read", "write",
               "read_secure", "save", "delete",
 );
 
-VIR_ENUM_IMPL(virAccessPermStoragePool,
+VIR_ENUM_IMPL(virAccessPermStoragePool, NULL,
               VIR_ACCESS_PERM_STORAGE_POOL_LAST,
               "getattr", "read", "write",
               "save", "delete", "start", "stop",
@@ -92,7 +92,7 @@  VIR_ENUM_IMPL(virAccessPermStoragePool,
               "format",
 );
 
-VIR_ENUM_IMPL(virAccessPermStorageVol,
+VIR_ENUM_IMPL(virAccessPermStorageVol, NULL,
               VIR_ACCESS_PERM_STORAGE_VOL_LAST,
               "getattr", "read", "create", "delete",
               "format", "resize", "data_read",
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 1231b9727c..3eeda0832a 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -50,7 +50,7 @@ 
 VIR_LOG_INIT("conf.capabilities");
 
 VIR_ENUM_DECL(virCapsHostPMTarget);
-VIR_ENUM_IMPL(virCapsHostPMTarget,
+VIR_ENUM_IMPL(virCapsHostPMTarget, NULL,
               VIR_NODE_SUSPEND_TARGET_LAST,
               "suspend_mem", "suspend_disk", "suspend_hybrid",
 );
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index 33c8b99e49..97ab9e4ece 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -32,26 +32,26 @@ 
 
 VIR_LOG_INIT("conf.cpu_conf");
 
-VIR_ENUM_IMPL(virCPU,
+VIR_ENUM_IMPL(virCPU, NULL,
               VIR_CPU_TYPE_LAST,
               "host", "guest", "auto",
 );
 
-VIR_ENUM_IMPL(virCPUMode,
+VIR_ENUM_IMPL(virCPUMode, NULL,
               VIR_CPU_MODE_LAST,
               "custom",
               "host-model",
               "host-passthrough",
 );
 
-VIR_ENUM_IMPL(virCPUMatch,
+VIR_ENUM_IMPL(virCPUMatch, NULL,
               VIR_CPU_MATCH_LAST,
               "minimum",
               "exact",
               "strict",
 );
 
-VIR_ENUM_IMPL(virCPUCheck,
+VIR_ENUM_IMPL(virCPUCheck, NULL,
               VIR_CPU_CHECK_LAST,
               "default",
               "none",
@@ -59,13 +59,13 @@  VIR_ENUM_IMPL(virCPUCheck,
               "full",
 );
 
-VIR_ENUM_IMPL(virCPUFallback,
+VIR_ENUM_IMPL(virCPUFallback, NULL,
               VIR_CPU_FALLBACK_LAST,
               "allow",
               "forbid",
 );
 
-VIR_ENUM_IMPL(virCPUFeaturePolicy,
+VIR_ENUM_IMPL(virCPUFeaturePolicy, NULL,
               VIR_CPU_FEATURE_LAST,
               "force",
               "require",
@@ -74,7 +74,7 @@  VIR_ENUM_IMPL(virCPUFeaturePolicy,
               "forbid",
 );
 
-VIR_ENUM_IMPL(virCPUCacheMode,
+VIR_ENUM_IMPL(virCPUCacheMode, NULL,
               VIR_CPU_CACHE_MODE_LAST,
               "emulate",
               "passthrough",
diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c
index 2f82bdc2a7..c74dd003b9 100644
--- a/src/conf/device_conf.c
+++ b/src/conf/device_conf.c
@@ -31,7 +31,7 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_DEVICE
 
-VIR_ENUM_IMPL(virDomainDeviceAddress,
+VIR_ENUM_IMPL(virDomainDeviceAddress, NULL,
               VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST,
               "none",
               "pci",
diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
index 2e7e1c206b..37a540e60b 100644
--- a/src/conf/domain_capabilities.c
+++ b/src/conf/domain_capabilities.c
@@ -27,7 +27,7 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_CAPABILITIES
 
-VIR_ENUM_IMPL(virDomainCapsCPUUsable,
+VIR_ENUM_IMPL(virDomainCapsCPUUsable, NULL,
               VIR_DOMCAPS_CPU_USABLE_LAST,
               "unknown", "yes", "no",
 );
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b969a9f6e5..60b8feee0c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -89,7 +89,7 @@  struct _virDomainXMLOption {
      VIR_DOMAIN_DEF_FORMAT_INACTIVE | \
      VIR_DOMAIN_DEF_FORMAT_MIGRATABLE)
 
-VIR_ENUM_IMPL(virDomainTaint,
+VIR_ENUM_IMPL(virDomainTaint, NULL,
               VIR_DOMAIN_TAINT_LAST,
               "custom-argv",
               "custom-monitor",
@@ -104,7 +104,7 @@  VIR_ENUM_IMPL(virDomainTaint,
               "custom-ga-command",
 );
 
-VIR_ENUM_IMPL(virDomainVirt,
+VIR_ENUM_IMPL(virDomainVirt, NULL,
               VIR_DOMAIN_VIRT_LAST,
               "none",
               "qemu",
@@ -124,7 +124,7 @@  VIR_ENUM_IMPL(virDomainVirt,
               "vz",
 );
 
-VIR_ENUM_IMPL(virDomainOS,
+VIR_ENUM_IMPL(virDomainOS, NULL,
               VIR_DOMAIN_OSTYPE_LAST,
               "hvm",
               "xen",
@@ -134,7 +134,7 @@  VIR_ENUM_IMPL(virDomainOS,
               "xenpvh",
 );
 
-VIR_ENUM_IMPL(virDomainBoot,
+VIR_ENUM_IMPL(virDomainBoot, NULL,
               VIR_DOMAIN_BOOT_LAST,
               "fd",
               "cdrom",
@@ -142,7 +142,7 @@  VIR_ENUM_IMPL(virDomainBoot,
               "network",
 );
 
-VIR_ENUM_IMPL(virDomainFeature,
+VIR_ENUM_IMPL(virDomainFeature, NULL,
               VIR_DOMAIN_FEATURE_LAST,
               "acpi",
               "apic",
@@ -166,14 +166,14 @@  VIR_ENUM_IMPL(virDomainFeature,
               "msrs",
 );
 
-VIR_ENUM_IMPL(virDomainCapabilitiesPolicy,
+VIR_ENUM_IMPL(virDomainCapabilitiesPolicy, NULL,
               VIR_DOMAIN_CAPABILITIES_POLICY_LAST,
               "default",
               "allow",
               "deny",
 );
 
-VIR_ENUM_IMPL(virDomainHyperv,
+VIR_ENUM_IMPL(virDomainHyperv, NULL,
               VIR_DOMAIN_HYPERV_LAST,
               "relaxed",
               "vapic",
@@ -191,18 +191,18 @@  VIR_ENUM_IMPL(virDomainHyperv,
               "evmcs",
 );
 
-VIR_ENUM_IMPL(virDomainKVM,
+VIR_ENUM_IMPL(virDomainKVM, NULL,
               VIR_DOMAIN_KVM_LAST,
               "hidden",
 );
 
-VIR_ENUM_IMPL(virDomainMsrsUnknown,
+VIR_ENUM_IMPL(virDomainMsrsUnknown, NULL,
               VIR_DOMAIN_MSRS_UNKNOWN_LAST,
               "ignore",
               "fault",
 );
 
-VIR_ENUM_IMPL(virDomainCapsFeature,
+VIR_ENUM_IMPL(virDomainCapsFeature, NULL,
               VIR_DOMAIN_CAPS_FEATURE_LAST,
               "audit_control",
               "audit_write",
@@ -243,14 +243,14 @@  VIR_ENUM_IMPL(virDomainCapsFeature,
               "wake_alarm",
 );
 
-VIR_ENUM_IMPL(virDomainLifecycle,
+VIR_ENUM_IMPL(virDomainLifecycle, NULL,
               VIR_DOMAIN_LIFECYCLE_LAST,
               "poweroff",
               "reboot",
               "crash",
 );
 
-VIR_ENUM_IMPL(virDomainLifecycleAction,
+VIR_ENUM_IMPL(virDomainLifecycleAction, NULL,
               VIR_DOMAIN_LIFECYCLE_ACTION_LAST,
               "destroy",
               "restart",
@@ -260,7 +260,7 @@  VIR_ENUM_IMPL(virDomainLifecycleAction,
               "coredump-restart",
 );
 
-VIR_ENUM_IMPL(virDomainLockFailure,
+VIR_ENUM_IMPL(virDomainLockFailure, NULL,
               VIR_DOMAIN_LOCK_FAILURE_LAST,
               "default",
               "poweroff",
@@ -269,7 +269,7 @@  VIR_ENUM_IMPL(virDomainLockFailure,
               "ignore",
 );
 
-VIR_ENUM_IMPL(virDomainDevice,
+VIR_ENUM_IMPL(virDomainDevice, NULL,
               VIR_DOMAIN_DEVICE_LAST,
               "none",
               "disk",
@@ -298,7 +298,7 @@  VIR_ENUM_IMPL(virDomainDevice,
               "vsock",
 );
 
-VIR_ENUM_IMPL(virDomainDiskDevice,
+VIR_ENUM_IMPL(virDomainDiskDevice, NULL,
               VIR_DOMAIN_DISK_DEVICE_LAST,
               "disk",
               "cdrom",
@@ -306,7 +306,7 @@  VIR_ENUM_IMPL(virDomainDiskDevice,
               "lun",
 );
 
-VIR_ENUM_IMPL(virDomainDiskGeometryTrans,
+VIR_ENUM_IMPL(virDomainDiskGeometryTrans, NULL,
               VIR_DOMAIN_DISK_TRANS_LAST,
               "default",
               "none",
@@ -314,7 +314,7 @@  VIR_ENUM_IMPL(virDomainDiskGeometryTrans,
               "lba",
 );
 
-VIR_ENUM_IMPL(virDomainDiskBus,
+VIR_ENUM_IMPL(virDomainDiskBus, NULL,
               VIR_DOMAIN_DISK_BUS_LAST,
               "ide",
               "fdc",
@@ -327,7 +327,7 @@  VIR_ENUM_IMPL(virDomainDiskBus,
               "sd",
 );
 
-VIR_ENUM_IMPL(virDomainDiskCache,
+VIR_ENUM_IMPL(virDomainDiskCache, NULL,
               VIR_DOMAIN_DISK_CACHE_LAST,
               "default",
               "none",
@@ -337,7 +337,7 @@  VIR_ENUM_IMPL(virDomainDiskCache,
               "unsafe",
 );
 
-VIR_ENUM_IMPL(virDomainDiskErrorPolicy,
+VIR_ENUM_IMPL(virDomainDiskErrorPolicy, NULL,
               VIR_DOMAIN_DISK_ERROR_POLICY_LAST,
               "default",
               "stop",
@@ -346,21 +346,21 @@  VIR_ENUM_IMPL(virDomainDiskErrorPolicy,
               "enospace",
 );
 
-VIR_ENUM_IMPL(virDomainDiskIo,
+VIR_ENUM_IMPL(virDomainDiskIo, NULL,
               VIR_DOMAIN_DISK_IO_LAST,
               "default",
               "native",
               "threads",
 );
 
-VIR_ENUM_IMPL(virDomainDeviceSGIO,
+VIR_ENUM_IMPL(virDomainDeviceSGIO, NULL,
               VIR_DOMAIN_DEVICE_SGIO_LAST,
               "default",
               "filtered",
               "unfiltered",
 );
 
-VIR_ENUM_IMPL(virDomainController,
+VIR_ENUM_IMPL(virDomainController, NULL,
               VIR_DOMAIN_CONTROLLER_TYPE_LAST,
               "ide",
               "fdc",
@@ -373,7 +373,7 @@  VIR_ENUM_IMPL(virDomainController,
               "xenbus",
 );
 
-VIR_ENUM_IMPL(virDomainControllerModelPCI,
+VIR_ENUM_IMPL(virDomainControllerModelPCI, NULL,
               VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST,
               "pci-root",
               "pcie-root",
@@ -387,7 +387,7 @@  VIR_ENUM_IMPL(virDomainControllerModelPCI,
               "pcie-expander-bus",
 );
 
-VIR_ENUM_IMPL(virDomainControllerPCIModelName,
+VIR_ENUM_IMPL(virDomainControllerPCIModelName, NULL,
               VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_LAST,
               "none",
               "pci-bridge",
@@ -402,7 +402,7 @@  VIR_ENUM_IMPL(virDomainControllerPCIModelName,
               "pcie-pci-bridge",
 );
 
-VIR_ENUM_IMPL(virDomainControllerModelSCSI,
+VIR_ENUM_IMPL(virDomainControllerModelSCSI, NULL,
               VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST,
               "auto",
               "buslogic",
@@ -416,7 +416,7 @@  VIR_ENUM_IMPL(virDomainControllerModelSCSI,
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainControllerModelUSB,
+VIR_ENUM_IMPL(virDomainControllerModelUSB, NULL,
               VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST,
               "piix3-uhci",
               "piix4-uhci",
@@ -434,21 +434,21 @@  VIR_ENUM_IMPL(virDomainControllerModelUSB,
               "none",
 );
 
-VIR_ENUM_IMPL(virDomainControllerModelIDE,
+VIR_ENUM_IMPL(virDomainControllerModelIDE, NULL,
               VIR_DOMAIN_CONTROLLER_MODEL_IDE_LAST,
               "piix3",
               "piix4",
               "ich6",
 );
 
-VIR_ENUM_IMPL(virDomainControllerModelVirtioSerial,
+VIR_ENUM_IMPL(virDomainControllerModelVirtioSerial, NULL,
               VIR_DOMAIN_CONTROLLER_MODEL_VIRTIO_SERIAL_LAST,
               "virtio",
               "virtio-transitional",
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainFS,
+VIR_ENUM_IMPL(virDomainFS, NULL,
               VIR_DOMAIN_FS_TYPE_LAST,
               "mount",
               "block",
@@ -459,7 +459,7 @@  VIR_ENUM_IMPL(virDomainFS,
               "volume",
 );
 
-VIR_ENUM_IMPL(virDomainFSDriver,
+VIR_ENUM_IMPL(virDomainFSDriver, NULL,
               VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
               "default",
               "path",
@@ -469,20 +469,20 @@  VIR_ENUM_IMPL(virDomainFSDriver,
               "ploop",
 );
 
-VIR_ENUM_IMPL(virDomainFSAccessMode,
+VIR_ENUM_IMPL(virDomainFSAccessMode, NULL,
               VIR_DOMAIN_FS_ACCESSMODE_LAST,
               "passthrough",
               "mapped",
               "squash",
 );
 
-VIR_ENUM_IMPL(virDomainFSWrpolicy,
+VIR_ENUM_IMPL(virDomainFSWrpolicy, NULL,
               VIR_DOMAIN_FS_WRPOLICY_LAST,
               "default",
               "immediate",
 );
 
-VIR_ENUM_IMPL(virDomainFSModel,
+VIR_ENUM_IMPL(virDomainFSModel, NULL,
               VIR_DOMAIN_FS_MODEL_LAST,
               "default",
               "virtio",
@@ -490,7 +490,7 @@  VIR_ENUM_IMPL(virDomainFSModel,
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainNet,
+VIR_ENUM_IMPL(virDomainNet, NULL,
               VIR_DOMAIN_NET_TYPE_LAST,
               "user",
               "ethernet",
@@ -506,35 +506,35 @@  VIR_ENUM_IMPL(virDomainNet,
               "udp",
 );
 
-VIR_ENUM_IMPL(virDomainNetBackend,
+VIR_ENUM_IMPL(virDomainNetBackend, NULL,
               VIR_DOMAIN_NET_BACKEND_TYPE_LAST,
               "default",
               "qemu",
               "vhost",
 );
 
-VIR_ENUM_IMPL(virDomainNetVirtioTxMode,
+VIR_ENUM_IMPL(virDomainNetVirtioTxMode, NULL,
               VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST,
               "default",
               "iothread",
               "timer",
 );
 
-VIR_ENUM_IMPL(virDomainNetInterfaceLinkState,
+VIR_ENUM_IMPL(virDomainNetInterfaceLinkState, NULL,
               VIR_DOMAIN_NET_INTERFACE_LINK_STATE_LAST,
               "default",
               "up",
               "down",
 );
 
-VIR_ENUM_IMPL(virDomainChrDeviceState,
+VIR_ENUM_IMPL(virDomainChrDeviceState, NULL,
               VIR_DOMAIN_CHR_DEVICE_STATE_LAST,
               "default",
               "connected",
               "disconnected",
 );
 
-VIR_ENUM_IMPL(virDomainChrSerialTarget,
+VIR_ENUM_IMPL(virDomainChrSerialTarget, NULL,
               VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST,
               "none",
               "isa-serial",
@@ -545,7 +545,7 @@  VIR_ENUM_IMPL(virDomainChrSerialTarget,
               "sclp-serial",
 );
 
-VIR_ENUM_IMPL(virDomainChrChannelTarget,
+VIR_ENUM_IMPL(virDomainChrChannelTarget, NULL,
               VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST,
               "none",
               "guestfwd",
@@ -553,7 +553,7 @@  VIR_ENUM_IMPL(virDomainChrChannelTarget,
               "xen",
 );
 
-VIR_ENUM_IMPL(virDomainChrConsoleTarget,
+VIR_ENUM_IMPL(virDomainChrConsoleTarget, NULL,
               VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST,
               "none",
               "serial",
@@ -566,7 +566,7 @@  VIR_ENUM_IMPL(virDomainChrConsoleTarget,
               "sclplm",
 );
 
-VIR_ENUM_IMPL(virDomainChrSerialTargetModel,
+VIR_ENUM_IMPL(virDomainChrSerialTargetModel, NULL,
               VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST,
               "none",
               "isa-serial",
@@ -579,7 +579,7 @@  VIR_ENUM_IMPL(virDomainChrSerialTargetModel,
               "16550a",
 );
 
-VIR_ENUM_IMPL(virDomainChrDevice,
+VIR_ENUM_IMPL(virDomainChrDevice, NULL,
               VIR_DOMAIN_CHR_DEVICE_TYPE_LAST,
               "parallel",
               "serial",
@@ -587,7 +587,7 @@  VIR_ENUM_IMPL(virDomainChrDevice,
               "channel",
 );
 
-VIR_ENUM_IMPL(virDomainChr,
+VIR_ENUM_IMPL(virDomainChr, NULL,
               VIR_DOMAIN_CHR_TYPE_LAST,
               "null",
               "vc",
@@ -604,7 +604,7 @@  VIR_ENUM_IMPL(virDomainChr,
               "nmdm",
 );
 
-VIR_ENUM_IMPL(virDomainChrTcpProtocol,
+VIR_ENUM_IMPL(virDomainChrTcpProtocol, NULL,
               VIR_DOMAIN_CHR_TCP_PROTOCOL_LAST,
               "raw",
               "telnet",
@@ -612,28 +612,28 @@  VIR_ENUM_IMPL(virDomainChrTcpProtocol,
               "tls",
 );
 
-VIR_ENUM_IMPL(virDomainChrSpicevmc,
+VIR_ENUM_IMPL(virDomainChrSpicevmc, NULL,
               VIR_DOMAIN_CHR_SPICEVMC_LAST,
               "vdagent",
               "smartcard",
               "usbredir",
 );
 
-VIR_ENUM_IMPL(virDomainSmartcard,
+VIR_ENUM_IMPL(virDomainSmartcard, NULL,
               VIR_DOMAIN_SMARTCARD_TYPE_LAST,
               "host",
               "host-certificates",
               "passthrough",
 );
 
-VIR_ENUM_IMPL(virDomainSoundCodec,
+VIR_ENUM_IMPL(virDomainSoundCodec, NULL,
               VIR_DOMAIN_SOUND_CODEC_TYPE_LAST,
               "duplex",
               "micro",
               "output",
 );
 
-VIR_ENUM_IMPL(virDomainSoundModel,
+VIR_ENUM_IMPL(virDomainSoundModel, NULL,
               VIR_DOMAIN_SOUND_MODEL_LAST,
               "sb16",
               "es1370",
@@ -644,13 +644,13 @@  VIR_ENUM_IMPL(virDomainSoundModel,
               "usb",
 );
 
-VIR_ENUM_IMPL(virDomainKeyWrapCipherName,
+VIR_ENUM_IMPL(virDomainKeyWrapCipherName, NULL,
               VIR_DOMAIN_KEY_WRAP_CIPHER_NAME_LAST,
               "aes",
               "dea",
 );
 
-VIR_ENUM_IMPL(virDomainMemballoonModel,
+VIR_ENUM_IMPL(virDomainMemballoonModel, NULL,
               VIR_DOMAIN_MEMBALLOON_MODEL_LAST,
               "virtio",
               "xen",
@@ -659,7 +659,7 @@  VIR_ENUM_IMPL(virDomainMemballoonModel,
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainSmbiosMode,
+VIR_ENUM_IMPL(virDomainSmbiosMode, NULL,
               VIR_DOMAIN_SMBIOS_LAST,
               "none",
               "emulate",
@@ -667,14 +667,14 @@  VIR_ENUM_IMPL(virDomainSmbiosMode,
               "sysinfo",
 );
 
-VIR_ENUM_IMPL(virDomainWatchdogModel,
+VIR_ENUM_IMPL(virDomainWatchdogModel, NULL,
               VIR_DOMAIN_WATCHDOG_MODEL_LAST,
               "i6300esb",
               "ib700",
               "diag288",
 );
 
-VIR_ENUM_IMPL(virDomainWatchdogAction,
+VIR_ENUM_IMPL(virDomainWatchdogAction, NULL,
               VIR_DOMAIN_WATCHDOG_ACTION_LAST,
               "reset",
               "shutdown",
@@ -685,7 +685,7 @@  VIR_ENUM_IMPL(virDomainWatchdogAction,
               "inject-nmi",
 );
 
-VIR_ENUM_IMPL(virDomainPanicModel,
+VIR_ENUM_IMPL(virDomainPanicModel, NULL,
               VIR_DOMAIN_PANIC_MODEL_LAST,
               "default",
               "isa",
@@ -694,7 +694,7 @@  VIR_ENUM_IMPL(virDomainPanicModel,
               "s390",
 );
 
-VIR_ENUM_IMPL(virDomainVideo,
+VIR_ENUM_IMPL(virDomainVideo, NULL,
               VIR_DOMAIN_VIDEO_TYPE_LAST,
               "default",
               "vga",
@@ -709,14 +709,14 @@  VIR_ENUM_IMPL(virDomainVideo,
               "none",
 );
 
-VIR_ENUM_IMPL(virDomainVideoVGAConf,
+VIR_ENUM_IMPL(virDomainVideoVGAConf, NULL,
               VIR_DOMAIN_VIDEO_VGACONF_LAST,
               "io",
               "on",
               "off",
 );
 
-VIR_ENUM_IMPL(virDomainInput,
+VIR_ENUM_IMPL(virDomainInput, NULL,
               VIR_DOMAIN_INPUT_TYPE_LAST,
               "mouse",
               "tablet",
@@ -724,7 +724,7 @@  VIR_ENUM_IMPL(virDomainInput,
               "passthrough",
 );
 
-VIR_ENUM_IMPL(virDomainInputBus,
+VIR_ENUM_IMPL(virDomainInputBus, NULL,
               VIR_DOMAIN_INPUT_BUS_LAST,
               "ps2",
               "usb",
@@ -733,7 +733,7 @@  VIR_ENUM_IMPL(virDomainInputBus,
               "virtio",
 );
 
-VIR_ENUM_IMPL(virDomainInputModel,
+VIR_ENUM_IMPL(virDomainInputModel, NULL,
               VIR_DOMAIN_INPUT_MODEL_LAST,
               "default",
               "virtio",
@@ -741,7 +741,7 @@  VIR_ENUM_IMPL(virDomainInputModel,
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainGraphics,
+VIR_ENUM_IMPL(virDomainGraphics, NULL,
               VIR_DOMAIN_GRAPHICS_TYPE_LAST,
               "sdl",
               "vnc",
@@ -751,7 +751,7 @@  VIR_ENUM_IMPL(virDomainGraphics,
               "egl-headless",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsListen,
+VIR_ENUM_IMPL(virDomainGraphicsListen, NULL,
               VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST,
               "none",
               "address",
@@ -759,7 +759,7 @@  VIR_ENUM_IMPL(virDomainGraphicsListen,
               "socket",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsAuthConnected,
+VIR_ENUM_IMPL(virDomainGraphicsAuthConnected, NULL,
               VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_LAST,
               "default",
               "fail",
@@ -767,7 +767,7 @@  VIR_ENUM_IMPL(virDomainGraphicsAuthConnected,
               "keep",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsVNCSharePolicy,
+VIR_ENUM_IMPL(virDomainGraphicsVNCSharePolicy, NULL,
               VIR_DOMAIN_GRAPHICS_VNC_SHARE_LAST,
               "default",
               "allow-exclusive",
@@ -775,7 +775,7 @@  VIR_ENUM_IMPL(virDomainGraphicsVNCSharePolicy,
               "ignore",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsSpiceChannelName,
+VIR_ENUM_IMPL(virDomainGraphicsSpiceChannelName, NULL,
               VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST,
               "main",
               "display",
@@ -787,14 +787,14 @@  VIR_ENUM_IMPL(virDomainGraphicsSpiceChannelName,
               "usbredir",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsSpiceChannelMode,
+VIR_ENUM_IMPL(virDomainGraphicsSpiceChannelMode, NULL,
               VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_LAST,
               "any",
               "secure",
               "insecure",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsSpiceImageCompression,
+VIR_ENUM_IMPL(virDomainGraphicsSpiceImageCompression, NULL,
               VIR_DOMAIN_GRAPHICS_SPICE_IMAGE_COMPRESSION_LAST,
               "default",
               "auto_glz",
@@ -805,7 +805,7 @@  VIR_ENUM_IMPL(virDomainGraphicsSpiceImageCompression,
               "off",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsSpiceJpegCompression,
+VIR_ENUM_IMPL(virDomainGraphicsSpiceJpegCompression, NULL,
               VIR_DOMAIN_GRAPHICS_SPICE_JPEG_COMPRESSION_LAST,
               "default",
               "auto",
@@ -813,7 +813,7 @@  VIR_ENUM_IMPL(virDomainGraphicsSpiceJpegCompression,
               "always",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsSpiceZlibCompression,
+VIR_ENUM_IMPL(virDomainGraphicsSpiceZlibCompression, NULL,
               VIR_DOMAIN_GRAPHICS_SPICE_ZLIB_COMPRESSION_LAST,
               "default",
               "auto",
@@ -821,14 +821,14 @@  VIR_ENUM_IMPL(virDomainGraphicsSpiceZlibCompression,
               "always",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsSpiceMouseMode,
+VIR_ENUM_IMPL(virDomainGraphicsSpiceMouseMode, NULL,
               VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_LAST,
               "default",
               "server",
               "client",
 );
 
-VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode,
+VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode, NULL,
               VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_LAST,
               "default",
               "filter",
@@ -836,13 +836,13 @@  VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode,
               "off",
 );
 
-VIR_ENUM_IMPL(virDomainHostdevMode,
+VIR_ENUM_IMPL(virDomainHostdevMode, NULL,
               VIR_DOMAIN_HOSTDEV_MODE_LAST,
               "subsystem",
               "capabilities",
 );
 
-VIR_ENUM_IMPL(virDomainHostdevSubsys,
+VIR_ENUM_IMPL(virDomainHostdevSubsys, NULL,
               VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST,
               "usb",
               "pci",
@@ -851,7 +851,7 @@  VIR_ENUM_IMPL(virDomainHostdevSubsys,
               "mdev",
 );
 
-VIR_ENUM_IMPL(virDomainHostdevSubsysPCIBackend,
+VIR_ENUM_IMPL(virDomainHostdevSubsysPCIBackend, NULL,
               VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST,
               "default",
               "kvm",
@@ -859,19 +859,19 @@  VIR_ENUM_IMPL(virDomainHostdevSubsysPCIBackend,
               "xen",
 );
 
-VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIProtocol,
+VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIProtocol, NULL,
               VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST,
               "adapter",
               "iscsi",
 );
 
-VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIHostProtocol,
+VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIHostProtocol, NULL,
               VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_LAST,
               "none",
               "vhost",
 );
 
-VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIVHostModel,
+VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIVHostModel, NULL,
               VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_VHOST_MODEL_TYPE_LAST,
               "default",
               "virtio",
@@ -879,24 +879,24 @@  VIR_ENUM_IMPL(virDomainHostdevSubsysSCSIVHostModel,
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainHostdevCaps,
+VIR_ENUM_IMPL(virDomainHostdevCaps, NULL,
               VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST,
               "storage",
               "misc",
               "net",
 );
 
-VIR_ENUM_IMPL(virDomainHub,
+VIR_ENUM_IMPL(virDomainHub, NULL,
               VIR_DOMAIN_HUB_TYPE_LAST,
               "usb",
 );
 
-VIR_ENUM_IMPL(virDomainRedirdevBus,
+VIR_ENUM_IMPL(virDomainRedirdevBus, NULL,
               VIR_DOMAIN_REDIRDEV_BUS_LAST,
               "usb",
 );
 
-VIR_ENUM_IMPL(virDomainState,
+VIR_ENUM_IMPL(virDomainState, NULL,
               VIR_DOMAIN_LAST,
               "nostate",
               "running",
@@ -908,12 +908,12 @@  VIR_ENUM_IMPL(virDomainState,
               "pmsuspended",
 );
 
-VIR_ENUM_IMPL(virDomainNostateReason,
+VIR_ENUM_IMPL(virDomainNostateReason, NULL,
               VIR_DOMAIN_NOSTATE_LAST,
               "unknown",
 );
 
-VIR_ENUM_IMPL(virDomainRunningReason,
+VIR_ENUM_IMPL(virDomainRunningReason, NULL,
               VIR_DOMAIN_RUNNING_LAST,
               "unknown",
               "booted",
@@ -928,12 +928,12 @@  VIR_ENUM_IMPL(virDomainRunningReason,
               "post-copy",
 );
 
-VIR_ENUM_IMPL(virDomainBlockedReason,
+VIR_ENUM_IMPL(virDomainBlockedReason, NULL,
               VIR_DOMAIN_BLOCKED_LAST,
               "unknown",
 );
 
-VIR_ENUM_IMPL(virDomainPausedReason,
+VIR_ENUM_IMPL(virDomainPausedReason, NULL,
               VIR_DOMAIN_PAUSED_LAST,
               "unknown",
               "user",
@@ -951,13 +951,13 @@  VIR_ENUM_IMPL(virDomainPausedReason,
               "post-copy failed",
 );
 
-VIR_ENUM_IMPL(virDomainShutdownReason,
+VIR_ENUM_IMPL(virDomainShutdownReason, NULL,
               VIR_DOMAIN_SHUTDOWN_LAST,
               "unknown",
               "user",
 );
 
-VIR_ENUM_IMPL(virDomainShutoffReason,
+VIR_ENUM_IMPL(virDomainShutoffReason, NULL,
               VIR_DOMAIN_SHUTOFF_LAST,
               "unknown",
               "shutdown",
@@ -970,18 +970,18 @@  VIR_ENUM_IMPL(virDomainShutoffReason,
               "daemon",
 );
 
-VIR_ENUM_IMPL(virDomainCrashedReason,
+VIR_ENUM_IMPL(virDomainCrashedReason, NULL,
               VIR_DOMAIN_CRASHED_LAST,
               "unknown",
               "panicked",
 );
 
-VIR_ENUM_IMPL(virDomainPMSuspendedReason,
+VIR_ENUM_IMPL(virDomainPMSuspendedReason, NULL,
               VIR_DOMAIN_PMSUSPENDED_LAST,
               "unknown",
 );
 
-VIR_ENUM_IMPL(virDomainSeclabel,
+VIR_ENUM_IMPL(virDomainSeclabel, NULL,
               VIR_DOMAIN_SECLABEL_LAST,
               "default",
               "none",
@@ -989,7 +989,7 @@  VIR_ENUM_IMPL(virDomainSeclabel,
               "static",
 );
 
-VIR_ENUM_IMPL(virDomainClockOffset,
+VIR_ENUM_IMPL(virDomainClockOffset, NULL,
               VIR_DOMAIN_CLOCK_OFFSET_LAST,
               "utc",
               "localtime",
@@ -997,13 +997,13 @@  VIR_ENUM_IMPL(virDomainClockOffset,
               "timezone",
 );
 
-VIR_ENUM_IMPL(virDomainClockBasis,
+VIR_ENUM_IMPL(virDomainClockBasis, NULL,
               VIR_DOMAIN_CLOCK_BASIS_LAST,
               "utc",
               "localtime",
 );
 
-VIR_ENUM_IMPL(virDomainTimerName,
+VIR_ENUM_IMPL(virDomainTimerName, NULL,
               VIR_DOMAIN_TIMER_NAME_LAST,
               "platform",
               "pit",
@@ -1014,14 +1014,14 @@  VIR_ENUM_IMPL(virDomainTimerName,
               "hypervclock",
 );
 
-VIR_ENUM_IMPL(virDomainTimerTrack,
+VIR_ENUM_IMPL(virDomainTimerTrack, NULL,
               VIR_DOMAIN_TIMER_TRACK_LAST,
               "boot",
               "guest",
               "wall",
 );
 
-VIR_ENUM_IMPL(virDomainTimerTickpolicy,
+VIR_ENUM_IMPL(virDomainTimerTickpolicy, NULL,
               VIR_DOMAIN_TIMER_TICKPOLICY_LAST,
               "delay",
               "catchup",
@@ -1029,7 +1029,7 @@  VIR_ENUM_IMPL(virDomainTimerTickpolicy,
               "discard",
 );
 
-VIR_ENUM_IMPL(virDomainTimerMode,
+VIR_ENUM_IMPL(virDomainTimerMode, NULL,
               VIR_DOMAIN_TIMER_MODE_LAST,
               "auto",
               "native",
@@ -1038,7 +1038,7 @@  VIR_ENUM_IMPL(virDomainTimerMode,
               "smpsafe",
 );
 
-VIR_ENUM_IMPL(virDomainStartupPolicy,
+VIR_ENUM_IMPL(virDomainStartupPolicy, NULL,
               VIR_DOMAIN_STARTUP_POLICY_LAST,
               "default",
               "mandatory",
@@ -1046,56 +1046,56 @@  VIR_ENUM_IMPL(virDomainStartupPolicy,
               "optional",
 );
 
-VIR_ENUM_IMPL(virDomainCpuPlacementMode,
+VIR_ENUM_IMPL(virDomainCpuPlacementMode, NULL,
               VIR_DOMAIN_CPU_PLACEMENT_MODE_LAST,
               "static",
               "auto",
 );
 
-VIR_ENUM_IMPL(virDomainDiskTray,
+VIR_ENUM_IMPL(virDomainDiskTray, NULL,
               VIR_DOMAIN_DISK_TRAY_LAST,
               "closed",
               "open",
 );
 
-VIR_ENUM_IMPL(virDomainRNGModel,
+VIR_ENUM_IMPL(virDomainRNGModel, NULL,
               VIR_DOMAIN_RNG_MODEL_LAST,
               "virtio",
               "virtio-transitional",
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainRNGBackend,
+VIR_ENUM_IMPL(virDomainRNGBackend, NULL,
               VIR_DOMAIN_RNG_BACKEND_LAST,
               "random",
               "egd",
 );
 
-VIR_ENUM_IMPL(virDomainTPMModel,
+VIR_ENUM_IMPL(virDomainTPMModel, NULL,
               VIR_DOMAIN_TPM_MODEL_LAST,
               "tpm-tis",
               "tpm-crb",
 );
 
-VIR_ENUM_IMPL(virDomainTPMBackend,
+VIR_ENUM_IMPL(virDomainTPMBackend, NULL,
               VIR_DOMAIN_TPM_TYPE_LAST,
               "passthrough",
               "emulator",
 );
 
-VIR_ENUM_IMPL(virDomainTPMVersion,
+VIR_ENUM_IMPL(virDomainTPMVersion, NULL,
               VIR_DOMAIN_TPM_VERSION_LAST,
               "default",
               "1.2",
               "2.0",
 );
 
-VIR_ENUM_IMPL(virDomainIOMMUModel,
+VIR_ENUM_IMPL(virDomainIOMMUModel, NULL,
               VIR_DOMAIN_IOMMU_MODEL_LAST,
               "intel",
 );
 
-VIR_ENUM_IMPL(virDomainVsockModel,
+VIR_ENUM_IMPL(virDomainVsockModel, NULL,
               VIR_DOMAIN_VSOCK_MODEL_LAST,
               "default",
               "virtio",
@@ -1103,14 +1103,14 @@  VIR_ENUM_IMPL(virDomainVsockModel,
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainDiskDiscard,
+VIR_ENUM_IMPL(virDomainDiskDiscard, NULL,
               VIR_DOMAIN_DISK_DISCARD_LAST,
               "default",
               "unmap",
               "ignore",
 );
 
-VIR_ENUM_IMPL(virDomainDiskDetectZeroes,
+VIR_ENUM_IMPL(virDomainDiskDetectZeroes, NULL,
               VIR_DOMAIN_DISK_DETECT_ZEROES_LAST,
               "default",
               "off",
@@ -1118,7 +1118,7 @@  VIR_ENUM_IMPL(virDomainDiskDetectZeroes,
               "unmap",
 );
 
-VIR_ENUM_IMPL(virDomainDiskModel,
+VIR_ENUM_IMPL(virDomainDiskModel, NULL,
               VIR_DOMAIN_DISK_MODEL_LAST,
               "default",
               "virtio",
@@ -1126,7 +1126,7 @@  VIR_ENUM_IMPL(virDomainDiskModel,
               "virtio-non-transitional",
 );
 
-VIR_ENUM_IMPL(virDomainDiskMirrorState,
+VIR_ENUM_IMPL(virDomainDiskMirrorState, NULL,
               VIR_DOMAIN_DISK_MIRROR_STATE_LAST,
               "none",
               "yes",
@@ -1134,7 +1134,7 @@  VIR_ENUM_IMPL(virDomainDiskMirrorState,
               "pivot",
 );
 
-VIR_ENUM_IMPL(virDomainMemorySource,
+VIR_ENUM_IMPL(virDomainMemorySource, NULL,
               VIR_DOMAIN_MEMORY_SOURCE_LAST,
               "none",
               "file",
@@ -1142,28 +1142,28 @@  VIR_ENUM_IMPL(virDomainMemorySource,
               "memfd",
 );
 
-VIR_ENUM_IMPL(virDomainMemoryAllocation,
+VIR_ENUM_IMPL(virDomainMemoryAllocation, NULL,
               VIR_DOMAIN_MEMORY_ALLOCATION_LAST,
               "none",
               "immediate",
               "ondemand",
 );
 
-VIR_ENUM_IMPL(virDomainLoader,
+VIR_ENUM_IMPL(virDomainLoader, NULL,
               VIR_DOMAIN_LOADER_TYPE_LAST,
               "none",
               "rom",
               "pflash",
 );
 
-VIR_ENUM_IMPL(virDomainIOAPIC,
+VIR_ENUM_IMPL(virDomainIOAPIC, NULL,
               VIR_DOMAIN_IOAPIC_LAST,
               "none",
               "qemu",
               "kvm",
 );
 
-VIR_ENUM_IMPL(virDomainHPTResizing,
+VIR_ENUM_IMPL(virDomainHPTResizing, NULL,
               VIR_DOMAIN_HPT_RESIZING_LAST,
               "none",
               "enabled",
@@ -1171,7 +1171,7 @@  VIR_ENUM_IMPL(virDomainHPTResizing,
               "required",
 );
 
-VIR_ENUM_IMPL(virDomainOsDefFirmware,
+VIR_ENUM_IMPL(virDomainOsDefFirmware, NULL,
               VIR_DOMAIN_OS_DEF_FIRMWARE_LAST,
               "none",
               "bios",
@@ -1181,26 +1181,26 @@  VIR_ENUM_IMPL(virDomainOsDefFirmware,
 /* Internal mapping: subset of block job types that can be present in
  * <mirror> XML (remaining types are not two-phase). */
 VIR_ENUM_DECL(virDomainBlockJob);
-VIR_ENUM_IMPL(virDomainBlockJob,
+VIR_ENUM_IMPL(virDomainBlockJob, NULL,
               VIR_DOMAIN_BLOCK_JOB_TYPE_LAST,
               "", "", "copy", "", "active-commit",
 );
 
-VIR_ENUM_IMPL(virDomainMemoryModel,
+VIR_ENUM_IMPL(virDomainMemoryModel, NULL,
               VIR_DOMAIN_MEMORY_MODEL_LAST,
               "",
               "dimm",
               "nvdimm",
 );
 
-VIR_ENUM_IMPL(virDomainShmemModel,
+VIR_ENUM_IMPL(virDomainShmemModel, NULL,
               VIR_DOMAIN_SHMEM_MODEL_LAST,
               "ivshmem",
               "ivshmem-plain",
               "ivshmem-doorbell",
 );
 
-VIR_ENUM_IMPL(virDomainLaunchSecurity,
+VIR_ENUM_IMPL(virDomainLaunchSecurity, NULL,
               VIR_DOMAIN_LAUNCH_SECURITY_LAST,
               "",
               "sev",
diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
index b134ff4adc..bcaf90ed24 100644
--- a/src/conf/interface_conf.c
+++ b/src/conf/interface_conf.c
@@ -31,7 +31,7 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_INTERFACE
 
-VIR_ENUM_IMPL(virInterface,
+VIR_ENUM_IMPL(virInterface, NULL,
               VIR_INTERFACE_TYPE_LAST,
               "ethernet", "bridge", "bond", "vlan",
 );
diff --git a/src/conf/netdev_vlan_conf.c b/src/conf/netdev_vlan_conf.c
index 516129280d..28484b32cb 100644
--- a/src/conf/netdev_vlan_conf.c
+++ b/src/conf/netdev_vlan_conf.c
@@ -24,7 +24,7 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
-VIR_ENUM_IMPL(virNativeVlanMode,
+VIR_ENUM_IMPL(virNativeVlanMode, NULL,
               VIR_NATIVE_VLAN_MODE_LAST,
               "default", "tagged", "untagged",
 );
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 78bff6f687..8e1a7d3fea 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -43,32 +43,32 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_NETWORK
 
-VIR_ENUM_IMPL(virNetworkForward,
+VIR_ENUM_IMPL(virNetworkForward, NULL,
               VIR_NETWORK_FORWARD_LAST,
               "none", "nat", "route", "open",
               "bridge", "private", "vepa", "passthrough",
               "hostdev",
 );
 
-VIR_ENUM_IMPL(virNetworkBridgeMACTableManager,
+VIR_ENUM_IMPL(virNetworkBridgeMACTableManager, NULL,
               VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LAST,
               "default", "kernel", "libvirt",
 );
 
 VIR_ENUM_DECL(virNetworkForwardHostdevDevice);
-VIR_ENUM_IMPL(virNetworkForwardHostdevDevice,
+VIR_ENUM_IMPL(virNetworkForwardHostdevDevice, NULL,
               VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST,
               "none", "pci", "netdev",
 );
 
-VIR_ENUM_IMPL(virNetworkForwardDriverName,
+VIR_ENUM_IMPL(virNetworkForwardDriverName, NULL,
               VIR_NETWORK_FORWARD_DRIVER_NAME_LAST,
               "default",
               "kvm",
               "vfio",
 );
 
-VIR_ENUM_IMPL(virNetworkTaint,
+VIR_ENUM_IMPL(virNetworkTaint, NULL,
               VIR_NETWORK_TAINT_LAST,
               "hook-script",
 );
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 1db045d9ac..25708b8ccf 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -42,13 +42,13 @@ 
 
 VIR_LOG_INIT("conf.node_device_conf");
 
-VIR_ENUM_IMPL(virNodeDevDevnode,
+VIR_ENUM_IMPL(virNodeDevDevnode, NULL,
               VIR_NODE_DEV_DEVNODE_LAST,
               "dev",
               "link",
 );
 
-VIR_ENUM_IMPL(virNodeDevCap,
+VIR_ENUM_IMPL(virNodeDevCap, NULL,
               VIR_NODE_DEV_CAP_LAST,
               "system",
               "pci",
@@ -68,13 +68,13 @@  VIR_ENUM_IMPL(virNodeDevCap,
               "ccw",
 );
 
-VIR_ENUM_IMPL(virNodeDevNetCap,
+VIR_ENUM_IMPL(virNodeDevNetCap, NULL,
               VIR_NODE_DEV_CAP_NET_LAST,
               "80203",
               "80211",
 );
 
-VIR_ENUM_IMPL(virNodeDevDRM,
+VIR_ENUM_IMPL(virNodeDevDRM, NULL,
               VIR_NODE_DEV_DRM_LAST,
               "primary",
               "control",
diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index 6720d5620d..5529dde03a 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -38,21 +38,21 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_DOMAIN
 
-VIR_ENUM_IMPL(virDomainNumatuneMemMode,
+VIR_ENUM_IMPL(virDomainNumatuneMemMode, NULL,
               VIR_DOMAIN_NUMATUNE_MEM_LAST,
               "strict",
               "preferred",
               "interleave",
 );
 
-VIR_ENUM_IMPL(virDomainNumatunePlacement,
+VIR_ENUM_IMPL(virDomainNumatunePlacement, NULL,
               VIR_DOMAIN_NUMATUNE_PLACEMENT_LAST,
               "default",
               "static",
               "auto",
 );
 
-VIR_ENUM_IMPL(virDomainMemoryAccess,
+VIR_ENUM_IMPL(virDomainMemoryAccess, NULL,
               VIR_DOMAIN_MEMORY_ACCESS_LAST,
               "default",
               "shared",
diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
index cecee51d87..e8329fea6d 100644
--- a/src/conf/nwfilter_conf.c
+++ b/src/conf/nwfilter_conf.c
@@ -49,7 +49,7 @@ 
 #define VIR_FROM_THIS VIR_FROM_NWFILTER
 
 
-VIR_ENUM_IMPL(virNWFilterRuleAction,
+VIR_ENUM_IMPL(virNWFilterRuleAction, NULL,
               VIR_NWFILTER_RULE_ACTION_LAST,
               "drop",
               "accept",
@@ -58,7 +58,7 @@  VIR_ENUM_IMPL(virNWFilterRuleAction,
               "continue",
 );
 
-VIR_ENUM_IMPL(virNWFilterJumpTarget,
+VIR_ENUM_IMPL(virNWFilterJumpTarget, NULL,
               VIR_NWFILTER_RULE_ACTION_LAST,
               "DROP",
               "ACCEPT",
@@ -67,27 +67,27 @@  VIR_ENUM_IMPL(virNWFilterJumpTarget,
               "CONTINUE",
 );
 
-VIR_ENUM_IMPL(virNWFilterRuleDirection,
+VIR_ENUM_IMPL(virNWFilterRuleDirection, NULL,
               VIR_NWFILTER_RULE_DIRECTION_LAST,
               "in",
               "out",
               "inout",
 );
 
-VIR_ENUM_IMPL(virNWFilterChainPolicy,
+VIR_ENUM_IMPL(virNWFilterChainPolicy, NULL,
               VIR_NWFILTER_CHAIN_POLICY_LAST,
               "ACCEPT",
               "DROP",
 );
 
-VIR_ENUM_IMPL(virNWFilterEbtablesTable,
+VIR_ENUM_IMPL(virNWFilterEbtablesTable, NULL,
               VIR_NWFILTER_EBTABLES_TABLE_LAST,
               "filter",
               "nat",
               "broute",
 );
 
-VIR_ENUM_IMPL(virNWFilterChainSuffix,
+VIR_ENUM_IMPL(virNWFilterChainSuffix, NULL,
               VIR_NWFILTER_CHAINSUFFIX_LAST,
               "root",
               "mac",
@@ -99,7 +99,7 @@  VIR_ENUM_IMPL(virNWFilterChainSuffix,
               "ipv6",
 );
 
-VIR_ENUM_IMPL(virNWFilterRuleProtocol,
+VIR_ENUM_IMPL(virNWFilterRuleProtocol, NULL,
               VIR_NWFILTER_RULE_PROTOCOL_LAST,
               "none",
               "mac",
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index ce543cbaf7..f38dff2a06 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -51,7 +51,7 @@ 
 
 VIR_LOG_INIT("conf.snapshot_conf");
 
-VIR_ENUM_IMPL(virDomainSnapshotLocation,
+VIR_ENUM_IMPL(virDomainSnapshotLocation, NULL,
               VIR_DOMAIN_SNAPSHOT_LOCATION_LAST,
               "default",
               "no",
@@ -60,7 +60,7 @@  VIR_ENUM_IMPL(virDomainSnapshotLocation,
 );
 
 /* virDomainSnapshotState is really virDomainState plus one extra state */
-VIR_ENUM_IMPL(virDomainSnapshotState,
+VIR_ENUM_IMPL(virDomainSnapshotState, NULL,
               VIR_DOMAIN_SNAPSHOT_LAST,
               "nostate",
               "running",
diff --git a/src/conf/storage_adapter_conf.c b/src/conf/storage_adapter_conf.c
index 18bcb5eb9e..9673a58db0 100644
--- a/src/conf/storage_adapter_conf.c
+++ b/src/conf/storage_adapter_conf.c
@@ -32,7 +32,7 @@ 
 
 VIR_LOG_INIT("conf.storage_adapter_conf");
 
-VIR_ENUM_IMPL(virStorageAdapter,
+VIR_ENUM_IMPL(virStorageAdapter, NULL,
               VIR_STORAGE_ADAPTER_TYPE_LAST,
               "default", "scsi_host", "fc_host",
 );
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 3ae0d7ab77..23fbd9f31c 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -47,13 +47,13 @@ 
 
 VIR_LOG_INIT("conf.storage_conf");
 
-VIR_ENUM_IMPL(virStorageVol,
+VIR_ENUM_IMPL(virStorageVol, NULL,
               VIR_STORAGE_VOL_LAST,
               "file", "block", "dir", "network",
               "netdir", "ploop",
 );
 
-VIR_ENUM_IMPL(virStoragePool,
+VIR_ENUM_IMPL(virStoragePool, NULL,
               VIR_STORAGE_POOL_LAST,
               "dir", "fs", "netfs",
               "logical", "disk", "iscsi",
@@ -62,31 +62,31 @@  VIR_ENUM_IMPL(virStoragePool,
               "zfs", "vstorage",
 );
 
-VIR_ENUM_IMPL(virStoragePoolFormatFileSystem,
+VIR_ENUM_IMPL(virStoragePoolFormatFileSystem, NULL,
               VIR_STORAGE_POOL_FS_LAST,
               "auto", "ext2", "ext3",
               "ext4", "ufs", "iso9660", "udf",
               "gfs", "gfs2", "vfat", "hfs+", "xfs", "ocfs2",
 );
 
-VIR_ENUM_IMPL(virStoragePoolFormatFileSystemNet,
+VIR_ENUM_IMPL(virStoragePoolFormatFileSystemNet, NULL,
               VIR_STORAGE_POOL_NETFS_LAST,
               "auto", "nfs", "glusterfs", "cifs",
 );
 
-VIR_ENUM_IMPL(virStoragePoolFormatDisk,
+VIR_ENUM_IMPL(virStoragePoolFormatDisk, NULL,
               VIR_STORAGE_POOL_DISK_LAST,
               "unknown", "dos", "dvh", "gpt",
               "mac", "bsd", "pc98", "sun", "lvm2",
 );
 
-VIR_ENUM_IMPL(virStoragePoolFormatLogical,
+VIR_ENUM_IMPL(virStoragePoolFormatLogical, NULL,
               VIR_STORAGE_POOL_LOGICAL_LAST,
               "unknown", "lvm2",
 );
 
 
-VIR_ENUM_IMPL(virStorageVolFormatDisk,
+VIR_ENUM_IMPL(virStorageVolFormatDisk, NULL,
               VIR_STORAGE_VOL_DISK_LAST,
               "none", "linux", "fat16",
               "fat32", "linux-swap",
@@ -94,12 +94,12 @@  VIR_ENUM_IMPL(virStorageVolFormatDisk,
               "extended",
 );
 
-VIR_ENUM_IMPL(virStorageVolDefRefreshAllocation,
+VIR_ENUM_IMPL(virStorageVolDefRefreshAllocation, NULL,
               VIR_STORAGE_VOL_DEF_REFRESH_ALLOCATION_LAST,
               "default", "capacity",
 );
 
-VIR_ENUM_IMPL(virStoragePartedFs,
+VIR_ENUM_IMPL(virStoragePartedFs, NULL,
               VIR_STORAGE_PARTED_FS_TYPE_LAST,
               "ext2", "ext2", "fat16",
               "fat32", "linux-swap",
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index 6e4bf68921..a52d8ed5ce 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -40,7 +40,7 @@ 
 
 VIR_LOG_INIT("libxl.libxl_domain");
 
-VIR_ENUM_IMPL(libxlDomainJob,
+VIR_ENUM_IMPL(libxlDomainJob, NULL,
               LIBXL_JOB_LAST,
               "none",
               "query",
diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
index d714ddd2dd..0bcdb75c4a 100644
--- a/src/locking/lock_daemon.c
+++ b/src/locking/lock_daemon.c
@@ -85,7 +85,7 @@  enum {
 };
 
 VIR_ENUM_DECL(virDaemonErr);
-VIR_ENUM_IMPL(virDaemonErr,
+VIR_ENUM_IMPL(virDaemonErr, NULL,
               VIR_LOCK_DAEMON_ERR_LAST,
               "Initialization successful",
               "Unable to obtain pidfile",
diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c
index 3469d87caa..fff186db36 100644
--- a/src/logging/log_daemon.c
+++ b/src/logging/log_daemon.c
@@ -81,7 +81,7 @@  enum {
 };
 
 VIR_ENUM_DECL(virDaemonErr);
-VIR_ENUM_IMPL(virDaemonErr,
+VIR_ENUM_IMPL(virDaemonErr, NULL,
               VIR_LOG_DAEMON_ERR_LAST,
               "Initialization successful",
               "Unable to obtain pidfile",
diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c
index 51a9fd36eb..ea08bc2427 100644
--- a/src/lxc/lxc_domain.c
+++ b/src/lxc/lxc_domain.c
@@ -37,7 +37,7 @@ 
 #define VIR_FROM_THIS VIR_FROM_LXC
 #define LXC_NAMESPACE_HREF "http://libvirt.org/schemas/domain/lxc/1.0"
 
-VIR_ENUM_IMPL(virLXCDomainJob,
+VIR_ENUM_IMPL(virLXCDomainJob, NULL,
               LXC_JOB_LAST,
               "none",
               "query",
@@ -181,14 +181,14 @@  virLXCDomainObjPrivateFree(void *data)
 
 
 
-VIR_ENUM_IMPL(virLXCDomainNamespace,
+VIR_ENUM_IMPL(virLXCDomainNamespace, NULL,
               VIR_LXC_DOMAIN_NAMESPACE_LAST,
               "sharenet",
               "shareipc",
               "shareuts",
 );
 
-VIR_ENUM_IMPL(virLXCDomainNamespaceSource,
+VIR_ENUM_IMPL(virLXCDomainNamespaceSource, NULL,
               VIR_LXC_DOMAIN_NAMESPACE_SOURCE_LAST,
               "none",
               "name",
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index b4c6e790d8..766ca3d3de 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -35,7 +35,7 @@ 
 
 VIR_LOG_INIT("lxc.lxc_native");
 
-VIR_ENUM_IMPL(virLXCNetworkConfigEntry,
+VIR_ENUM_IMPL(virLXCNetworkConfigEntry, NULL,
               VIR_LXC_NETWORK_CONFIG_LAST,
               "name",
               "type",
diff --git a/src/network/leaseshelper.c b/src/network/leaseshelper.c
index 89d9a003e2..c2ffa06cf1 100644
--- a/src/network/leaseshelper.c
+++ b/src/network/leaseshelper.c
@@ -73,7 +73,7 @@  enum virLeaseActionFlags {
 
 VIR_ENUM_DECL(virLeaseAction);
 
-VIR_ENUM_IMPL(virLeaseAction,
+VIR_ENUM_IMPL(virLeaseAction, NULL,
               VIR_LEASE_ACTION_LAST,
               "add", "old", "del", "init",
 );
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index 361db299a5..9a3f09718d 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -1215,7 +1215,7 @@  void qemuAgentNotifyEvent(qemuAgentPtr mon,
 
 VIR_ENUM_DECL(qemuAgentShutdownMode);
 
-VIR_ENUM_IMPL(qemuAgentShutdownMode,
+VIR_ENUM_IMPL(qemuAgentShutdownMode, NULL,
               QEMU_AGENT_SHUTDOWN_LAST,
               "powerdown", "reboot", "halt",
 );
@@ -1335,7 +1335,7 @@  int qemuAgentFSThaw(qemuAgentPtr mon)
 
 VIR_ENUM_DECL(qemuAgentSuspendMode);
 
-VIR_ENUM_IMPL(qemuAgentSuspendMode,
+VIR_ENUM_IMPL(qemuAgentSuspendMode, NULL,
               VIR_NODE_SUSPEND_TARGET_LAST,
               "guest-suspend-ram",
               "guest-suspend-disk",
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index f8ea66b577..9eb5e418cc 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -63,7 +63,7 @@  VIR_LOG_INIT("qemu.qemu_capabilities");
  * are used in domain status files which are read on
  * daemon restarts
  */
-VIR_ENUM_IMPL(virQEMUCaps,
+VIR_ENUM_IMPL(virQEMUCaps, NULL,
               QEMU_CAPS_LAST, /* virQEMUCaps grouping marker */
               /* 0 */
               "vnc-colon",
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 2acc0b56ea..3b4e99e865 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -72,7 +72,7 @@ 
 VIR_LOG_INIT("qemu.qemu_command");
 
 VIR_ENUM_DECL(virDomainDiskQEMUBus);
-VIR_ENUM_IMPL(virDomainDiskQEMUBus,
+VIR_ENUM_IMPL(virDomainDiskQEMUBus, NULL,
               VIR_DOMAIN_DISK_BUS_LAST,
               "ide",
               "floppy",
@@ -88,7 +88,7 @@  VIR_ENUM_IMPL(virDomainDiskQEMUBus,
 
 VIR_ENUM_DECL(qemuDiskCacheV2);
 
-VIR_ENUM_IMPL(qemuDiskCacheV2,
+VIR_ENUM_IMPL(qemuDiskCacheV2, NULL,
               VIR_DOMAIN_DISK_CACHE_LAST,
               "default",
               "none",
@@ -98,7 +98,7 @@  VIR_ENUM_IMPL(qemuDiskCacheV2,
               "unsafe",
 );
 
-VIR_ENUM_IMPL(qemuVideo,
+VIR_ENUM_IMPL(qemuVideo, NULL,
               VIR_DOMAIN_VIDEO_TYPE_LAST,
               "", /* default value, we shouldn't see this */
               "std",
@@ -115,7 +115,7 @@  VIR_ENUM_IMPL(qemuVideo,
 
 VIR_ENUM_DECL(qemuDeviceVideo);
 
-VIR_ENUM_IMPL(qemuDeviceVideo,
+VIR_ENUM_IMPL(qemuDeviceVideo, NULL,
               VIR_DOMAIN_VIDEO_TYPE_LAST,
               "", /* default value, we shouldn't see this */
               "VGA",
@@ -132,7 +132,7 @@  VIR_ENUM_IMPL(qemuDeviceVideo,
 
 VIR_ENUM_DECL(qemuDeviceVideoSecondary);
 
-VIR_ENUM_IMPL(qemuDeviceVideoSecondary,
+VIR_ENUM_IMPL(qemuDeviceVideoSecondary, NULL,
               VIR_DOMAIN_VIDEO_TYPE_LAST,
               "", /* default value, we shouldn't see this */
               "", /* no secondary device for VGA */
@@ -149,7 +149,7 @@  VIR_ENUM_IMPL(qemuDeviceVideoSecondary,
 
 VIR_ENUM_DECL(qemuSoundCodec);
 
-VIR_ENUM_IMPL(qemuSoundCodec,
+VIR_ENUM_IMPL(qemuSoundCodec, NULL,
               VIR_DOMAIN_SOUND_CODEC_TYPE_LAST,
               "hda-duplex",
               "hda-micro",
@@ -158,7 +158,7 @@  VIR_ENUM_IMPL(qemuSoundCodec,
 
 VIR_ENUM_DECL(qemuControllerModelUSB);
 
-VIR_ENUM_IMPL(qemuControllerModelUSB,
+VIR_ENUM_IMPL(qemuControllerModelUSB, NULL,
               VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST,
               "piix3-usb-uhci",
               "piix4-usb-uhci",
@@ -177,7 +177,7 @@  VIR_ENUM_IMPL(qemuControllerModelUSB,
 );
 
 VIR_ENUM_DECL(qemuDomainFSDriver);
-VIR_ENUM_IMPL(qemuDomainFSDriver,
+VIR_ENUM_IMPL(qemuDomainFSDriver, NULL,
               VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
               "local",
               "local",
@@ -188,7 +188,7 @@  VIR_ENUM_IMPL(qemuDomainFSDriver,
 );
 
 VIR_ENUM_DECL(qemuNumaPolicy);
-VIR_ENUM_IMPL(qemuNumaPolicy,
+VIR_ENUM_IMPL(qemuNumaPolicy, NULL,
               VIR_DOMAIN_NUMATUNE_MEM_LAST,
               "bind",
               "preferred",
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 38fa16bc5f..c42869a289 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -80,7 +80,7 @@  VIR_LOG_INIT("qemu.qemu_domain");
 
 #define QEMU_NAMESPACE_HREF "http://libvirt.org/schemas/domain/qemu/1.0"
 
-VIR_ENUM_IMPL(qemuDomainJob,
+VIR_ENUM_IMPL(qemuDomainJob, NULL,
               QEMU_JOB_LAST,
               "none",
               "query",
@@ -93,14 +93,14 @@  VIR_ENUM_IMPL(qemuDomainJob,
               "async nested",
 );
 
-VIR_ENUM_IMPL(qemuDomainAgentJob,
+VIR_ENUM_IMPL(qemuDomainAgentJob, NULL,
               QEMU_AGENT_JOB_LAST,
               "none",
               "query",
               "modify",
 );
 
-VIR_ENUM_IMPL(qemuDomainAsyncJob,
+VIR_ENUM_IMPL(qemuDomainAsyncJob, NULL,
               QEMU_ASYNC_JOB_LAST,
               "none",
               "migration out",
@@ -111,7 +111,7 @@  VIR_ENUM_IMPL(qemuDomainAsyncJob,
               "start",
 );
 
-VIR_ENUM_IMPL(qemuDomainNamespace,
+VIR_ENUM_IMPL(qemuDomainNamespace, NULL,
               QEMU_DOMAIN_NS_LAST,
               "mount",
 );
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4510b0ce60..0bde8a39aa 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2708,7 +2708,7 @@  typedef enum {
 } virQEMUSaveFormat;
 
 VIR_ENUM_DECL(qemuSaveCompression);
-VIR_ENUM_IMPL(qemuSaveCompression,
+VIR_ENUM_IMPL(qemuSaveCompression, NULL,
               QEMU_SAVE_FORMAT_LAST,
               "raw",
               "gzip",
@@ -2718,7 +2718,7 @@  VIR_ENUM_IMPL(qemuSaveCompression,
 );
 
 VIR_ENUM_DECL(qemuDumpFormat);
-VIR_ENUM_IMPL(qemuDumpFormat,
+VIR_ENUM_IMPL(qemuDumpFormat, NULL,
               VIR_DOMAIN_CORE_DUMP_FORMAT_LAST,
               "elf",
               "kdump-zlib",
diff --git a/src/qemu/qemu_firmware.c b/src/qemu/qemu_firmware.c
index f3d89d000d..4e0c2bbbae 100644
--- a/src/qemu/qemu_firmware.c
+++ b/src/qemu/qemu_firmware.c
@@ -52,7 +52,7 @@  typedef enum {
 } qemuFirmwareOSInterface;
 
 VIR_ENUM_DECL(qemuFirmwareOSInterface);
-VIR_ENUM_IMPL(qemuFirmwareOSInterface,
+VIR_ENUM_IMPL(qemuFirmwareOSInterface, NULL,
               QEMU_FIRMWARE_OS_INTERFACE_LAST,
               "",
               "bios",
@@ -102,7 +102,7 @@  typedef enum {
 } qemuFirmwareDevice;
 
 VIR_ENUM_DECL(qemuFirmwareDevice);
-VIR_ENUM_IMPL(qemuFirmwareDevice,
+VIR_ENUM_IMPL(qemuFirmwareDevice, NULL,
               QEMU_FIRMWARE_DEVICE_LAST,
               "",
               "flash",
@@ -148,7 +148,7 @@  typedef enum {
 } qemuFirmwareFeature;
 
 VIR_ENUM_DECL(qemuFirmwareFeature);
-VIR_ENUM_IMPL(qemuFirmwareFeature,
+VIR_ENUM_IMPL(qemuFirmwareFeature, NULL,
               QEMU_FIRMWARE_FEATURE_LAST,
               "",
               "acpi-s3",
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index e3ad4e52a7..08aa40d374 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -66,7 +66,7 @@ 
 
 VIR_LOG_INIT("qemu.qemu_migration");
 
-VIR_ENUM_IMPL(qemuMigrationJobPhase,
+VIR_ENUM_IMPL(qemuMigrationJobPhase, NULL,
               QEMU_MIGRATION_PHASE_LAST,
               "none",
               "perform2",
diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c
index 74b8575a91..e1b3ef571b 100644
--- a/src/qemu/qemu_migration_cookie.c
+++ b/src/qemu/qemu_migration_cookie.c
@@ -38,7 +38,7 @@ 
 
 VIR_LOG_INIT("qemu.qemu_migration_cookie");
 
-VIR_ENUM_IMPL(qemuMigrationCookieFlag,
+VIR_ENUM_IMPL(qemuMigrationCookieFlag, NULL,
               QEMU_MIGRATION_COOKIE_FLAG_LAST,
               "graphics",
               "lockstate",
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index e296fc1927..54707d57f7 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -72,13 +72,13 @@  typedef enum {
     QEMU_MIGRATION_COMPRESS_LAST
 } qemuMigrationCompressMethod;
 VIR_ENUM_DECL(qemuMigrationCompressMethod);
-VIR_ENUM_IMPL(qemuMigrationCompressMethod,
+VIR_ENUM_IMPL(qemuMigrationCompressMethod, NULL,
               QEMU_MIGRATION_COMPRESS_LAST,
               "xbzrle",
               "mt",
 );
 
-VIR_ENUM_IMPL(qemuMigrationCapability,
+VIR_ENUM_IMPL(qemuMigrationCapability, NULL,
               QEMU_MIGRATION_CAP_LAST,
               "xbzrle",
               "auto-converge",
@@ -93,7 +93,7 @@  VIR_ENUM_IMPL(qemuMigrationCapability,
 
 
 VIR_ENUM_DECL(qemuMigrationParam);
-VIR_ENUM_IMPL(qemuMigrationParam,
+VIR_ENUM_IMPL(qemuMigrationParam, NULL,
               QEMU_MIGRATION_PARAM_LAST,
               "compress-level",
               "compress-threads",
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index babcbde878..250302d3d6 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -168,7 +168,7 @@  static int qemuMonitorOnceInit(void)
 VIR_ONCE_GLOBAL_INIT(qemuMonitor);
 
 
-VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
+VIR_ENUM_IMPL(qemuMonitorMigrationStatus, NULL,
               QEMU_MONITOR_MIGRATION_STATUS_LAST,
               "inactive", "setup",
               "active", "pre-switchover",
@@ -177,7 +177,7 @@  VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
               "cancelling", "cancelled",
 );
 
-VIR_ENUM_IMPL(qemuMonitorVMStatus,
+VIR_ENUM_IMPL(qemuMonitorVMStatus, NULL,
               QEMU_MONITOR_VM_STATUS_LAST,
               "debug", "inmigrate", "internal-error", "io-error", "paused",
               "postmigrate", "prelaunch", "finish-migrate", "restore-vm",
@@ -194,12 +194,12 @@  typedef enum {
 
 VIR_ENUM_DECL(qemuMonitorBlockIOStatus);
 
-VIR_ENUM_IMPL(qemuMonitorBlockIOStatus,
+VIR_ENUM_IMPL(qemuMonitorBlockIOStatus, NULL,
               QEMU_MONITOR_BLOCK_IO_STATUS_LAST,
               "ok", "failed", "nospace",
 );
 
-VIR_ENUM_IMPL(qemuMonitorDumpStatus,
+VIR_ENUM_IMPL(qemuMonitorDumpStatus, NULL,
               QEMU_MONITOR_DUMP_STATUS_LAST,
               "none", "active", "completed", "failed",
 );
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 71c452b25b..6ec4e6bd1b 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -733,7 +733,7 @@  static void qemuMonitorJSONHandleRTCChange(qemuMonitorPtr mon, virJSONValuePtr d
 }
 
 VIR_ENUM_DECL(qemuMonitorWatchdogAction);
-VIR_ENUM_IMPL(qemuMonitorWatchdogAction,
+VIR_ENUM_IMPL(qemuMonitorWatchdogAction, NULL,
               VIR_DOMAIN_EVENT_WATCHDOG_LAST,
               "none", "pause", "reset", "poweroff", "shutdown", "debug", "inject-nmi",
 );
@@ -756,7 +756,7 @@  static void qemuMonitorJSONHandleWatchdog(qemuMonitorPtr mon, virJSONValuePtr da
 }
 
 VIR_ENUM_DECL(qemuMonitorIOErrorAction);
-VIR_ENUM_IMPL(qemuMonitorIOErrorAction,
+VIR_ENUM_IMPL(qemuMonitorIOErrorAction, NULL,
               VIR_DOMAIN_EVENT_IO_ERROR_LAST,
               "ignore", "stop", "report",
 );
@@ -799,7 +799,7 @@  qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
 
 
 VIR_ENUM_DECL(qemuMonitorGraphicsAddressFamily);
-VIR_ENUM_IMPL(qemuMonitorGraphicsAddressFamily,
+VIR_ENUM_IMPL(qemuMonitorGraphicsAddressFamily, NULL,
               VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_LAST,
               "ipv4", "ipv6", "unix",
 );
@@ -5466,7 +5466,7 @@  qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
 }
 
 
-VIR_ENUM_IMPL(qemuMonitorCPUProperty,
+VIR_ENUM_IMPL(qemuMonitorCPUProperty, NULL,
               QEMU_MONITOR_CPU_PROPERTY_LAST,
               "boolean", "string", "number",
 );
diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c
index c3782971f1..f838c668b7 100644
--- a/src/remote/remote_daemon.c
+++ b/src/remote/remote_daemon.c
@@ -90,7 +90,7 @@  enum {
 };
 
 VIR_ENUM_DECL(virDaemonErr);
-VIR_ENUM_IMPL(virDaemonErr,
+VIR_ENUM_IMPL(virDaemonErr, NULL,
               VIR_DAEMON_ERR_LAST,
               "Initialization successful",
               "Unable to obtain pidfile",
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index 4238d7014b..edb343044d 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -62,7 +62,7 @@  VIR_LOG_INIT("util.cgroup");
 #define CGROUP_NB_TOTAL_CPU_STAT_PARAM 3
 #define CGROUP_NB_PER_CPU_STAT_PARAM   1
 
-VIR_ENUM_IMPL(virCgroupController,
+VIR_ENUM_IMPL(virCgroupController, NULL,
               VIR_CGROUP_CONTROLLER_LAST,
               "cpu", "cpuacct", "cpuset", "memory", "devices",
               "freezer", "blkio", "net_cls", "perf_event",
diff --git a/src/util/vircgroupbackend.c b/src/util/vircgroupbackend.c
index d56e4ea292..362c014093 100644
--- a/src/util/vircgroupbackend.c
+++ b/src/util/vircgroupbackend.c
@@ -30,7 +30,7 @@ 
 #define VIR_FROM_THIS VIR_FROM_CGROUP
 
 VIR_ENUM_DECL(virCgroupBackend);
-VIR_ENUM_IMPL(virCgroupBackend,
+VIR_ENUM_IMPL(virCgroupBackend, NULL,
               VIR_CGROUP_BACKEND_TYPE_LAST,
               "cgroup V2",
               "cgroup V1",
diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c
index 8ce10d3608..d930b04ac1 100644
--- a/src/util/vircgroupv1.c
+++ b/src/util/vircgroupv1.c
@@ -47,7 +47,7 @@  VIR_LOG_INIT("util.cgroup");
 
 
 VIR_ENUM_DECL(virCgroupV1Controller);
-VIR_ENUM_IMPL(virCgroupV1Controller,
+VIR_ENUM_IMPL(virCgroupV1Controller, NULL,
               VIR_CGROUP_CONTROLLER_LAST,
               "cpu", "cpuacct", "cpuset", "memory", "devices",
               "freezer", "blkio", "net_cls", "perf_event",
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index 0cfbc96264..5e421da4ae 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -44,7 +44,7 @@  VIR_LOG_INIT("util.cgroup");
 #define VIR_FROM_THIS VIR_FROM_CGROUP
 
 VIR_ENUM_DECL(virCgroupV2Controller);
-VIR_ENUM_IMPL(virCgroupV2Controller,
+VIR_ENUM_IMPL(virCgroupV2Controller, NULL,
               VIR_CGROUP_CONTROLLER_LAST,
               "cpu", "cpuacct", "cpuset", "memory", "devices",
               "freezer", "io", "net_cls", "perf_event", "name=systemd",
diff --git a/src/util/virconf.c b/src/util/virconf.c
index 665805b7cf..709b688628 100644
--- a/src/util/virconf.c
+++ b/src/util/virconf.c
@@ -65,7 +65,7 @@  struct _virConfParserCtxt {
   do { while ((ctxt->cur < ctxt->end) && (c_isblank(CUR))) \
           ctxt->cur++; } while (0)
 
-VIR_ENUM_IMPL(virConf,
+VIR_ENUM_IMPL(virConf, NULL,
               VIR_CONF_LAST,
               "*unexpected*",
               "long",
diff --git a/src/util/virenum.c b/src/util/virenum.c
index 6ae8d9fb2a..cbe0444ba0 100644
--- a/src/util/virenum.c
+++ b/src/util/virenum.c
@@ -23,14 +23,14 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
-VIR_ENUM_IMPL(virTristateBool,
+VIR_ENUM_IMPL(virTristateBool, NULL,
               VIR_TRISTATE_BOOL_LAST,
               "default",
               "yes",
               "no",
 );
 
-VIR_ENUM_IMPL(virTristateSwitch,
+VIR_ENUM_IMPL(virTristateSwitch, NULL,
               VIR_TRISTATE_SWITCH_LAST,
               "default",
               "on",
diff --git a/src/util/virenum.h b/src/util/virenum.h
index 706ae752d8..9eb3bc4bc4 100644
--- a/src/util/virenum.h
+++ b/src/util/virenum.h
@@ -33,19 +33,19 @@  virEnumToString(const char * const *types,
                 int type,
                 const char *label);
 
-# define VIR_ENUM_IMPL(name, lastVal, ...) \
+# define VIR_ENUM_IMPL(name, label, lastVal, ...) \
     static const char *const name ## TypeList[] = { __VA_ARGS__ }; \
     const char *name ## TypeToString(int type) { \
         return virEnumToString(name ## TypeList, \
                                ARRAY_CARDINALITY(name ## TypeList), \
                                type, \
-                               NULL); \
+                               label); \
     } \
     int name ## TypeFromString(const char *type) { \
         return virEnumFromString(name ## TypeList, \
                                  ARRAY_CARDINALITY(name ## TypeList), \
                                  type, \
-                                 NULL); \
+                                 label); \
     } \
     verify(ARRAY_CARDINALITY(name ## TypeList) == lastVal)
 
diff --git a/src/util/virerror.c b/src/util/virerror.c
index 37b5b2f3f9..0a4b2ff00e 100644
--- a/src/util/virerror.c
+++ b/src/util/virerror.c
@@ -57,7 +57,7 @@  static virLogPriority virErrorLevelPriority(virErrorLevel level)
 
 
 VIR_ENUM_DECL(virErrorDomain);
-VIR_ENUM_IMPL(virErrorDomain,
+VIR_ENUM_IMPL(virErrorDomain, NULL,
               VIR_ERR_DOMAIN_LAST,
               "", /* 0 */
               "Xen Driver",
diff --git a/src/util/virfirewall.c b/src/util/virfirewall.c
index f6344b631c..88eab85783 100644
--- a/src/util/virfirewall.c
+++ b/src/util/virfirewall.c
@@ -42,7 +42,7 @@  typedef struct _virFirewallGroup virFirewallGroup;
 typedef virFirewallGroup *virFirewallGroupPtr;
 
 VIR_ENUM_DECL(virFirewallLayerCommand);
-VIR_ENUM_IMPL(virFirewallLayerCommand,
+VIR_ENUM_IMPL(virFirewallLayerCommand, NULL,
               VIR_FIREWALL_LAYER_LAST,
               EBTABLES_PATH,
               IPTABLES_PATH,
diff --git a/src/util/virfirewalld.c b/src/util/virfirewalld.c
index 60b75e7e25..7b0c0da2ea 100644
--- a/src/util/virfirewalld.c
+++ b/src/util/virfirewalld.c
@@ -41,7 +41,7 @@  VIR_LOG_INIT("util.firewalld");
  * understood by the firewalld.direct "passthrough" method
  */
 VIR_ENUM_DECL(virFirewallLayerFirewallD);
-VIR_ENUM_IMPL(virFirewallLayerFirewallD,
+VIR_ENUM_IMPL(virFirewallLayerFirewallD, NULL,
               VIR_FIREWALL_LAYER_LAST,
               "eb",
               "ipv4",
@@ -50,7 +50,7 @@  VIR_ENUM_IMPL(virFirewallLayerFirewallD,
 
 
 VIR_ENUM_DECL(virFirewallDBackend);
-VIR_ENUM_IMPL(virFirewallDBackend,
+VIR_ENUM_IMPL(virFirewallDBackend, NULL,
               VIR_FIREWALLD_BACKEND_LAST,
               "",
               "iptables",
diff --git a/src/util/virgic.c b/src/util/virgic.c
index a3ea3ce6ff..95b22d636c 100644
--- a/src/util/virgic.c
+++ b/src/util/virgic.c
@@ -23,7 +23,7 @@ 
 #include "virgic.h"
 #include "virutil.h"
 
-VIR_ENUM_IMPL(virGICVersion,
+VIR_ENUM_IMPL(virGICVersion, NULL,
               VIR_GIC_VERSION_LAST,
               "none",
               "host",
diff --git a/src/util/virhook.c b/src/util/virhook.c
index 57549ef8e5..82001c3eeb 100644
--- a/src/util/virhook.c
+++ b/src/util/virhook.c
@@ -49,7 +49,7 @@  VIR_ENUM_DECL(virHookLxcOp);
 VIR_ENUM_DECL(virHookNetworkOp);
 VIR_ENUM_DECL(virHookLibxlOp);
 
-VIR_ENUM_IMPL(virHookDriver,
+VIR_ENUM_IMPL(virHookDriver, NULL,
               VIR_HOOK_DRIVER_LAST,
               "daemon",
               "qemu",
@@ -58,21 +58,21 @@  VIR_ENUM_IMPL(virHookDriver,
               "libxl",
 );
 
-VIR_ENUM_IMPL(virHookDaemonOp,
+VIR_ENUM_IMPL(virHookDaemonOp, NULL,
               VIR_HOOK_DAEMON_OP_LAST,
               "start",
               "shutdown",
               "reload",
 );
 
-VIR_ENUM_IMPL(virHookSubop,
+VIR_ENUM_IMPL(virHookSubop, NULL,
               VIR_HOOK_SUBOP_LAST,
               "-",
               "begin",
               "end",
 );
 
-VIR_ENUM_IMPL(virHookQemuOp,
+VIR_ENUM_IMPL(virHookQemuOp, NULL,
               VIR_HOOK_QEMU_OP_LAST,
               "start",
               "stopped",
@@ -85,7 +85,7 @@  VIR_ENUM_IMPL(virHookQemuOp,
               "restore",
 );
 
-VIR_ENUM_IMPL(virHookLxcOp,
+VIR_ENUM_IMPL(virHookLxcOp, NULL,
               VIR_HOOK_LXC_OP_LAST,
               "start",
               "stopped",
@@ -95,7 +95,7 @@  VIR_ENUM_IMPL(virHookLxcOp,
               "reconnect",
 );
 
-VIR_ENUM_IMPL(virHookNetworkOp,
+VIR_ENUM_IMPL(virHookNetworkOp, NULL,
               VIR_HOOK_NETWORK_OP_LAST,
               "start",
               "started",
@@ -105,7 +105,7 @@  VIR_ENUM_IMPL(virHookNetworkOp,
               "updated",
 );
 
-VIR_ENUM_IMPL(virHookLibxlOp,
+VIR_ENUM_IMPL(virHookLibxlOp, NULL,
               VIR_HOOK_LIBXL_OP_LAST,
               "start",
               "stopped",
diff --git a/src/util/virkeycode.c b/src/util/virkeycode.c
index 336443e01d..5a4cce3168 100644
--- a/src/util/virkeycode.c
+++ b/src/util/virkeycode.c
@@ -68,7 +68,7 @@  verify(VIR_KEYMAP_ENTRY_MAX == ARRAY_CARDINALITY(virKeyNameTable_linux));
 verify(VIR_KEYMAP_ENTRY_MAX == ARRAY_CARDINALITY(virKeyNameTable_osx));
 verify(VIR_KEYMAP_ENTRY_MAX == ARRAY_CARDINALITY(virKeyNameTable_win32));
 
-VIR_ENUM_IMPL(virKeycodeSet,
+VIR_ENUM_IMPL(virKeycodeSet, NULL,
               VIR_KEYCODE_SET_LAST,
               "linux",
               "xt",
diff --git a/src/util/virlog.c b/src/util/virlog.c
index 248ce19902..ed8c772d72 100644
--- a/src/util/virlog.c
+++ b/src/util/virlog.c
@@ -76,7 +76,7 @@  static char virLogHostname[HOST_NAME_MAX+1];
     VIR_LOG_PID_REGEX ": " VIR_LOG_LEVEL_REGEX " : "
 
 VIR_ENUM_DECL(virLogDestination);
-VIR_ENUM_IMPL(virLogDestination,
+VIR_ENUM_IMPL(virLogDestination, NULL,
               VIR_LOG_TO_OUTPUT_LAST,
               "stderr", "syslog", "file", "journald",
 );
diff --git a/src/util/virmdev.c b/src/util/virmdev.c
index 3d5488cdae..98d1c15b25 100644
--- a/src/util/virmdev.c
+++ b/src/util/virmdev.c
@@ -47,7 +47,7 @@  struct _virMediatedDeviceList {
     virMediatedDevicePtr *devs;
 };
 
-VIR_ENUM_IMPL(virMediatedDeviceModel,
+VIR_ENUM_IMPL(virMediatedDeviceModel, NULL,
               VIR_MDEV_MODEL_TYPE_LAST,
               "vfio-pci",
               "vfio-ccw",
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index 5c0e9723b9..39069fdd22 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -2413,7 +2413,7 @@  virNetDevSetNetConfig(const char *linkdev ATTRIBUTE_UNUSED,
 
 #endif /* defined(__linux__) && defined(HAVE_LIBNL) && defined(IFLA_VF_MAX) */
 
-VIR_ENUM_IMPL(virNetDevIfState,
+VIR_ENUM_IMPL(virNetDevIfState, NULL,
               VIR_NETDEV_IF_STATE_LAST,
               "" /* value of zero means no state */,
               "unknown", "notpresent",
@@ -2421,7 +2421,7 @@  VIR_ENUM_IMPL(virNetDevIfState,
               "testing", "dormant", "up",
 );
 
-VIR_ENUM_IMPL(virNetDevFeature,
+VIR_ENUM_IMPL(virNetDevFeature, NULL,
               VIR_NET_DEV_FEAT_LAST,
               "rx",
               "tx",
@@ -2765,7 +2765,7 @@  static int virNetDevGetMcastList(const char *ifname,
 }
 
 
-VIR_ENUM_IMPL(virNetDevRxFilterMode,
+VIR_ENUM_IMPL(virNetDevRxFilterMode, NULL,
               VIR_NETDEV_RX_FILTER_MODE_LAST,
               "none",
               "normal",
diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c
index 3302522289..d2e091d95a 100644
--- a/src/util/virnetdevmacvlan.c
+++ b/src/util/virnetdevmacvlan.c
@@ -32,7 +32,7 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_NET
 
-VIR_ENUM_IMPL(virNetDevMacVLanMode,
+VIR_ENUM_IMPL(virNetDevMacVLanMode, NULL,
               VIR_NETDEV_MACVLAN_MODE_LAST,
               "vepa",
               "private",
diff --git a/src/util/virnetdevvportprofile.c b/src/util/virnetdevvportprofile.c
index 32a366d4da..5d6362816a 100644
--- a/src/util/virnetdevvportprofile.c
+++ b/src/util/virnetdevvportprofile.c
@@ -25,7 +25,7 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_NET
 
-VIR_ENUM_IMPL(virNetDevVPort,
+VIR_ENUM_IMPL(virNetDevVPort, NULL,
               VIR_NETDEV_VPORT_PROFILE_LAST,
               "none",
               "802.1Qbg",
@@ -34,7 +34,7 @@  VIR_ENUM_IMPL(virNetDevVPort,
               "midonet",
 );
 
-VIR_ENUM_IMPL(virNetDevVPortProfileOp,
+VIR_ENUM_IMPL(virNetDevVPortProfileOp, NULL,
               VIR_NETDEV_VPORT_PROFILE_OP_LAST,
               "create",
               "save",
diff --git a/src/util/virpci.c b/src/util/virpci.c
index 8f2936c23a..c765ff1f9c 100644
--- a/src/util/virpci.c
+++ b/src/util/virpci.c
@@ -46,12 +46,12 @@  VIR_LOG_INIT("util.pci");
 #define PCI_ID_LEN 10   /* "XXXX XXXX" */
 #define PCI_ADDR_LEN 13 /* "XXXX:XX:XX.X" */
 
-VIR_ENUM_IMPL(virPCIELinkSpeed,
+VIR_ENUM_IMPL(virPCIELinkSpeed, NULL,
               VIR_PCIE_LINK_SPEED_LAST,
               "", "2.5", "5", "8", "16",
 );
 
-VIR_ENUM_IMPL(virPCIStubDriver,
+VIR_ENUM_IMPL(virPCIStubDriver, NULL,
               VIR_PCI_STUB_DRIVER_LAST,
               "none",
               "pciback", /* XEN */
@@ -59,7 +59,7 @@  VIR_ENUM_IMPL(virPCIStubDriver,
               "vfio-pci", /* VFIO */
 );
 
-VIR_ENUM_IMPL(virPCIHeader,
+VIR_ENUM_IMPL(virPCIHeader, NULL,
               VIR_PCI_HEADER_LAST,
               "endpoint",
               "pci-bridge",
diff --git a/src/util/virperf.c b/src/util/virperf.c
index 7c328da574..6e05e165bd 100644
--- a/src/util/virperf.c
+++ b/src/util/virperf.c
@@ -34,7 +34,7 @@  VIR_LOG_INIT("util.perf");
 
 #define VIR_FROM_THIS VIR_FROM_PERF
 
-VIR_ENUM_IMPL(virPerfEvent,
+VIR_ENUM_IMPL(virPerfEvent, NULL,
               VIR_PERF_EVENT_LAST,
               "cmt", "mbmt", "mbml",
               "cpu_cycles", "instructions",
diff --git a/src/util/virprocess.c b/src/util/virprocess.c
index f2533f639f..94c8d99abb 100644
--- a/src/util/virprocess.c
+++ b/src/util/virprocess.c
@@ -107,7 +107,7 @@  static inline int setns(int fd ATTRIBUTE_UNUSED, int nstype ATTRIBUTE_UNUSED)
 }
 #endif
 
-VIR_ENUM_IMPL(virProcessSchedPolicy,
+VIR_ENUM_IMPL(virProcessSchedPolicy, NULL,
               VIR_PROC_POLICY_LAST,
               "none",
               "batch",
diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
index b845f366f0..080665f5e9 100644
--- a/src/util/virresctrl.c
+++ b/src/util/virresctrl.c
@@ -53,7 +53,7 @@  VIR_LOG_INIT("util.virresctrl");
  * consistent in between all of them. */
 
 /* Cache name mapping for Linux kernel naming. */
-VIR_ENUM_IMPL(virCacheKernel,
+VIR_ENUM_IMPL(virCacheKernel, NULL,
               VIR_CACHE_TYPE_LAST,
               "Unified",
               "Instruction",
@@ -61,7 +61,7 @@  VIR_ENUM_IMPL(virCacheKernel,
 );
 
 /* Cache name mapping for our XML naming. */
-VIR_ENUM_IMPL(virCache,
+VIR_ENUM_IMPL(virCache, NULL,
               VIR_CACHE_TYPE_LAST,
               "both",
               "code",
@@ -70,7 +70,7 @@  VIR_ENUM_IMPL(virCache,
 
 /* Cache name mapping for resctrl interface naming. */
 VIR_ENUM_DECL(virResctrl);
-VIR_ENUM_IMPL(virResctrl,
+VIR_ENUM_IMPL(virResctrl, NULL,
               VIR_CACHE_TYPE_LAST,
               "",
               "CODE",
@@ -78,7 +78,7 @@  VIR_ENUM_IMPL(virResctrl,
 );
 
 /* Monitor feature name prefix mapping for monitor naming */
-VIR_ENUM_IMPL(virResctrlMonitorPrefix,
+VIR_ENUM_IMPL(virResctrlMonitorPrefix, NULL,
               VIR_RESCTRL_MONITOR_TYPE_LAST,
               "__unsupported__",
               "llc_",
diff --git a/src/util/virsecret.c b/src/util/virsecret.c
index 854dc72b06..648130d657 100644
--- a/src/util/virsecret.c
+++ b/src/util/virsecret.c
@@ -32,7 +32,7 @@ 
 
 VIR_LOG_INIT("util.secret");
 
-VIR_ENUM_IMPL(virSecretUsage,
+VIR_ENUM_IMPL(virSecretUsage, NULL,
               VIR_SECRET_USAGE_TYPE_LAST,
               "none", "volume", "ceph", "iscsi", "tls",
 );
diff --git a/src/util/virstorageencryption.c b/src/util/virstorageencryption.c
index 49df7fddd8..3535ed5cad 100644
--- a/src/util/virstorageencryption.c
+++ b/src/util/virstorageencryption.c
@@ -37,12 +37,12 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_STORAGE
 
-VIR_ENUM_IMPL(virStorageEncryptionSecret,
+VIR_ENUM_IMPL(virStorageEncryptionSecret, NULL,
               VIR_STORAGE_ENCRYPTION_SECRET_TYPE_LAST,
               "passphrase",
 );
 
-VIR_ENUM_IMPL(virStorageEncryptionFormat,
+VIR_ENUM_IMPL(virStorageEncryptionFormat, NULL,
               VIR_STORAGE_ENCRYPTION_FORMAT_LAST,
               "default", "qcow", "luks",
 );
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 2b1c0a5b8e..654aaa5a82 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -49,7 +49,7 @@  VIR_LOG_INIT("util.storagefile");
 
 static virClassPtr virStorageSourceClass;
 
-VIR_ENUM_IMPL(virStorage,
+VIR_ENUM_IMPL(virStorage, NULL,
               VIR_STORAGE_TYPE_LAST,
               "none",
               "file",
@@ -59,7 +59,7 @@  VIR_ENUM_IMPL(virStorage,
               "volume",
 );
 
-VIR_ENUM_IMPL(virStorageFileFormat,
+VIR_ENUM_IMPL(virStorageFileFormat, NULL,
               VIR_STORAGE_FILE_LAST,
               "none",
               "raw", "dir", "bochs",
@@ -71,12 +71,12 @@  VIR_ENUM_IMPL(virStorageFileFormat,
               "cow", "qcow", "qcow2", "qed", "vmdk",
 );
 
-VIR_ENUM_IMPL(virStorageFileFeature,
+VIR_ENUM_IMPL(virStorageFileFeature, NULL,
               VIR_STORAGE_FILE_FEATURE_LAST,
               "lazy_refcounts",
 );
 
-VIR_ENUM_IMPL(virStorageNetProtocol,
+VIR_ENUM_IMPL(virStorageNetProtocol, NULL,
               VIR_STORAGE_NET_PROTOCOL_LAST,
               "none",
               "nbd",
@@ -93,21 +93,21 @@  VIR_ENUM_IMPL(virStorageNetProtocol,
               "vxhs",
 );
 
-VIR_ENUM_IMPL(virStorageNetHostTransport,
+VIR_ENUM_IMPL(virStorageNetHostTransport, NULL,
               VIR_STORAGE_NET_HOST_TRANS_LAST,
               "tcp",
               "unix",
               "rdma",
 );
 
-VIR_ENUM_IMPL(virStorageSourcePoolMode,
+VIR_ENUM_IMPL(virStorageSourcePoolMode, NULL,
               VIR_STORAGE_SOURCE_POOL_MODE_LAST,
               "default",
               "host",
               "direct",
 );
 
-VIR_ENUM_IMPL(virStorageAuth,
+VIR_ENUM_IMPL(virStorageAuth, NULL,
               VIR_STORAGE_AUTH_TYPE_LAST,
               "none", "chap", "ceph",
 );
diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c
index 79a935b90a..b874bdcda0 100644
--- a/src/util/virsysinfo.c
+++ b/src/util/virsysinfo.c
@@ -41,7 +41,7 @@ 
 
 VIR_LOG_INIT("util.sysinfo");
 
-VIR_ENUM_IMPL(virSysinfo,
+VIR_ENUM_IMPL(virSysinfo, NULL,
               VIR_SYSINFO_LAST,
               "smbios",
 );
diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c
index 8f23348d97..d123fcf37a 100644
--- a/src/util/virtypedparam.c
+++ b/src/util/virtypedparam.c
@@ -31,7 +31,7 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
-VIR_ENUM_IMPL(virTypedParameter,
+VIR_ENUM_IMPL(virTypedParameter, NULL,
               VIR_TYPED_PARAM_LAST,
               "unknown",
               "int",
diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c
index 963e7a9876..5d5e7cfe96 100644
--- a/src/vmware/vmware_conf.c
+++ b/src/vmware/vmware_conf.c
@@ -38,7 +38,7 @@ 
 
 VIR_LOG_INIT("vmware.vmware_conf");
 
-VIR_ENUM_IMPL(vmwareDriver,
+VIR_ENUM_IMPL(vmwareDriver, NULL,
               VMWARE_DRIVER_LAST,
               "player",
               "ws",
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index cf2d4df945..811110c3ce 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -509,7 +509,7 @@  def->parallels[0]...
  * this is good enough for now because all virDomainControllerModel values
  * are actually SCSI controller models in the ESX case */
 VIR_ENUM_DECL(virVMXControllerModelSCSI);
-VIR_ENUM_IMPL(virVMXControllerModelSCSI,
+VIR_ENUM_IMPL(virVMXControllerModelSCSI, NULL,
               VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST,
               "auto", /* just to match virDomainControllerModel, will never be used */
               "buslogic",
diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
index d87475f6f6..9a216dcd12 100644
--- a/tools/virsh-domain-monitor.c
+++ b/tools/virsh-domain-monitor.c
@@ -38,7 +38,7 @@ 
 #include "virenum.h"
 
 VIR_ENUM_DECL(virshDomainIOError);
-VIR_ENUM_IMPL(virshDomainIOError,
+VIR_ENUM_IMPL(virshDomainIOError, NULL,
               VIR_DOMAIN_DISK_ERROR_LAST,
               N_("no error"),
               N_("unspecified error"),
@@ -102,7 +102,7 @@  virshGetDomainDescription(vshControl *ctl, virDomainPtr dom, bool title,
 }
 
 VIR_ENUM_DECL(virshDomainControlState);
-VIR_ENUM_IMPL(virshDomainControlState,
+VIR_ENUM_IMPL(virshDomainControlState, NULL,
               VIR_DOMAIN_CONTROL_LAST,
               N_("ok"),
               N_("background job"),
@@ -118,7 +118,7 @@  virshDomainControlStateToString(int state)
 }
 
 VIR_ENUM_DECL(virshDomainControlErrorReason);
-VIR_ENUM_IMPL(virshDomainControlErrorReason,
+VIR_ENUM_IMPL(virshDomainControlErrorReason, NULL,
               VIR_DOMAIN_CONTROL_ERROR_REASON_LAST,
               "",
               N_("unknown"),
@@ -134,7 +134,7 @@  virshDomainControlErrorReasonToString(int reason)
 }
 
 VIR_ENUM_DECL(virshDomainState);
-VIR_ENUM_IMPL(virshDomainState,
+VIR_ENUM_IMPL(virshDomainState, NULL,
               VIR_DOMAIN_LAST,
               N_("no state"),
               N_("running"),
@@ -154,13 +154,13 @@  virshDomainStateToString(int state)
 }
 
 VIR_ENUM_DECL(virshDomainNostateReason);
-VIR_ENUM_IMPL(virshDomainNostateReason,
+VIR_ENUM_IMPL(virshDomainNostateReason, NULL,
               VIR_DOMAIN_NOSTATE_LAST,
               N_("unknown"),
 );
 
 VIR_ENUM_DECL(virshDomainRunningReason);
-VIR_ENUM_IMPL(virshDomainRunningReason,
+VIR_ENUM_IMPL(virshDomainRunningReason, NULL,
               VIR_DOMAIN_RUNNING_LAST,
               N_("unknown"),
               N_("booted"),
@@ -176,13 +176,13 @@  VIR_ENUM_IMPL(virshDomainRunningReason,
 );
 
 VIR_ENUM_DECL(virshDomainBlockedReason);
-VIR_ENUM_IMPL(virshDomainBlockedReason,
+VIR_ENUM_IMPL(virshDomainBlockedReason, NULL,
               VIR_DOMAIN_BLOCKED_LAST,
               N_("unknown"),
 );
 
 VIR_ENUM_DECL(virshDomainPausedReason);
-VIR_ENUM_IMPL(virshDomainPausedReason,
+VIR_ENUM_IMPL(virshDomainPausedReason, NULL,
               VIR_DOMAIN_PAUSED_LAST,
               N_("unknown"),
               N_("user"),
@@ -201,14 +201,14 @@  VIR_ENUM_IMPL(virshDomainPausedReason,
 );
 
 VIR_ENUM_DECL(virshDomainShutdownReason);
-VIR_ENUM_IMPL(virshDomainShutdownReason,
+VIR_ENUM_IMPL(virshDomainShutdownReason, NULL,
               VIR_DOMAIN_SHUTDOWN_LAST,
               N_("unknown"),
               N_("user"),
 );
 
 VIR_ENUM_DECL(virshDomainShutoffReason);
-VIR_ENUM_IMPL(virshDomainShutoffReason,
+VIR_ENUM_IMPL(virshDomainShutoffReason, NULL,
               VIR_DOMAIN_SHUTOFF_LAST,
               N_("unknown"),
               N_("shutdown"),
@@ -222,14 +222,14 @@  VIR_ENUM_IMPL(virshDomainShutoffReason,
 );
 
 VIR_ENUM_DECL(virshDomainCrashedReason);
-VIR_ENUM_IMPL(virshDomainCrashedReason,
+VIR_ENUM_IMPL(virshDomainCrashedReason, NULL,
               VIR_DOMAIN_CRASHED_LAST,
               N_("unknown"),
               N_("panicked"),
 );
 
 VIR_ENUM_DECL(virshDomainPMSuspendedReason);
-VIR_ENUM_IMPL(virshDomainPMSuspendedReason,
+VIR_ENUM_IMPL(virshDomainPMSuspendedReason, NULL,
               VIR_DOMAIN_PMSUSPENDED_LAST,
               N_("unknown"),
 );
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index da57d96d1a..f8a1e2ae84 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -99,7 +99,7 @@  virshDomainDefine(virConnectPtr conn, const char *xml, unsigned int flags)
 }
 
 VIR_ENUM_DECL(virshDomainVcpuState);
-VIR_ENUM_IMPL(virshDomainVcpuState,
+VIR_ENUM_IMPL(virshDomainVcpuState, NULL,
               VIR_VCPU_LAST,
               N_("offline"),
               N_("running"),
@@ -2556,7 +2556,7 @@  static const vshCmdOptDef opts_blockjob[] = {
 };
 
 VIR_ENUM_DECL(virshDomainBlockJob);
-VIR_ENUM_IMPL(virshDomainBlockJob,
+VIR_ENUM_IMPL(virshDomainBlockJob, NULL,
               VIR_DOMAIN_BLOCK_JOB_TYPE_LAST,
               N_("Unknown job"),
               N_("Block Pull"),
@@ -5645,13 +5645,13 @@  static const vshCmdOptDef opts_setLifecycleAction[] = {
     {.name = NULL}
 };
 
-VIR_ENUM_IMPL(virDomainLifecycle,
+VIR_ENUM_IMPL(virDomainLifecycle, NULL,
               VIR_DOMAIN_LIFECYCLE_LAST,
               "poweroff",
               "reboot",
               "crash");
 
-VIR_ENUM_IMPL(virDomainLifecycleAction,
+VIR_ENUM_IMPL(virDomainLifecycleAction, NULL,
               VIR_DOMAIN_LIFECYCLE_ACTION_LAST,
               "destroy",
               "restart",
@@ -6042,7 +6042,7 @@  static const vshCmdOptDef opts_domjobinfo[] = {
 };
 
 VIR_ENUM_DECL(virshDomainJob);
-VIR_ENUM_IMPL(virshDomainJob,
+VIR_ENUM_IMPL(virshDomainJob, NULL,
               VIR_DOMAIN_JOB_LAST,
               N_("None"),
               N_("Bounded"),
@@ -6059,7 +6059,7 @@  virshDomainJobToString(int type)
 }
 
 VIR_ENUM_DECL(virshDomainJobOperation);
-VIR_ENUM_IMPL(virshDomainJobOperation,
+VIR_ENUM_IMPL(virshDomainJobOperation, NULL,
               VIR_DOMAIN_JOB_OPERATION_LAST,
               N_("Unknown"),
               N_("Start"),
@@ -8777,7 +8777,7 @@  static const vshCmdOptDef opts_send_process_signal[] = {
 };
 
 VIR_ENUM_DECL(virDomainProcessSignal);
-VIR_ENUM_IMPL(virDomainProcessSignal,
+VIR_ENUM_IMPL(virDomainProcessSignal, NULL,
               VIR_DOMAIN_PROCESS_SIGNAL_LAST,
                "nop",    "hup",  "int",  "quit",  "ill", /* 0-4 */
               "trap",   "abrt",  "bus",   "fpe", "kill", /* 5-9 */
@@ -12740,7 +12740,7 @@  cmdEdit(vshControl *ctl, const vshCmd *cmd)
  * "event" command
  */
 VIR_ENUM_DECL(virshDomainEvent);
-VIR_ENUM_IMPL(virshDomainEvent,
+VIR_ENUM_IMPL(virshDomainEvent, NULL,
               VIR_DOMAIN_EVENT_LAST,
               N_("Defined"),
               N_("Undefined"),
@@ -12760,7 +12760,7 @@  virshDomainEventToString(int event)
 }
 
 VIR_ENUM_DECL(virshDomainEventDefined);
-VIR_ENUM_IMPL(virshDomainEventDefined,
+VIR_ENUM_IMPL(virshDomainEventDefined, NULL,
               VIR_DOMAIN_EVENT_DEFINED_LAST,
               N_("Added"),
               N_("Updated"),
@@ -12768,13 +12768,13 @@  VIR_ENUM_IMPL(virshDomainEventDefined,
               N_("Snapshot"));
 
 VIR_ENUM_DECL(virshDomainEventUndefined);
-VIR_ENUM_IMPL(virshDomainEventUndefined,
+VIR_ENUM_IMPL(virshDomainEventUndefined, NULL,
               VIR_DOMAIN_EVENT_UNDEFINED_LAST,
               N_("Removed"),
               N_("Renamed"));
 
 VIR_ENUM_DECL(virshDomainEventStarted);
-VIR_ENUM_IMPL(virshDomainEventStarted,
+VIR_ENUM_IMPL(virshDomainEventStarted, NULL,
               VIR_DOMAIN_EVENT_STARTED_LAST,
               N_("Booted"),
               N_("Migrated"),
@@ -12783,7 +12783,7 @@  VIR_ENUM_IMPL(virshDomainEventStarted,
               N_("Event wakeup"));
 
 VIR_ENUM_DECL(virshDomainEventSuspended);
-VIR_ENUM_IMPL(virshDomainEventSuspended,
+VIR_ENUM_IMPL(virshDomainEventSuspended, NULL,
               VIR_DOMAIN_EVENT_SUSPENDED_LAST,
               N_("Paused"),
               N_("Migrated"),
@@ -12796,7 +12796,7 @@  VIR_ENUM_IMPL(virshDomainEventSuspended,
               N_("Post-copy Error"));
 
 VIR_ENUM_DECL(virshDomainEventResumed);
-VIR_ENUM_IMPL(virshDomainEventResumed,
+VIR_ENUM_IMPL(virshDomainEventResumed, NULL,
               VIR_DOMAIN_EVENT_RESUMED_LAST,
               N_("Unpaused"),
               N_("Migrated"),
@@ -12804,7 +12804,7 @@  VIR_ENUM_IMPL(virshDomainEventResumed,
               N_("Post-copy"));
 
 VIR_ENUM_DECL(virshDomainEventStopped);
-VIR_ENUM_IMPL(virshDomainEventStopped,
+VIR_ENUM_IMPL(virshDomainEventStopped, NULL,
               VIR_DOMAIN_EVENT_STOPPED_LAST,
               N_("Shutdown"),
               N_("Destroyed"),
@@ -12815,20 +12815,20 @@  VIR_ENUM_IMPL(virshDomainEventStopped,
               N_("Snapshot"));
 
 VIR_ENUM_DECL(virshDomainEventShutdown);
-VIR_ENUM_IMPL(virshDomainEventShutdown,
+VIR_ENUM_IMPL(virshDomainEventShutdown, NULL,
               VIR_DOMAIN_EVENT_SHUTDOWN_LAST,
               N_("Finished"),
               N_("Finished after guest request"),
               N_("Finished after host request"));
 
 VIR_ENUM_DECL(virshDomainEventPMSuspended);
-VIR_ENUM_IMPL(virshDomainEventPMSuspended,
+VIR_ENUM_IMPL(virshDomainEventPMSuspended, NULL,
               VIR_DOMAIN_EVENT_PMSUSPENDED_LAST,
               N_("Memory"),
               N_("Disk"));
 
 VIR_ENUM_DECL(virshDomainEventCrashed);
-VIR_ENUM_IMPL(virshDomainEventCrashed,
+VIR_ENUM_IMPL(virshDomainEventCrashed, NULL,
               VIR_DOMAIN_EVENT_CRASHED_LAST,
               N_("Panicked"));
 
@@ -12871,7 +12871,7 @@  virshDomainEventDetailToString(int event, int detail)
 }
 
 VIR_ENUM_DECL(virshDomainEventWatchdog);
-VIR_ENUM_IMPL(virshDomainEventWatchdog,
+VIR_ENUM_IMPL(virshDomainEventWatchdog, NULL,
               VIR_DOMAIN_EVENT_WATCHDOG_LAST,
               N_("none"),
               N_("pause"),
@@ -12889,7 +12889,7 @@  virshDomainEventWatchdogToString(int action)
 }
 
 VIR_ENUM_DECL(virshDomainEventIOError);
-VIR_ENUM_IMPL(virshDomainEventIOError,
+VIR_ENUM_IMPL(virshDomainEventIOError, NULL,
               VIR_DOMAIN_EVENT_IO_ERROR_LAST,
               N_("none"),
               N_("pause"),
@@ -12903,7 +12903,7 @@  virshDomainEventIOErrorToString(int action)
 }
 
 VIR_ENUM_DECL(virshGraphicsPhase);
-VIR_ENUM_IMPL(virshGraphicsPhase,
+VIR_ENUM_IMPL(virshGraphicsPhase, NULL,
               VIR_DOMAIN_EVENT_GRAPHICS_LAST,
               N_("connect"),
               N_("initialize"),
@@ -12917,7 +12917,7 @@  virshGraphicsPhaseToString(int phase)
 }
 
 VIR_ENUM_DECL(virshGraphicsAddress);
-VIR_ENUM_IMPL(virshGraphicsAddress,
+VIR_ENUM_IMPL(virshGraphicsAddress, NULL,
               VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_LAST,
               N_("IPv4"),
               N_("IPv6"),
@@ -12931,7 +12931,7 @@  virshGraphicsAddressToString(int family)
 }
 
 VIR_ENUM_DECL(virshDomainBlockJobStatus);
-VIR_ENUM_IMPL(virshDomainBlockJobStatus,
+VIR_ENUM_IMPL(virshDomainBlockJobStatus, NULL,
               VIR_DOMAIN_BLOCK_JOB_LAST,
               N_("completed"),
               N_("failed"),
@@ -12946,7 +12946,7 @@  virshDomainBlockJobStatusToString(int status)
 }
 
 VIR_ENUM_DECL(virshDomainEventDiskChange);
-VIR_ENUM_IMPL(virshDomainEventDiskChange,
+VIR_ENUM_IMPL(virshDomainEventDiskChange, NULL,
               VIR_DOMAIN_EVENT_DISK_CHANGE_LAST,
               N_("changed"),
               N_("dropped"));
@@ -12959,7 +12959,7 @@  virshDomainEventDiskChangeToString(int reason)
 }
 
 VIR_ENUM_DECL(virshDomainEventTrayChange);
-VIR_ENUM_IMPL(virshDomainEventTrayChange,
+VIR_ENUM_IMPL(virshDomainEventTrayChange, NULL,
               VIR_DOMAIN_EVENT_TRAY_CHANGE_LAST,
               N_("opened"),
               N_("closed"));
@@ -13283,14 +13283,14 @@  virshEventTunablePrint(virConnectPtr conn ATTRIBUTE_UNUSED,
 }
 
 VIR_ENUM_DECL(virshEventAgentLifecycleState);
-VIR_ENUM_IMPL(virshEventAgentLifecycleState,
+VIR_ENUM_IMPL(virshEventAgentLifecycleState, NULL,
               VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_LAST,
               N_("unknown"),
               N_("connected"),
               N_("disconnected"));
 
 VIR_ENUM_DECL(virshEventAgentLifecycleReason);
-VIR_ENUM_IMPL(virshEventAgentLifecycleReason,
+VIR_ENUM_IMPL(virshEventAgentLifecycleReason, NULL,
               VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_LAST,
               N_("unknown"),
               N_("domain started"),
@@ -13369,7 +13369,7 @@  virshEventDeviceRemovalFailedPrint(virConnectPtr conn ATTRIBUTE_UNUSED,
 }
 
 VIR_ENUM_DECL(virshEventMetadataChangeType);
-VIR_ENUM_IMPL(virshEventMetadataChangeType,
+VIR_ENUM_IMPL(virshEventMetadataChangeType, NULL,
               VIR_DOMAIN_METADATA_LAST,
               N_("description"),
               N_("title"),
diff --git a/tools/virsh-host.c b/tools/virsh-host.c
index da269f4c4c..596c9f759b 100644
--- a/tools/virsh-host.c
+++ b/tools/virsh-host.c
@@ -774,7 +774,7 @@  typedef enum {
 } virshCPUStats;
 
 VIR_ENUM_DECL(virshCPUStats);
-VIR_ENUM_IMPL(virshCPUStats,
+VIR_ENUM_IMPL(virshCPUStats, NULL,
               VIRSH_CPU_LAST,
               VIR_NODE_CPU_STATS_USER,
               VIR_NODE_CPU_STATS_KERNEL,
diff --git a/tools/virsh-network.c b/tools/virsh-network.c
index 14bf9a144f..766ec50e0e 100644
--- a/tools/virsh-network.c
+++ b/tools/virsh-network.c
@@ -906,12 +906,12 @@  static const vshCmdOptDef opts_network_update[] = {
 };
 
 VIR_ENUM_DECL(virNetworkUpdateCommand);
-VIR_ENUM_IMPL(virNetworkUpdateCommand,
+VIR_ENUM_IMPL(virNetworkUpdateCommand, NULL,
               VIR_NETWORK_UPDATE_COMMAND_LAST,
               "none", "modify", "delete", "add-last", "add-first");
 
 VIR_ENUM_DECL(virNetworkSection);
-VIR_ENUM_IMPL(virNetworkSection,
+VIR_ENUM_IMPL(virNetworkSection, NULL,
               VIR_NETWORK_SECTION_LAST,
               "none", "bridge", "domain", "ip", "ip-dhcp-host",
               "ip-dhcp-range", "forward", "forward-interface",
@@ -1140,7 +1140,7 @@  cmdNetworkEdit(vshControl *ctl, const vshCmd *cmd)
  * "net-event" command
  */
 VIR_ENUM_DECL(virshNetworkEvent);
-VIR_ENUM_IMPL(virshNetworkEvent,
+VIR_ENUM_IMPL(virshNetworkEvent, NULL,
               VIR_NETWORK_EVENT_LAST,
               N_("Defined"),
               N_("Undefined"),
@@ -1164,7 +1164,7 @@  struct virshNetEventData {
 typedef struct virshNetEventData virshNetEventData;
 
 VIR_ENUM_DECL(virshNetworkEventId);
-VIR_ENUM_IMPL(virshNetworkEventId,
+VIR_ENUM_IMPL(virshNetworkEventId, NULL,
               VIR_NETWORK_EVENT_ID_LAST,
               "lifecycle");
 
diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c
index 0dfefe3a2f..3968ce63f2 100644
--- a/tools/virsh-nodedev.c
+++ b/tools/virsh-nodedev.c
@@ -757,7 +757,7 @@  cmdNodeDeviceReset(vshControl *ctl, const vshCmd *cmd)
  * "nodedev-event" command
  */
 VIR_ENUM_DECL(virshNodeDeviceEvent);
-VIR_ENUM_IMPL(virshNodeDeviceEvent,
+VIR_ENUM_IMPL(virshNodeDeviceEvent, NULL,
               VIR_NODE_DEVICE_EVENT_LAST,
               N_("Created"),
               N_("Deleted"));
diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
index c56ab2d90a..51e7ba107e 100644
--- a/tools/virsh-pool.c
+++ b/tools/virsh-pool.c
@@ -1039,7 +1039,7 @@  virshStoragePoolListCollect(vshControl *ctl,
 
 
 VIR_ENUM_DECL(virshStoragePoolState);
-VIR_ENUM_IMPL(virshStoragePoolState,
+VIR_ENUM_IMPL(virshStoragePoolState, NULL,
               VIR_STORAGE_POOL_STATE_LAST,
               N_("inactive"),
               N_("building"),
@@ -1890,7 +1890,7 @@  cmdPoolEdit(vshControl *ctl, const vshCmd *cmd)
  * "pool-event" command
  */
 VIR_ENUM_DECL(virshPoolEvent);
-VIR_ENUM_IMPL(virshPoolEvent,
+VIR_ENUM_IMPL(virshPoolEvent, NULL,
               VIR_STORAGE_POOL_EVENT_LAST,
               N_("Defined"),
               N_("Undefined"),
diff --git a/tools/virsh-secret.c b/tools/virsh-secret.c
index b34ae12bbe..52ec392e79 100644
--- a/tools/virsh-secret.c
+++ b/tools/virsh-secret.c
@@ -566,7 +566,7 @@  cmdSecretList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
  * "Secret-event" command
  */
 VIR_ENUM_DECL(virshSecretEvent);
-VIR_ENUM_IMPL(virshSecretEvent,
+VIR_ENUM_IMPL(virshSecretEvent, NULL,
               VIR_SECRET_EVENT_LAST,
               N_("Defined"),
               N_("Undefined"));
diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c
index 97803b21be..cc576ed8e4 100644
--- a/tools/virsh-volume.c
+++ b/tools/virsh-volume.c
@@ -937,7 +937,7 @@  static const vshCmdOptDef opts_vol_wipe[] = {
 };
 
 VIR_ENUM_DECL(virStorageVolWipeAlgorithm);
-VIR_ENUM_IMPL(virStorageVolWipeAlgorithm,
+VIR_ENUM_IMPL(virStorageVolWipeAlgorithm, NULL,
               VIR_STORAGE_VOL_WIPE_ALG_LAST,
               "zero", "nnsa", "dod", "bsi", "gutmann", "schneier",
               "pfitzner7", "pfitzner33", "random", "trim");
@@ -984,7 +984,7 @@  cmdVolWipe(vshControl *ctl, const vshCmd *cmd)
 
 
 VIR_ENUM_DECL(virshStorageVol);
-VIR_ENUM_IMPL(virshStorageVol,
+VIR_ENUM_IMPL(virshStorageVol, NULL,
               VIR_STORAGE_VOL_LAST,
               N_("file"),
               N_("block"),
diff --git a/tools/virt-admin.c b/tools/virt-admin.c
index 4ff006ffcb..a4f9ad2b8b 100644
--- a/tools/virt-admin.c
+++ b/tools/virt-admin.c
@@ -56,7 +56,7 @@  static const vshCmdGrp cmdGroups[];
 static const vshClientHooks hooks;
 
 VIR_ENUM_DECL(virClientTransport);
-VIR_ENUM_IMPL(virClientTransport,
+VIR_ENUM_IMPL(virClientTransport, NULL,
               VIR_CLIENT_TRANS_LAST,
               N_("unix"),
               N_("tcp"),
diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
index 804c0adc2d..49b08677fb 100644
--- a/tools/virt-host-validate-common.c
+++ b/tools/virt-host-validate-common.c
@@ -35,7 +35,7 @@ 
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
-VIR_ENUM_IMPL(virHostValidateCPUFlag,
+VIR_ENUM_IMPL(virHostValidateCPUFlag, NULL,
               VIR_HOST_VALIDATE_CPU_FLAG_LAST,
               "vmx",
               "svm",