aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-11-16 09:05:16 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2001-11-16 09:05:16 +0100
commit25e7f439857c2fb0e93f32906f6da0ff3d395047 (patch)
tree4a79da552d8d92dd6c4288af8f6d52ff415db7e6
parent38b3baaef415c904fba681f05f3ee44eb3d10ae6 (diff)
downloadgcc-25e7f439857c2fb0e93f32906f6da0ff3d395047.zip
gcc-25e7f439857c2fb0e93f32906f6da0ff3d395047.tar.gz
gcc-25e7f439857c2fb0e93f32906f6da0ff3d395047.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-lang.c35
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20011115-1.c26
4 files changed, 65 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2671505..819b241 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/c-lang.c b/gcc/c-lang.c
index 72d2536..5655d8c 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 1981a9e..d79c9f6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
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 0000000..17a3565
--- /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);
+}