From: Philippe Mathieu-Daudé <philmd@linaro.org>
Move compat properties API definitions to their own file
unit, compile it only when system emulation is configured.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Michael Tokarev <mjt@tls.msk.ru>
---
qom/compat-properties.c | 116 ++++++++++++++++++++++++++++++++++++++++
qom/meson.build | 3 ++
qom/object.c | 100 ----------------------------------
3 files changed, 119 insertions(+), 100 deletions(-)
create mode 100644 qom/compat-properties.c
diff --git a/qom/compat-properties.c b/qom/compat-properties.c
new file mode 100644
index 0000000000..f8d9b0036a
--- /dev/null
+++ b/qom/compat-properties.c
@@ -0,0 +1,116 @@
+/*
+ * QEMU Object Model
+ *
+ * Copyright IBM, Corp. 2011
+ *
+ * Authors:
+ * Anthony Liguori <aliguori@us.ibm.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "qapi/error.h"
+#include "qom/compat-properties.h"
+#include "qom/qom-qobject.h"
+#include "hw/core/qdev.h"
+
+bool object_apply_global_props(Object *obj, const GPtrArray *props,
+ Error **errp)
+{
+ int i;
+
+ if (!props) {
+ return true;
+ }
+
+ for (i = 0; i < props->len; i++) {
+ GlobalProperty *p = g_ptr_array_index(props, i);
+ Error *err = NULL;
+
+ if (object_dynamic_cast(obj, p->driver) == NULL) {
+ continue;
+ }
+ if (p->optional && !object_property_find(obj, p->property)) {
+ continue;
+ }
+ p->used = true;
+ if (!object_property_parse(obj, p->property, p->value, &err)) {
+ error_prepend(&err, "can't apply global %s.%s=%s: ",
+ p->driver, p->property, p->value);
+ /*
+ * If errp != NULL, propagate error and return.
+ * If errp == NULL, report a warning, but keep going
+ * with the remaining globals.
+ */
+ if (errp) {
+ error_propagate(errp, err);
+ return false;
+ } else {
+ warn_report_err(err);
+ }
+ }
+ }
+
+ return true;
+}
+
+/*
+ * Global property defaults
+ * Slot 0: accelerator's global property defaults
+ * Slot 1: machine's global property defaults
+ * Slot 2: global properties from legacy command line option
+ * Each is a GPtrArray of GlobalProperty.
+ * Applied in order, later entries override earlier ones.
+ */
+static GPtrArray *object_compat_props[3];
+
+/*
+ * Retrieve @GPtrArray for global property defined with options
+ * other than "-global". These are generally used for syntactic
+ * sugar and legacy command line options.
+ */
+void object_register_sugar_prop(const char *driver, const char *prop,
+ const char *value, bool optional)
+{
+ GlobalProperty *g;
+ if (!object_compat_props[2]) {
+ object_compat_props[2] = g_ptr_array_new();
+ }
+ g = g_new0(GlobalProperty, 1);
+ g->driver = g_strdup(driver);
+ g->property = g_strdup(prop);
+ g->value = g_strdup(value);
+ g->optional = optional;
+ g_ptr_array_add(object_compat_props[2], g);
+}
+
+/*
+ * Set machine's global property defaults to @compat_props.
+ * May be called at most once.
+ */
+void object_set_machine_compat_props(GPtrArray *compat_props)
+{
+ assert(!object_compat_props[1]);
+ object_compat_props[1] = compat_props;
+}
+
+/*
+ * Set accelerator's global property defaults to @compat_props.
+ * May be called at most once.
+ */
+void object_set_accelerator_compat_props(GPtrArray *compat_props)
+{
+ assert(!object_compat_props[0]);
+ object_compat_props[0] = compat_props;
+}
+
+void object_apply_compat_props(Object *obj)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(object_compat_props); i++) {
+ object_apply_global_props(obj, object_compat_props[i],
+ i == 2 ? &error_fatal : &error_abort);
+ }
+}
diff --git a/qom/meson.build b/qom/meson.build
index 8192243430..bd6f4aadd7 100644
--- a/qom/meson.build
+++ b/qom/meson.build
@@ -5,6 +5,9 @@ qom_ss.add(files(
'object_interfaces.c',
'qom-qobject.c',
))
+if have_system
+ qom_ss.add(files('compat-properties.c'))
+endif
qmp_ss.add(files('qom-qmp-cmds.c'))
system_ss.add(files('qom-hmp-cmds.c'))
diff --git a/qom/object.c b/qom/object.c
index 838b1d2b22..f00d659ef0 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -440,106 +440,6 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
}
}
-bool object_apply_global_props(Object *obj, const GPtrArray *props,
- Error **errp)
-{
- int i;
-
- if (!props) {
- return true;
- }
-
- for (i = 0; i < props->len; i++) {
- GlobalProperty *p = g_ptr_array_index(props, i);
- Error *err = NULL;
-
- if (object_dynamic_cast(obj, p->driver) == NULL) {
- continue;
- }
- if (p->optional && !object_property_find(obj, p->property)) {
- continue;
- }
- p->used = true;
- if (!object_property_parse(obj, p->property, p->value, &err)) {
- error_prepend(&err, "can't apply global %s.%s=%s: ",
- p->driver, p->property, p->value);
- /*
- * If errp != NULL, propagate error and return.
- * If errp == NULL, report a warning, but keep going
- * with the remaining globals.
- */
- if (errp) {
- error_propagate(errp, err);
- return false;
- } else {
- warn_report_err(err);
- }
- }
- }
-
- return true;
-}
-
-/*
- * Global property defaults
- * Slot 0: accelerator's global property defaults
- * Slot 1: machine's global property defaults
- * Slot 2: global properties from legacy command line option
- * Each is a GPtrArray of GlobalProperty.
- * Applied in order, later entries override earlier ones.
- */
-static GPtrArray *object_compat_props[3];
-
-/*
- * Retrieve @GPtrArray for global property defined with options
- * other than "-global". These are generally used for syntactic
- * sugar and legacy command line options.
- */
-void object_register_sugar_prop(const char *driver, const char *prop,
- const char *value, bool optional)
-{
- GlobalProperty *g;
- if (!object_compat_props[2]) {
- object_compat_props[2] = g_ptr_array_new();
- }
- g = g_new0(GlobalProperty, 1);
- g->driver = g_strdup(driver);
- g->property = g_strdup(prop);
- g->value = g_strdup(value);
- g->optional = optional;
- g_ptr_array_add(object_compat_props[2], g);
-}
-
-/*
- * Set machine's global property defaults to @compat_props.
- * May be called at most once.
- */
-void object_set_machine_compat_props(GPtrArray *compat_props)
-{
- assert(!object_compat_props[1]);
- object_compat_props[1] = compat_props;
-}
-
-/*
- * Set accelerator's global property defaults to @compat_props.
- * May be called at most once.
- */
-void object_set_accelerator_compat_props(GPtrArray *compat_props)
-{
- assert(!object_compat_props[0]);
- object_compat_props[0] = compat_props;
-}
-
-void object_apply_compat_props(Object *obj)
-{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(object_compat_props); i++) {
- object_apply_global_props(obj, object_compat_props[i],
- i == 2 ? &error_fatal : &error_abort);
- }
-}
-
static void object_class_property_init_all(Object *obj)
{
ObjectPropertyIterator iter;
--
2.47.3
On 03.04.2026 13:43, Michael Tokarev wrote:
> From: Philippe Mathieu-Daudé <philmd@linaro.org>
>
> Move compat properties API definitions to their own file
> unit, compile it only when system emulation is configured.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> Reviewed-by: Michael Tokarev <mjt@tls.msk.ru>
This one breaks user-only build on a few architectures:
https://buildd.debian.org/status/fetch.php?pkg=qemu&arch=amd64&ver=1%3A11.0.0%7Erc2%2Bds-1&stamp=1775233181&raw=0
https://buildd.debian.org/status/fetch.php?pkg=qemu&arch=amd64&ver=1%3A11.0.0%7Erc2%2Bds-1&stamp=1775233181&raw=0
https://buildd.debian.org/status/fetch.php?pkg=qemu&arch=ppc64el&ver=1%3A11.0.0%7Erc2%2Bds-1&stamp=1775233277&raw=0
cc -m64 -o qemu-aarch64 libcommon.a.p/accel_accel-common.c.o
libcommon.a.p/hw_core_cpu-common.c.o
libcommon.a.p/hw_core_machine-smp.c.o libcommon.a.p/cpu-common.c.o
libcommon.a.p/page-vary-common.c.o libcommon.a.p/target-info.c.o
libcommon.a.p/disas_capstone.c.o libcommon.a.p/disas_disas-host.c.o
libcommon.a.p/disas_disas-target.c.o libcommon.a.p/disas_objdump.c.o
libcommon.a.p/disas_disas-common.c.o libcommon.a.p/fpu_softfloat.c.o
libcommon.a.p/meson-generated_.._gdbstub_gdbstub-xml.c.o
libcommon_arm.a.p/target_arm_mmuidx.c.o
libcommon_arm.a.p/target_arm_tcg_arith_helper.c.o
libcommon_arm.a.p/target_arm_tcg_crypto_helper.c.o
libuser.a.p/semihosting_user.c.o libuser.a.p/semihosting_guestfd.c.o
libuser.a.p/accel_accel-user.c.o libuser.a.p/accel_tcg_cpu-exec.c.o
libuser.a.p/accel_tcg_cpu-exec-common.c.o
libuser.a.p/accel_tcg_tcg-runtime.c.o
libuser.a.p/accel_tcg_tcg-runtime-gvec.c.o
libuser.a.p/accel_tcg_tb-maint.c.o libuser.a.p/accel_tcg_tcg-all.c.o
libuser.a.p/accel_tcg_tcg-stats.c.o
libuser.a.p/accel_tcg_translate-all.c.o
libuser.a.p/accel_tcg_translator.c.o libuser.a.p/accel_tcg_user-exec.c.o
libuser.a.p/accel_tcg_user-exec-stub.c.o
libuser.a.p/hw_core_cpu-user.c.o libuser.a.p/hw_core_qdev-user.c.o
libuser.a.p/gdbstub_gdbstub.c.o libuser.a.p/gdbstub_syscalls.c.o
libuser.a.p/gdbstub_user.c.o libuser.a.p/cpu-target.c.o
libuser.a.p/tcg_optimize.c.o libuser.a.p/tcg_region.c.o
libuser.a.p/tcg_tcg.c.o libuser.a.p/tcg_tcg-common.c.o
libuser.a.p/tcg_tcg-op.c.o libuser.a.p/tcg_tcg-op-ldst.c.o
libuser.a.p/tcg_tcg-op-gvec.c.o libuser.a.p/tcg_tcg-op-vec.c.o
libuser.a.p/tcg_perf.c.o libuser.a.p/common-user_safe-syscall.S.o
libuser.a.p/common-user_safe-syscall-error.c.o
libqemu-aarch64-linux-user.a.p/target_arm_gdbstub.c.o
libqemu-aarch64-linux-user.a.p/target_arm_cpu.c.o
libqemu-aarch64-linux-user.a.p/target_arm_cpregs-gcs.c.o
libqemu-aarch64-linux-user.a.p/target_arm_cpregs-pmu.c.o
libqemu-aarch64-linux-user.a.p/target_arm_debug_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_vfp_fpscr.c.o
libqemu-aarch64-linux-user.a.p/target_arm_el2-stubs.c.o
libqemu-aarch64-linux-user.a.p/target_arm_common-semi-target.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_debug.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_hflags.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_neon_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_tlb_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_vec_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_vfp_helper.c.o
libqemu-aarch64-linux-user.a.p/linux-user_aarch64_cpu_loop.c.o
libqemu-aarch64-linux-user.a.p/linux-user_aarch64_elfload.c.o
libqemu-aarch64-linux-user.a.p/linux-user_aarch64_signal.c.o
libqemu-aarch64-linux-user.a.p/target-info-stub.c.o
libqemu-aarch64-linux-user.a.p/target_arm_cpu64.c.o
libqemu-aarch64-linux-user.a.p/target_arm_gdbstub64.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_cpu32.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_gengvec.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_translate.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_translate-m-nocp.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_translate-mve.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_translate-neon.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_translate-vfp.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_m_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_mve_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_op_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_cpu64.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_gengvec64.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_translate-a64.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_translate-sve.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_translate-sme.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_helper-a64.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_mte_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_pauth_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_sme_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_sve_helper.c.o
libqemu-aarch64-linux-user.a.p/target_arm_tcg_vec_helper64.c.o
libqemu-aarch64-linux-user.a.p/semihosting_syscalls.c.o
libqemu-aarch64-linux-user.a.p/semihosting_arm-compat-semi.c.o
libqemu-aarch64-linux-user.a.p/accel_accel-target.c.o
libqemu-aarch64-linux-user.a.p/gdbstub_user-target.c.o
libqemu-aarch64-linux-user.a.p/linux-user_elfload.c.o
libqemu-aarch64-linux-user.a.p/linux-user_exit.c.o
libqemu-aarch64-linux-user.a.p/linux-user_fd-trans.c.o
libqemu-aarch64-linux-user.a.p/linux-user_linuxload.c.o
libqemu-aarch64-linux-user.a.p/linux-user_main.c.o
libqemu-aarch64-linux-user.a.p/linux-user_mmap.c.o
libqemu-aarch64-linux-user.a.p/linux-user_signal.c.o
libqemu-aarch64-linux-user.a.p/linux-user_strace.c.o
libqemu-aarch64-linux-user.a.p/linux-user_syscall.c.o
libqemu-aarch64-linux-user.a.p/linux-user_thunk.c.o
libqemu-aarch64-linux-user.a.p/linux-user_uaccess.c.o
libqemu-aarch64-linux-user.a.p/linux-user_uname.c.o
libqemu-aarch64-linux-user.a.p/linux-user_flatload.c.o
libqemu-aarch64-linux-user.a.p/linux-user_semihost.c.o
libqemu-aarch64-linux-user.a.p/linux-user_aarch64_mte_user_helper.c.o
libhwcore.a.p/hw_core_bus.c.o libhwcore.a.p/hw_core_gpio.c.o
libhwcore.a.p/hw_core_qdev-properties.c.o libhwcore.a.p/hw_core_qdev.c.o
libhwcore.a.p/hw_core_resetcontainer.c.o
libhwcore.a.p/hw_core_resettable.c.o
libhwcore.a.p/hw_core_vmstate-if.c.o libhwcore.a.p/hw_core_irq.c.o
libhwcore.a.p/hw_core_clock.c.o libhwcore.a.p/hw_core_qdev-clock.c.o
libqom.a.p/qom_container.c.o libqom.a.p/qom_object.c.o
libqom.a.p/qom_object_interfaces.c.o libqom.a.p/qom_qom-qobject.c.o
libevent-loop-base.a.p/event-loop-base.c.o -Wl,--as-needed
-Wl,--no-undefined -pie -static-pie -fstack-protector-strong
-Wl,-z,relro -Wl,-z,now -g -O2 -Werror=implicit-function-declaration
'-ffile-prefix-map=/build/reproducible-path/qemu-11.0.0~rc2+ds=.'
-fstack-protector-strong -fstack-clash-protection -Wformat
-Werror=format-security -fcf-protection -ffile-prefix-map=../../=
-Wdate-time -D_FORTIFY_SOURCE=2 -DPROVIDE_STUBS_FOR_STATIC -Wl,-z,relro
-Wl,--as-needed -Wl,-Map=%.map,--no-print-map-discarded
-Wl,--start-group libqemuutil.a /usr/lib/x86_64-linux-gnu/libcapstone.a
/usr/lib/x86_64-linux-gnu/libz.a -lm -pthread
/usr/lib/x86_64-linux-gnu/libglib-2.0.a
/usr/lib/gcc/x86_64-linux-gnu/15/libatomic.a
/usr/lib/x86_64-linux-gnu/libsysprof-capture-4.a -Wl,-z,nodelete
/usr/lib/x86_64-linux-gnu/libpcre2-8.a -Wl,--end-group
/usr/bin/x86_64-linux-gnu-ld.bfd:
libhwcore.a.p/hw_core_qdev-properties.c.o: in function
`qdev_prop_set_globals':
./b/user/hw/core/qdev-properties.c:1021:(.text+0x1913): undefined
reference to `object_apply_global_props'
/usr/bin/x86_64-linux-gnu-ld.bfd:
./b/user/hw/core/qdev-properties.c:1021:(.text+0x194a): undefined
reference to `object_apply_global_props'
/usr/bin/x86_64-linux-gnu-ld.bfd: libhwcore.a.p/hw_core_qdev.c.o: in
function `device_post_init':
./b/user/hw/core/qdev.c:689:(.text+0x3ee): undefined reference to
`object_apply_compat_props'
collect2: error: ld returned 1 exit status
[1743/1778] cc -m64 -o qemu-aarch64_be
libcommon.a.p/accel_accel-common.c.o
libcommon.a.p/hw_core_cpu-common.c.o
libcommon.a.p/hw_core_machine-smp.c.o libcommon.a.p/cpu-common.c.o
libcommon.a.p/page-vary-common.c.o libcommon.a.p/target-info.c.o
libcommon.a.p/disas_capstone.c.o libcommon.a.p/disas_disas-host.c.o
libcommon.a.p/disas_disas-target.c.o libcommon.a.p/disas_objdump.c.o
libcommon.a.p/disas_disas-common.c.o libcommon.a.p/fpu_softfloat.c.o
libcommon.a.p/meson-generated_.._gdbstub_gdbstub-xml.c.o
libcommon_arm.a.p/target_arm_mmuidx.c.o
libcommon_arm.a.p/target_arm_tcg_arith_helper.c.o
libcommon_arm.a.p/target_arm_tcg_crypto_helper.c.o
libuser.a.p/semihosting_user.c.o libuser.a.p/semihosting_guestfd.c.o
libuser.a.p/accel_accel-user.c.o libuser.a.p/accel_tcg_cpu-exec.c.o
libuser.a.p/accel_tcg_cpu-exec-common.c.o
libuser.a.p/accel_tcg_tcg-runtime.c.o
libuser.a.p/accel_tcg_tcg-runtime-gvec.c.o
libuser.a.p/accel_tcg_tb-maint.c.o libuser.a.p/accel_tcg_tcg-all.c.o
libuser.a.p/accel_tcg_tcg-stats.c.o
libuser.a.p/accel_tcg_translate-all.c.o
libuser.a.p/accel_tcg_translator.c.o libuser.a.p/accel_tcg_user-exec.c.o
libuser.a.p/accel_tcg_user-exec-stub.c.o
libuser.a.p/hw_core_cpu-user.c.o libuser.a.p/hw_core_qdev-user.c.o
libuser.a.p/gdbstub_gdbstub.c.o libuser.a.p/gdbstub_syscalls.c.o
libuser.a.p/gdbstub_user.c.o libuser.a.p/cpu-target.c.o
libuser.a.p/tcg_optimize.c.o libuser.a.p/tcg_region.c.o
libuser.a.p/tcg_tcg.c.o libuser.a.p/tcg_tcg-common.c.o
libuser.a.p/tcg_tcg-op.c.o libuser.a.p/tcg_tcg-op-ldst.c.o
libuser.a.p/tcg_tcg-op-gvec.c.o libuser.a.p/tcg_tcg-op-vec.c.o
libuser.a.p/tcg_perf.c.o libuser.a.p/common-user_safe-syscall.S.o
libuser.a.p/common-user_safe-syscall-error.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_gdbstub.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_cpu.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_cpregs-gcs.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_cpregs-pmu.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_debug_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_vfp_fpscr.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_el2-stubs.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_common-semi-target.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_debug.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_hflags.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_neon_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_tlb_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_vec_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_vfp_helper.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_aarch64_cpu_loop.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_aarch64_elfload.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_aarch64_signal.c.o
libqemu-aarch64_be-linux-user.a.p/target-info-stub.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_cpu64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_gdbstub64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_cpu32.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_gengvec.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-m-nocp.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-mve.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-neon.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-vfp.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_m_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_mve_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_op_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_cpu64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_gengvec64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-a64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-sve.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-sme.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_helper-a64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_mte_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_pauth_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_sme_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_sve_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_vec_helper64.c.o
libqemu-aarch64_be-linux-user.a.p/semihosting_syscalls.c.o
libqemu-aarch64_be-linux-user.a.p/semihosting_arm-compat-semi.c.o
libqemu-aarch64_be-linux-user.a.p/accel_accel-target.c.o
libqemu-aarch64_be-linux-user.a.p/gdbstub_user-target.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_elfload.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_exit.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_fd-trans.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_linuxload.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_main.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_mmap.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_signal.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_strace.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_syscall.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_thunk.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_uaccess.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_uname.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_flatload.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_semihost.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_aarch64_mte_user_helper.c.o
libhwcore.a.p/hw_core_bus.c.o libhwcore.a.p/hw_core_gpio.c.o
libhwcore.a.p/hw_core_qdev-properties.c.o libhwcore.a.p/hw_core_qdev.c.o
libhwcore.a.p/hw_core_resetcontainer.c.o
libhwcore.a.p/hw_core_resettable.c.o
libhwcore.a.p/hw_core_vmstate-if.c.o libhwcore.a.p/hw_core_irq.c.o
libhwcore.a.p/hw_core_clock.c.o libhwcore.a.p/hw_core_qdev-clock.c.o
libqom.a.p/qom_container.c.o libqom.a.p/qom_object.c.o
libqom.a.p/qom_object_interfaces.c.o libqom.a.p/qom_qom-qobject.c.o
libevent-loop-base.a.p/event-loop-base.c.o -Wl,--as-needed
-Wl,--no-undefined -pie -static-pie -fstack-protector-strong
-Wl,-z,relro -Wl,-z,now -g -O2 -Werror=implicit-function-declaration
'-ffile-prefix-map=/build/reproducible-path/qemu-11.0.0~rc2+ds=.'
-fstack-protector-strong -fstack-clash-protection -Wformat
-Werror=format-security -fcf-protection -ffile-prefix-map=../../=
-Wdate-time -D_FORTIFY_SOURCE=2 -DPROVIDE_STUBS_FOR_STATIC -Wl,-z,relro
-Wl,--as-needed -Wl,-Map=%.map,--no-print-map-discarded
-Wl,--start-group libqemuutil.a /usr/lib/x86_64-linux-gnu/libcapstone.a
/usr/lib/x86_64-linux-gnu/libz.a -lm -pthread
/usr/lib/x86_64-linux-gnu/libglib-2.0.a
/usr/lib/gcc/x86_64-linux-gnu/15/libatomic.a
/usr/lib/x86_64-linux-gnu/libsysprof-capture-4.a -Wl,-z,nodelete
/usr/lib/x86_64-linux-gnu/libpcre2-8.a -Wl,--end-group
FAILED: [code=1] qemu-aarch64_be
cc -m64 -o qemu-aarch64_be libcommon.a.p/accel_accel-common.c.o
libcommon.a.p/hw_core_cpu-common.c.o
libcommon.a.p/hw_core_machine-smp.c.o libcommon.a.p/cpu-common.c.o
libcommon.a.p/page-vary-common.c.o libcommon.a.p/target-info.c.o
libcommon.a.p/disas_capstone.c.o libcommon.a.p/disas_disas-host.c.o
libcommon.a.p/disas_disas-target.c.o libcommon.a.p/disas_objdump.c.o
libcommon.a.p/disas_disas-common.c.o libcommon.a.p/fpu_softfloat.c.o
libcommon.a.p/meson-generated_.._gdbstub_gdbstub-xml.c.o
libcommon_arm.a.p/target_arm_mmuidx.c.o
libcommon_arm.a.p/target_arm_tcg_arith_helper.c.o
libcommon_arm.a.p/target_arm_tcg_crypto_helper.c.o
libuser.a.p/semihosting_user.c.o libuser.a.p/semihosting_guestfd.c.o
libuser.a.p/accel_accel-user.c.o libuser.a.p/accel_tcg_cpu-exec.c.o
libuser.a.p/accel_tcg_cpu-exec-common.c.o
libuser.a.p/accel_tcg_tcg-runtime.c.o
libuser.a.p/accel_tcg_tcg-runtime-gvec.c.o
libuser.a.p/accel_tcg_tb-maint.c.o libuser.a.p/accel_tcg_tcg-all.c.o
libuser.a.p/accel_tcg_tcg-stats.c.o
libuser.a.p/accel_tcg_translate-all.c.o
libuser.a.p/accel_tcg_translator.c.o libuser.a.p/accel_tcg_user-exec.c.o
libuser.a.p/accel_tcg_user-exec-stub.c.o
libuser.a.p/hw_core_cpu-user.c.o libuser.a.p/hw_core_qdev-user.c.o
libuser.a.p/gdbstub_gdbstub.c.o libuser.a.p/gdbstub_syscalls.c.o
libuser.a.p/gdbstub_user.c.o libuser.a.p/cpu-target.c.o
libuser.a.p/tcg_optimize.c.o libuser.a.p/tcg_region.c.o
libuser.a.p/tcg_tcg.c.o libuser.a.p/tcg_tcg-common.c.o
libuser.a.p/tcg_tcg-op.c.o libuser.a.p/tcg_tcg-op-ldst.c.o
libuser.a.p/tcg_tcg-op-gvec.c.o libuser.a.p/tcg_tcg-op-vec.c.o
libuser.a.p/tcg_perf.c.o libuser.a.p/common-user_safe-syscall.S.o
libuser.a.p/common-user_safe-syscall-error.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_gdbstub.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_cpu.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_cpregs-gcs.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_cpregs-pmu.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_debug_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_vfp_fpscr.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_el2-stubs.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_common-semi-target.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_debug.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_hflags.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_neon_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_tlb_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_vec_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_vfp_helper.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_aarch64_cpu_loop.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_aarch64_elfload.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_aarch64_signal.c.o
libqemu-aarch64_be-linux-user.a.p/target-info-stub.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_cpu64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_gdbstub64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_cpu32.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_gengvec.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-m-nocp.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-mve.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-neon.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-vfp.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_m_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_mve_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_op_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_cpu64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_gengvec64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-a64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-sve.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_translate-sme.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_helper-a64.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_mte_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_pauth_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_sme_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_sve_helper.c.o
libqemu-aarch64_be-linux-user.a.p/target_arm_tcg_vec_helper64.c.o
libqemu-aarch64_be-linux-user.a.p/semihosting_syscalls.c.o
libqemu-aarch64_be-linux-user.a.p/semihosting_arm-compat-semi.c.o
libqemu-aarch64_be-linux-user.a.p/accel_accel-target.c.o
libqemu-aarch64_be-linux-user.a.p/gdbstub_user-target.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_elfload.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_exit.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_fd-trans.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_linuxload.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_main.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_mmap.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_signal.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_strace.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_syscall.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_thunk.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_uaccess.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_uname.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_flatload.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_semihost.c.o
libqemu-aarch64_be-linux-user.a.p/linux-user_aarch64_mte_user_helper.c.o
libhwcore.a.p/hw_core_bus.c.o libhwcore.a.p/hw_core_gpio.c.o
libhwcore.a.p/hw_core_qdev-properties.c.o libhwcore.a.p/hw_core_qdev.c.o
libhwcore.a.p/hw_core_resetcontainer.c.o
libhwcore.a.p/hw_core_resettable.c.o
libhwcore.a.p/hw_core_vmstate-if.c.o libhwcore.a.p/hw_core_irq.c.o
libhwcore.a.p/hw_core_clock.c.o libhwcore.a.p/hw_core_qdev-clock.c.o
libqom.a.p/qom_container.c.o libqom.a.p/qom_object.c.o
libqom.a.p/qom_object_interfaces.c.o libqom.a.p/qom_qom-qobject.c.o
libevent-loop-base.a.p/event-loop-base.c.o -Wl,--as-needed
-Wl,--no-undefined -pie -static-pie -fstack-protector-strong
-Wl,-z,relro -Wl,-z,now -g -O2 -Werror=implicit-function-declaration
'-ffile-prefix-map=/build/reproducible-path/qemu-11.0.0~rc2+ds=.'
-fstack-protector-strong -fstack-clash-protection -Wformat
-Werror=format-security -fcf-protection -ffile-prefix-map=../../=
-Wdate-time -D_FORTIFY_SOURCE=2 -DPROVIDE_STUBS_FOR_STATIC -Wl,-z,relro
-Wl,--as-needed -Wl,-Map=%.map,--no-print-map-discarded
-Wl,--start-group libqemuutil.a /usr/lib/x86_64-linux-gnu/libcapstone.a
/usr/lib/x86_64-linux-gnu/libz.a -lm -pthread
/usr/lib/x86_64-linux-gnu/libglib-2.0.a
/usr/lib/gcc/x86_64-linux-gnu/15/libatomic.a
/usr/lib/x86_64-linux-gnu/libsysprof-capture-4.a -Wl,-z,nodelete
/usr/lib/x86_64-linux-gnu/libpcre2-8.a -Wl,--end-group
/usr/bin/x86_64-linux-gnu-ld.bfd:
libhwcore.a.p/hw_core_qdev-properties.c.o: in function
`qdev_prop_set_globals':
./b/user/hw/core/qdev-properties.c:1021:(.text+0x1913): undefined
reference to `object_apply_global_props'
/usr/bin/x86_64-linux-gnu-ld.bfd:
./b/user/hw/core/qdev-properties.c:1021:(.text+0x194a): undefined
reference to `object_apply_global_props'
/usr/bin/x86_64-linux-gnu-ld.bfd: libhwcore.a.p/hw_core_qdev.c.o: in
function `device_post_init':
./b/user/hw/core/qdev.c:689:(.text+0x3ee): undefined reference to
`object_apply_compat_props'
collect2: error: ld returned 1 exit status
So apparently something else is needed here.
It looks like this patchset is a bit more difficult.
I'll dig deeper.
Thnks,
/mjt
> ---
> qom/compat-properties.c | 116 ++++++++++++++++++++++++++++++++++++++++
> qom/meson.build | 3 ++
> qom/object.c | 100 ----------------------------------
> 3 files changed, 119 insertions(+), 100 deletions(-)
> create mode 100644 qom/compat-properties.c
>
> diff --git a/qom/compat-properties.c b/qom/compat-properties.c
> new file mode 100644
> index 0000000000..f8d9b0036a
> --- /dev/null
> +++ b/qom/compat-properties.c
> @@ -0,0 +1,116 @@
> +/*
> + * QEMU Object Model
> + *
> + * Copyright IBM, Corp. 2011
> + *
> + * Authors:
> + * Anthony Liguori <aliguori@us.ibm.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qapi/error.h"
> +#include "qom/compat-properties.h"
> +#include "qom/qom-qobject.h"
> +#include "hw/core/qdev.h"
> +
> +bool object_apply_global_props(Object *obj, const GPtrArray *props,
> + Error **errp)
> +{
> + int i;
> +
> + if (!props) {
> + return true;
> + }
> +
> + for (i = 0; i < props->len; i++) {
> + GlobalProperty *p = g_ptr_array_index(props, i);
> + Error *err = NULL;
> +
> + if (object_dynamic_cast(obj, p->driver) == NULL) {
> + continue;
> + }
> + if (p->optional && !object_property_find(obj, p->property)) {
> + continue;
> + }
> + p->used = true;
> + if (!object_property_parse(obj, p->property, p->value, &err)) {
> + error_prepend(&err, "can't apply global %s.%s=%s: ",
> + p->driver, p->property, p->value);
> + /*
> + * If errp != NULL, propagate error and return.
> + * If errp == NULL, report a warning, but keep going
> + * with the remaining globals.
> + */
> + if (errp) {
> + error_propagate(errp, err);
> + return false;
> + } else {
> + warn_report_err(err);
> + }
> + }
> + }
> +
> + return true;
> +}
> +
> +/*
> + * Global property defaults
> + * Slot 0: accelerator's global property defaults
> + * Slot 1: machine's global property defaults
> + * Slot 2: global properties from legacy command line option
> + * Each is a GPtrArray of GlobalProperty.
> + * Applied in order, later entries override earlier ones.
> + */
> +static GPtrArray *object_compat_props[3];
> +
> +/*
> + * Retrieve @GPtrArray for global property defined with options
> + * other than "-global". These are generally used for syntactic
> + * sugar and legacy command line options.
> + */
> +void object_register_sugar_prop(const char *driver, const char *prop,
> + const char *value, bool optional)
> +{
> + GlobalProperty *g;
> + if (!object_compat_props[2]) {
> + object_compat_props[2] = g_ptr_array_new();
> + }
> + g = g_new0(GlobalProperty, 1);
> + g->driver = g_strdup(driver);
> + g->property = g_strdup(prop);
> + g->value = g_strdup(value);
> + g->optional = optional;
> + g_ptr_array_add(object_compat_props[2], g);
> +}
> +
> +/*
> + * Set machine's global property defaults to @compat_props.
> + * May be called at most once.
> + */
> +void object_set_machine_compat_props(GPtrArray *compat_props)
> +{
> + assert(!object_compat_props[1]);
> + object_compat_props[1] = compat_props;
> +}
> +
> +/*
> + * Set accelerator's global property defaults to @compat_props.
> + * May be called at most once.
> + */
> +void object_set_accelerator_compat_props(GPtrArray *compat_props)
> +{
> + assert(!object_compat_props[0]);
> + object_compat_props[0] = compat_props;
> +}
> +
> +void object_apply_compat_props(Object *obj)
> +{
> + int i;
> +
> + for (i = 0; i < ARRAY_SIZE(object_compat_props); i++) {
> + object_apply_global_props(obj, object_compat_props[i],
> + i == 2 ? &error_fatal : &error_abort);
> + }
> +}
> diff --git a/qom/meson.build b/qom/meson.build
> index 8192243430..bd6f4aadd7 100644
> --- a/qom/meson.build
> +++ b/qom/meson.build
> @@ -5,6 +5,9 @@ qom_ss.add(files(
> 'object_interfaces.c',
> 'qom-qobject.c',
> ))
> +if have_system
> + qom_ss.add(files('compat-properties.c'))
> +endif
>
> qmp_ss.add(files('qom-qmp-cmds.c'))
> system_ss.add(files('qom-hmp-cmds.c'))
> diff --git a/qom/object.c b/qom/object.c
> index 838b1d2b22..f00d659ef0 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -440,106 +440,6 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
> }
> }
>
> -bool object_apply_global_props(Object *obj, const GPtrArray *props,
> - Error **errp)
> -{
> - int i;
> -
> - if (!props) {
> - return true;
> - }
> -
> - for (i = 0; i < props->len; i++) {
> - GlobalProperty *p = g_ptr_array_index(props, i);
> - Error *err = NULL;
> -
> - if (object_dynamic_cast(obj, p->driver) == NULL) {
> - continue;
> - }
> - if (p->optional && !object_property_find(obj, p->property)) {
> - continue;
> - }
> - p->used = true;
> - if (!object_property_parse(obj, p->property, p->value, &err)) {
> - error_prepend(&err, "can't apply global %s.%s=%s: ",
> - p->driver, p->property, p->value);
> - /*
> - * If errp != NULL, propagate error and return.
> - * If errp == NULL, report a warning, but keep going
> - * with the remaining globals.
> - */
> - if (errp) {
> - error_propagate(errp, err);
> - return false;
> - } else {
> - warn_report_err(err);
> - }
> - }
> - }
> -
> - return true;
> -}
> -
> -/*
> - * Global property defaults
> - * Slot 0: accelerator's global property defaults
> - * Slot 1: machine's global property defaults
> - * Slot 2: global properties from legacy command line option
> - * Each is a GPtrArray of GlobalProperty.
> - * Applied in order, later entries override earlier ones.
> - */
> -static GPtrArray *object_compat_props[3];
> -
> -/*
> - * Retrieve @GPtrArray for global property defined with options
> - * other than "-global". These are generally used for syntactic
> - * sugar and legacy command line options.
> - */
> -void object_register_sugar_prop(const char *driver, const char *prop,
> - const char *value, bool optional)
> -{
> - GlobalProperty *g;
> - if (!object_compat_props[2]) {
> - object_compat_props[2] = g_ptr_array_new();
> - }
> - g = g_new0(GlobalProperty, 1);
> - g->driver = g_strdup(driver);
> - g->property = g_strdup(prop);
> - g->value = g_strdup(value);
> - g->optional = optional;
> - g_ptr_array_add(object_compat_props[2], g);
> -}
> -
> -/*
> - * Set machine's global property defaults to @compat_props.
> - * May be called at most once.
> - */
> -void object_set_machine_compat_props(GPtrArray *compat_props)
> -{
> - assert(!object_compat_props[1]);
> - object_compat_props[1] = compat_props;
> -}
> -
> -/*
> - * Set accelerator's global property defaults to @compat_props.
> - * May be called at most once.
> - */
> -void object_set_accelerator_compat_props(GPtrArray *compat_props)
> -{
> - assert(!object_compat_props[0]);
> - object_compat_props[0] = compat_props;
> -}
> -
> -void object_apply_compat_props(Object *obj)
> -{
> - int i;
> -
> - for (i = 0; i < ARRAY_SIZE(object_compat_props); i++) {
> - object_apply_global_props(obj, object_compat_props[i],
> - i == 2 ? &error_fatal : &error_abort);
> - }
> -}
> -
> static void object_class_property_init_all(Object *obj)
> {
> ObjectPropertyIterator iter;
© 2016 - 2026 Red Hat, Inc.