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