On 06/25/2015 02:48 AM, Richard Biener wrote:
On Thu, Jun 25, 2015 at 5:12 AM, Aldy Hernandez <al...@redhat.com> wrote:
The problem here is that we are trying to call dwarf2out_late_global_decl()
on a static variable in a template which has a type of TEMPLATE_TYPE_PARM:

template <typename T> class A
{
   static __thread T a;
};

We are calling late_global_decl because we are about to remove the unused
static from the symbol table:

           /* See if the debugger can use anything before the DECL
              passes away.  Perhaps it can notice a DECL that is now a
              constant and can tag the early DIE with an appropriate
              attribute.

              Otherwise, this is the last chance the debug_hooks have
              at looking at optimized away DECLs, since
              late_global_decl will subsequently be called from the
              contents of the now pruned symbol table.  */
           if (!decl_function_context (node->decl))
             (*debug_hooks->late_global_decl) (node->decl);

Since gen_type_die_with_usage() cannot handle TEMPLATE_TYPE_PARMs we ICE.

I think we need to avoid calling late_global_decl on DECL's for which
decl_type_context() is true, similarly to what we do for the call to
early_global_decl in rest_of_decl_compilation:

       && !decl_function_context (decl)
       && !current_function_decl
       && DECL_SOURCE_LOCATION (decl) != BUILTINS_LOCATION
       && !decl_type_context (decl))
     (*debug_hooks->early_global_decl) (decl);

Presumably the old code did not run into this problem because the
TEMPLATE_TYPE_PARAMs had been lowered by the time dwarf2out_decl was called,
but here we are calling late_global_decl relatively early.

I think we need to sort out that instead - by the time we call _early_
global decl it
should already be "lowered".  Otherwise LTO streaming will run into
the decl_type_context it cannot handle.  Is the case running into
late_global_decl
before we called early_global_decl on it btw?

Typically in C++ we call early_global_decl via:

        cp_finish_decl
          -> make_rtl_for_nonlocal_decl
            -> rest_of_decl_compilation
              -> early_global_decl.

However, in this case we have not called early_global_decl on the DECL because cp_finish_decl avoids the make_rtl_for_nonlocal_decl path for templates:

cp_finish_decl():
  ...
  if (processing_template_decl)
    {
      bool type_dependent_p;
      ...
      ...
      return;
    }

Aldy

Reply via email to