On 06 Apr 20:41, Jan Hubicka wrote:
> > 2015-04-03 20:12 GMT+03:00 Jan Hubicka <[email protected]>:
> > >>
> > >> 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?
> >
> > I believe this should help. Will try it.
> If it passes testing, the patch is preapproved.
>
> Thanks!
> Honza
Here is a committed version.
Thanks,
Ilya
--
diff --git a/gcc/ipa-comdats.c b/gcc/ipa-comdats.c
index f349f9f..e24359c 100644
--- a/gcc/ipa-comdats.c
+++ b/gcc/ipa-comdats.c
@@ -377,7 +377,7 @@ ipa_comdats (void)
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);
diff --git a/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-1.cc
b/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-1.cc
new file mode 100644
index 0000000..26d3c48
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-1.cc
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fcheck-pointer-bounds -mmpx" } */
+
+namespace
+{
+ template <int dim>
+ int __attribute__((noinline))
+ f1 ()
+ {
+ return dim;
+ }
+}
+
+int
+test ()
+{
+ return f1<3> ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-2.cc
b/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-2.cc
new file mode 100644
index 0000000..2b1abe9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mpx/chkp-thunk-comdat-2.cc
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fcheck-pointer-bounds -mmpx" } */
+
+class c1
+{
+public:
+ virtual int test1 (const char *);
+};
+
+class c2
+{
+public:
+ int test2 (const char *);
+};
+
+int
+c1::test1 (const char *)
+{
+ return 0;
+}
+
+int
+c2::test2 (const char *)
+{
+ return 0;
+}