> Hi, > > Currently enqueue_references in comdats pass enqueue target function instead > of thunks. But propagate_comdat_group doesn't walk through thunks and > therefore comdat group of thunk's caller is not propagated into thunk's > target function. This patch tries to fix it. Testing is in progress. Does > it look OK? > > Thanks, > Ilya > -- > gcc/ > > 2015-04-07 Ilya Enkovich <ilya.enkov...@intel.com> > > * ipa-comdats.c (propagate_comdat_group): Walk through thunks. > > gcc/testsuite/ > > 2015-04-07 Ilya Enkovich <ilya.enkov...@intel.com> > > * gcc.target/i386/mpx/chkp-thunk-comdat-3.c: New. > > > diff --git a/gcc/ipa-comdats.c b/gcc/ipa-comdats.c > index f349f9f..74088a9 100644 > --- a/gcc/ipa-comdats.c > +++ b/gcc/ipa-comdats.c > @@ -144,10 +144,12 @@ propagate_comdat_group (struct symtab_node *symbol, > > /* If we see inline clone, its comdat group actually > corresponds to the comdat group of the function it is inlined > - to. */ > + to. Dive into thunks similar to aliases. */ > > if (cgraph_node * cn = dyn_cast <cgraph_node *> (symbol2)) > { > + if (cn->thunk.thunk_p) > + newgroup = propagate_comdat_group (symbol2, newgroup, map);
OK, thanks! Please put the comment about inline clones just before the global.inlined_to test and make the comment about thunks separate. Probably "Thunks can not call across section boundary" Honza > if (cn->global.inlined_to) > symbol2 = cn->global.inlined_to; > } > diff --git a/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-3.c > b/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-3.c > new file mode 100644 > index 0000000..dd0057e > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-3.c > @@ -0,0 +1,23 @@ > +/* { dg-do compile } */ > +/* { dg-options "-fcheck-pointer-bounds -mmpx -O -fvisibility=hidden" } */ > + > +int val; > + > +static int __attribute__((noinline)) > +test1 () > +{ > + return val; > +} > + > +static int __attribute__((bnd_legacy,noinline)) > +test2 () > +{ > + return test1 (); > +} > + > +int > +test3 (void) > +{ > + return test2 (); > +} > +