diff --git a/gdb/linespec.c b/gdb/linespec.c index 4156694..91cacb5 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -842,6 +842,8 @@ add_sal_to_sals (struct linespec_state *self, else canonical_name = xstrprintf ("%s:%d", filename, sal->line); } + else if (symname != NULL) + canonical_name = xstrdup (symname); self->canonical_names[sals->nelts - 1] = canonical_name; } @@ -1837,13 +1839,14 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls) if (ls->expression != NULL) { + struct symtab_and_line sal; + /* We have an expression. No other attribute is allowed. */ - sals.sals = XMALLOC (struct symtab_and_line); - sals.nelts = 1; - sals.sals[0] = find_pc_line (ls->expr_pc, 0); - sals.sals[0].pc = ls->expr_pc; - sals.sals[0].section = find_pc_overlay (ls->expr_pc); - sals.sals[0].explicit_pc = 1; + sal = find_pc_line (ls->expr_pc, 0); + sal.pc = ls->expr_pc; + sal.section = find_pc_overlay (ls->expr_pc); + sal.explicit_pc = 1; + add_sal_to_sals (state, &sals, &sal, ls->expression); } else if (ls->labels.label_symbols != NULL) { @@ -2284,19 +2287,15 @@ decode_line_full (char **argptr, int flags, gdb_assert (canonical->addr_string != NULL); canonical->pre_expanded = 1; - /* Fill in the missing canonical names. */ + /* Arrange for allocated canonical names to be freed. */ if (result.nelts > 0) { int i; - if (state->canonical_names == NULL) - state->canonical_names = xcalloc (result.nelts, sizeof (char *)); make_cleanup (xfree, state->canonical_names); for (i = 0; i < result.nelts; ++i) { - if (state->canonical_names[i] == NULL) - state->canonical_names[i] = savestring (arg_start, - *argptr - arg_start); + gdb_assert (state->canonical_names[i] != NULL); make_cleanup (xfree, state->canonical_names[i]); } }