> 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 ();
> +}
> +

Reply via email to