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);
            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