On Wed, Oct 08, 2014 at 09:05:30PM +0200, Pierre-Marie de Rodat wrote:
> gcc/
>       * dwarf2out.h (struct array_descr_info): Remove the base_decl field.
>       * dwarf2out.c (enum dw_scalar_form): New.
>       (struct loc_descr_context): New.
>       (add_scalar_info): New.
>       (add_bound_info): Add a context parameter.  Use add_scalar_info.
>       (loc_list_from_tree): Add a context parameter.  Handle PLACEHOLDER_EXPR
>       nodes for type-related expressions.  Likewise for base declarations.
>       (loc_descriptor_from_tree): Add a context parameter.
>       (subrange_type_die): Update calls to add_bound_info.
>       (tls_mem_loc_descriptor): Likewise.
>       (loc_list_for_address_of_addr_expr_of_indirect_ref): Add a context
>       parameter.  Update calls to loc_list_from_tree.
>       (add_subscript_info): Update calls to add_bound_info.
>       (gen_array_type_die): Update calls to loc_list_from_tree and to
>       add_bound_info.
>       (descr_info_loc): Remove.
>       (add_descr_info_field): Remove.
>       (gen_descr_array_type_die): Switch add_descr_info_field calls into
>       add_scalar_info/add_bound_info ones.
>       (gen_subprogram_die): Update calls to loc_list_from_tree.
>       (gen_variable_die): Likewise.

Replace implicitely with implicitly in the whole patch.

> +     to refer to register values).
> +
> +   CONTEXT provides information to customize the location descriptions
> +   generation.  Its context_type field specifies what type is implicitely
> +   referenced by DW_OP_push_object_address.  If it is NULL_TREE, this 
> operation
> +   will not be generated.
> +
> +   If CONTEXT is NULL, the behavior is the same as if the context_type field
> +   was NULL_TREE.  */

as if both context_type and base_decl were NULL_TREE?

> @@ -14311,6 +14351,12 @@ loc_list_from_tree (tree loc, int want_address)
>       extending the values properly.  Hopefully this won't be a real
>       problem...  */
>  
> +  if (context != NULL
> +      && context->base_decl == loc
> +      && want_address == 0)
> +    return new_loc_list (new_loc_descr (DW_OP_push_object_address, 0, 0),
> +                      NULL, NULL, NULL);
> +

This isn't guarded with dwarf_version >= 3 || !dwarf_strict.  Shouldn't it
be too and return NULL otherwise?

> +     expansion_failed (loc, NULL_RTX,
> +                       "PLACEHOLDER_EXPR for a unexpected type");

for an unexpected type?

> @@ -14533,7 +14594,8 @@ loc_list_from_tree (tree loc, int want_address)
>  
>       list_ret = loc_list_from_tree (obj,
>                                      want_address == 2
> -                                    && !bitpos && !offset ? 2 : 1);
> +                                    && !bitpos && !offset ? 2 : 1,
> +                                       context);

Formatting.  Should use tabs, not spaces.

> +      if (prec <= HOST_BITS_PER_WIDE_INT
> +            || tree_fits_uhwi_p (value))

Formatting.  || should be below p in prec.

Would be nice if you tried more than one fortran testcase, say build
all gfortran.dg/ tests with -O0 -g -dA (and perhaps -O2 -g -dA afterwards)
with both unpatched and patched compilers and diff *.s files?

Otherwise, LGTM.

        Jakub

Reply via email to