diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2671505d473..819b2414fe5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-11-16 Jakub Jelinek + + * c-lang.c (finish_file): Don't emit static inline functions if + they weren't referenced. + 2001-11-15 Stan Shebs * expr.c (expand_expr, case COMPONENT_REF): Fix variable ref. diff --git a/gcc/c-lang.c b/gcc/c-lang.c index 72d2536123c..5655d8cfcdf 100644 --- a/gcc/c-lang.c +++ b/gcc/c-lang.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1981a9ef20f..d79c9f6642d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-11-16 Jakub Jelinek + + * gcc.c-torture/execute/20011115-1.c: New test. + 2001-11-15 Jakub Jelinek * gcc.c-torture/compile/20011114-2.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/20011115-1.c b/gcc/testsuite/gcc.c-torture/execute/20011115-1.c new file mode 100644 index 00000000000..17a35658e2b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20011115-1.c @@ -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); +}