> 2015-04-02 20:04 GMT+03:00 Jan Hubicka <[email protected]>:
> >> Hi,
> >>
> >> With r221574 (https://gcc.gnu.org/ml/gcc-cvs/2015-03/msg00495.html) thunks
> >> don't get comdat groups assigned and this causes a failure in cgraph
> >> checker for instrumentation thunks. It happens because instrumentation
> >> thunk may reference local symbol in comdat not being in comdat by itself.
> >> This patch fixes the problem. Doesn't affect not instrumented code.
> >> Testing is in progress. Does it look OK?
> >>
> >> Thanks,
> >> Ilya
> >> --
> >> gcc/
> >>
> >> 2015-04-02 Ilya Enkovich <[email protected]>
> >>
> >> * ipa-comdats.c (ipa_comdats): Visit all instrumentation
> >> thunks to set proper comdat group.
> >>
> >> gcc/testsuite/
> >>
> >> 2015-04-02 Ilya Enkovich <[email protected]>
> >>
> >> * gcc.target/i386/mpx/chkp-thunk-comdat-1.cc: New.
> >> * gcc.target/i386/mpx/chkp-thunk-comdat-2.cc: New.
> >>
> >>
> >> diff --git a/gcc/ipa-comdats.c b/gcc/ipa-comdats.c
> >> index f349f9f..30bcad8 100644
> >> --- a/gcc/ipa-comdats.c
> >> +++ b/gcc/ipa-comdats.c
> >> @@ -348,10 +348,9 @@ ipa_comdats (void)
> >> }
> >>
> >> /* Finally assign symbols to the sections. */
> >> -
> >> + cgraph_node *fun;
> >> FOR_EACH_DEFINED_SYMBOL (symbol)
> >> {
> >> - struct cgraph_node *fun;
> >> symbol->aux = NULL;
> >> if (!symbol->get_comdat_group ()
> >> && !symbol->alias
> >> @@ -388,6 +387,20 @@ ipa_comdats (void)
> >> true);
> >> }
> >> }
> >> +
> >> + /* Instrumentation thunks reference original node and thus
> >> + need to be in the same comdat group. Otherwise we may
> >> + get a local instrumented symbol in a comdat group and
> >> + the referencing original node outside of it. */
> >> + FOR_EACH_DEFINED_FUNCTION (fun)
> >> + if (fun->instrumentation_clone
> >> + && fun->instrumented_version
> >> + && !fun->instrumented_version->alias
> >> + && fun->get_comdat_group ()
> >> + && !fun->instrumented_version->get_comdat_group ())
> >> + fun->instrumented_version->call_for_symbol_and_aliases
> >> + (set_comdat_group_1, fun, true);
> >
> > I think you want to handle them same way as the aliases&thunks are handled.
> > This fix is symptomatic: the code may assign them to different comdat groups
> > and may propagate that furhter.
>
> Currently ipa_comdats doesn't set comdat groups for thunks. At the
I see, that is a bug. It is supposed to keep thunks in the same section
as their target (thunks doesn't really work across sections on some target,
like PPC, because there is no way to produce a tailcall)
Does the following fix the problem?
Index: ipa-comdats.c
===================================================================
--- ipa-comdats.c (revision 221857)
+++ ipa-comdats.c (working copy)
@@ -377,12 +377,12 @@
fprintf (dump_file, "To group: %s\n", IDENTIFIER_POINTER (group));
}
if (is_a <cgraph_node *> (symbol))
- dyn_cast <cgraph_node *>(symbol)->call_for_symbol_and_aliases
+ dyn_cast <cgraph_node *>(symbol)->call_for_symbol_thunks_and_aliases
(set_comdat_group_1,
*comdat_head_map.get (group),
true);
else
- symbol->call_for_symbol_and_aliases
+ symbol->call_for_symbol_thunks_and_aliases
(set_comdat_group,
*comdat_head_map.get (group),
true);
> same time all references to local symbol should be within one comdat
> group. That's why I need this fix. Assigning function and its
> instrumentation thunks to different comdat groups would be an error
> because both nodes represent the same function.
>
> Thanks,
> Ilya
>
> >
> > Honza