1 /* List lines of source files for GDB, the GNU debugger.
2 Copyright 1986-1989, 1991-1999 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
23 #include "expression.h"
30 #include <sys/types.h>
31 #include "gdb_string.h"
35 #include "gnu-regex.h"
41 #ifdef CRLF_SOURCE_FILES
43 /* Define CRLF_SOURCE_FILES in an xm-*.h file if source files on the
44 host use \r\n rather than just \n. Defining CRLF_SOURCE_FILES is
45 much faster than defining LSEEK_NOT_LINEAR. */
51 #define OPEN_MODE (O_RDONLY | O_BINARY)
52 #define FDOPEN_MODE FOPEN_RB
54 #else /* ! defined (CRLF_SOURCE_FILES) */
56 #define OPEN_MODE O_RDONLY
57 #define FDOPEN_MODE FOPEN_RT
59 #endif /* ! defined (CRLF_SOURCE_FILES) */
61 /* Forward declarations */
63 int open_source_file
PARAMS ((struct symtab
*));
65 void find_source_lines
PARAMS ((struct symtab
*, int));
67 /* Prototypes for exported functions. */
69 void _initialize_source
PARAMS ((void));
71 /* Prototypes for local functions. */
73 static int get_filename_and_charpos
PARAMS ((struct symtab
*, char **));
75 static void reverse_search_command
PARAMS ((char *, int));
77 static void forward_search_command
PARAMS ((char *, int));
79 static void line_info
PARAMS ((char *, int));
81 static void list_command
PARAMS ((char *, int));
83 static void ambiguous_line_spec
PARAMS ((struct symtabs_and_lines
*));
85 static void source_info
PARAMS ((char *, int));
87 static void show_directories
PARAMS ((char *, int));
89 /* Path of directories to search for source files.
90 Same format as the PATH environment variable's value. */
94 /* Symtab of default file for listing lines of. */
96 struct symtab
*current_source_symtab
;
98 /* Default next line to list. */
100 int current_source_line
;
102 /* Default number of lines to print with commands like "list".
103 This is based on guessing how many long (i.e. more than chars_per_line
104 characters) lines there will be. To be completely correct, "list"
105 and friends should be rewritten to count characters and see where
106 things are wrapping, but that would be a fair amount of work. */
108 int lines_to_list
= 10;
110 /* Line number of last line printed. Default for various commands.
111 current_source_line is usually, but not always, the same as this. */
113 static int last_line_listed
;
115 /* First line number listed by last listing command. */
117 static int first_line_listed
;
119 /* Saves the name of the last source file visited and a possible error code.
120 Used to prevent repeating annoying "No such file or directories" msgs */
122 static struct symtab
*last_source_visited
= NULL
;
123 static int last_source_error
= 0;
126 /* Set the source file default for the "list" command to be S.
128 If S is NULL, and we don't have a default, find one. This
129 should only be called when the user actually tries to use the
130 default, since we produce an error if we can't find a reasonable
131 default. Also, since this can cause symbols to be read, doing it
132 before we need to would make things slower than necessary. */
135 select_source_symtab (s
)
136 register struct symtab
*s
;
138 struct symtabs_and_lines sals
;
139 struct symtab_and_line sal
;
140 struct partial_symtab
*ps
;
141 struct partial_symtab
*cs_pst
= 0;
146 current_source_symtab
= s
;
147 current_source_line
= 1;
151 if (current_source_symtab
)
154 /* Make the default place to list be the function `main'
156 if (lookup_symbol ("main", 0, VAR_NAMESPACE
, 0, NULL
))
158 sals
= decode_line_spec ("main", 1);
161 current_source_symtab
= sal
.symtab
;
162 current_source_line
= max (sal
.line
- (lines_to_list
- 1), 1);
163 if (current_source_symtab
)
167 /* All right; find the last file in the symtab list (ignoring .h's). */
169 current_source_line
= 1;
171 for (ofp
= object_files
; ofp
!= NULL
; ofp
= ofp
->next
)
173 for (s
= ofp
->symtabs
; s
; s
= s
->next
)
175 char *name
= s
->filename
;
176 int len
= strlen (name
);
177 if (!(len
> 2 && (STREQ (&name
[len
- 2], ".h"))))
179 current_source_symtab
= s
;
183 if (current_source_symtab
)
186 /* Howabout the partial symbol tables? */
188 for (ofp
= object_files
; ofp
!= NULL
; ofp
= ofp
->next
)
190 for (ps
= ofp
->psymtabs
; ps
!= NULL
; ps
= ps
->next
)
192 char *name
= ps
->filename
;
193 int len
= strlen (name
);
194 if (!(len
> 2 && (STREQ (&name
[len
- 2], ".h"))))
204 internal_error ("select_source_symtab: readin pst found and no symtabs.");
208 current_source_symtab
= PSYMTAB_TO_SYMTAB (cs_pst
);
211 if (current_source_symtab
)
214 error ("Can't find a default source file");
218 show_directories (ignore
, from_tty
)
222 puts_filtered ("Source directories searched: ");
223 puts_filtered (source_path
);
224 puts_filtered ("\n");
227 /* Forget what we learned about line positions in source files, and
228 which directories contain them; must check again now since files
229 may be found in a different directory now. */
232 forget_cached_source_info ()
234 register struct symtab
*s
;
235 register struct objfile
*objfile
;
237 for (objfile
= object_files
; objfile
!= NULL
; objfile
= objfile
->next
)
239 for (s
= objfile
->symtabs
; s
!= NULL
; s
= s
->next
)
241 if (s
->line_charpos
!= NULL
)
243 mfree (objfile
->md
, s
->line_charpos
);
244 s
->line_charpos
= NULL
;
246 if (s
->fullname
!= NULL
)
248 mfree (objfile
->md
, s
->fullname
);
260 sprintf (buf
, "$cdir%c$cwd", DIRNAME_SEPARATOR
);
261 source_path
= strsave (buf
);
262 forget_cached_source_info ();
265 /* Add zero or more directories to the front of the source path. */
268 directory_command (dirname
, from_tty
)
273 /* FIXME, this goes to "delete dir"... */
276 if (from_tty
&& query ("Reinitialize source path to empty? "))
284 mod_path (dirname
, &source_path
);
285 last_source_visited
= NULL
;
288 show_directories ((char *) 0, from_tty
);
289 forget_cached_source_info ();
292 /* Add zero or more directories to the front of an arbitrary path. */
295 mod_path (dirname
, which_path
)
299 char *old
= *which_path
;
305 dirname
= strsave (dirname
);
306 make_cleanup (free
, dirname
);
310 char *name
= dirname
;
315 char *separator
= strchr (name
, DIRNAME_SEPARATOR
);
316 char *space
= strchr (name
, ' ');
317 char *tab
= strchr (name
, '\t');
319 if (separator
== 0 && space
== 0 && tab
== 0)
320 p
= dirname
= name
+ strlen (name
);
324 if (separator
!= 0 && (p
== 0 || separator
< p
))
326 if (space
!= 0 && (p
== 0 || space
< p
))
328 if (tab
!= 0 && (p
== 0 || tab
< p
))
331 while (*dirname
== DIRNAME_SEPARATOR
338 if (!(SLASH_P (*name
) && p
<= name
+ 1) /* "/" */
339 #if defined(_WIN32) || defined(__MSDOS__)
340 /* On MS-DOS and MS-Windows, h:\ is different from h: */
341 && !(!SLASH_P (*name
) && ROOTED_P (name
) && p
<= name
+ 3) /* d:/ */
344 /* Sigh. "foo/" => "foo" */
348 while (p
> name
&& p
[-1] == '.')
352 /* "." => getwd (). */
353 name
= current_directory
;
356 else if (p
> name
+ 1 && SLASH_P (p
[-2]))
366 /* "...foo/." => "...foo". */
377 name
= tilde_expand (name
);
378 #if defined(_WIN32) || defined(__MSDOS__)
379 else if (ROOTED_P (name
) && p
== name
+ 2) /* "d:" => "d:." */
380 name
= concat (name
, ".", NULL
);
382 else if (!ROOTED_P (name
) && name
[0] != '$')
383 name
= concat (current_directory
, SLASH_STRING
, name
, NULL
);
385 name
= savestring (name
, p
- name
);
386 make_cleanup (free
, name
);
388 /* Unless it's a variable, check existence. */
391 /* These are warnings, not errors, since we don't want a
392 non-existent directory in a .gdbinit file to stop processing
393 of the .gdbinit file.
395 Whether they get added to the path is more debatable. Current
396 answer is yes, in case the user wants to go make the directory
397 or whatever. If the directory continues to not exist/not be
398 a directory/etc, then having them in the path should be
400 if (stat (name
, &st
) < 0)
402 int save_errno
= errno
;
403 fprintf_unfiltered (gdb_stderr
, "Warning: ");
404 print_sys_errmsg (name
, save_errno
);
406 else if ((st
.st_mode
& S_IFMT
) != S_IFDIR
)
407 warning ("%s is not a directory.", name
);
412 register unsigned int len
= strlen (name
);
417 /* FIXME: strncmp loses in interesting ways on MS-DOS and
418 MS-Windows because of case-insensitivity and two different
419 but functionally identical slash characters. We need a
420 special filesystem-dependent file-name comparison function.
422 Actually, even on Unix I would use realpath() or its work-
423 alike before comparing. Then all the code above which
424 removes excess slashes and dots could simply go away. */
425 if (!strncmp (p
, name
, len
)
426 && (p
[len
] == '\0' || p
[len
] == DIRNAME_SEPARATOR
))
428 /* Found it in the search path, remove old copy */
430 p
--; /* Back over leading separator */
431 if (prefix
> p
- *which_path
)
432 goto skip_dup
; /* Same dir twice in one cmd */
433 strcpy (p
, &p
[len
+ 1]); /* Copy from next \0 or : */
435 p
= strchr (p
, DIRNAME_SEPARATOR
);
445 tinybuf
[0] = DIRNAME_SEPARATOR
;
448 /* If we have already tacked on a name(s) in this command, be sure they stay on the front as we tack on some more. */
455 temp
= concat (old
, tinybuf
, name
, NULL
);
457 *which_path
= concat (temp
, "", &old
[prefix
], NULL
);
458 prefix
= strlen (temp
);
463 *which_path
= concat (name
, (old
[0] ? tinybuf
: old
), old
, NULL
);
464 prefix
= strlen (name
);
472 while (*dirname
!= '\0');
477 source_info (ignore
, from_tty
)
481 register struct symtab
*s
= current_source_symtab
;
485 printf_filtered ("No current source file.\n");
488 printf_filtered ("Current source file is %s\n", s
->filename
);
490 printf_filtered ("Compilation directory is %s\n", s
->dirname
);
492 printf_filtered ("Located in %s\n", s
->fullname
);
494 printf_filtered ("Contains %d line%s.\n", s
->nlines
,
495 s
->nlines
== 1 ? "" : "s");
497 printf_filtered ("Source language is %s.\n", language_str (s
->language
));
498 printf_filtered ("Compiled with %s debugging format.\n", s
->debugformat
);
503 /* Open a file named STRING, searching path PATH (dir names sep by some char)
504 using mode MODE and protection bits PROT in the calls to open.
506 If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
507 (ie pretend the first element of PATH is "."). This also indicates
508 that a slash in STRING disables searching of the path (this is
509 so that "exec-file ./foo" or "symbol-file ./foo" insures that you
510 get that particular version of foo or an error message).
512 If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
513 the actual file opened (this string will always start with a "/". We
514 have to take special pains to avoid doubling the "/" between the directory
515 and the file, sigh! Emacs gets confuzzed by this when we print the
518 If a file is found, return the descriptor.
519 Otherwise, return -1, with errno set for the last name we tried to open. */
521 /* >>>> This should only allow files of certain types,
522 >>>> eg executable, non-directory */
524 openp (path
, try_cwd_first
, string
, mode
, prot
, filename_opened
)
530 char **filename_opened
;
533 register char *filename
;
534 register char *p
, *p1
;
545 if (try_cwd_first
|| ROOTED_P (string
))
549 fd
= open (filename
, mode
, prot
);
552 for (i
= 0; string
[i
]; i
++)
553 if (SLASH_P (string
[i
]))
558 while (string
[0] == '.' && SLASH_P (string
[1]))
561 alloclen
= strlen (path
) + strlen (string
) + 2;
562 filename
= (char *) alloca (alloclen
);
564 for (p
= path
; p
; p
= p1
? p1
+ 1 : 0)
566 p1
= (char *) strchr (p
, DIRNAME_SEPARATOR
);
572 if (len
== 4 && p
[0] == '$' && p
[1] == 'c'
573 && p
[2] == 'w' && p
[3] == 'd')
575 /* Name is $cwd -- insert current directory name instead. */
578 /* First, realloc the filename buffer if too short. */
579 len
= strlen (current_directory
);
580 newlen
= len
+ strlen (string
) + 2;
581 if (newlen
> alloclen
)
584 filename
= (char *) alloca (alloclen
);
586 strcpy (filename
, current_directory
);
590 /* Normal file name in path -- just use it. */
591 strncpy (filename
, p
, len
);
595 /* Remove trailing slashes */
596 while (len
> 0 && SLASH_P (filename
[len
- 1]))
599 strcat (filename
+ len
, SLASH_STRING
);
600 strcat (filename
, string
);
602 fd
= open (filename
, mode
);
611 *filename_opened
= (char *) 0;
612 else if (ROOTED_P (filename
))
613 *filename_opened
= savestring (filename
, strlen (filename
));
616 /* Beware the // my son, the Emacs barfs, the botch that catch... */
618 *filename_opened
= concat (current_directory
,
619 SLASH_P (current_directory
[strlen (current_directory
) - 1])
625 /* This is a debugging hack that can go away when all combinations
626 of Mac and Unix names are handled reasonably. */
628 extern int debug_openp
;
632 printf ("openp on %s, path %s mode %d prot %d\n returned %d",
633 string
, path
, mode
, prot
, fd
);
634 if (*filename_opened
)
635 printf (" (filename is %s)", *filename_opened
);
645 /* This is essentially a convenience, for clients that want the behaviour
646 of openp, using source_path, but that really don't want the file to be
647 opened but want instead just to know what the full pathname is (as
648 qualified against source_path).
650 The current working directory is searched first.
652 If the file was found, this function returns 1, and FULL_PATHNAME is
653 set to the fully-qualified pathname.
655 Else, this functions returns 0, and FULL_PATHNAME is set to NULL.
658 source_full_path_of (filename
, full_pathname
)
660 char **full_pathname
;
664 fd
= openp (source_path
, 1, filename
, O_RDONLY
, 0, full_pathname
);
667 *full_pathname
= NULL
;
676 /* Open a source file given a symtab S. Returns a file descriptor or
677 negative number for error. */
683 char *path
= source_path
;
688 /* Quick way out if we already know its full name */
691 result
= open (s
->fullname
, OPEN_MODE
);
694 /* Didn't work -- free old one, try again. */
695 mfree (s
->objfile
->md
, s
->fullname
);
699 if (s
->dirname
!= NULL
)
701 /* Replace a path entry of $cdir with the compilation directory name */
703 /* We cast strstr's result in case an ANSIhole has made it const,
704 which produces a "required warning" when assigned to a nonconst. */
705 p
= (char *) strstr (source_path
, "$cdir");
706 if (p
&& (p
== path
|| p
[-1] == DIRNAME_SEPARATOR
)
707 && (p
[cdir_len
] == DIRNAME_SEPARATOR
|| p
[cdir_len
] == '\0'))
712 alloca (strlen (source_path
) + 1 + strlen (s
->dirname
) + 1);
713 len
= p
- source_path
;
714 strncpy (path
, source_path
, len
); /* Before $cdir */
715 strcpy (path
+ len
, s
->dirname
); /* new stuff */
716 strcat (path
+ len
, source_path
+ len
+ cdir_len
); /* After $cdir */
720 result
= openp (path
, 0, s
->filename
, OPEN_MODE
, 0, &s
->fullname
);
723 /* Didn't work. Try using just the basename. */
724 p
= basename (s
->filename
);
725 if (p
!= s
->filename
)
726 result
= openp (path
, 0, p
, OPEN_MODE
, 0, &s
->fullname
);
731 /* Didn't work. Try using just the MPW basename. */
732 p
= (char *) mpw_basename (s
->filename
);
733 if (p
!= s
->filename
)
734 result
= openp (path
, 0, p
, OPEN_MODE
, 0, &s
->fullname
);
738 /* Didn't work. Try using the mixed Unix/MPW basename. */
739 p
= (char *) mpw_mixed_basename (s
->filename
);
740 if (p
!= s
->filename
)
741 result
= openp (path
, 0, p
, OPEN_MODE
, 0, &s
->fullname
);
747 fullname
= s
->fullname
;
748 s
->fullname
= mstrsave (s
->objfile
->md
, s
->fullname
);
754 /* Return the path to the source file associated with symtab. Returns NULL
758 symtab_to_filename (s
)
766 /* If we've seen the file before, just return fullname. */
771 /* Try opening the file to setup fullname */
773 fd
= open_source_file (s
);
775 return s
->filename
; /* File not found. Just use short name */
777 /* Found the file. Cleanup and return the full name */
784 /* Create and initialize the table S->line_charpos that records
785 the positions of the lines in the source file, which is assumed
786 to be open on descriptor DESC.
787 All set S->nlines to the number of such lines. */
790 find_source_lines (s
, desc
)
795 register char *data
, *p
, *end
;
797 int lines_allocated
= 1000;
802 line_charpos
= (int *) xmmalloc (s
->objfile
->md
,
803 lines_allocated
* sizeof (int));
804 if (fstat (desc
, &st
) < 0)
805 perror_with_name (s
->filename
);
807 if (s
&& s
->objfile
&& s
->objfile
->obfd
)
808 mtime
= bfd_get_mtime (s
->objfile
->obfd
);
810 mtime
= bfd_get_mtime (exec_bfd
);
812 if (mtime
&& mtime
< st
.st_mtime
)
815 printf_filtered ("\n");
816 warning ("Source file is more recent than executable.\n");
819 #ifdef LSEEK_NOT_LINEAR
823 /* Have to read it byte by byte to find out where the chars live */
825 line_charpos
[0] = lseek (desc
, 0, SEEK_CUR
);
827 while (myread (desc
, &c
, 1) > 0)
831 if (nlines
== lines_allocated
)
833 lines_allocated
*= 2;
835 (int *) xmrealloc (s
->objfile
->md
, (char *) line_charpos
,
836 sizeof (int) * lines_allocated
);
838 line_charpos
[nlines
++] = lseek (desc
, 0, SEEK_CUR
);
842 #else /* lseek linear. */
844 struct cleanup
*old_cleanups
;
846 /* st_size might be a large type, but we only support source files whose
847 size fits in an int. */
848 size
= (int) st
.st_size
;
850 /* Use malloc, not alloca, because this may be pretty large, and we may
851 run into various kinds of limits on stack size. */
852 data
= (char *) xmalloc (size
);
853 old_cleanups
= make_cleanup (free
, data
);
855 /* Reassign `size' to result of read for systems where \r\n -> \n. */
856 size
= myread (desc
, data
, size
);
858 perror_with_name (s
->filename
);
866 /* A newline at the end does not start a new line. */
869 if (nlines
== lines_allocated
)
871 lines_allocated
*= 2;
873 (int *) xmrealloc (s
->objfile
->md
, (char *) line_charpos
,
874 sizeof (int) * lines_allocated
);
876 line_charpos
[nlines
++] = p
- data
;
879 do_cleanups (old_cleanups
);
881 #endif /* lseek linear. */
884 (int *) xmrealloc (s
->objfile
->md
, (char *) line_charpos
,
885 nlines
* sizeof (int));
889 /* Return the character position of a line LINE in symtab S.
890 Return 0 if anything is invalid. */
892 #if 0 /* Currently unused */
895 source_line_charpos (s
, line
)
901 if (!s
->line_charpos
|| line
<= 0)
903 if (line
> s
->nlines
)
905 return s
->line_charpos
[line
- 1];
908 /* Return the line number of character position POS in symtab S. */
911 source_charpos_line (s
, chr
)
912 register struct symtab
*s
;
915 register int line
= 0;
918 if (s
== 0 || s
->line_charpos
== 0)
920 lnp
= s
->line_charpos
;
921 /* Files are usually short, so sequential search is Ok */
922 while (line
< s
->nlines
&& *lnp
<= chr
)
927 if (line
>= s
->nlines
)
935 /* Get full pathname and line number positions for a symtab.
936 Return nonzero if line numbers may have changed.
937 Set *FULLNAME to actual name of the file as found by `openp',
938 or to 0 if the file is not found. */
941 get_filename_and_charpos (s
, fullname
)
945 register int desc
, linenums_changed
= 0;
947 desc
= open_source_file (s
);
955 *fullname
= s
->fullname
;
956 if (s
->line_charpos
== 0)
957 linenums_changed
= 1;
958 if (linenums_changed
)
959 find_source_lines (s
, desc
);
961 return linenums_changed
;
964 /* Print text describing the full name of the source file S
965 and the line number LINE and its corresponding character position.
966 The text starts with two Ctrl-z so that the Emacs-GDB interface
969 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
971 Return 1 if successful, 0 if could not find the file. */
974 identify_source_line (s
, line
, mid_statement
, pc
)
980 if (s
->line_charpos
== 0)
981 get_filename_and_charpos (s
, (char **) NULL
);
982 if (s
->fullname
== 0)
984 if (line
> s
->nlines
)
985 /* Don't index off the end of the line_charpos array. */
987 annotate_source (s
->fullname
, line
, s
->line_charpos
[line
- 1],
990 current_source_line
= line
;
991 first_line_listed
= line
;
992 last_line_listed
= line
;
993 current_source_symtab
= s
;
998 /* Print source lines from the file of symtab S,
999 starting with line number LINE and stopping before line number STOPLINE. */
1001 static void print_source_lines_base
PARAMS ((struct symtab
* s
, int line
, int stopline
, int noerror
));
1003 print_source_lines_base (s
, line
, stopline
, noerror
)
1011 register FILE *stream
;
1012 int nlines
= stopline
- line
;
1014 /* Regardless of whether we can open the file, set current_source_symtab. */
1015 current_source_symtab
= s
;
1016 current_source_line
= line
;
1017 first_line_listed
= line
;
1019 /* Only prints "No such file or directory" once */
1020 if ((s
!= last_source_visited
) || (!last_source_error
))
1022 last_source_visited
= s
;
1023 desc
= open_source_file (s
);
1027 desc
= last_source_error
;
1033 last_source_error
= desc
;
1037 char *name
= alloca (strlen (s
->filename
) + 100);
1038 sprintf (name
, "%d\t%s", line
, s
->filename
);
1039 print_sys_errmsg (name
, errno
);
1042 printf_filtered ("%d\tin %s\n", line
, s
->filename
);
1047 last_source_error
= 0;
1049 if (s
->line_charpos
== 0)
1050 find_source_lines (s
, desc
);
1052 if (line
< 1 || line
> s
->nlines
)
1055 error ("Line number %d out of range; %s has %d lines.",
1056 line
, s
->filename
, s
->nlines
);
1059 if (lseek (desc
, s
->line_charpos
[line
- 1], 0) < 0)
1062 perror_with_name (s
->filename
);
1065 stream
= fdopen (desc
, FDOPEN_MODE
);
1068 while (nlines
-- > 0)
1073 last_line_listed
= current_source_line
;
1074 printf_filtered ("%d\t", current_source_line
++);
1077 if (c
< 040 && c
!= '\t' && c
!= '\n' && c
!= '\r')
1078 printf_filtered ("^%c", c
+ 0100);
1080 printf_filtered ("^?");
1081 #ifdef CRLF_SOURCE_FILES
1084 /* Just skip \r characters. */
1088 printf_filtered ("%c", c
);
1090 while (c
!= '\n' && (c
= fgetc (stream
)) >= 0);
1096 /* Show source lines from the file of symtab S, starting with line
1097 number LINE and stopping before line number STOPLINE. If this is the
1098 not the command line version, then the source is shown in the source
1099 window otherwise it is simply printed */
1102 print_source_lines (s
, line
, stopline
, noerror
)
1104 int line
, stopline
, noerror
;
1108 m_winPtrIsNull (srcWin
) || !srcWin
->generic
.isVisible
)
1109 print_source_lines_base (s
, line
, stopline
, noerror
);
1112 TuiGenWinInfoPtr locator
= locatorWinInfoPtr ();
1113 extern void tui_vAddWinToLayout
PARAMS ((va_list));
1114 extern void tui_vUpdateSourceWindowsWithLine
PARAMS ((va_list));
1116 /* Regardless of whether we can open the file,
1117 set current_source_symtab. */
1118 current_source_symtab
= s
;
1119 current_source_line
= line
;
1120 first_line_listed
= line
;
1122 /* make sure that the source window is displayed */
1123 tuiDo ((TuiOpaqueFuncPtr
) tui_vAddWinToLayout
, SRC_WIN
);
1125 tuiDo ((TuiOpaqueFuncPtr
) tui_vUpdateSourceWindowsWithLine
, s
, line
);
1126 tuiDo ((TuiOpaqueFuncPtr
) tui_vUpdateLocatorFilename
, s
->filename
);
1129 print_source_lines_base (s
, line
, stopline
, noerror
);
1135 /* Print a list of files and line numbers which a user may choose from
1136 in order to list a function which was specified ambiguously (as with
1137 `list classname::overloadedfuncname', for example). The vector in
1138 SALS provides the filenames and line numbers. */
1141 ambiguous_line_spec (sals
)
1142 struct symtabs_and_lines
*sals
;
1146 for (i
= 0; i
< sals
->nelts
; ++i
)
1147 printf_filtered ("file: \"%s\", line number: %d\n",
1148 sals
->sals
[i
].symtab
->filename
, sals
->sals
[i
].line
);
1152 list_command (arg
, from_tty
)
1156 struct symtabs_and_lines sals
, sals_end
;
1157 struct symtab_and_line sal
, sal_end
;
1163 int linenum_beg
= 0;
1166 if (!have_full_symbols () && !have_partial_symbols ())
1167 error ("No symbol table is loaded. Use the \"file\" command.");
1169 /* Pull in a current source symtab if necessary */
1170 if (current_source_symtab
== 0 &&
1171 (arg
== 0 || arg
[0] == '+' || arg
[0] == '-'))
1172 select_source_symtab (0);
1174 /* "l" or "l +" lists next ten lines. */
1176 if (arg
== 0 || STREQ (arg
, "+"))
1178 if (current_source_symtab
== 0)
1179 error ("No default source file yet. Do \"help list\".");
1180 print_source_lines (current_source_symtab
, current_source_line
,
1181 current_source_line
+ lines_to_list
, 0);
1185 /* "l -" lists previous ten lines, the ones before the ten just listed. */
1186 if (STREQ (arg
, "-"))
1188 if (current_source_symtab
== 0)
1189 error ("No default source file yet. Do \"help list\".");
1190 print_source_lines (current_source_symtab
,
1191 max (first_line_listed
- lines_to_list
, 1),
1192 first_line_listed
, 0);
1196 /* Now if there is only one argument, decode it in SAL
1198 If there are two arguments, decode them in SAL and SAL_END
1199 and clear NO_END; however, if one of the arguments is blank,
1200 set DUMMY_BEG or DUMMY_END to record that fact. */
1207 sals
= decode_line_1 (&arg1
, 0, 0, 0, 0);
1213 ambiguous_line_spec (&sals
);
1222 /* Record whether the BEG arg is all digits. */
1224 for (p
= arg
; p
!= arg1
&& *p
>= '0' && *p
<= '9'; p
++);
1225 linenum_beg
= (p
== arg1
);
1227 while (*arg1
== ' ' || *arg1
== '\t')
1233 while (*arg1
== ' ' || *arg1
== '\t')
1240 sals_end
= decode_line_1 (&arg1
, 0, 0, 0, 0);
1242 sals_end
= decode_line_1 (&arg1
, 0, sal
.symtab
, sal
.line
, 0);
1243 if (sals_end
.nelts
== 0)
1245 if (sals_end
.nelts
> 1)
1247 ambiguous_line_spec (&sals_end
);
1248 free (sals_end
.sals
);
1251 sal_end
= sals_end
.sals
[0];
1252 free (sals_end
.sals
);
1257 error ("Junk at end of line specification.");
1259 if (!no_end
&& !dummy_beg
&& !dummy_end
1260 && sal
.symtab
!= sal_end
.symtab
)
1261 error ("Specified start and end are in different files.");
1262 if (dummy_beg
&& dummy_end
)
1263 error ("Two empty args do not say what lines to list.");
1265 /* if line was specified by address,
1266 first print exactly which line, and which file.
1267 In this case, sal.symtab == 0 means address is outside
1268 of all known source files, not that user failed to give a filename. */
1271 if (sal
.symtab
== 0)
1272 /* FIXME-32x64--assumes sal.pc fits in long. */
1273 error ("No source file for address %s.",
1274 local_hex_string ((unsigned long) sal
.pc
));
1275 sym
= find_pc_function (sal
.pc
);
1278 print_address_numeric (sal
.pc
, 1, gdb_stdout
);
1279 printf_filtered (" is in ");
1280 fputs_filtered (SYMBOL_SOURCE_NAME (sym
), gdb_stdout
);
1281 printf_filtered (" (%s:%d).\n", sal
.symtab
->filename
, sal
.line
);
1285 print_address_numeric (sal
.pc
, 1, gdb_stdout
);
1286 printf_filtered (" is at %s:%d.\n",
1287 sal
.symtab
->filename
, sal
.line
);
1291 /* If line was not specified by just a line number,
1292 and it does not imply a symtab, it must be an undebuggable symbol
1293 which means no source code. */
1295 if (!linenum_beg
&& sal
.symtab
== 0)
1296 error ("No line number known for %s.", arg
);
1298 /* If this command is repeated with RET,
1299 turn it into the no-arg variant. */
1304 if (dummy_beg
&& sal_end
.symtab
== 0)
1305 error ("No default source file yet. Do \"help list\".");
1307 print_source_lines (sal_end
.symtab
,
1308 max (sal_end
.line
- (lines_to_list
- 1), 1),
1309 sal_end
.line
+ 1, 0);
1310 else if (sal
.symtab
== 0)
1311 error ("No default source file yet. Do \"help list\".");
1314 if (lines_to_list
% 2 == 0)
1315 print_source_lines (sal
.symtab
,
1316 max (sal
.line
- (lines_to_list
/ 2), 1),
1317 sal
.line
+ (lines_to_list
/ 2), 0);
1319 /* If lines_to_list is odd, then we round down in
1320 * one of the lines_to_list/2 computations, round up in
1321 * the other, so the total window size around the specified
1322 * line comes out right.
1324 print_source_lines (sal
.symtab
,
1325 max (sal
.line
- (lines_to_list
/ 2), 1),
1326 sal
.line
+ ((1 + lines_to_list
) / 2), 0);
1329 print_source_lines (sal
.symtab
, sal
.line
,
1331 ? sal
.line
+ lines_to_list
1332 : sal_end
.line
+ 1),
1336 /* Print info on range of pc's in a specified line. */
1339 line_info (arg
, from_tty
)
1343 struct symtabs_and_lines sals
;
1344 struct symtab_and_line sal
;
1345 CORE_ADDR start_pc
, end_pc
;
1348 INIT_SAL (&sal
); /* initialize to zeroes */
1352 sal
.symtab
= current_source_symtab
;
1353 sal
.line
= last_line_listed
;
1355 sals
.sals
= (struct symtab_and_line
*)
1356 xmalloc (sizeof (struct symtab_and_line
));
1361 sals
= decode_line_spec_1 (arg
, 0);
1366 /* C++ More than one line may have been specified, as when the user
1367 specifies an overloaded function name. Print info on them all. */
1368 for (i
= 0; i
< sals
.nelts
; i
++)
1372 if (sal
.symtab
== 0)
1374 printf_filtered ("No line number information available");
1377 /* This is useful for "info line *0x7f34". If we can't tell the
1378 user about a source line, at least let them have the symbolic
1380 printf_filtered (" for address ");
1382 print_address (sal
.pc
, gdb_stdout
);
1385 printf_filtered (".");
1386 printf_filtered ("\n");
1388 else if (sal
.line
> 0
1389 && find_line_pc_range (sal
, &start_pc
, &end_pc
))
1391 if (start_pc
== end_pc
)
1393 printf_filtered ("Line %d of \"%s\"",
1394 sal
.line
, sal
.symtab
->filename
);
1396 printf_filtered (" is at address ");
1397 print_address (start_pc
, gdb_stdout
);
1399 printf_filtered (" but contains no code.\n");
1403 printf_filtered ("Line %d of \"%s\"",
1404 sal
.line
, sal
.symtab
->filename
);
1406 printf_filtered (" starts at address ");
1407 print_address (start_pc
, gdb_stdout
);
1409 printf_filtered (" and ends at ");
1410 print_address (end_pc
, gdb_stdout
);
1411 printf_filtered (".\n");
1414 /* x/i should display this line's code. */
1415 set_next_address (start_pc
);
1417 /* Repeating "info line" should do the following line. */
1418 last_line_listed
= sal
.line
+ 1;
1420 /* If this is the only line, show the source code. If it could
1421 not find the file, don't do anything special. */
1422 if (annotation_level
&& sals
.nelts
== 1)
1423 identify_source_line (sal
.symtab
, sal
.line
, 0, start_pc
);
1426 /* Is there any case in which we get here, and have an address
1427 which the user would want to see? If we have debugging symbols
1428 and no line numbers? */
1429 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1430 sal
.line
, sal
.symtab
->filename
);
1435 /* Commands to search the source file for a regexp. */
1439 forward_search_command (regex
, from_tty
)
1445 register FILE *stream
;
1451 ** If this is the TUI, search from the first line displayed in
1452 ** the source window, otherwise, search from last_line_listed+1
1453 ** in current_source_symtab
1456 line
= last_line_listed
;
1459 if (srcWin
->generic
.isVisible
&& srcWin
->generic
.contentSize
> 0)
1460 line
= ((TuiWinContent
)
1461 srcWin
->generic
.content
)[0]->whichElement
.source
.lineOrAddr
.lineNo
;
1464 printf_filtered ("No source displayed.\nExpression not found.\n");
1470 line
= last_line_listed
+ 1;
1473 msg
= (char *) re_comp (regex
);
1477 if (current_source_symtab
== 0)
1478 select_source_symtab (0);
1480 desc
= open_source_file (current_source_symtab
);
1482 perror_with_name (current_source_symtab
->filename
);
1484 if (current_source_symtab
->line_charpos
== 0)
1485 find_source_lines (current_source_symtab
, desc
);
1487 if (line
< 1 || line
> current_source_symtab
->nlines
)
1490 error ("Expression not found");
1493 if (lseek (desc
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1496 perror_with_name (current_source_symtab
->filename
);
1499 stream
= fdopen (desc
, FDOPEN_MODE
);
1503 static char *buf
= NULL
;
1505 int cursize
, newsize
;
1508 buf
= xmalloc (cursize
);
1517 if (p
- buf
== cursize
)
1519 newsize
= cursize
+ cursize
/ 2;
1520 buf
= xrealloc (buf
, newsize
);
1525 while (c
!= '\n' && (c
= getc (stream
)) >= 0);
1527 #ifdef CRLF_SOURCE_FILES
1528 /* Remove the \r, if any, at the end of the line, otherwise
1529 regular expressions that end with $ or \n won't work. */
1530 if (p
- buf
> 1 && p
[-2] == '\r')
1537 /* we now have a source line in buf, null terminate and match */
1539 if (re_exec (buf
) > 0)
1544 print_source_lines_base (current_source_symtab
, line
, line
+ 1, 0);
1545 print_source_lines (current_source_symtab
, line
, line
+ 1, 0);
1546 set_internalvar (lookup_internalvar ("_"),
1547 value_from_longest (builtin_type_int
,
1549 current_source_line
= max (line
- lines_to_list
/ 2, 1);
1555 printf_filtered ("Expression not found\n");
1561 reverse_search_command (regex
, from_tty
)
1567 register FILE *stream
;
1572 ** If this is the TUI, search from the first line displayed in
1573 ** the source window, otherwise, search from last_line_listed-1
1574 ** in current_source_symtab
1577 line
= last_line_listed
;
1580 if (srcWin
->generic
.isVisible
&& srcWin
->generic
.contentSize
> 0)
1581 line
= ((TuiWinContent
)
1582 srcWin
->generic
.content
)[0]->whichElement
.source
.lineOrAddr
.lineNo
;
1585 printf_filtered ("No source displayed.\nExpression not found.\n");
1591 line
= last_line_listed
- 1;
1594 msg
= (char *) re_comp (regex
);
1598 if (current_source_symtab
== 0)
1599 select_source_symtab (0);
1601 desc
= open_source_file (current_source_symtab
);
1603 perror_with_name (current_source_symtab
->filename
);
1605 if (current_source_symtab
->line_charpos
== 0)
1606 find_source_lines (current_source_symtab
, desc
);
1608 if (line
< 1 || line
> current_source_symtab
->nlines
)
1611 error ("Expression not found");
1614 if (lseek (desc
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1617 perror_with_name (current_source_symtab
->filename
);
1620 stream
= fdopen (desc
, FDOPEN_MODE
);
1624 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1625 char buf
[4096]; /* Should be reasonable??? */
1626 register char *p
= buf
;
1635 while (c
!= '\n' && (c
= getc (stream
)) >= 0);
1637 #ifdef CRLF_SOURCE_FILES
1638 /* Remove the \r, if any, at the end of the line, otherwise
1639 regular expressions that end with $ or \n won't work. */
1640 if (p
- buf
> 1 && p
[-2] == '\r')
1647 /* We now have a source line in buf; null terminate and match. */
1649 if (re_exec (buf
) > 0)
1654 print_source_lines_base (current_source_symtab
, line
, line
+ 1, 0);
1655 print_source_lines (current_source_symtab
, line
, line
+ 1, 0);
1656 set_internalvar (lookup_internalvar ("_"),
1657 value_from_longest (builtin_type_int
,
1659 current_source_line
= max (line
- lines_to_list
/ 2, 1);
1663 if (fseek (stream
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1666 perror_with_name (current_source_symtab
->filename
);
1670 printf_filtered ("Expression not found\n");
1676 _initialize_source ()
1678 struct cmd_list_element
*c
;
1679 current_source_symtab
= 0;
1680 init_source_path ();
1682 /* The intention is to use POSIX Basic Regular Expressions.
1683 Always use the GNU regex routine for consistency across all hosts.
1684 Our current GNU regex.c does not have all the POSIX features, so this is
1685 just an approximation. */
1686 re_set_syntax (RE_SYNTAX_GREP
);
1688 c
= add_cmd ("directory", class_files
, directory_command
,
1689 "Add directory DIR to beginning of search path for source files.\n\
1690 Forget cached info on source file locations and line positions.\n\
1691 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1692 directory in which the source file was compiled into object code.\n\
1693 With no argument, reset the search path to $cdir:$cwd, the default.",
1697 add_com_alias ("use", "directory", class_files
, 0);
1699 c
->completer
= filename_completer
;
1701 add_cmd ("directories", no_class
, show_directories
,
1702 "Current search path for finding source files.\n\
1703 $cwd in the path means the current working directory.\n\
1704 $cdir in the path means the compilation directory of the source file.",
1709 add_com_alias ("D", "directory", class_files
, 0);
1710 add_cmd ("ld", no_class
, show_directories
,
1711 "Current search path for finding source files.\n\
1712 $cwd in the path means the current working directory.\n\
1713 $cdir in the path means the compilation directory of the source file.",
1717 add_info ("source", source_info
,
1718 "Information about the current source file.");
1720 add_info ("line", line_info
,
1721 concat ("Core addresses of the code for a source line.\n\
1722 Line can be specified as\n\
1723 LINENUM, to list around that line in current file,\n\
1724 FILE:LINENUM, to list around that line in that file,\n\
1725 FUNCTION, to list around beginning of that function,\n\
1726 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1728 Default is to describe the last source line that was listed.\n\n\
1729 This sets the default address for \"x\" to the line's first instruction\n\
1730 so that \"x/i\" suffices to start examining the machine code.\n\
1731 The address is also stored as the value of \"$_\".", NULL
));
1733 add_com ("forward-search", class_files
, forward_search_command
,
1734 "Search for regular expression (see regex(3)) from last line listed.\n\
1735 The matching line number is also stored as the value of \"$_\".");
1736 add_com_alias ("search", "forward-search", class_files
, 0);
1738 add_com ("reverse-search", class_files
, reverse_search_command
,
1739 "Search backward for regular expression (see regex(3)) from last line listed.\n\
1740 The matching line number is also stored as the value of \"$_\".");
1744 add_com_alias ("/", "forward-search", class_files
, 0);
1745 add_com_alias ("?", "reverse-search", class_files
, 0);
1748 add_com ("list", class_files
, list_command
,
1749 concat ("List specified function or line.\n\
1750 With no argument, lists ten more lines after or around previous listing.\n\
1751 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1752 One argument specifies a line, and ten lines are listed around that line.\n\
1753 Two arguments with comma between specify starting and ending lines to list.\n\
1755 Lines can be specified in these ways:\n\
1756 LINENUM, to list around that line in current file,\n\
1757 FILE:LINENUM, to list around that line in that file,\n\
1758 FUNCTION, to list around beginning of that function,\n\
1759 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1760 *ADDRESS, to list around the line containing that address.\n\
1761 With two args if one is empty it stands for ten lines away from the other arg.", NULL
));
1764 add_com_alias ("l", "list", class_files
, 1);
1766 add_com_alias ("v", "list", class_files
, 1);
1769 add_com_alias ("file", "list", class_files
, 1);
1772 (add_set_cmd ("listsize", class_support
, var_uinteger
,
1773 (char *) &lines_to_list
,
1774 "Set number of source lines gdb will list by default.",