From b9298844e505d8bad226fa7be2a625263eaa7da6 Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Wed, 26 May 1993 03:27:32 +0000 Subject: [PATCH] * source.c (line_info): If --fullname, display the source. (identify_source_line), callers: Take pc as argument, rather than assuming innermost frame (emacs doesn't use this, so no one ever noticed). * symtab.h: Declare frame_file_full_name. * main.c: Don't. --- gdb/ChangeLog | 9 +++++++++ gdb/source.c | 53 +++++++++++++++++++++++++++++++-------------------- gdb/symtab.h | 24 +++++++++++++++++++++-- 3 files changed, 63 insertions(+), 23 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4886362e4b3..49cb5c01347 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +Tue May 25 20:44:24 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * source.c (line_info): If --fullname, display the source. + (identify_source_line), callers: Take pc as argument, rather than + assuming innermost frame (emacs doesn't use this, so no one ever + noticed). + * symtab.h: Declare frame_file_full_name. + * main.c: Don't. + Tue May 25 15:30:43 1993 Brendan Kehoe (brendan@lisa.cygnus.com) * breakpoint.c (catch_command_1): Fix typo in error msg. diff --git a/gdb/source.c b/gdb/source.c index 2c2c518b152..682f1e86189 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -106,13 +106,13 @@ static int last_line_listed; static int first_line_listed; -/* Set the source file default for the "list" command, specifying a - symtab. Sigh. Behavior specification: If it is called with a - non-zero argument, that is the symtab to select. If it is not, - first lookup "main"; if it exists, use the symtab and line it - defines. If not, take the last symtab in the symtab lists (if it - exists) or the last symtab in the psymtab lists (if *it* exists). If - none of this works, report an error. */ +/* Set the source file default for the "list" command to be S. + + If S is NULL, and we don't have a default, find one. This + should only be called when the user actually tries to use the + default, since we produce an error if we can't find a reasonable + default. Also, since this can cause symbols to be read, doing it + before we need to would make things slower than necessary. */ void select_source_symtab (s) @@ -131,6 +131,9 @@ select_source_symtab (s) return; } + if (current_source_symtab) + return; + /* Make the default place to list be the function `main' if one exists. */ if (lookup_symbol ("main", 0, VAR_NAMESPACE, 0, NULL)) @@ -189,9 +192,6 @@ select_source_symtab (s) } } - if (current_source_symtab) - return; - error ("Can't find a default source file"); } @@ -437,8 +437,13 @@ source_info (ignore, from_tty) /* Open a file named STRING, searching path PATH (dir names sep by colons) using mode MODE and protection bits PROT in the calls to open. + If TRY_CWD_FIRST, try to open ./STRING before searching PATH. - (ie pretend the first element of PATH is ".") + (ie pretend the first element of PATH is "."). This also indicates + that a slash in STRING disables searching of the path (this is + so that "exec-file ./foo" or "symbol-file ./foo" insures that you + get that particular version of foo or an error message). + If FILENAMED_OPENED is non-null, set it to a newly allocated string naming the actual file opened (this string will always start with a "/". We have to take special pains to avoid doubling the "/" between the directory @@ -468,18 +473,18 @@ openp (path, try_cwd_first, string, mode, prot, filename_opened) if (!path) path = "."; - /* ./foo => foo */ - while (string[0] == '.' && string[1] == '/') - string += 2; - if (try_cwd_first || string[0] == '/') { filename = string; fd = open (filename, mode, prot); - if (fd >= 0 || string[0] == '/') + if (fd >= 0 || string[0] == '/' || strchr (string, '/')) goto done; } + /* ./foo => foo */ + while (string[0] == '.' && string[1] == '/') + string += 2; + alloclen = strlen (path) + strlen (string) + 2; filename = (char *) alloca (alloclen); fd = -1; @@ -773,10 +778,11 @@ get_filename_and_charpos (s, fullname) Return 1 if successful, 0 if could not find the file. */ int -identify_source_line (s, line, mid_statement) +identify_source_line (s, line, mid_statement, pc) struct symtab *s; int line; int mid_statement; + CORE_ADDR pc; { if (s->line_charpos == 0) get_filename_and_charpos (s, (char **)NULL); @@ -787,7 +793,7 @@ identify_source_line (s, line, mid_statement) printf ("\032\032%s:%d:%d:%s:0x%x\n", s->fullname, line, s->line_charpos[line - 1], mid_statement ? "middle" : "beg", - get_frame_pc (get_current_frame())); + pc); current_source_line = line; first_line_listed = line; last_line_listed = line; @@ -841,7 +847,7 @@ print_source_lines (s, line, stopline, noerror) perror_with_name (s->filename); } - stream = fdopen (desc, "r"); + stream = fdopen (desc, FOPEN_RT); clearerr (stream); while (nlines-- > 0) @@ -1110,6 +1116,11 @@ line_info (arg, from_tty) set_next_address (start_pc); /* Repeating "info line" should do the following line. */ last_line_listed = sal.line + 1; + + /* If this is the only line, show the source code. If it could + not find the file, don't do anything special. */ + if (frame_file_full_name && sals.nelts == 1) + identify_source_line (sal.symtab, sal.line, 0, start_pc); } else printf_filtered ("Line number %d is out of range for \"%s\".\n", @@ -1159,7 +1170,7 @@ forward_search_command (regex, from_tty) perror_with_name (current_source_symtab->filename); } - stream = fdopen (desc, "r"); + stream = fdopen (desc, FOPEN_RT); clearerr (stream); while (1) { /* FIXME!!! We walk right off the end of buf if we get a long line!!! */ @@ -1231,7 +1242,7 @@ reverse_search_command (regex, from_tty) perror_with_name (current_source_symtab->filename); } - stream = fdopen (desc, "r"); + stream = fdopen (desc, FOPEN_RT); clearerr (stream); while (line > 1) { diff --git a/gdb/symtab.h b/gdb/symtab.h index 03d5e7f8a2b..c8c311dbfb7 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -469,7 +469,8 @@ enum address_class /* Value is in specified register. Just like LOC_REGPARM except the register holds the address of the argument instead of the argument itself. This is currently used for the passing of structs and unions - on sparc and hppa. */ + on sparc and hppa. It is also used for call by reference where the + address is in a register, at least by mipsread.c. */ LOC_REGPARM_ADDR, @@ -618,6 +619,23 @@ struct linetable_entry CORE_ADDR pc; }; +/* The order of entries in the linetable is significant. + + It should generally be in ascending line number order. Line table + entries for a function at lines 10-40 should come before entries + for a function at lines 50-70. + + A for statement looks like this + + 10 0x100 - for the init/test part of a for stmt. + 20 0x200 + 30 0x300 + 10 0x400 - for the increment part of a for stmt. + + FIXME: this description is incomplete. coffread.c is said to get + the linetable order wrong (would arrange_linenos from xcoffread.c + work for normal COFF too?). */ + struct linetable { int nitems; @@ -1041,8 +1059,10 @@ symbol_file_add PARAMS ((char *, int, CORE_ADDR, int, int, int)); /* source.c */ +extern int frame_file_full_name; /* in stack.c */ + extern int -identify_source_line PARAMS ((struct symtab *, int, int)); +identify_source_line PARAMS ((struct symtab *, int, int, CORE_ADDR)); extern void print_source_lines PARAMS ((struct symtab *, int, int, int)); -- 2.30.2