On Mon, 2010-05-31 at 11:48 -0700, Mark Mitchell wrote: > Andi Kleen wrote: > > Don't get me wrong; I think virtual functions are very useful. The > "target hooks" and "language hooks" we have are essentially "poor man's" > virtual functions, and we could naturally (and mechanically) convert > them to actual virtual functions.
The GGC marking routines are probably also somehow like virtual functions, even if they are not implemented as function pointers. What I mean is that today, the following generated function (from gtype-desc.c in the build tree) void gt_pch_nx_eh_region_d (void *x_p) { struct eh_region_d * const x = (struct eh_region_d *)x_p; if (gt_pch_note_object (x, x, gt_pch_p_11eh_region_d, gt_ggc_e_11eh_region_d)) { gt_pch_n_11eh_region_d ((*x).outer); gt_pch_n_11eh_region_d ((*x).inner); gt_pch_n_11eh_region_d ((*x).next_peer); switch ((*x).type) { case ERT_TRY: gt_pch_n_10eh_catch_d ((*x).u.eh_try.first_catch); gt_pch_n_10eh_catch_d ((*x).u.eh_try.last_catch); break; case ERT_ALLOWED_EXCEPTIONS: gt_pch_n_9tree_node ((*x).u.allowed.type_list); gt_pch_n_9tree_node ((*x).u.allowed.label); break; case ERT_MUST_NOT_THROW: gt_pch_n_9tree_node ((*x).u.must_not_throw.failure_decl); break; default: break; } gt_pch_n_16eh_landing_pad_d ((*x).landing_pads); gt_pch_n_7rtx_def ((*x).exc_ptr_reg); gt_pch_n_7rtx_def ((*x).filter_reg); } } could probably be replaced by a virtual function to mark each eh_region_d, and have 3 subclasses of these for the ERT_TRY, ERT_ALLOWED_EXCEPTIONS, ERT_MUST_NOT_THROW cases. I would believe that replacing a complex function like above (which contains a switch) with a virtual function call could probably be a win in performance, not a loose. But perhaps my intuition is wrong. Honestly, I don't have exact figures of the cost of virtual calls. IIRC, they have been costly for Intel processors more than 5 years ago (but AMD processors perhaps run them quicker at that time), but current Intel & AMD processors probably deal better with indirect jump, so a virtual call is perhaps a with w.r.t. a complex switch like above. Another point where virtual functions will greatly help is for dump code used when debugging GCC & passing some -fdump-... option to GCC. Besides, in that case, the speed of the dump does not matter much. Still, my concerns on C++ is mostly gengtype related. I believe we need to keep a garbage collector even with C++, and I believe that changing gengtype to follow C++ could be quite painful if we follow the usual route of parsing our headers. Making a gengtype able to parse almost any C++ header file would be painful. Cheers. -- Basile STARYNKEVITCH http://starynkevitch.net/Basile/ email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359 8, rue de la Faiencerie, 92340 Bourg La Reine, France *** opinions {are only mines, sont seulement les miennes} ***