On 5/9/2026 8:03 AM, Richard Henderson wrote:
> On 5/8/26 19:59, Pierrick Bouvier wrote:
>> On 5/8/2026 5:54 PM, Pierrick Bouvier wrote:
>>> Instead of defining a class_init per class, just use a common
>>> constructor and set class_data to corresponding TargetInfo structure.
>>>
>>> Suggested-by: Richard Henderson <[email protected]>
>>> Signed-off-by: Pierrick Bouvier <[email protected]>
>>> ---
>>>   include/qemu/target-info-init.h | 14 ++------------
>>>   include/qemu/target-info-qom.h  |  1 +
>>>   target-info-qom.c               |  6 ++++++
>>>   3 files changed, 9 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/include/qemu/target-info-init.h b/include/qemu/target-
>>> info-init.h
>>> index 176fd975a16..3945f2998e0 100644
>>> --- a/include/qemu/target-info-init.h
>>> +++ b/include/qemu/target-info-init.h
>>> @@ -37,8 +37,6 @@ const TargetInfo *target_info(void)     \
>>>   #include "qemu/target-info-qom.h"
>>>   #include "qom/object.h"
>>>   -#define TYPE_TARGET_INFO_TARGET TYPE_TARGET_INFO"-"TARGET_NAME
>>> -
>>>   typedef struct TargetInfoQomTarget {
>>>       TargetInfoQom parent;
>>>   } TargetInfoQomTarget;
>>> @@ -47,24 +45,16 @@ typedef struct TargetInfoQomTargetClass {
>>>       TargetInfoQomClass parent_class;
>>>   } TargetInfoQomTargetClass;
>>>   -OBJECT_DECLARE_TYPE(TargetInfoQomTarget, TargetInfoQomTargetClass,
>>> TARGET_INFO_TARGET)
>>> -
>>>   #define
>>> target_info_init(ti_var)                                            \
>>> -static void target_info_qom_class_init(ObjectClass *oc, const void *
>>> data)  \
>>> -
>>> {                                                                           
>>> \
>>> -    TargetInfoQomTargetClass *klass =
>>> TARGET_INFO_TARGET_CLASS(oc);         \
>>> -    klass->parent_class.target_info =
>>> &ti_var;                              \
>>> -}                                                                          
>>>  \
>>> -
>>>                                                                             
>>> \
>>>   static const TypeInfo target_info_qom_target_type_info =
>>> {                  \
>>> -    .name =
>>> TYPE_TARGET_INFO_TARGET,                                        \
>>> +    .name = 
>>> TYPE_TARGET_INFO"-"TARGET_NAME,                                \
>>>       .parent =
>>> TYPE_TARGET_INFO,                                             \
>>>       .instance_size =
>>> sizeof(TargetInfoQomTarget),                           \
>>>       .class_size =
>>> sizeof(TargetInfoQomTargetClass),                         \
>>>       .class_init =
>>> target_info_qom_class_init,                               \
>>> +    .class_data =
>>> &ti_var,                                                  \
>>>       .abstract =
>>> false,                                                      \
>>>   };                                                                        
>>>   \
>>> -
>>>                                                                             
>>> \
>>>   DEFINE_TARGET_INFO_TYPE(target_info_qom_target_type_info)
>>>     #endif /* CONFIG_USER_ONLY */
>>> diff --git a/include/qemu/target-info-qom.h b/include/qemu/target-
>>> info-qom.h
>>> index 91be415ed33..a37c3e101e0 100644
>>> --- a/include/qemu/target-info-qom.h
>>> +++ b/include/qemu/target-info-qom.h
>>> @@ -25,6 +25,7 @@ typedef struct TargetInfoQomClass {
>>>     OBJECT_DECLARE_TYPE(TargetInfoQom, TargetInfoQomClass, TARGET_INFO)
>>>   +void target_info_qom_class_init(ObjectClass *oc, const void * data);
>>>   void target_info_qom_set_target(void);
>>>     #endif /* QEMU_TARGET_INFO_QOM_H */
>>> diff --git a/target-info-qom.c b/target-info-qom.c
>>> index cc470b3b4d6..5b0498ca654 100644
>>> --- a/target-info-qom.c
>>> +++ b/target-info-qom.c
>>> @@ -37,6 +37,12 @@ static const TypeInfo target_info_parent_type = {
>>>     DEFINE_TARGET_INFO_TYPE(target_info_parent_type)
>>>   +void target_info_qom_class_init(ObjectClass *oc, const void * data)
>>> +{
>>> +    TargetInfoQomClass *klass = TARGET_INFO_CLASS(oc);
>>> +    klass->target_info = data;
>>> +}
>>> +
>>>   static const TargetInfo *target_info_ptr;
>>>     const TargetInfo *target_info(void)
>>
>> This patch can be squashed with 3, but I thought it might be better for
>> review to keep it on top for now.
> 
> Mmm.  You've missed the part about using class_base_init instead of
> class_init, so that you don't need the extern function declaration.  See
> review of patch 3.
>

I feel that this pattern of using a super ctor with a data set by child
is very counter intuitive, but I'll trust your judgment on how QOM is
supposed to work.

I'll squash this with patch 3 in next version so there is no confusion also.

> 
> r~

Regards,
Pierrick

Reply via email to