On Tue, Jan 5, 2016 at 3:32 PM, Pierre-Marie de Rodat
<[email protected]> wrote:
> Hello,
>
> In Ada, it is possible to have nested subprograms in the following
> configuration:
>
> procedure Parent is
> type T;
> [...]
> procedure Child (Value : T) is
> begin
> [...]
> end Child;
> begin
> [...]
> end Parent;
>
> If we generate debugging information for Child first before Parent, the
> debug info for T will be generated at global scope since the DIE for
> Parent does not exist yet. It is when generating debug info for Parent
> that we are supposed to relocate it thanks to decls_for_scope and
> process_scope_var.
>
> However, process_scope_var currently works only on TYPE_DECL nodes that
> are stubs, for unknown reasons. This change adapts it to work on all
> TYPE_DECL nodes.
>
> It bootstrapped and regtested fine on x86_64-linux and triggered to
> regression in the GDB testsuite for Ada, C, C++ and Fortran. Ok to
> commit? Thank you in advance!
Looking for TYPE_DECL_IS_STUB uses I come along dwarf2out_ignore_block
which you'd need to change as well I think.
> gcc/ChangeLog:
>
> * dwarf2out.c (process_scope_var): Relocate TYPE_DECL nodes that
> are not stubs just like stub ones.
> ---
> gcc/dwarf2out.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> index 2c0bd63..da5524e 100644
> --- a/gcc/dwarf2out.c
> +++ b/gcc/dwarf2out.c
> @@ -22829,8 +22829,7 @@ process_scope_var (tree stmt, tree decl, tree
> origin, dw_die_ref context_die)
> if (TREE_CODE (decl_or_origin) == FUNCTION_DECL)
> die = lookup_decl_die (decl_or_origin);
> - else if (TREE_CODE (decl_or_origin) == TYPE_DECL
> - && TYPE_DECL_IS_STUB (decl_or_origin))
> + else if (TREE_CODE (decl_or_origin) == TYPE_DECL)
> die = lookup_type_die (TREE_TYPE (decl_or_origin));
But ... I think this change is wrong. It is supposed to use the _type_ DIE
in case the FE didn't create a proper TYPE_DECL. So I think what is
maybe missing is
else if (TREE_CODE (decl_or_origin) == TYPE_DECL)
die = lookup_decl_die (decl_or_origin);
? That is, why should we lookup the type if the type-decl isn't a stub?
Btw, not sure how you get at the "wrong" debug info gen order, I can't seem to
get at it with a C testcase.
As with the other patch this misses a testcase.
Richard.
> else
> die = NULL;
> --
> 2.6.4
>