aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-02-16 20:22:57 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-02-16 20:22:57 +0100
commited89033d7c15db7bbc3c6c6dfb9495ac263b3a73 (patch)
tree12b6d76fc0f117c75866f01aa2c9dc3604966d54
parent7b909872f15f48482a23e41fe8093cb1f4425c74 (diff)
downloadgcc-ed89033d7c15db7bbc3c6c6dfb9495ac263b3a73.zip
gcc-ed89033d7c15db7bbc3c6c6dfb9495ac263b3a73.tar.gz
gcc-ed89033d7c15db7bbc3c6c6dfb9495ac263b3a73.tar.bz2
re PR ipa/64963 (IPA Cloning/Splitting does not copy function section attributes resulting in kernel miscompilation)
PR ipa/64963 * cgraphclones.c (cgraph_node::create_virtual_clone): Copy section if not linkonce. Fix up formatting. (cgraph_node::create_version_clone_with_body): Copy section. * trans-mem.c (ipa_tm_create_version): Likewise. * gcc.dg/ipa/ipa-clone-1.c: New test. Co-Authored-By: James Greenhalgh <james.greenhalgh@arm.com> From-SVN: r220742
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cgraphclones.c5
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipa-clone-1.c20
-rw-r--r--gcc/trans-mem.c1
5 files changed, 40 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 061e034..9ef0d8c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2015-02-16 Jakub Jelinek <jakub@redhat.com>
+ James Greenhalgh <james.greenhalgh@arm.com>
+
+ PR ipa/64963
+ * cgraphclones.c (cgraph_node::create_virtual_clone): Copy
+ section if not linkonce. Fix up formatting.
+ (cgraph_node::create_version_clone_with_body): Copy section.
+ * trans-mem.c (ipa_tm_create_version): Likewise.
+
2015-02-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/65077
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
index 2a7de2e..863081e 100644
--- a/gcc/cgraphclones.c
+++ b/gcc/cgraphclones.c
@@ -577,7 +577,7 @@ cgraph_node::create_virtual_clone (vec<cgraph_edge *> redirect_callers,
char *name;
if (!in_lto_p)
- gcc_checking_assert (tree_versionable_function_p (old_decl));
+ gcc_checking_assert (tree_versionable_function_p (old_decl));
gcc_assert (local.can_change_signature || !args_to_skip);
@@ -617,6 +617,8 @@ cgraph_node::create_virtual_clone (vec<cgraph_edge *> redirect_callers,
ABI support for this. */
set_new_clone_decl_and_node_flags (new_node);
new_node->clone.tree_map = tree_map;
+ if (!DECL_ONE_ONLY (old_decl))
+ new_node->set_section (get_section ());
/* Clones of global symbols or symbols with unique names are unique. */
if ((TREE_PUBLIC (old_decl)
@@ -1009,6 +1011,7 @@ cgraph_node::create_version_clone_with_body
new_version_node->externally_visible = 0;
new_version_node->local.local = 1;
new_version_node->lowered = true;
+ new_version_node->set_section (get_section ());
/* Clones of global symbols or symbols with unique names are unique. */
if ((TREE_PUBLIC (old_decl)
&& !DECL_EXTERNAL (old_decl)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8af42fa..d5769b7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-16 Jakub Jelinek <jakub@redhat.com>
+ James Greenhalgh <james.greenhalgh@arm.com>
+
+ PR ipa/64963
+ * gcc.dg/ipa/ipa-clone-1.c: New test.
+
2015-02-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/65077
diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-clone-1.c b/gcc/testsuite/gcc.dg/ipa/ipa-clone-1.c
new file mode 100644
index 0000000..5ee8166
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/ipa-clone-1.c
@@ -0,0 +1,20 @@
+/* PR ipa/64693 */
+/* { dg-do compile } */
+/* { dg-require-named-sections "" } */
+/* { dg-options "-O3 -fipa-cp -fipa-cp-clone -fdump-ipa-cp" } */
+
+static int __attribute__ ((noinline, section ("test_section")))
+foo (int arg)
+{
+ return 7 * arg;
+}
+
+int
+bar (int arg)
+{
+ return foo (5);
+}
+
+/* { dg-final { scan-assembler "test_section" } } */
+/* { dg-final { scan-ipa-dump "Creating a specialized node of foo" "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */
diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
index 21fa497..146a975 100644
--- a/gcc/trans-mem.c
+++ b/gcc/trans-mem.c
@@ -4967,6 +4967,7 @@ ipa_tm_create_version (struct cgraph_node *old_node)
new_node->externally_visible = old_node->externally_visible;
new_node->lowered = true;
new_node->tm_clone = 1;
+ new_node->set_section (old_node->get_section ());
get_cg_data (&old_node, true)->clone = new_node;
if (old_node->get_availability () >= AVAIL_INTERPOSABLE)