OSDN Git Service

* c-lang.c (finish_file): Don't emit static inline functions if
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Nov 2001 08:05:16 +0000 (08:05 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Nov 2001 08:05:16 +0000 (08:05 +0000)
they weren't referenced.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47082 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-lang.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20011115-1.c [new file with mode: 0644]

index 2671505..819b241 100644 (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.
index 72d2536..5655d8c 100644 (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
index 1981a9e..d79c9f6 100644 (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.
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 (file)
index 0000000..17a3565
--- /dev/null
@@ -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);
+}