]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/57038 (Latest libreoffice compilation fails with enabled LTO)
authorJan Hubicka <jh@suse.cz>
Wed, 15 May 2013 08:09:26 +0000 (10:09 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 15 May 2013 08:09:26 +0000 (08:09 +0000)
PR lto/57038
PR lto/47375
* lto-symtab.c (lto_symtab_symbol_p): Add external symbol; weakrefs are
not external.
(lto_symtab_merge_decls): Fix thinko when dealing with non-lto_symtab decls.
(lto_symtab_merge_cgraph_nodes): Use lto_symtab_symbol_p.
(lto_symtab_prevailing_decl): Get int sync with lto_symtab_symbol_p.
* varpool.c (dump_varpool_node): Dump more flags.

* lto-partition.c (get_symbol_class): Fix weakrefs.
(lto_balanced_map): Fix weakrefs.
(privatize_symbol_name): Remove unnecesary label.
(rename_statics): Handle weakrefs as statics.

* gcc.dg/lto/attr-weakref-1_0.c: New testcase.
* gcc.dg/lto/attr-weakref-1_1.c: New testcase.
* gcc.dg/lto/attr-weakref-1_2.c: New testcase.

From-SVN: r198917

gcc/ChangeLog
gcc/lto-symtab.c
gcc/lto/ChangeLog
gcc/lto/lto-partition.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/20070621-1.C
gcc/testsuite/gcc.dg/lto/attr-weakref-1_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/attr-weakref-1_1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/attr-weakref-1_2.c [new file with mode: 0644]
gcc/varpool.c

index ee2d403aac4c5cd4efe2daad5dac75bedba7daf7..f3daf5ad6686e04addca230fd0ed11b74b1bb369 100644 (file)
@@ -1,3 +1,14 @@
+2013-05-15  Jan Hubicka  <jh@suse.cz>
+
+       PR lto/57038
+       PR lto/47375
+       * lto-symtab.c (lto_symtab_symbol_p): Add external symbol; weakrefs are
+       not external.
+       (lto_symtab_merge_decls): Fix thinko when dealing with non-lto_symtab decls.
+       (lto_symtab_merge_cgraph_nodes): Use lto_symtab_symbol_p.
+       (lto_symtab_prevailing_decl): Get int sync with lto_symtab_symbol_p.
+       * varpool.c (dump_varpool_node): Dump more flags.
+
 2013-05-15  Ganesh Gopalasubramanian  <Ganesh.Gopalasubramanian@amd.com>
 
        * config/i386/i386.c (processor_alias_table): Add instruction
index b28fe63aa851e2b1bf22fd5353d5ead12f53ff3a..e33ed465c09c5221efeef211ba6fb753b93aab78 100644 (file)
@@ -227,13 +227,16 @@ lto_symtab_resolve_replaceable_p (symtab_node e)
 }
 
 /* Return true, if the symbol E should be resolved by lto-symtab.
-   Those are all real symbols that are not static (we handle renaming
-   of static later in partitioning).  */
+   Those are all external symbols and all real symbols that are not static (we
+   handle renaming of static later in partitioning).  */
 
 static bool
 lto_symtab_symbol_p (symtab_node e)
 {
-  if (!TREE_PUBLIC (e->symbol.decl))
+  if (!TREE_PUBLIC (e->symbol.decl) && !DECL_EXTERNAL (e->symbol.decl))
+    return false;
+  /* weakrefs are really static variables that are made external by a hack.  */
+  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (e->symbol.decl)))
     return false;
   return symtab_real_symbol_p (e);
 }
@@ -528,10 +531,19 @@ lto_symtab_merge_decls (void)
   symtab_initialize_asm_name_hash ();
 
   FOR_EACH_SYMBOL (node)
-    if (TREE_PUBLIC (node->symbol.decl)
-       && node->symbol.next_sharing_asm_name
-       && !node->symbol.previous_sharing_asm_name)
-    lto_symtab_merge_decls_1 (node);
+    if (lto_symtab_symbol_p (node)
+       && node->symbol.next_sharing_asm_name)
+      {
+        symtab_node n;
+
+       /* To avoid duplicated work, see if this is first real symbol in the
+          chain.  */
+       for (n = node->symbol.previous_sharing_asm_name;
+            n && !lto_symtab_symbol_p (n); n = n->symbol.previous_sharing_asm_name)
+         ;
+       if (!n)
+          lto_symtab_merge_decls_1 (node);
+      }
 }
 
 /* Helper to process the decl chain for the symbol table entry *SLOT.  */
@@ -574,7 +586,7 @@ lto_symtab_merge_cgraph_nodes (void)
 
   if (!flag_ltrans)
     FOR_EACH_SYMBOL (node)
-      if (TREE_PUBLIC (node->symbol.decl)
+      if (lto_symtab_symbol_p (node)
          && node->symbol.next_sharing_asm_name
          && !node->symbol.previous_sharing_asm_name)
         lto_symtab_merge_cgraph_nodes_1 (node);
@@ -602,7 +614,7 @@ lto_symtab_prevailing_decl (tree decl)
   symtab_node ret;
 
   /* Builtins and local symbols are their own prevailing decl.  */
-  if (!TREE_PUBLIC (decl) || is_builtin_fn (decl))
+  if ((!TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl)) || is_builtin_fn (decl))
     return decl;
 
   /* DECL_ABSTRACTs are their own prevailng decl.  */
@@ -614,6 +626,11 @@ lto_symtab_prevailing_decl (tree decl)
   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
     return decl;
 
+  /* As an anoying special cases weakrefs are really static variables with
+     EXTERNAL flag.  */
+  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
+    return decl;
+
   /* Ensure DECL_ASSEMBLER_NAME will not set assembler name.  */
   gcc_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
 
index 87320693361ad5c5f0cd7ad015d896c6f8c25558..9a86b4958d74130ab324d44e32fdce889e675f2f 100644 (file)
@@ -1,3 +1,12 @@
+2013-05-15  Jan Hubicka  <jh@suse.cz>
+
+       PR lto/57038
+       PR lto/47375
+       * lto-partition.c (get_symbol_class): Fix weakrefs.
+       (lto_balanced_map): Fix weakrefs.
+       (privatize_symbol_name): Remove unnecesary label.
+       (rename_statics): Handle weakrefs as statics.
+
 2013-05-09  Jan Hubicka  <jh@suse.cz>
            Richard Biener  <rguenther@suse.de>
 
index 652272ac1efdecebcc318560aca946e631521e23..acf8f2902370fea4807a467ca808d9fe1ee9f05f 100644 (file)
@@ -59,6 +59,10 @@ get_symbol_class (symtab_node node)
   if (cnode && cnode->global.inlined_to)
     return SYMBOL_DUPLICATE;
 
+  /* Weakref aliases are always duplicated.  */
+  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)))
+    return SYMBOL_DUPLICATE;
+
   /* External declarations are external.  */
   if (DECL_EXTERNAL (node->symbol.decl))
     return SYMBOL_EXTERNAL;
@@ -79,10 +83,6 @@ get_symbol_class (symtab_node node)
   else if (!cgraph (node)->analyzed)
     return SYMBOL_EXTERNAL;
 
-  /* Weakref aliases are always duplicated.  */
-  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)))
-    return SYMBOL_DUPLICATE;
-
   /* Comdats are duplicated to every use unless they are keyed.
      Those do not need duplication.  */
   if (DECL_COMDAT (node->symbol.decl)
@@ -561,7 +561,8 @@ lto_balanced_map (void)
 
              last_visited_node++;
 
-             gcc_assert (node->analyzed);
+             gcc_assert (node->analyzed
+                         || lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)));
 
              /* Compute boundary cost of callgraph edges.  */
              for (edge = node->callees; edge; edge = edge->next_callee)
@@ -768,7 +769,6 @@ privatize_symbol_name (symtab_node node)
 {
   tree decl = node->symbol.decl;
   const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
-  char *label;
 
   /* Our renaming machinery do not handle more than one change of assembler name.
      We should not need more than one anyway.  */
@@ -793,7 +793,6 @@ privatize_symbol_name (symtab_node node)
                name);
       return;
     }
-  ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
   change_decl_assembler_name (decl, clone_function_name (decl, "lto_priv"));
   if (node->symbol.lto_file_data)
     lto_record_renamed_decl (node->symbol.lto_file_data, name,
@@ -869,7 +868,8 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node node)
         once this is fixed.  */
         || DECL_EXTERNAL (node->symbol.decl)
         || !symtab_real_symbol_p (node))
-       && !may_need_named_section_p (encoder, node))
+       && !may_need_named_section_p (encoder, node)
+       && !lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)))
     return;
 
   /* Now walk symbols sharing the same name and see if there are any conflicts.
@@ -894,9 +894,11 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node node)
   /* Assign every symbol in the set that shares the same ASM name an unique
      mangled name.  */
   for (s = symtab_node_for_asm (name); s;)
-    if (!s->symbol.externally_visible
+    if ((!s->symbol.externally_visible
+        || lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)))
        && ((symtab_real_symbol_p (s)
-             && !DECL_EXTERNAL (node->symbol.decl)
+             && (!DECL_EXTERNAL (node->symbol.decl)
+                || lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)))
             && !TREE_PUBLIC (node->symbol.decl))
            || may_need_named_section_p (encoder, s))
        && (!encoder
index d4059893482f71020cf20267c6095149d3b546d0..383dc9d9d9c288b9dfd2f620c1ab40d69624cae1 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-15  Jan Hubicka  <jh@suse.cz>
+
+       * gcc.dg/lto/attr-weakref-1_0.c: New testcase.
+       * gcc.dg/lto/attr-weakref-1_1.c: New testcase.
+       * gcc.dg/lto/attr-weakref-1_2.c: New testcase.
+
 2013-05-14  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        * gcc.dg/torture/alias-1.c: Add dg-require-effective-target
index 185314a47ca91d34f4fba52d0ae564fa9681bb16..15d1ac74c993a7427f35feb02ba67059f66a5478 100644 (file)
@@ -1,3 +1,4 @@
+// { dg-do compile }
 /* Reduced from libstdc++-v3/testsuite/25_algorithms/equal/1.cc
 
 1.2.ii: In function 'void test1()':
diff --git a/gcc/testsuite/gcc.dg/lto/attr-weakref-1_0.c b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_0.c
new file mode 100644 (file)
index 0000000..1e02f68
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-lto-do run } */
+int first = 0;
+void abort (void);
+int second = 0;
+void callmealias (void)
+{
+  if (!first || !second)
+   abort ();
+}
+void callmefirst (void)
+{
+  if (first)
+    abort();
+  first = 1;
+}
+void callmesecond (void)
+{
+  if (!first)
+    abort();
+  if (second)
+    abort();
+  second = 1;
+}
+main()
+{
+  c();
+  b();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/lto/attr-weakref-1_1.c b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_1.c
new file mode 100644 (file)
index 0000000..67e6e1c
--- /dev/null
@@ -0,0 +1,7 @@
+extern void callmesecond();
+static void callmealias() __attribute__((weakref ("callmesecond")));
+
+b()
+{
+  callmealias();
+}
diff --git a/gcc/testsuite/gcc.dg/lto/attr-weakref-1_2.c b/gcc/testsuite/gcc.dg/lto/attr-weakref-1_2.c
new file mode 100644 (file)
index 0000000..6f382f6
--- /dev/null
@@ -0,0 +1,7 @@
+extern void callmefirst();
+static void callmealias() __attribute__((weakref ("callmefirst")));
+
+c()
+{
+  callmealias();
+}
index dbf519e6137c2fec12529d277e5600eb408ec472..e3ad22b1cfdb469432312991cb7b5a3a22180ec3 100644 (file)
@@ -86,6 +86,10 @@ dump_varpool_node (FILE *f, struct varpool_node *node)
     fprintf (f, " finalized");
   if (node->output)
     fprintf (f, " output");
+  if (TREE_READONLY (node->symbol.decl))
+    fprintf (f, " read-only");
+  if (const_value_known_p (node->symbol.decl))
+    fprintf (f, " const-value-known");
   fprintf (f, "\n");
 }