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
This commit is contained in:
parent
88d946326b
commit
8fe91ca80e
@ -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>
|
||||
|
||||
|
16
gcc/ipa.c
16
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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
15
gcc/testsuite/gcc.dg/lto/pr59626_0.c
Normal file
15
gcc/testsuite/gcc.dg/lto/pr59626_0.c
Normal file
@ -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);
|
||||
}
|
4
gcc/testsuite/gcc.dg/lto/pr59626_1.c
Normal file
4
gcc/testsuite/gcc.dg/lto/pr59626_1.c
Normal file
@ -0,0 +1,4 @@
|
||||
int bar (int (*fn)(const char *))
|
||||
{
|
||||
return fn ("0");
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user