On 04/29/2015 12:33 PM, Jason Merrill wrote:
On 04/28/2015 09:01 PM, Aldy Hernandez wrote:

The approach looks good to me.

-  analyze_functions ();
+  analyze_functions (true);

In the C++ front end at least we comment anonymous boolean arguments, i.e.

  analyze_functions (/*first_time*/true);

Let's do that here, too.  Similarly for the calls to referred_to_p (false).

Done.


+      /* ?? Why are we looking at TREE_USED?  Shouldn't the call to
+     referred_to_p above be enough?  Apparently not, because the
+     `__unused__' attribute is not being considered for
+     referred_to_p.  */

Seems like you answered your question.  :)

I've adjusted the comment.


+      /* Global ctors and dtors are called by the runtime.  */
+      && (TREE_CODE (decl) != FUNCTION_DECL
+      || (!DECL_STATIC_CONSTRUCTOR (decl)
+          && !DECL_STATIC_DESTRUCTOR (decl)))

Maybe check snode->needed_p instead?

I thought so too, but it's a bit too restrictive. Particularly, it causes this test to fail:

static void foo (void) {} /* { dg-warning "'foo' defined but not used" } */
static void bar (void) { bar (); } /* { dg-warning "'bar' defined but not used" } */

...because force_output is true, which unfortunately is set here:

  /* When not optimizing, also output the static functions. (see
     PR24561), but don't do so for always_inline functions, functions
     declared inline and nested functions.  These were optimized out
     in the original implementation and it is unclear whether we want
     to change the behavior here.  */
  if ((!opt_for_fn (decl, optimize)
       && !node->cpp_implicit_alias
       && !DECL_DISREGARD_INLINE_LIMITS (decl)
       && !DECL_DECLARED_INLINE_P (decl)
       && !(DECL_CONTEXT (decl)
            && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL))
      && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
    node->force_output = 1;

I've left it as is, and am committing the attached incremental patch.

Thanks.
Aldy
commit 5ffe67af1604495d4cafeae4b3e948bf2eac77b3
Author: Aldy Hernandez <al...@redhat.com>
Date:   Wed Apr 29 18:04:58 2015 -0700

    Provide comments for some boolean arguments.
    
    Use needed_p instead of looking at DECL_*_CONSTRUCTOR.

diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 0ee1d2b..0873162 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2467,13 +2467,13 @@ symbol_table::finalize_compilation_unit (void)
 
   /* Gimplify and lower all functions, compute reachability and
      remove unreachable nodes.  */
-  analyze_functions (true);
+  analyze_functions (/*first_time=*/true);
 
   /* Mark alias targets necessary and emit diagnostics.  */
   handle_alias_pairs ();
 
   /* Gimplify and lower thunks.  */
-  analyze_functions (false);
+  analyze_functions (/*first_time=*/false);
 
   /* Emit early debug for reachable functions, and by consequence,
      locally scoped symbols.  */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 3155595..9a27ca2 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -505,8 +505,6 @@ wrapup_global_declarations (tree *vec, int len)
 void
 check_global_declaration (tree decl)
 {
-  // ?? Perhaps we should avoid all DECL_ARTIFICIALs here?
-
   /* 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.  */
@@ -518,9 +516,9 @@ check_global_declaration (tree decl)
       && ! TREE_NO_WARNING (decl)
       && ! TREE_PUBLIC (decl)
       && (warn_unused_function
-         || snode->referred_to_p (false)))
+         || snode->referred_to_p (/*include_self=*/false)))
     {
-      if (snode->referred_to_p (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);
@@ -535,11 +533,10 @@ check_global_declaration (tree decl)
        || (warn_unused_variable
           && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
       && ! DECL_IN_SYSTEM_HEADER (decl)
-      && ! snode->referred_to_p (false)
-      /* ?? Why are we looking at TREE_USED?  Shouldn't the call to
-        referred_to_p above be enough?  Apparently not, because the
-        `__unused__' attribute is not being considered for
-        referred_to_p.  */
+      && ! 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.  */

Reply via email to