From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26301 invoked by alias); 9 Dec 2003 21:24:38 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 26292 invoked from network); 9 Dec 2003 21:24:35 -0000 Received: from unknown (HELO touchme.toronto.redhat.com) (216.129.200.20) by sources.redhat.com with SMTP; 9 Dec 2003 21:24:35 -0000 Received: from redhat.com (toocool.toronto.redhat.com [172.16.14.72]) by touchme.toronto.redhat.com (Postfix) with ESMTP id B658F800456; Tue, 9 Dec 2003 16:24:34 -0500 (EST) Message-ID: <3FD63D92.40808@redhat.com> Date: Tue, 09 Dec 2003 21:24:00 -0000 From: "J. Johnston" Organization: Red Hat Inc. User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 X-Accept-Language: en-us, en MIME-Version: 1.0 To: David Carlton Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA]: add reason code and silent flag to decode_line_1 References: <3FD4F5D8.4000207@redhat.com> <3FD5000E.4000009@redhat.com> In-Reply-To: Content-Type: multipart/mixed; boundary="------------050409060609070003040706" X-SW-Source: 2003-12/txt/msg00275.txt.bz2 This is a multi-part message in MIME format. --------------050409060609070003040706 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1358 David, here is the updated patch based on your suggestion. It is definitely cleaner in the short-term. 2003-12-09 Jeff Johnston * linespec.h (decode_line_1): Add new not_found_ptr parameter. * linespec.c (decode_line_1): Add new parameter. Pass on new parameter to decode_variable and symtab_from_filename functions. (decode_variable): Add new not_found_ptr parameter. Throw exception rather than failing if the not_found_ptr is non-null and the function is not found. (symtab_from_filename): Add new not_found_ptr parametr. Throw exception rather than failing if the not_found_ptr is non-null and the source file is not found. * breakpoint.c: Change all callers of decode_line_1 to add default extra parameter for decode_line_1 calls. * tracepoint.c: Ditto. * cli/cli-cmds.c: Ditto. David Carlton wrote: > On Mon, 08 Dec 2003 17:49:50 -0500, "J. Johnston" said: > >>David Carlton wrote: > > >>>A unit test would be nice, too, if possible. > > >>Well, that comes with my pending breakpoint support which I was >>asked to break into smaller chunks and get the support structure in >>place first. It will be the first and perhaps only user of this >>functionality. > > > Fair enough. > > David Carlton > carlton@kealia.com > --------------050409060609070003040706 Content-Type: text/plain; name="linespec.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="linespec.patch" Content-length: 11756 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 9 Dec 2003 21:14:45 -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); 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); 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); } /* 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); 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); else sals = decode_line_1 (&arg, 1, (struct symtab *) NULL, - 0, (char ***) NULL); + 0, (char ***) NULL, NULL); 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); 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); 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); else sals = decode_line_1 (&string, funfirstline, - (struct symtab *) NULL, 0, (char ***) NULL); + (struct symtab *) NULL, 0, (char ***) NULL, NULL); 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 9 Dec 2003 21:14:45 -0000 @@ -100,7 +100,8 @@ 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 *not_found_ptr); static struct symtabs_and_lines decode_all_digits (char **argptr, @@ -119,7 +120,8 @@ 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 *not_found_ptr); static struct symtabs_and_lines symbol_found (int funfirstline, @@ -637,7 +639,12 @@ 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. + + If NOT_FOUND_PTR is not null, store a boolean true/false value at the location, based + on whether or not failure occurs due to an unknown function or file. In the case + where failure does occur due to an unknown function or file, do not issue an error + message. */ /* 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 +653,7 @@ 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 *not_found_ptr) { char *p; char *q; @@ -665,6 +672,9 @@ decode_line_1 (char **argptr, int funfir int is_objc_method = 0; char *saved_arg = *argptr; + if (not_found_ptr) + *not_found_ptr = 0; + /* Defaults have defaults. */ initialize_defaults (&default_symtab, &default_line); @@ -722,7 +732,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, + not_found_ptr); } #if 0 /* No one really seems to know why this was added. It certainly @@ -827,7 +838,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, not_found_ptr); } @@ -1422,10 +1434,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. If + NOT_FOUND_PTR is not null and the source file is not found, store + boolean true at the location pointed to and do not issue an + error message. */ 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 *not_found_ptr) { char *p1; char *copy; @@ -1450,6 +1466,11 @@ symtab_from_filename (char **argptr, cha { if (!have_full_symbols () && !have_partial_symbols ()) error ("No symbol table is loaded. Use the \"file\" command."); + if (not_found_ptr) + { + *not_found_ptr = 1; + throw_exception (RETURN_ERROR); + } error ("No source file named %s.", copy); } @@ -1626,11 +1647,13 @@ 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. If NOT_FOUND_PTR is not NULL and + the function cannot be found, store boolean true in the location pointed to + and do not issue an error message. */ static struct symtabs_and_lines decode_variable (char *copy, int funfirstline, char ***canonical, - struct symtab *file_symtab) + struct symtab *file_symtab, int *not_found_ptr) { struct symbol *sym; /* The symtab that SYM was found in. */ @@ -1658,6 +1681,12 @@ decode_variable (char *copy, int funfirs !have_partial_symbols () && !have_minimal_symbols ()) error ("No symbol table is loaded. Use the \"file\" command."); + if (not_found_ptr) + { + *not_found_ptr = 1; + 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 9 Dec 2003 21:14:45 -0000 @@ -24,6 +24,6 @@ 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 *not_found_ptr); #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 9 Dec 2003 21:14:45 -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); 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 9 Dec 2003 21:14:46 -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); 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); 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 9 Dec 2003 21:14:46 -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, 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, 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, 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, 0); if (sals_end.nelts == 0) return; if (sals_end.nelts > 1) --------------050409060609070003040706--