On Mon, Sep 21, 2015 at 02:24:51PM -0300, Eduardo Habkost wrote: > On Mon, Sep 21, 2015 at 05:52:47PM +0200, Andreas Färber wrote: > > Am 21.09.2015 um 17:49 schrieb Eduardo Habkost: > > > On Sat, Sep 19, 2015 at 04:43:29PM +0200, Andreas Färber wrote: > > >> The script used for converting from QEMUMachine had used one > > >> DEFINE_MACHINE() per machine registered. In cases where multiple > > >> machines are registered from one source file, avoid the excessive > > >> generation of module init functions by reverting this unrolling. > > > > > > Why is that a problem? > > > > It's unnecessary code bloat and it blocks the usual QOM patterns. See > > the follow-up series for an example where an abstract base type helps, > > which your macro does not allow. > > Do you have any numbers on the actual bloat impact?
This is what I see on x86_64: $ readelf -W -s before/qemu-system-arm | grep smdkc210 2675: 00000000001422b0 12 FUNC LOCAL DEFAULT 13 exynos4_machine_smdkc210_machine_init_register_types 2676: 00000000007051c0 104 OBJECT LOCAL DEFAULT 23 exynos4_machine_smdkc210_machine_init_typeinfo 2680: 0000000000142310 72 FUNC LOCAL DEFAULT 13 exynos4_machine_smdkc210_machine_init_class_init 2682: 00000000001424b0 264 FUNC LOCAL DEFAULT 13 smdkc210_init 2693: 00000000000a4d50 17 FUNC LOCAL DEFAULT 13 do_qemu_init_exynos4_machine_smdkc210_machine_init_register_types $ readelf -W -s after/qemu-system-arm | grep smdkc210 2675: 00000000007041c0 104 OBJECT LOCAL DEFAULT 23 smdkc210_type 2676: 0000000000141ff0 72 FUNC LOCAL DEFAULT 13 smdkc210_class_init 2678: 00000000001421e0 264 FUNC LOCAL DEFAULT 13 smdkc210_init An additional type_register_static() call inside an existing type_init() function adds 16 bytes to the function. An additional type_init() functions adds 29 bytes: * 12 bytes for the the function calling type_register_static() * 17 bytes for the do_qemu_init_*() function So, you are saving 13 bytes for each machine class. For comparison on the existing per-machine-class bloat, each new machine class already adds at least: * 104 bytes for the TypeInfo object * 240 bytes for each MachineClass struct allocated at runtime when find_machine() runs object_class_get_list() * A variable number of bytes for strings, class_init and other machine code (336 bytes for class_init and instance_init, in the smdkc210 case) I would happily add extra 13 bytes for each machine class if it means simpler code. -- Eduardo