From e01c7cca63aa448ccf625c5201d8d9d31f2633b3 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 18 May 2013 00:20:58 +0200 Subject: lto-symtab.c (lto_symtab_merge_cgraph_nodes): Resolve cross module weakrefs. * lto-symtab.c (lto_symtab_merge_cgraph_nodes): Resolve cross module weakrefs. * cgraph.c (dump_cgraph_node): Do not ice on unresolved alias. * cgraphunit.c (handle_alias_pairs): Store target of unresolved weakrefs. (output_weakrefs): Update. From-SVN: r199041 --- gcc/cgraphunit.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'gcc/cgraphunit.c') diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 7fa8055..6ebf8d4 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1069,9 +1069,17 @@ handle_alias_pairs (void) if (!target_node && lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)) != NULL) { if (TREE_CODE (p->decl) == FUNCTION_DECL) - cgraph_get_create_node (p->decl)->alias = true; + { + struct cgraph_node *anode = cgraph_get_create_node (p->decl); + anode->alias = true; + anode->thunk.alias = p->target; + } else - varpool_get_node (p->decl)->alias = true; + { + struct varpool_node *anode = varpool_get_node (p->decl); + anode->alias = true; + anode->alias_of = p->target; + } DECL_EXTERNAL (p->decl) = 1; alias_pairs->unordered_remove (i); continue; @@ -1939,14 +1947,14 @@ output_weakrefs (void) && !TREE_ASM_WRITTEN (node->symbol.decl) && lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl))) do_assemble_alias (node->symbol.decl, - node->thunk.alias ? DECL_ASSEMBLER_NAME (node->thunk.alias) + node->thunk.alias && DECL_P (node->thunk.alias) ? DECL_ASSEMBLER_NAME (node->thunk.alias) : get_alias_symbol (node->symbol.decl)); FOR_EACH_VARIABLE (vnode) if (vnode->alias && DECL_EXTERNAL (vnode->symbol.decl) && !TREE_ASM_WRITTEN (vnode->symbol.decl) && lookup_attribute ("weakref", DECL_ATTRIBUTES (vnode->symbol.decl))) do_assemble_alias (vnode->symbol.decl, - vnode->alias_of ? DECL_ASSEMBLER_NAME (vnode->alias_of) + vnode->alias_of && DECL_P (vnode->alias_of) ? DECL_ASSEMBLER_NAME (vnode->alias_of) : get_alias_symbol (vnode->symbol.decl)); } -- cgit v1.1