Index: breakpoint.c =================================================================== RCS file: /cvs/src/src/gdb/breakpoint.c,v retrieving revision 1.145 diff -u -p -r1.145 breakpoint.c --- breakpoint.c 17 Nov 2003 00:55:49 -0000 1.145 +++ breakpoint.c 8 Dec 2003 22:03:57 -0000 @@ -4323,7 +4323,7 @@ solib_load_unload_1 (char *hookname, int int thread = -1; /* All threads. */ /* Set a breakpoint on the specified hook. */ - sals = decode_line_1 (&hookname, 1, (struct symtab *) NULL, 0, &canonical); + sals = decode_line_1 (&hookname, 1, (struct symtab *) NULL, 0, &canonical, NULL, 0); addr_end = hookname; if (sals.nelts == 0) @@ -4841,9 +4841,9 @@ 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, addr_string, NULL, 0); else - *sals = decode_line_1 (address, 1, (struct symtab *) NULL, 0, addr_string); + *sals = decode_line_1 (address, 1, (struct symtab *) NULL, 0, addr_string, NULL, 0); } /* For any SAL that didn't have a canonical string, fill one in. */ if (sals->nelts > 0 && *addr_string == NULL) @@ -5289,7 +5289,7 @@ break_at_finish_command_1 (char *arg, in beg_addr_string = addr_string; sals = decode_line_1 (&addr_string, 1, (struct symtab *) NULL, 0, - (char ***) NULL); + (char ***) NULL, NULL, 0); xfree (beg_addr_string); old_chain = make_cleanup (xfree, sals.sals); @@ -5806,10 +5806,10 @@ until_break_command (char *arg, int from if (default_breakpoint_valid) sals = decode_line_1 (&arg, 1, default_breakpoint_symtab, - default_breakpoint_line, (char ***) NULL); + default_breakpoint_line, (char ***) NULL, NULL, 0); else sals = decode_line_1 (&arg, 1, (struct symtab *) NULL, - 0, (char ***) NULL); + 0, (char ***) NULL, NULL, 0); if (sals.nelts != 1) error ("Couldn't get information on specified line."); @@ -6269,7 +6269,7 @@ handle_gnu_v3_exceptions (int tempflag, trigger_func_name = xstrdup ("__cxa_throw"); nameptr = trigger_func_name; - sals = decode_line_1 (&nameptr, 1, NULL, 0, NULL); + sals = decode_line_1 (&nameptr, 1, NULL, 0, NULL, NULL, 0); if (sals.nelts == 0) { xfree (trigger_func_name); @@ -6976,7 +6976,7 @@ breakpoint_re_set_one (void *bint) set_language (b->language); input_radix = b->input_radix; s = b->addr_string; - sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, (char ***) NULL); + sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, (char ***) NULL, NULL, 0); for (i = 0; i < sals.nelts; i++) { resolve_sal_pc (&sals.sals[i]); @@ -7512,10 +7512,10 @@ decode_line_spec_1 (char *string, int fu sals = decode_line_1 (&string, funfirstline, default_breakpoint_symtab, default_breakpoint_line, - (char ***) NULL); + (char ***) NULL, NULL, 0); else sals = decode_line_1 (&string, funfirstline, - (struct symtab *) NULL, 0, (char ***) NULL); + (struct symtab *) NULL, 0, (char ***) NULL, NULL, 0); if (*string) error ("Junk at end of line specification: %s", string); return sals; Index: linespec.c =================================================================== RCS file: /cvs/src/src/gdb/linespec.c,v retrieving revision 1.52 diff -u -p -r1.52 linespec.c --- linespec.c 20 Oct 2003 14:38:42 -0000 1.52 +++ linespec.c 8 Dec 2003 22:03:58 -0000 @@ -100,7 +100,9 @@ static struct symtabs_and_lines decode_l int, int, char ***); static struct symtab *symtab_from_filename (char **argptr, - char *p, int is_quote_enclosed); + char *p, int is_quote_enclosed, + int *reason_code_ptr, + int silent_if_not_found); static struct symtabs_and_lines decode_all_digits (char **argptr, @@ -119,7 +121,9 @@ static struct symtabs_and_lines decode_d static struct symtabs_and_lines decode_variable (char *copy, int funfirstline, char ***canonical, - struct symtab *file_symtab); + struct symtab *file_symtab, + int *reason_code_ptr, + int silent_if_not_found); static struct symtabs_and_lines symbol_found (int funfirstline, @@ -637,7 +641,16 @@ decode_line_2 (struct symbol *sym_arr[], Note that it is possible to return zero for the symtab if no file is validly specified. Callers must check that. - Also, the line number returned may be invalid. */ + Also, the line number returned may be invalid. + + The SILENT_IF_NOT_FOUND flag specifies that no error message is issued for + an unknown function or file. This is used when searching for locations in + shared libraries that may not be loaded yet. + + REASON_CODE_PTR, if not null, is used to set a reason code value if failure + occurs due to an unknown function or file. It is needed by the caller + of decode_line_1 to determine that an error has occurred when + SILENT_IF_NOT_FOUND is in effect. */ /* We allow single quotes in various places. This is a hideous kludge, which exists because the completer can't yet deal with the @@ -646,7 +659,8 @@ decode_line_2 (struct symbol *sym_arr[], struct symtabs_and_lines decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, - int default_line, char ***canonical) + int default_line, char ***canonical, int *reason_code_ptr, + int silent_if_not_found) { char *p; char *q; @@ -722,7 +736,8 @@ decode_line_1 (char **argptr, int funfir /* No, the first part is a filename; set s to be that file's symtab. Also, move argptr past the filename. */ - file_symtab = symtab_from_filename (argptr, p, is_quote_enclosed); + file_symtab = symtab_from_filename (argptr, p, is_quote_enclosed, + reason_code_ptr, silent_if_not_found); } #if 0 /* No one really seems to know why this was added. It certainly @@ -827,7 +842,8 @@ decode_line_1 (char **argptr, int funfir /* Look up that token as a variable. If file specified, use that file's per-file block to start with. */ - return decode_variable (copy, funfirstline, canonical, file_symtab); + return decode_variable (copy, funfirstline, canonical, + file_symtab, reason_code_ptr, silent_if_not_found); } @@ -1422,10 +1438,14 @@ collect_methods (char *copy, struct type /* Return the symtab associated to the filename given by the substring - of *ARGPTR ending at P, and advance ARGPTR past that filename. */ + of *ARGPTR ending at P, and advance ARGPTR past that filename. The + SILENT_IF_NOT_FOUND flag is used to specify that if the filename is + not found, do not issue an error message. The REASON_CODE_PTR + is used to store a reason code should the source file not be found. */ static struct symtab * -symtab_from_filename (char **argptr, char *p, int is_quote_enclosed) +symtab_from_filename (char **argptr, char *p, int is_quote_enclosed, + int *reason_code_ptr, int silent_if_not_found) { char *p1; char *copy; @@ -1450,6 +1470,10 @@ symtab_from_filename (char **argptr, cha { if (!have_full_symbols () && !have_partial_symbols ()) error ("No symbol table is loaded. Use the \"file\" command."); + if (reason_code_ptr) + *reason_code_ptr = DL1_NOT_FOUND; + if (silent_if_not_found) + throw_exception (RETURN_ERROR); error ("No source file named %s.", copy); } @@ -1626,11 +1650,15 @@ decode_dollar (char *copy, int funfirstl /* Decode a linespec that's a variable. If FILE_SYMTAB is non-NULL, - look in that symtab's static variables first. */ + look in that symtab's static variables first. The SILENT_IF_NOT_FOUND + flag is used to specify that no error message should be issued if the + function is not found. The REASON_CODE_PTR is used to store a reason + code should the function not be found. */ static struct symtabs_and_lines decode_variable (char *copy, int funfirstline, char ***canonical, - struct symtab *file_symtab) + struct symtab *file_symtab, int *reason_code_ptr, + int silent_if_not_found) { struct symbol *sym; /* The symtab that SYM was found in. */ @@ -1658,6 +1686,11 @@ decode_variable (char *copy, int funfirs !have_partial_symbols () && !have_minimal_symbols ()) error ("No symbol table is loaded. Use the \"file\" command."); + if (reason_code_ptr) + *reason_code_ptr = DL1_NOT_FOUND; + if (silent_if_not_found) + throw_exception (RETURN_ERROR); + error ("Function \"%s\" not defined.", copy); } Index: linespec.h =================================================================== RCS file: /cvs/src/src/gdb/linespec.h,v retrieving revision 1.3 diff -u -p -r1.3 linespec.h --- linespec.h 12 Apr 2003 17:41:25 -0000 1.3 +++ linespec.h 8 Dec 2003 22:03:58 -0000 @@ -24,6 +24,10 @@ struct symtab; extern struct symtabs_and_lines decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, int default_line, - char ***canonical); + char ***canonical, int *reason_code_ptr, + int silent_if_not_found); + +/* Failure reason codes (non-zero). */ +#define DL1_NOT_FOUND 0x1 #endif /* defined (LINESPEC_H) */ Index: symtab.c =================================================================== RCS file: /cvs/src/src/gdb/symtab.c,v retrieving revision 1.123 diff -u -p -r1.123 symtab.c --- symtab.c 22 Nov 2003 16:01:03 -0000 1.123 +++ symtab.c 8 Dec 2003 22:03:58 -0000 @@ -3868,7 +3868,7 @@ decode_line_spec (char *string, int funf sals = decode_line_1 (&string, funfirstline, cursal.symtab, cursal.line, - (char ***) NULL); + (char ***) NULL, NULL, 0); if (*string) error ("Junk at end of line specification: %s", string); Index: tracepoint.c =================================================================== RCS file: /cvs/src/src/gdb/tracepoint.c,v retrieving revision 1.54 diff -u -p -r1.54 tracepoint.c --- tracepoint.c 2 Oct 2003 20:28:30 -0000 1.54 +++ tracepoint.c 8 Dec 2003 22:03:58 -0000 @@ -392,7 +392,7 @@ trace_command (char *arg, int from_tty) printf_filtered ("TRACE %s\n", arg); addr_start = arg; - sals = decode_line_1 (&arg, 1, (struct symtab *) NULL, 0, &canonical); + sals = decode_line_1 (&arg, 1, (struct symtab *) NULL, 0, &canonical, NULL, 0); addr_end = arg; if (!sals.nelts) return; /* ??? Presumably decode_line_1 has already warned? */ @@ -2341,7 +2341,7 @@ scope_info (char *args, int from_tty) if (args == 0 || *args == 0) error ("requires an argument (function, line or *addr) to define a scope"); - sals = decode_line_1 (&args, 1, NULL, 0, &canonical); + sals = decode_line_1 (&args, 1, NULL, 0, &canonical, NULL, 0); if (sals.nelts == 0) return; /* presumably decode_line_1 has already warned */ Index: cli/cli-cmds.c =================================================================== RCS file: /cvs/src/src/gdb/cli/cli-cmds.c,v retrieving revision 1.36 diff -u -p -r1.36 cli-cmds.c --- cli/cli-cmds.c 8 Nov 2003 00:13:03 -0000 1.36 +++ cli/cli-cmds.c 8 Dec 2003 22:03:58 -0000 @@ -557,7 +557,7 @@ edit_command (char *arg, int from_tty) /* Now should only be one argument -- decode it in SAL */ arg1 = arg; - sals = decode_line_1 (&arg1, 0, 0, 0, 0); + sals = decode_line_1 (&arg1, 0, 0, 0, 0, NULL, 0); if (! sals.nelts) return; /* C++ */ if (sals.nelts > 1) { @@ -681,7 +681,7 @@ list_command (char *arg, int from_tty) dummy_beg = 1; else { - sals = decode_line_1 (&arg1, 0, 0, 0, 0); + sals = decode_line_1 (&arg1, 0, 0, 0, 0, NULL, 0); if (!sals.nelts) return; /* C++ */ @@ -714,9 +714,9 @@ list_command (char *arg, int from_tty) else { if (dummy_beg) - sals_end = decode_line_1 (&arg1, 0, 0, 0, 0); + sals_end = decode_line_1 (&arg1, 0, 0, 0, 0, NULL, 0); else - sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0); + sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0, NULL, 0); if (sals_end.nelts == 0) return; if (sals_end.nelts > 1)