Commit 8fe91ca8 by Jan Hubicka Committed by Jan Hubicka

re PR lto/59626 (/usr/include/bits/unistd.h:173:1: error: inlining failed in…

re PR lto/59626 (/usr/include/bits/unistd.h:173:1: error: inlining failed in call to always_inline 'readlinkat': recursive inlining)


	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
parent 88d94632
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> 2014-04-04 Jakub Jelinek <jakub@redhat.com>
Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
......
...@@ -139,7 +139,10 @@ process_references (struct ipa_ref_list *list, ...@@ -139,7 +139,10 @@ process_references (struct ipa_ref_list *list,
if (node->definition && !node->in_other_partition if (node->definition && !node->in_other_partition
&& ((!DECL_EXTERNAL (node->decl) || node->alias) && ((!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 /* We use variable constructors during late complation for
constant folding. Keep references alive so partitioning constant folding. Keep references alive so partitioning
knows about potential references. */ knows about potential references. */
...@@ -191,7 +194,10 @@ walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets, ...@@ -191,7 +194,10 @@ walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets,
/* Prior inlining, keep alive bodies of possible targets for /* Prior inlining, keep alive bodies of possible targets for
devirtualization. */ devirtualization. */
if (n->definition 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); pointer_set_insert (reachable, n);
/* Even after inlining we want to keep the possible targets in the /* 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) ...@@ -491,6 +497,12 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
node->alias = false; node->alias = false;
node->thunk.thunk_p = false; node->thunk.thunk_p = false;
node->weakref = 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) if (!node->in_other_partition)
node->local.local = false; node->local.local = false;
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
......
...@@ -1001,6 +1001,9 @@ input_overwrite_node (struct lto_file_decl_data *file_data, ...@@ -1001,6 +1001,9 @@ input_overwrite_node (struct lto_file_decl_data *file_data,
node->thunk.thunk_p = bp_unpack_value (bp, 1); node->thunk.thunk_p = bp_unpack_value (bp, 1);
node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution, node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN); LDPR_NUM_KNOWN);
gcc_assert (flag_ltrans
|| (!node->in_other_partition
&& !node->used_from_other_partition));
} }
/* Return string alias is alias of. */ /* Return string alias is alias of. */
...@@ -1169,6 +1172,9 @@ input_varpool_node (struct lto_file_decl_data *file_data, ...@@ -1169,6 +1172,9 @@ input_varpool_node (struct lto_file_decl_data *file_data,
node->same_comdat_group = (symtab_node *) (intptr_t) ref; node->same_comdat_group = (symtab_node *) (intptr_t) ref;
node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution, node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN); LDPR_NUM_KNOWN);
gcc_assert (flag_ltrans
|| (!node->in_other_partition
&& !node->used_from_other_partition));
return node; return node;
} }
......
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> 2014-04-04 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR debug/60655 PR debug/60655
......
/* { 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);
}
int bar (int (*fn)(const char *))
{
return fn ("0");
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment