On Tue, Aug 18, 2015 at 2:14 PM, Cary Coutant <ccout...@gmail.com> wrote: >>>>> Based on Richard's suggestion, I have a patch to localize comdat >>>>> functions which seems like a very effective solution to this problem. >>>>> The text size increase is limited to the extra comdat copies generated >>>>> for the specialized modules (modules with unsafe options) which is >>>>> usually only a few. Since -fweak does something similar for >>>>> functions, I have called the new option -fweak-comdat-functions. >>>>> This does not apply to virtual comdat functions as their addresses can >>>>> always be leaked via the vtable. Using this flag with virtual >>>>> functions generates a warning. > > +fweak-comdat-functions > +C++ Var(flag_weak_comdat_functions) Init(1) > +Specific to comdat functions(-fno-weak-comdat-functions : Localize > Comdat Functions). > +With -fno-weak-comdat-functions, virtual comdat functions are still linked as > +weak functions. With -fno-weak-comdat-functions, the address of the comdat > +functions that are localized will be unique and this can cause unintended > +behavior when addresses of comdat functions are used. > > Is one of those "With -fno-weak-comdat-functions" supposed to be "With > -fweak-comdat-functions"? This description doesn't really say what the > flag (without the "no") does, and doesn't explain what "localize" > means. > > +@item -fno-weak-comdat-functions > +@opindex fno-weak-comdat-functions > +Do not use weak symbol support for comdat non-virtual functions, even if it > +is provided by the linker. By default, G++ uses weak symbols if they are > +available. This option is useful when comdat functions generated in certain > +compilation units need to be kept local to the respective units and not > exposed > +globally. This does not apply to virtual comdat functions as their pointers > +may be taken via virtual tables. This can cause unintended behavior if > +the addresses of comdat functions are used. > > It's not really the "weak" that is causing the problem -- it's the > "comdat". What the option really is doing is making the functions > static rather than comdat. (It's all gated under flag_weak because > weak symbols are the fall-back to link-once and comdat symbols.) I'd > suggest phrasing this more in terms of static vs. comdat.
Thanks, will make those changes. Do you recommend a different name for this flag like -fmake-comdat-functions-static? Sri > > This looks like the right way to go, though. > > -cary