> 
> I am playing with doing some internal interface static analysis
> using the first patch below (and looking at LTO bootstrap results).
> 
> An example, obvious patch resulting from that is the 2nd patch,
> resuling from the static analysis output
> 
> /space/rguenther/src/svn/trunk/gcc/tree-ssa-pre.c:add_to_value can be made 
> static
> /space/rguenther/src/svn/trunk/gcc/tree-ssa-pre.c:print_value_expressions 
> can be made static
> 
> the static analysis is very verbose (and does not consider ipa-refs yet).
> You also need to union results for building all frontends and all
> targets (well, in theory, or you can simply manually verify things
> which is a good idea anyway - even unused functions may be useful
> exported when they implement a generic data structure for example).
> 
> Excercise for the reader: turn the analysis into a plugin.
> 
> Richard.
> 
> 
> Index: gcc/lto/lto.c
> ===================================================================
> --- gcc/lto/lto.c     (revision 185918)
> +++ gcc/lto/lto.c     (working copy)
> @@ -2721,6 +2721,65 @@ read_cgraph_and_symbols (unsigned nfiles
>    lto_symtab_merge_cgraph_nodes ();
>    ggc_collect ();
>  
> +  if (flag_wpa)
> +    {
> +      struct cgraph_node *node;
> +      FILE *f = fopen (concat (dump_base_name, ".callers", NULL), "w");
> +      for (node = cgraph_nodes; node; node = node->next)
> +     {
> +       tree caller_tu = NULL_TREE;
> +       struct cgraph_edge *caller;
> +       bool found = true;
> +
> +       if (!TREE_PUBLIC (node->decl)
> +           || !TREE_STATIC (node->decl)
> +           || resolution_used_from_other_file_p (node->resolution))
> +         continue;
> +
> +       if (!node->callers)
> +         {
> +           expanded_location loc = expand_location (DECL_SOURCE_LOCATION 
> (node->decl));
> +           fprintf (f, "%s:%s no calls\n",
> +                    loc.file, IDENTIFIER_POINTER (DECL_NAME (node->decl)));
> +         }

With Mozilla folks I used the dumps from first WPA unreachable function removal 
pass
with some degree of success.  This gets a lot of non-trivial cases of dead code,
but also there are a lot of funny false positives wrt comdats etc.
> +       for (caller = node->callers; caller; caller = caller->next_caller)
> +         {
> +           if (!caller_tu)
> +             caller_tu = DECL_CONTEXT (caller->caller->decl);
> +           else if (caller_tu
> +                    && DECL_CONTEXT (caller->caller->decl) != caller_tu)
> +             found = false;
> +         }
Extending to IPA-REF should be straighforward.
> +       if (found && caller_tu)
> +         {
> +           expanded_location loc1 = expand_location (DECL_SOURCE_LOCATION 
> (node->decl));
> +           expanded_location loc2 = expand_location (DECL_SOURCE_LOCATION 
> (node->callers->caller->decl));
> +
> +           if (DECL_CONTEXT (node->decl) == caller_tu)
> +             fprintf (f, "%s:%s can be made static\n",
> +                      loc1.file, IDENTIFIER_POINTER (DECL_NAME 
> (node->decl)));
Indeed, this is also useful. Any plans to turn this into general -W<something>,
or you will also stay just with an internal hack like I did? :)

Honza

Reply via email to