Re: [PATCH 2/6] Introduce `pre_expanded sals'

Jan Kratochvil
2011-04-11T21:08:06Z

On Mon, 04 Apr 2011 05:08:23 +0200, Sergio Durigan Junior wrote:
> static struct symtabs_and_lines
> -addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found)
> +addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found,
> + int *pre_expanded)
> {
> char *s;
> int marker_spec, not_found;
> struct symtabs_and_lines sals = {0};
> struct gdb_exception e;
> + int my_pre_expanded = 0;

Such as proposal:
if (pre_expanded == NULL)
pre_expanded = &my_pre_expanded;

and use only `pre_expanded' in the code so that one does not forget to update
both. (+Probably some *pre_expanded preinitialization.)

[...]
> + my_pre_expanded = canonical.pre_expanded;
> + if (pre_expanded)
> + *pre_expanded = my_pre_expanded;
> + }
> }
> if (e.reason < 0)
> {
> @@ -11010,7 +11041,7 @@ addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found)
>
> if (!not_found)
> {
> - gdb_assert (sals.nelts == 1);
> + gdb_assert (my_pre_expanded || sals.nelts == 1);
>
> resolve_sal_pc (&sals.sals[0]);
> if (b->condition_not_parsed && s && s[0])
> @@ -11049,22 +11080,27 @@ re_set_breakpoint (struct breakpoint *b)
> struct symtabs_and_lines expanded = {0};
> struct symtabs_and_lines expanded_end = {0};
> struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
> + int pre_expanded = 0;
>
> input_radix = b->input_radix;
> save_current_space_and_thread ();
> switch_to_program_space_and_thread (b->pspace);
> set_language (b->language);
>
> - sals = addr_string_to_sals (b, b->addr_string, &found);
> + sals = addr_string_to_sals (b, b->addr_string, &found, &pre_expanded);
> if (found)
> {
> make_cleanup (xfree, sals.sals);
> - expanded = expand_line_sal_maybe (sals.sals[0]);
> + if (pre_expanded)
> + expanded = sals;
> + else
> + expanded = expand_line_sal_maybe (sals.sals[0]);
> }
>
> if (b->addr_string_range_end)
> {
> - sals_end = addr_string_to_sals (b, b->addr_string_range_end, &found);
> + sals_end = addr_string_to_sals (b, b->addr_string_range_end, &found,
> + NULL);
> if (found)
> {
> make_cleanup (xfree, sals_end.sals);
> diff --git a/gdb/linespec.h b/gdb/linespec.h
> index d8d2ec9..458235c 100644
> --- a/gdb/linespec.h
> +++ b/gdb/linespec.h
> @@ -30,6 +30,10 @@ struct linespec_result
> display mechanism would do the wrong thing. */
> int special_display;
>
> + /* If non-zero, the linespec result should be considered to be a
> + "pre-expanded" multi-location linespec. */
> + int pre_expanded;

Here could be the comment by Tom from the follow-up mail as this comment does
not explain much.

> +
> /* If non-NULL, an array of canonical names for returned
> symtab_and_line objects. The array has as many elements as the
> `nelts' field in the symtabs_and_line returned by decode_line_1.

Thanks,
Jan