> From: Trevor Saunders <tsaund...@mozilla.com>
> 
> Hi,
> 
> the interesting symbol in the test case for pr61324 is __GLOBAL__sub_I_s.  It
> refers to nothing, and is called by nothing, however it is kept (I believe
> because of -fkeep-inline-functions).  That means ipa_comdats never tries to 
> put

Aha, that explans why it is around.

> it in a comdat, and so it never ends up in the hash table.  It seems like the
> simplest solution is to just check if symbol is not in the map before trying 
> to
> get the comdat it should go in, but another approach might be to keep separate
> hash maps for comdat functions and functions that can't be in any comdat, and
> then iterate over only the functions that belong in a comdat.

Well, -fkeep-inline-functions promise you that you can call any inline function 
from debugger.
I suppose in this case you also want to be able to call static functions. 
Comdat pass may
bundle the function into comdat that is later optimized away by linker, so I 
would say we
just want to disable the whole comdat pass when -fkeep-inline-functions is used?

Patch for that is preapproved.
Honza
> 
> boottstrapped + regtested x86_64-unknown-linux-gnu, ok?
> 
> Trev
> 
> gcc/
> 
>       * ipa-comdats.c (ipa_commdats): check if map contains symbol before
>       trying to put symbol in a comdat.
> 
> diff --git a/gcc/ipa-comdats.c b/gcc/ipa-comdats.c
> index af2aef8..8695a7e 100644
> --- a/gcc/ipa-comdats.c
> +++ b/gcc/ipa-comdats.c
> @@ -327,18 +327,18 @@ ipa_comdats (void)
>         && !symbol->alias
>         && symbol->real_symbol_p ())
>       {
> -       tree group = *map.get (symbol);
> +       tree *group = map.get (symbol);
>  
> -       if (group == error_mark_node)
> +       if (!group || *group == error_mark_node)
>           continue;
>         if (dump_file)
>           {
>             fprintf (dump_file, "Localizing symbol\n");
>             symbol->dump (dump_file);
> -           fprintf (dump_file, "To group: %s\n", IDENTIFIER_POINTER (group));
> +           fprintf (dump_file, "To group: %s\n", IDENTIFIER_POINTER 
> (*group));
>           }
>         symbol->call_for_symbol_and_aliases (set_comdat_group,
> -                                          *comdat_head_map.get (group),
> +                                          *comdat_head_map.get (*group),
>                                            true);
>       }
>      }
> diff --git a/gcc/testsuite/g++.dg/pr61324.C b/gcc/testsuite/g++.dg/pr61324.C
> new file mode 100644
> index 0000000..6102574
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/pr61324.C
> @@ -0,0 +1,13 @@
> +// { dg-do compile }
> +// { dg-options "-O -fkeep-inline-functions -fno-use-cxa-atexit" }
> +void foo ();
> +
> +struct S
> +{
> +  ~S ()
> +  {
> +    foo ();
> +  }
> +};
> +
> +S s;
> -- 
> 2.1.3

Reply via email to