On Wed, Nov 14, 2018 at 12:58 PM Nathan Sidwell <[email protected]> wrote:
>
> PR88006 and 87462 turn out to be the same problem, but started by
> different commits.
>
> The problem is that debug wants to emit a constant (for a non-type
> template parameter of a template instantiation) that refers to the
> address of some local function. That local might not be emitted though.
>
> gen_remaining_tmpl_value_param_die_attribute is aware of the problem:
> /* We do this in two phases - first get the cases we can
> handle during early-finish, preserving those we cannot
> (containing symbolic constants where we don't yet know
> whether we are going to output the referenced symbols).
> For those we try again at late-finish. */
>
> But the second phase unconditionally emits the constant:
> if (! early_dwarf
> && (dwarf_version >= 5 || !dwarf_strict))
> loc = loc_descriptor_from_tree (e->arg, 2, NULL);
>
> and loc_descriptor_from_tree eventually ends up in
> const_ok_for_output_1. That function assumes pretty much any non
> SYMBOL_REF_EXTERNAL_P SYMBOL_REF is accessible. That's not true.
>
> I'm not sure if there's a more canonical way of checking for a
> local-decl's emission, but not having a symtab entry seems significant?
>
> booted & tested on x86_64-linux, ok?
Hmm, there is reference_to_unused () used in a related case. But generally
for late emission such references are "OK" and expected to be pruned
later by resolve_addr () (which I see we do not call for type units?!). Quote:
/* Resolve DW_OP_addr and DW_AT_const_value CONST_STRING arguments to
an address in .rodata section if the string literal is emitted there,
or remove the containing location list or replace DW_AT_const_value
with DW_AT_location and empty location expression, if it isn't found
in .rodata. Similarly for SYMBOL_REFs, keep only those that refer
to something that has been emitted in the current CU. */
static void
resolve_addr (dw_die_ref die)
{
Richard.
>
> nathan
>
> --
> Nathan Sidwell