re PR lto/59626 (/usr/include/bits/unistd.h:173:1: error: inlining failed in call...
authorJan Hubicka <hubicka@ucw.cz>
Fri, 4 Apr 2014 18:02:31 +0000 (20:02 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 4 Apr 2014 18:02:31 +0000 (18:02 +0000)
PR ipa/59626
* lto-cgraph.c (input_overwrite_node): Check that partitioning
flags are set only during streaming.
* ipa.c (process_references, walk_polymorphic_call_targets,
symtab_remove_unreachable_nodes): Drop bodies of always inline
after early inlining.
(symtab_remove_unreachable_nodes): Remove always_inline attribute.
* gcc.dg/lto/pr59626_0.c: New testcase.
* gcc.dg/lto/pr59626_1.c: New testcase.

From-SVN: r209123

gcc/ChangeLog
gcc/ipa.c
gcc/lto-cgraph.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/pr59626_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr59626_1.c [new file with mode: 0644]

index ad1d2c1..90a787c 100644 (file)
@@ -1,3 +1,13 @@
+2014-04-04  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/59626
+       * lto-cgraph.c (input_overwrite_node): Check that partitioning
+       flags are set only during streaming.
+       * ipa.c (process_references, walk_polymorphic_call_targets,
+       symtab_remove_unreachable_nodes): Drop bodies of always inline
+       after early inlining.
+       (symtab_remove_unreachable_nodes): Remove always_inline attribute.
+       
 2014-04-04  Jakub Jelinek  <jakub@redhat.com>
        Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
index 435fff0..c766876 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -139,7 +139,10 @@ process_references (struct ipa_ref_list *list,
 
       if (node->definition && !node->in_other_partition
          && ((!DECL_EXTERNAL (node->decl) || node->alias)
-             || (before_inlining_p
+             || (((before_inlining_p
+                   && (cgraph_state < CGRAPH_STATE_IPA_SSA
+                       || !lookup_attribute ("always_inline",
+                                             DECL_ATTRIBUTES (node->decl)))))
                  /* We use variable constructors during late complation for
                     constant folding.  Keep references alive so partitioning
                     knows about potential references.  */
@@ -191,7 +194,10 @@ walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets,
          /* Prior inlining, keep alive bodies of possible targets for
             devirtualization.  */
           if (n->definition
-              && before_inlining_p)
+              && (before_inlining_p
+                  && (cgraph_state < CGRAPH_STATE_IPA_SSA
+                      || !lookup_attribute ("always_inline",
+                                            DECL_ATTRIBUTES (n->decl)))))
             pointer_set_insert (reachable, n);
 
          /* Even after inlining we want to keep the possible targets in the
@@ -491,6 +497,12 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
              node->alias = false;
              node->thunk.thunk_p = false;
              node->weakref = false;
+             /* After early inlining we drop always_inline attributes on
+                bodies of functions that are still referenced (have their
+                address taken).  */
+             DECL_ATTRIBUTES (node->decl)
+               = remove_attribute ("always_inline",
+                                   DECL_ATTRIBUTES (node->decl));
              if (!node->in_other_partition)
                node->local.local = false;
              cgraph_node_remove_callees (node);
index 6206de6..173067f 100644 (file)
@@ -1001,6 +1001,9 @@ input_overwrite_node (struct lto_file_decl_data *file_data,
   node->thunk.thunk_p = bp_unpack_value (bp, 1);
   node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution,
                                     LDPR_NUM_KNOWN);
+  gcc_assert (flag_ltrans
+             || (!node->in_other_partition
+                 && !node->used_from_other_partition));
 }
 
 /* Return string alias is alias of.  */
@@ -1169,6 +1172,9 @@ input_varpool_node (struct lto_file_decl_data *file_data,
   node->same_comdat_group = (symtab_node *) (intptr_t) ref;
   node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution,
                                                LDPR_NUM_KNOWN);
+  gcc_assert (flag_ltrans
+             || (!node->in_other_partition
+                 && !node->used_from_other_partition));
 
   return node;
 }
index 11a0a5e..b073b7f 100644 (file)
@@ -1,3 +1,10 @@
+2014-04-04  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/59626
+       testcase by Richard Biener
+       * gcc.dg/lto/pr59626_0.c: New testcase.
+       * gcc.dg/lto/pr59626_1.c: New testcase.
+
 2014-04-04  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
        PR debug/60655
diff --git a/gcc/testsuite/gcc.dg/lto/pr59626_0.c b/gcc/testsuite/gcc.dg/lto/pr59626_0.c
new file mode 100644 (file)
index 0000000..752982f
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-lto-do run } */
+
+int __atoi  (const char *) __asm__("atoi");
+extern inline __attribute__((always_inline,gnu_inline))
+int atoi (const char *x)
+{
+  return __atoi (x);
+}
+
+int bar (int (*)(const char *));
+
+int main()
+{
+  return bar (atoi);
+}
diff --git a/gcc/testsuite/gcc.dg/lto/pr59626_1.c b/gcc/testsuite/gcc.dg/lto/pr59626_1.c
new file mode 100644 (file)
index 0000000..9b3fa1d
--- /dev/null
@@ -0,0 +1,4 @@
+int bar (int (*fn)(const char *))
+{
+  return fn ("0");
+}