Move check_global_declaration from toplev.c to cgraphunit.c
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Wed, 16 Sep 2015 21:25:28 +0000 (21:25 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Wed, 16 Sep 2015 21:25:28 +0000 (21:25 +0000)
Unfortunately, toplev.c is a kitchen sink of things that do not belong anywhere
in particular. For example, check_global_declarations is only used in
cgraphunit.c. Moving it there allows us to make it static and remove one call
to symtab_node::get.

gcc/ChangeLog:

2015-09-16  Manuel López-Ibáñez  <manu@gcc.gnu.org>

* toplev.h (check_global_declaration): Remove declaration.
* toplev.c (check_global_declaration): Move to ...
* cgraphunit.c: ... here. Make it static and pass a symtab_node *.
(analyze_functions): Update call.

From-SVN: r227835

gcc/ChangeLog
gcc/cgraphunit.c
gcc/toplev.c
gcc/toplev.h

index 1fad63688e732ff2cd180c3dcedd2c59626adf01..f2432e252e7ce1ec0c976e7dc04b598982e0fb78 100644 (file)
@@ -1,3 +1,10 @@
+2015-09-16  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       * toplev.h (check_global_declaration): Remove declaration.
+       * toplev.c (check_global_declaration): Move to ...
+       * cgraphunit.c: ... here. Make it static and pass a symtab_node *.
+       (analyze_functions): Update call.
+
 2015-09-16  David S. Miller  <davem@davemloft.net>
 
        * lra-constraints.c (simplify_operand_subreg): Do not assume that
index 278515da09684895a7969b3d6c2fabd2583f1f6f..5d84246dc8d7a1122f061c9fa2b0b46569f0a908 100644 (file)
@@ -923,6 +923,69 @@ walk_polymorphic_call_targets (hash_set<void *> *reachable_call_targets,
     }
 }
 
+/* Issue appropriate warnings for the global declaration DECL.  */
+
+static void
+check_global_declaration (symtab_node *snode)
+{
+  tree decl = snode->decl;
+
+  /* Warn about any function declared static but not defined.  We don't
+     warn about variables, because many programs have static variables
+     that exist only to get some text into the object file.  */
+  if (TREE_CODE (decl) == FUNCTION_DECL
+      && DECL_INITIAL (decl) == 0
+      && DECL_EXTERNAL (decl)
+      && ! DECL_ARTIFICIAL (decl)
+      && ! TREE_NO_WARNING (decl)
+      && ! TREE_PUBLIC (decl)
+      && (warn_unused_function
+         || snode->referred_to_p (/*include_self=*/false)))
+    {
+      if (snode->referred_to_p (/*include_self=*/false))
+       pedwarn (input_location, 0, "%q+F used but never defined", decl);
+      else
+       warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl);
+      /* This symbol is effectively an "extern" declaration now.  */
+      TREE_PUBLIC (decl) = 1;
+    }
+
+  /* Warn about static fns or vars defined but not used.  */
+  if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
+       || (((warn_unused_variable && ! TREE_READONLY (decl))
+           || (warn_unused_const_variable && TREE_READONLY (decl)))
+          && TREE_CODE (decl) == VAR_DECL))
+      && ! DECL_IN_SYSTEM_HEADER (decl)
+      && ! snode->referred_to_p (/*include_self=*/false)
+      /* This TREE_USED check is needed in addition to referred_to_p
+        above, because the `__unused__' attribute is not being
+        considered for referred_to_p.  */
+      && ! TREE_USED (decl)
+      /* The TREE_USED bit for file-scope decls is kept in the identifier,
+        to handle multiple external decls in different scopes.  */
+      && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl)))
+      && ! DECL_EXTERNAL (decl)
+      && ! DECL_ARTIFICIAL (decl)
+      && ! DECL_ABSTRACT_ORIGIN (decl)
+      && ! TREE_PUBLIC (decl)
+      /* A volatile variable might be used in some non-obvious way.  */
+      && ! TREE_THIS_VOLATILE (decl)
+      /* Global register variables must be declared to reserve them.  */
+      && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
+      /* Global ctors and dtors are called by the runtime.  */
+      && (TREE_CODE (decl) != FUNCTION_DECL
+         || (!DECL_STATIC_CONSTRUCTOR (decl)
+             && !DECL_STATIC_DESTRUCTOR (decl)))
+      /* Otherwise, ask the language.  */
+      && lang_hooks.decls.warn_unused_global (decl))
+    warning_at (DECL_SOURCE_LOCATION (decl),
+               (TREE_CODE (decl) == FUNCTION_DECL)
+               ? OPT_Wunused_function
+               : (TREE_READONLY (decl)
+                  ? OPT_Wunused_const_variable
+                  : OPT_Wunused_variable),
+               "%qD defined but not used", decl);
+}
 
 /* Discover all functions and variables that are trivially needed, analyze
    them as well as all functions and variables referred by them  */
@@ -1110,7 +1173,7 @@ analyze_functions (bool first_time)
     {
       symtab_node *snode;
       FOR_EACH_SYMBOL (snode)
-       check_global_declaration (snode->decl);
+       check_global_declaration (snode);
     }
 
   if (symtab->dump_file)
index 95e4c522e4a5558f20ffe23cd722bbf99b9639cb..46689ab2860ba1e7f8ead559a756d843fcbb77d6 100644 (file)
@@ -469,69 +469,6 @@ wrapup_global_declarations (tree *vec, int len)
   return output_something;
 }
 
-/* Issue appropriate warnings for the global declaration DECL.  */
-
-void
-check_global_declaration (tree decl)
-{
-  /* Warn about any function declared static but not defined.  We don't
-     warn about variables, because many programs have static variables
-     that exist only to get some text into the object file.  */
-  symtab_node *snode = symtab_node::get (decl);
-  if (TREE_CODE (decl) == FUNCTION_DECL
-      && DECL_INITIAL (decl) == 0
-      && DECL_EXTERNAL (decl)
-      && ! DECL_ARTIFICIAL (decl)
-      && ! TREE_NO_WARNING (decl)
-      && ! TREE_PUBLIC (decl)
-      && (warn_unused_function
-         || snode->referred_to_p (/*include_self=*/false)))
-    {
-      if (snode->referred_to_p (/*include_self=*/false))
-       pedwarn (input_location, 0, "%q+F used but never defined", decl);
-      else
-       warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl);
-      /* This symbol is effectively an "extern" declaration now.  */
-      TREE_PUBLIC (decl) = 1;
-    }
-
-  /* Warn about static fns or vars defined but not used.  */
-  if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL)
-       || (((warn_unused_variable && ! TREE_READONLY (decl))
-           || (warn_unused_const_variable && TREE_READONLY (decl)))
-          && TREE_CODE (decl) == VAR_DECL))
-      && ! DECL_IN_SYSTEM_HEADER (decl)
-      && ! snode->referred_to_p (/*include_self=*/false)
-      /* This TREE_USED check is needed in addition to referred_to_p
-        above, because the `__unused__' attribute is not being
-        considered for referred_to_p.  */
-      && ! TREE_USED (decl)
-      /* The TREE_USED bit for file-scope decls is kept in the identifier,
-        to handle multiple external decls in different scopes.  */
-      && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl)))
-      && ! DECL_EXTERNAL (decl)
-      && ! DECL_ARTIFICIAL (decl)
-      && ! DECL_ABSTRACT_ORIGIN (decl)
-      && ! TREE_PUBLIC (decl)
-      /* A volatile variable might be used in some non-obvious way.  */
-      && ! TREE_THIS_VOLATILE (decl)
-      /* Global register variables must be declared to reserve them.  */
-      && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl))
-      /* Global ctors and dtors are called by the runtime.  */
-      && (TREE_CODE (decl) != FUNCTION_DECL
-         || (!DECL_STATIC_CONSTRUCTOR (decl)
-             && !DECL_STATIC_DESTRUCTOR (decl)))
-      /* Otherwise, ask the language.  */
-      && lang_hooks.decls.warn_unused_global (decl))
-    warning_at (DECL_SOURCE_LOCATION (decl),
-               (TREE_CODE (decl) == FUNCTION_DECL)
-               ? OPT_Wunused_function
-               : (TREE_READONLY (decl)
-                  ? OPT_Wunused_const_variable
-                  : OPT_Wunused_variable),
-               "%qD defined but not used", decl);
-}
-
 /* Compile an entire translation unit.  Write a file of assembly
    output and various debugging dumps.  */
 
index 21d9a75ed4f7199e55a349d762499f3e5bd12384..e613fec5894fe2c81686579064d9b50a47ff71fe 100644 (file)
@@ -61,7 +61,6 @@ extern void announce_function (tree);
 extern void wrapup_global_declaration_1 (tree);
 extern bool wrapup_global_declaration_2 (tree);
 extern bool wrapup_global_declarations (tree *, int);
-extern void check_global_declaration (tree);
 
 extern void global_decl_processing (void);