Hi! As discussed in the PR, in 4.9 we used to clone DECL_SECTION_NAME through using copy_node on the FUNCTION_DECL, and only in selected places (e.g. when creating artificial_thunk.*, or when creating virtual clones of DECL_ONE_ONLY functions) we used to explicitly clear DECL_SECTION_NAME. In 5 the section name is stored in cgraph node instead, and thus not copied by default, so we instead need to copy it over to restore previous behavior, otherwise we break the Linux kernel and various other packages.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2015-02-16 Jakub Jelinek <ja...@redhat.com> James Greenhalgh <james.greenha...@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. * gcc.dg/ipa/ipa-clone-1.c: New test. --- gcc/cgraphclones.c.jj 2015-01-09 21:59:44.000000000 +0100 +++ gcc/cgraphclones.c 2015-02-16 14:02:16.564725881 +0100 @@ -577,7 +577,7 @@ cgraph_node::create_virtual_clone (vec<c 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<c 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 (this->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_b new_version_node->externally_visible = 0; new_version_node->local.local = 1; new_version_node->lowered = true; + new_version_node->set_section (this->get_section ()); /* Clones of global symbols or symbols with unique names are unique. */ if ((TREE_PUBLIC (old_decl) && !DECL_EXTERNAL (old_decl) --- gcc/trans-mem.c.jj 2015-01-14 09:55:19.000000000 +0100 +++ gcc/trans-mem.c 2015-02-16 12:58:01.399808815 +0100 @@ -4967,6 +4967,7 @@ ipa_tm_create_version (struct cgraph_nod 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) --- gcc/testsuite/gcc.dg/ipa/ipa-clone-1.c.jj 2015-02-16 14:14:39.041625503 +0100 +++ gcc/testsuite/gcc.dg/ipa/ipa-clone-1.c 2015-02-16 14:15:31.944760949 +0100 @@ -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" } } */ Jakub