* 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.
This commit is contained in:
Jim Kingdon 1993-05-26 03:27:32 +00:00
parent b64d5e491a
commit b9298844e5
3 changed files with 63 additions and 23 deletions

View File

@ -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) Tue May 25 15:30:43 1993 Brendan Kehoe (brendan@lisa.cygnus.com)
* breakpoint.c (catch_command_1): Fix typo in error msg. * breakpoint.c (catch_command_1): Fix typo in error msg.

View File

@ -106,13 +106,13 @@ static int last_line_listed;
static int first_line_listed; static int first_line_listed;
/* Set the source file default for the "list" command, specifying a /* Set the source file default for the "list" command to be S.
symtab. Sigh. Behavior specification: If it is called with a
non-zero argument, that is the symtab to select. If it is not, If S is NULL, and we don't have a default, find one. This
first lookup "main"; if it exists, use the symtab and line it should only be called when the user actually tries to use the
defines. If not, take the last symtab in the symtab lists (if it default, since we produce an error if we can't find a reasonable
exists) or the last symtab in the psymtab lists (if *it* exists). If default. Also, since this can cause symbols to be read, doing it
none of this works, report an error. */ before we need to would make things slower than necessary. */
void void
select_source_symtab (s) select_source_symtab (s)
@ -131,6 +131,9 @@ select_source_symtab (s)
return; return;
} }
if (current_source_symtab)
return;
/* Make the default place to list be the function `main' /* Make the default place to list be the function `main'
if one exists. */ if one exists. */
if (lookup_symbol ("main", 0, VAR_NAMESPACE, 0, NULL)) 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"); 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) /* 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. using mode MODE and protection bits PROT in the calls to open.
If TRY_CWD_FIRST, try to open ./STRING before searching PATH. 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 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 the actual file opened (this string will always start with a "/". We
have to take special pains to avoid doubling the "/" between the directory 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) if (!path)
path = "."; path = ".";
/* ./foo => foo */
while (string[0] == '.' && string[1] == '/')
string += 2;
if (try_cwd_first || string[0] == '/') if (try_cwd_first || string[0] == '/')
{ {
filename = string; filename = string;
fd = open (filename, mode, prot); fd = open (filename, mode, prot);
if (fd >= 0 || string[0] == '/') if (fd >= 0 || string[0] == '/' || strchr (string, '/'))
goto done; goto done;
} }
/* ./foo => foo */
while (string[0] == '.' && string[1] == '/')
string += 2;
alloclen = strlen (path) + strlen (string) + 2; alloclen = strlen (path) + strlen (string) + 2;
filename = (char *) alloca (alloclen); filename = (char *) alloca (alloclen);
fd = -1; fd = -1;
@ -773,10 +778,11 @@ get_filename_and_charpos (s, fullname)
Return 1 if successful, 0 if could not find the file. */ Return 1 if successful, 0 if could not find the file. */
int int
identify_source_line (s, line, mid_statement) identify_source_line (s, line, mid_statement, pc)
struct symtab *s; struct symtab *s;
int line; int line;
int mid_statement; int mid_statement;
CORE_ADDR pc;
{ {
if (s->line_charpos == 0) if (s->line_charpos == 0)
get_filename_and_charpos (s, (char **)NULL); 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, printf ("\032\032%s:%d:%d:%s:0x%x\n", s->fullname,
line, s->line_charpos[line - 1], line, s->line_charpos[line - 1],
mid_statement ? "middle" : "beg", mid_statement ? "middle" : "beg",
get_frame_pc (get_current_frame())); pc);
current_source_line = line; current_source_line = line;
first_line_listed = line; first_line_listed = line;
last_line_listed = line; last_line_listed = line;
@ -841,7 +847,7 @@ print_source_lines (s, line, stopline, noerror)
perror_with_name (s->filename); perror_with_name (s->filename);
} }
stream = fdopen (desc, "r"); stream = fdopen (desc, FOPEN_RT);
clearerr (stream); clearerr (stream);
while (nlines-- > 0) while (nlines-- > 0)
@ -1110,6 +1116,11 @@ line_info (arg, from_tty)
set_next_address (start_pc); set_next_address (start_pc);
/* Repeating "info line" should do the following line. */ /* Repeating "info line" should do the following line. */
last_line_listed = sal.line + 1; 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 else
printf_filtered ("Line number %d is out of range for \"%s\".\n", 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); perror_with_name (current_source_symtab->filename);
} }
stream = fdopen (desc, "r"); stream = fdopen (desc, FOPEN_RT);
clearerr (stream); clearerr (stream);
while (1) { while (1) {
/* FIXME!!! We walk right off the end of buf if we get a long line!!! */ /* 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); perror_with_name (current_source_symtab->filename);
} }
stream = fdopen (desc, "r"); stream = fdopen (desc, FOPEN_RT);
clearerr (stream); clearerr (stream);
while (line > 1) while (line > 1)
{ {

View File

@ -469,7 +469,8 @@ enum address_class
/* Value is in specified register. Just like LOC_REGPARM except the /* Value is in specified register. Just like LOC_REGPARM except the
register holds the address of the argument instead of the argument register holds the address of the argument instead of the argument
itself. This is currently used for the passing of structs and unions 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, LOC_REGPARM_ADDR,
@ -618,6 +619,23 @@ struct linetable_entry
CORE_ADDR pc; 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 struct linetable
{ {
int nitems; int nitems;
@ -1041,8 +1059,10 @@ symbol_file_add PARAMS ((char *, int, CORE_ADDR, int, int, int));
/* source.c */ /* source.c */
extern int frame_file_full_name; /* in stack.c */
extern int extern int
identify_source_line PARAMS ((struct symtab *, int, int)); identify_source_line PARAMS ((struct symtab *, int, int, CORE_ADDR));
extern void extern void
print_source_lines PARAMS ((struct symtab *, int, int, int)); print_source_lines PARAMS ((struct symtab *, int, int, int));