c-lang.c (finish_file): Don't emit static inline functions if they weren't referenced.

* c-lang.c (finish_file): Don't emit static inline functions if
	they weren't referenced.

	* gcc.c-torture/execute/20011115-1.c: New test.

From-SVN: r47082
This commit is contained in:
Jakub Jelinek 2001-11-16 09:05:16 +01:00 committed by Jakub Jelinek
parent 38b3baaef4
commit 25e7f43985
4 changed files with 65 additions and 5 deletions

View File

@ -1,3 +1,8 @@
2001-11-16 Jakub Jelinek <jakub@redhat.com>
* c-lang.c (finish_file): Don't emit static inline functions if
they weren't referenced.
2001-11-15 Stan Shebs <shebs@apple.com>
* expr.c (expand_expr, case COMPONENT_REF): Fix variable ref.

View File

@ -271,13 +271,38 @@ void
finish_file ()
{
unsigned int i;
bool reconsider;
for (i = 0; i < VARRAY_ACTIVE_SIZE (deferred_fns); i++)
/* Don't output the same function twice. We may run into such
situations when an extern inline function is later given a
non-extern-inline definition. */
if (! TREE_ASM_WRITTEN (VARRAY_TREE (deferred_fns, i)))
c_expand_deferred_function (VARRAY_TREE (deferred_fns, i));
{
tree decl = VARRAY_TREE (deferred_fns, i);
if (! TREE_ASM_WRITTEN (decl) && TREE_PUBLIC (decl))
{
c_expand_deferred_function (decl);
VARRAY_TREE (deferred_fns, i) = NULL;
}
}
do
{
reconsider = false;
for (i = 0; i < VARRAY_ACTIVE_SIZE (deferred_fns); i++)
{
tree decl = VARRAY_TREE (deferred_fns, i);
if (decl
&& ! TREE_ASM_WRITTEN (decl)
&& (flag_keep_inline_functions
|| TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
{
c_expand_deferred_function (decl);
VARRAY_TREE (deferred_fns, i) = NULL;
reconsider = true;
}
}
} while (reconsider);
VARRAY_FREE (deferred_fns);
#ifndef ASM_OUTPUT_CONSTRUCTOR

View File

@ -1,3 +1,7 @@
2001-11-16 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/20011115-1.c: New test.
2001-11-15 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/compile/20011114-2.c: New test.

View File

@ -0,0 +1,26 @@
extern void exit (int);
static inline int
foo (void)
{
#ifdef __OPTIMIZE__
extern int undefined_reference;
return undefined_reference;
#else
return 0;
#endif
}
static inline int
bar (void)
{
if (foo == foo)
return 1;
else
return foo ();
}
int main (void)
{
exit (0);
}