From 6a73516d838ce30e52f576df0dee882e410038b3 Mon Sep 17 00:00:00 2001 From: Ilya Enkovich Date: Tue, 9 Dec 2014 07:56:26 +0000 Subject: [PATCH] lto-cgraph.c (input_cgraph_1): Don't break existing instrumentation clone references. * lto-cgraph.c (input_cgraph_1): Don't break existing instrumentation clone references. * lto/lto-symtab.c (lto_cgraph_replace_node): Redirect instrumented_version references appropriately. From-SVN: r218507 --- gcc/ChangeLog | 7 +++++++ gcc/lto-cgraph.c | 13 ++++++++++++- gcc/lto/lto-symtab.c | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dbd6272a0ed..eba4f993e5f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-12-09 Ilya Enkovich + + * lto-cgraph.c (input_cgraph_1): Don't break existing + instrumentation clone references. + * lto/lto-symtab.c (lto_cgraph_replace_node): Redirect + instrumented_version references appropriately. + 2014-12-09 Ilya Enkovich PR bootstrap/63995 diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index d424e145474..b310b446808 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -1562,7 +1562,18 @@ input_cgraph_1 (struct lto_file_decl_data *file_data, cnode->instrumented_version = cgraph_node::get (cnode->orig_decl); if (cnode->instrumented_version) - cnode->instrumented_version->instrumented_version = cnode; + { + /* We may have multiple nodes for a single function which + will be merged later. To have a proper merge we need + to keep instrumentation_version reference between nodes + consistent: each instrumented_version reference should + have proper reverse reference. Thus don't break existing + instrumented_version reference if it already exists. */ + if (cnode->instrumented_version->instrumented_version) + cnode->instrumented_version = NULL; + else + cnode->instrumented_version->instrumented_version = cnode; + } /* Restore decl names reference. */ if (IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (cnode->decl)) diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index 4c4e48af334..f5d82a74b08 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -99,6 +99,20 @@ lto_cgraph_replace_node (struct cgraph_node *node, /* Redirect incomming references. */ prevailing_node->clone_referring (node); + /* Fix instrumentation references. */ + if (node->instrumented_version) + { + gcc_assert (node->instrumentation_clone + == prevailing_node->instrumentation_clone); + node->instrumented_version->instrumented_version = prevailing_node; + if (!prevailing_node->instrumented_version) + prevailing_node->instrumented_version = node->instrumented_version; + /* Need to reset node->instrumented_version to NULL, + otherwise node removal code would reset + node->instrumented_version->instrumented_version. */ + node->instrumented_version = NULL; + } + ipa_merge_profiles (prevailing_node, node); lto_free_function_in_decl_state_for_node (node); -- 2.30.2