Re: RFC: -fno-share-inlines
On Montag, 24. August 2020 08:52:04 CEST Richard Biener wrote: > On Mon, Aug 10, 2020 at 9:36 AM Allan Sandfeld Jensen > > wrote: > > Following the previous discussion, this is a proposal for a patch that > > adds > > the flag -fno-share-inlines that can be used when compiling singular > > source > > files with a different set of flags than the rest of the project. > > > > It basically turns off comdat for inline functions, as if you compiled > > without support for 'weak' symbols. Turning them all into "static" > > functions, even if that wouldn't normally be possible for that type of > > function. Not sure if it breaks anything, which is why I am not sending > > it to the patch list. > > > > I also considered alternatively to turn the comdat generation off later > > during assembler production to ensure all processing and optimization of > > comdat functions would occur as normal. > > We already have -fvisibility-inlines-hidden so maybe call it > -fvisibility-inlines-static? That could make sense. > Does this option also imply 'static' vtables? > I don't think so. It affects functions declarations. It probably also affect virtual functions, but as far as I know the place changed only affects the functions not the virtual table. So there could still be a duplicated virtual table with the wrong methods, that then depends on linking if it will be used globally. I am not sure I dare change that, having different virtual tables for the same class depending on where it is allocated sounds like a way to break some things. I wouldn't use virtual tables anyway when dealing with mixed architectures. Best regards Allan
Re: RFC: -fno-share-inlines
On Mon, Aug 10, 2020 at 9:36 AM Allan Sandfeld Jensen wrote: > > Following the previous discussion, this is a proposal for a patch that adds > the flag -fno-share-inlines that can be used when compiling singular source > files with a different set of flags than the rest of the project. > > It basically turns off comdat for inline functions, as if you compiled without > support for 'weak' symbols. Turning them all into "static" functions, even if > that wouldn't normally be possible for that type of function. Not sure if it > breaks anything, which is why I am not sending it to the patch list. > > I also considered alternatively to turn the comdat generation off later during > assembler production to ensure all processing and optimization of comdat > functions would occur as normal. We already have -fvisibility-inlines-hidden so maybe call it -fvisibility-inlines-static? Does this option also imply 'static' vtables? Richard. > Best regards > Allan
RFC: -fno-share-inlines
Following the previous discussion, this is a proposal for a patch that adds the flag -fno-share-inlines that can be used when compiling singular source files with a different set of flags than the rest of the project. It basically turns off comdat for inline functions, as if you compiled without support for 'weak' symbols. Turning them all into "static" functions, even if that wouldn't normally be possible for that type of function. Not sure if it breaks anything, which is why I am not sending it to the patch list. I also considered alternatively to turn the comdat generation off later during assembler production to ensure all processing and optimization of comdat functions would occur as normal. Best regards Allandiff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 2b1aca16eb4..78e1f592126 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -1803,6 +1803,10 @@ frtti C++ ObjC++ Optimization Var(flag_rtti) Init(1) Generate run time type descriptor information. +fshare-inlines +C C++ ObjC ObjC++ Var(flag_share_inlines) Init(1) +Emit non-inlined inlined declared functions to be shared between object files. + fshort-enums C ObjC C++ ObjC++ LTO Optimization Var(flag_short_enums) Use the narrowest integer type possible for enumeration types. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 33c83773d33..8de796d16fc 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1957,10 +1957,9 @@ adjust_var_decl_tls_model (tree decl) void comdat_linkage (tree decl) { - if (flag_weak) -make_decl_one_only (decl, cxx_comdat_group (decl)); - else if (TREE_CODE (decl) == FUNCTION_DECL - || (VAR_P (decl) && DECL_ARTIFICIAL (decl))) + if ((!flag_share_inlines || !flag_weak) + && (TREE_CODE (decl) == FUNCTION_DECL + || (VAR_P (decl) && DECL_ARTIFICIAL (decl /* We can just emit function and compiler-generated variables statically; having multiple copies is (for the most part) only a waste of space. @@ -1978,6 +1977,8 @@ comdat_linkage (tree decl) should perform a string comparison, rather than an address comparison. */ TREE_PUBLIC (decl) = 0; + else if (flag_weak) +make_decl_one_only (decl, cxx_comdat_group (decl)); else { /* Static data member template instantiations, however, cannot