[1/3] RFC: introduce struct linespec_result
Tom Tromey
tromey@redhat.com
Fri Mar 18 18:55:00 GMT 2011
I needed to pass a new result from decode_line_1 back to the breakpoint
code. At first I stuffed this into symtab_and_line, but I think it is
cleaner to add a new structure that is filled in by decode_line_1.
(This will also come in handy for the SystemTap probe work.)
This patch introduces struct linespec_result and updates everything to
use it. It does not introduce any behavior changes.
Built and regtested on x86-64 (compile farm).
Tom
2011-03-18 Tom Tromey <tromey@redhat.com>
* symtab.c (decode_line_spec): Update.
* linespec.c (build_canonical_line_spec): Change type of
'canonical'.
(decode_line_2, decode_line_1, decode_objc, decode_compound)
(find_method, decode_all_digits, decode_dollar, decode_label)
(symbol_found): Likewise.
(init_linespec_result): New function.
* breakpoint.c (struct captured_parse_breakpoint_args)
<canonical_p>: New field, replaces addr_string_p.
(create_breakpoints_sal): Add 'canonical' parameter, replacing
'addr_string'.
(parse_breakpoint_sals): Likewise.
(do_captured_parse_breakpoint): Update.
(create_breakpoint): Use struct linespec_result.
(until_break_command): Update.
(breakpoint_re_set_one): Update.
(decode_line_spec_1): Update.
* linespec.h (struct linespec_result): New.
(init_linespec_result): Declare.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index c55e5c0..c1c7b5a 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -5954,7 +5954,7 @@ struct captured_parse_breakpoint_args
{
char **arg_p;
struct symtabs_and_lines *sals_p;
- char ***addr_string_p;
+ struct linespec_result *canonical_p;
int *not_found_ptr;
};
@@ -7479,7 +7479,8 @@ expand_line_sal_maybe (struct symtab_and_line sal)
static void
create_breakpoints_sal (struct gdbarch *gdbarch,
- struct symtabs_and_lines sals, char **addr_string,
+ struct symtabs_and_lines sals,
+ struct linespec_result *canonical,
char *cond_string,
enum bptype type, enum bpdisp disposition,
int thread, int task, int ignore_count,
@@ -7493,7 +7494,7 @@ create_breakpoints_sal (struct gdbarch *gdbarch,
struct symtabs_and_lines expanded =
expand_line_sal_maybe (sals.sals[i]);
- create_breakpoint_sal (gdbarch, expanded, addr_string[i],
+ create_breakpoint_sal (gdbarch, expanded, canonical->canonical[i],
cond_string, type, disposition,
thread, task, ignore_count, ops,
from_tty, enabled, internal);
@@ -7511,12 +7512,11 @@ create_breakpoints_sal (struct gdbarch *gdbarch,
static void
parse_breakpoint_sals (char **address,
struct symtabs_and_lines *sals,
- char ***addr_string,
+ struct linespec_result *canonical,
int *not_found_ptr)
{
char *addr_start = *address;
- *addr_string = NULL;
/* If no arg given, or if first arg is 'if ', use the default
breakpoint. */
if ((*address) == NULL
@@ -7565,15 +7565,15 @@ parse_breakpoint_sals (char **address,
|| ((strchr ("+-", (*address)[0]) != NULL)
&& ((*address)[1] != '['))))
*sals = decode_line_1 (address, 1, default_breakpoint_symtab,
- default_breakpoint_line, addr_string,
+ default_breakpoint_line, canonical,
not_found_ptr);
else
*sals = decode_line_1 (address, 1, (struct symtab *) NULL, 0,
- addr_string, not_found_ptr);
+ canonical, not_found_ptr);
}
/* For any SAL that didn't have a canonical string, fill one in. */
- if (sals->nelts > 0 && *addr_string == NULL)
- *addr_string = xcalloc (sals->nelts, sizeof (char **));
+ if (sals->nelts > 0 && canonical->canonical == NULL)
+ canonical->canonical = xcalloc (sals->nelts, sizeof (char **));
if (addr_start != (*address))
{
int i;
@@ -7581,9 +7581,9 @@ parse_breakpoint_sals (char **address,
for (i = 0; i < sals->nelts; i++)
{
/* Add the string if not present. */
- if ((*addr_string)[i] == NULL)
- (*addr_string)[i] = savestring (addr_start,
- (*address) - addr_start);
+ if (canonical->canonical[i] == NULL)
+ canonical->canonical[i] = savestring (addr_start,
+ (*address) - addr_start);
}
}
}
@@ -7638,7 +7638,7 @@ do_captured_parse_breakpoint (struct ui_out *ui, void *data)
{
struct captured_parse_breakpoint_args *args = data;
- parse_breakpoint_sals (args->arg_p, args->sals_p, args->addr_string_p,
+ parse_breakpoint_sals (args->arg_p, args->sals_p, args->canonical_p,
args->not_found_ptr);
}
@@ -7782,7 +7782,7 @@ create_breakpoint (struct gdbarch *gdbarch,
struct symtab_and_line pending_sal;
char *copy_arg;
char *addr_start = arg;
- char **addr_string;
+ struct linespec_result canonical;
struct cleanup *old_chain;
struct cleanup *bkpt_chain = NULL;
struct captured_parse_breakpoint_args parse_args;
@@ -7794,11 +7794,11 @@ create_breakpoint (struct gdbarch *gdbarch,
sals.sals = NULL;
sals.nelts = 0;
- addr_string = NULL;
+ init_linespec_result (&canonical);
parse_args.arg_p = &arg;
parse_args.sals_p = &sals;
- parse_args.addr_string_p = &addr_string;
+ parse_args.canonical_p = &canonical;
parse_args.not_found_ptr = ¬_found;
if (type_wanted == bp_static_tracepoint && is_marker_spec (arg))
@@ -7808,9 +7808,9 @@ create_breakpoint (struct gdbarch *gdbarch,
sals = decode_static_tracepoint_spec (&arg);
copy_arg = savestring (addr_start, arg - addr_start);
- addr_string = xcalloc (sals.nelts, sizeof (char **));
+ canonical.canonical = xcalloc (sals.nelts, sizeof (char **));
for (i = 0; i < sals.nelts; i++)
- addr_string[i] = xstrdup (copy_arg);
+ canonical.canonical[i] = xstrdup (copy_arg);
goto done;
}
@@ -7847,7 +7847,7 @@ create_breakpoint (struct gdbarch *gdbarch,
breakpoint behavior is on and thus a pending breakpoint
is defaulted on behalf of the user. */
copy_arg = xstrdup (addr_start);
- addr_string = ©_arg;
+ canonical.canonical = ©_arg;
sals.nelts = 1;
sals.sals = &pending_sal;
pending_sal.pc = 0;
@@ -7872,8 +7872,8 @@ create_breakpoint (struct gdbarch *gdbarch,
/* Make sure that all storage allocated to SALS gets freed. */
make_cleanup (xfree, sals.sals);
- /* Cleanup the addr_string array but not its contents. */
- make_cleanup (xfree, addr_string);
+ /* Cleanup the canonical array but not its contents. */
+ make_cleanup (xfree, canonical.canonical);
}
/* ----------------------------- SNIP -----------------------------
@@ -7882,12 +7882,12 @@ create_breakpoint (struct gdbarch *gdbarch,
then the memory is not reclaimed. */
bkpt_chain = make_cleanup (null_cleanup, 0);
- /* Mark the contents of the addr_string for cleanup. These go on
+ /* Mark the contents of the canonical for cleanup. These go on
the bkpt_chain and only occur if the breakpoint create fails. */
for (i = 0; i < sals.nelts; i++)
{
- if (addr_string[i] != NULL)
- make_cleanup (xfree, addr_string[i]);
+ if (canonical.canonical[i] != NULL)
+ make_cleanup (xfree, canonical.canonical[i]);
}
/* Resolve all line numbers to PC's and verify that the addresses
@@ -7934,7 +7934,7 @@ create_breakpoint (struct gdbarch *gdbarch,
expand multiple locations for each sal, given than SALS
already should contain all sals for MARKER_ID. */
if (type_wanted == bp_static_tracepoint
- && is_marker_spec (addr_string[0]))
+ && is_marker_spec (canonical.canonical[0]))
{
int i;
@@ -7949,7 +7949,7 @@ create_breakpoint (struct gdbarch *gdbarch,
expanded.sals[0] = sals.sals[i];
old_chain = make_cleanup (xfree, expanded.sals);
- create_breakpoint_sal (gdbarch, expanded, addr_string[i],
+ create_breakpoint_sal (gdbarch, expanded, canonical.canonical[i],
cond_string, type_wanted,
tempflag ? disp_del : disp_donttouch,
thread, task, ignore_count, ops,
@@ -7974,7 +7974,7 @@ create_breakpoint (struct gdbarch *gdbarch,
}
}
else
- create_breakpoints_sal (gdbarch, sals, addr_string, cond_string,
+ create_breakpoints_sal (gdbarch, sals, &canonical, cond_string,
type_wanted,
tempflag ? disp_del : disp_donttouch,
thread, task, ignore_count, ops, from_tty,
@@ -7989,7 +7989,7 @@ create_breakpoint (struct gdbarch *gdbarch,
b = set_raw_breakpoint_without_location (gdbarch, type_wanted);
set_breakpoint_number (internal, b);
b->thread = -1;
- b->addr_string = addr_string[0];
+ b->addr_string = canonical.canonical[0];
b->cond_string = NULL;
b->ignore_count = ignore_count;
b->disposition = tempflag ? disp_del : disp_donttouch;
@@ -8857,10 +8857,9 @@ until_break_command (char *arg, int from_tty, int anywhere)
if (default_breakpoint_valid)
sals = decode_line_1 (&arg, 1, default_breakpoint_symtab,
- default_breakpoint_line, (char ***) NULL, NULL);
+ default_breakpoint_line, NULL, NULL);
else
- sals = decode_line_1 (&arg, 1, (struct symtab *) NULL,
- 0, (char ***) NULL, NULL);
+ sals = decode_line_1 (&arg, 1, (struct symtab *) NULL, 0, NULL, NULL);
if (sals.nelts != 1)
error (_("Couldn't get information on specified line."));
@@ -10543,7 +10542,7 @@ breakpoint_re_set_one (void *bint)
}
else
sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0,
- (char ***) NULL, not_found_ptr);
+ NULL, not_found_ptr);
}
if (e.reason < 0)
{
@@ -11149,10 +11148,10 @@ decode_line_spec_1 (char *string, int funfirstline)
sals = decode_line_1 (&string, funfirstline,
default_breakpoint_symtab,
default_breakpoint_line,
- (char ***) NULL, NULL);
+ NULL, NULL);
else
sals = decode_line_1 (&string, funfirstline,
- (struct symtab *) NULL, 0, (char ***) NULL, NULL);
+ (struct symtab *) NULL, 0, NULL, NULL);
if (*string)
error (_("Junk at end of line specification: %s"), string);
return sals;
diff --git a/gdb/linespec.c b/gdb/linespec.c
index 3959402..6c0e7ed 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -60,12 +60,12 @@ static char *locate_first_half (char **argptr, int *is_quote_enclosed);
static struct symtabs_and_lines decode_objc (char **argptr,
int funfirstline,
struct symtab *file_symtab,
- char ***canonical,
+ struct linespec_result *canonical,
char *saved_arg);
static struct symtabs_and_lines decode_compound (char **argptr,
int funfirstline,
- char ***canonical,
+ struct linespec_result *canonical,
char *saved_arg,
char *p,
int *not_found_ptr);
@@ -73,7 +73,7 @@ static struct symtabs_and_lines decode_compound (char **argptr,
static struct symbol *lookup_prefix_sym (char **argptr, char *p);
static struct symtabs_and_lines find_method (int funfirstline,
- char ***canonical,
+ struct linespec_result *canonical,
char *saved_arg,
char *copy,
struct type *t,
@@ -97,14 +97,15 @@ static int add_constructors (int method_counter, struct type *t,
struct symbol **sym_arr);
static void build_canonical_line_spec (struct symtab_and_line *,
- char *, char ***);
+ char *, struct linespec_result *);
static char *find_toplevel_char (char *s, char c);
static int is_objc_method_format (const char *s);
static struct symtabs_and_lines decode_line_2 (struct symbol *[],
- int, int, char ***);
+ int, int,
+ struct linespec_result *);
static struct symtab *symtab_from_filename (char **argptr,
char *p, int is_quote_enclosed,
@@ -114,28 +115,28 @@ static struct
symtabs_and_lines decode_all_digits (char **argptr,
struct symtab *default_symtab,
int default_line,
- char ***canonical,
+ struct linespec_result *canonical,
struct symtab *file_symtab,
char *q);
static struct symtabs_and_lines decode_dollar (char *copy,
int funfirstline,
struct symtab *default_symtab,
- char ***canonical,
+ struct linespec_result *canonical,
struct symtab *file_symtab);
-static int decode_label (char *copy, char ***canonical,
+static int decode_label (char *copy, struct linespec_result *canonical,
struct symtabs_and_lines *result);
static struct symtabs_and_lines decode_variable (char *copy,
int funfirstline,
- char ***canonical,
+ struct linespec_result *canonical,
struct symtab *file_symtab,
int *not_found_ptr);
static struct
symtabs_and_lines symbol_found (int funfirstline,
- char ***canonical,
+ struct linespec_result *canonical,
char *copy,
struct symbol *sym,
struct symtab *file_symtab);
@@ -405,7 +406,7 @@ add_constructors (int method_counter, struct type *t,
static void
build_canonical_line_spec (struct symtab_and_line *sal, char *symname,
- char ***canonical)
+ struct linespec_result *canonical)
{
char **canonical_arr;
char *canonical_name;
@@ -414,11 +415,11 @@ build_canonical_line_spec (struct symtab_and_line *sal, char *symname,
if (s == (struct symtab *) NULL
|| s->filename == (char *) NULL
- || canonical == (char ***) NULL)
+ || canonical == NULL)
return;
canonical_arr = (char **) xmalloc (sizeof (char *));
- *canonical = canonical_arr;
+ canonical->canonical = canonical_arr;
filename = s->filename;
if (symname != NULL)
@@ -498,7 +499,7 @@ is_objc_method_format (const char *s)
static struct symtabs_and_lines
decode_line_2 (struct symbol *sym_arr[], int nelts, int funfirstline,
- char ***canonical)
+ struct linespec_result *canonical)
{
struct symtabs_and_lines values, return_values;
char *args, *arg1;
@@ -524,7 +525,7 @@ decode_line_2 (struct symbol *sym_arr[], int nelts, int funfirstline,
canonical_arr = (char **) xmalloc (nelts * sizeof (char *));
make_cleanup (xfree, canonical_arr);
memset (canonical_arr, 0, nelts * sizeof (char *));
- *canonical = canonical_arr;
+ canonical->canonical = canonical_arr;
}
i = 0;
@@ -791,7 +792,8 @@ keep_name_info (char *ptr)
struct symtabs_and_lines
decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
- int default_line, char ***canonical, int *not_found_ptr)
+ int default_line, struct linespec_result *canonical,
+ int *not_found_ptr)
{
char *p;
char *q;
@@ -1187,7 +1189,7 @@ locate_first_half (char **argptr, int *is_quote_enclosed)
struct symtabs_and_lines
decode_objc (char **argptr, int funfirstline, struct symtab *file_symtab,
- char ***canonical, char *saved_arg)
+ struct linespec_result *canonical, char *saved_arg)
{
struct symtabs_and_lines values;
struct symbol **sym_arr = NULL;
@@ -1293,7 +1295,8 @@ decode_objc (char **argptr, int funfirstline, struct symtab *file_symtab,
pointing to "AAA::inA::fun" and P pointing to "::inA::fun". */
static struct symtabs_and_lines
-decode_compound (char **argptr, int funfirstline, char ***canonical,
+decode_compound (char **argptr, int funfirstline,
+ struct linespec_result *canonical,
char *the_real_saved_arg, char *p, int *not_found_ptr)
{
struct symtabs_and_lines values;
@@ -1652,7 +1655,8 @@ lookup_prefix_sym (char **argptr, char *p)
symbol is SYM_CLASS. */
static struct symtabs_and_lines
-find_method (int funfirstline, char ***canonical, char *saved_arg,
+find_method (int funfirstline, struct linespec_result *canonical,
+ char *saved_arg,
char *copy, struct type *t, struct symbol *sym_class,
int *not_found_ptr)
{
@@ -1815,7 +1819,7 @@ symtab_from_filename (char **argptr, char *p, int is_quote_enclosed,
static struct symtabs_and_lines
decode_all_digits (char **argptr, struct symtab *default_symtab,
- int default_line, char ***canonical,
+ int default_line, struct linespec_result *canonical,
struct symtab *file_symtab, char *q)
{
@@ -1904,7 +1908,7 @@ decode_all_digits (char **argptr, struct symtab *default_symtab,
static struct symtabs_and_lines
decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab,
- char ***canonical, struct symtab *file_symtab)
+ struct linespec_result *canonical, struct symtab *file_symtab)
{
LONGEST valx;
int index = 0;
@@ -1984,7 +1988,8 @@ decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab,
This function returns 1 if a label was found, 0 otherwise. */
static int
-decode_label (char *copy, char ***canonical, struct symtabs_and_lines *result)
+decode_label (char *copy, struct linespec_result *canonical,
+ struct symtabs_and_lines *result)
{
struct symbol *sym;
@@ -2002,7 +2007,8 @@ decode_label (char *copy, char ***canonical, struct symtabs_and_lines *result)
the location pointed to and do not issue an error message. */
static struct symtabs_and_lines
-decode_variable (char *copy, int funfirstline, char ***canonical,
+decode_variable (char *copy, int funfirstline,
+ struct linespec_result *canonical,
struct symtab *file_symtab, int *not_found_ptr)
{
struct symbol *sym;
@@ -2044,7 +2050,7 @@ decode_variable (char *copy, int funfirstline, char ***canonical,
corresponding struct symtabs_and_lines. */
static struct symtabs_and_lines
-symbol_found (int funfirstline, char ***canonical, char *copy,
+symbol_found (int funfirstline, struct linespec_result *canonical, char *copy,
struct symbol *sym, struct symtab *file_symtab)
{
struct symtabs_and_lines values;
@@ -2130,3 +2136,9 @@ minsym_found (int funfirstline, struct minimal_symbol *msymbol)
values.nelts = 1;
return values;
}
+
+void
+init_linespec_result (struct linespec_result *lr)
+{
+ memset (lr, 0, sizeof (*lr));
+}
diff --git a/gdb/linespec.h b/gdb/linespec.h
index 7201638..3366fc6 100644
--- a/gdb/linespec.h
+++ b/gdb/linespec.h
@@ -20,9 +20,27 @@
struct symtab;
+/* An instance of this may be filled in by decode_line_1. The caller
+ must call init_linespec_result to initialize it. */
+
+struct linespec_result
+{
+ /* 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.
+ An element in the array may be NULL. The array and each non-NULL
+ element in it are allocated with xmalloc and must be freed by the
+ caller. */
+ char **canonical;
+};
+
+/* Initialize a linespec_result. */
+
+extern void init_linespec_result (struct linespec_result *);
+
extern struct symtabs_and_lines
decode_line_1 (char **argptr, int funfirstline,
struct symtab *default_symtab, int default_line,
- char ***canonical, int *not_found_ptr);
+ struct linespec_result *canonical, int *not_found_ptr);
#endif /* defined (LINESPEC_H) */
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 60bc585..6882262 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -4401,7 +4401,7 @@ decode_line_spec (char *string, int funfirstline)
sals = decode_line_1 (&string, funfirstline,
cursal.symtab, cursal.line,
- (char ***) NULL, NULL);
+ NULL, NULL);
if (*string)
error (_("Junk at end of line specification: %s"), string);
More information about the Gdb-patches
mailing list