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"
31 #include <sys/types.h>
32 #include "gdb_string.h"
36 #include "gnu-regex.h"
42 #ifdef CRLF_SOURCE_FILES
44 /* Define CRLF_SOURCE_FILES in an xm-*.h file if source files on the
45 host use \r\n rather than just \n. Defining CRLF_SOURCE_FILES is
46 much faster than defining LSEEK_NOT_LINEAR. */
52 #define OPEN_MODE (O_RDONLY | O_BINARY)
53 #define FDOPEN_MODE FOPEN_RB
55 #else /* ! defined (CRLF_SOURCE_FILES) */
57 #define OPEN_MODE O_RDONLY
58 #define FDOPEN_MODE FOPEN_RT
60 #endif /* ! defined (CRLF_SOURCE_FILES) */
62 /* Prototypes for exported functions. */
64 void _initialize_source PARAMS ((void));
66 /* Prototypes for local functions. */
68 static int get_filename_and_charpos PARAMS ((struct symtab *, char **));
70 static void reverse_search_command PARAMS ((char *, int));
72 static void forward_search_command PARAMS ((char *, int));
74 static void line_info PARAMS ((char *, int));
76 static void list_command PARAMS ((char *, int));
78 static void ambiguous_line_spec PARAMS ((struct symtabs_and_lines *));
80 static void source_info PARAMS ((char *, int));
82 static void show_directories PARAMS ((char *, int));
84 /* Path of directories to search for source files.
85 Same format as the PATH environment variable's value. */
89 /* Symtab of default file for listing lines of. */
91 struct symtab *current_source_symtab;
93 /* Default next line to list. */
95 int current_source_line;
97 /* Default number of lines to print with commands like "list".
98 This is based on guessing how many long (i.e. more than chars_per_line
99 characters) lines there will be. To be completely correct, "list"
100 and friends should be rewritten to count characters and see where
101 things are wrapping, but that would be a fair amount of work. */
103 int lines_to_list = 10;
105 /* Line number of last line printed. Default for various commands.
106 current_source_line is usually, but not always, the same as this. */
108 static int last_line_listed;
110 /* First line number listed by last listing command. */
112 static int first_line_listed;
114 /* Saves the name of the last source file visited and a possible error code.
115 Used to prevent repeating annoying "No such file or directories" msgs */
117 static struct symtab *last_source_visited = NULL;
118 static int last_source_error = 0;
121 /* Set the source file default for the "list" command to be S.
123 If S is NULL, and we don't have a default, find one. This
124 should only be called when the user actually tries to use the
125 default, since we produce an error if we can't find a reasonable
126 default. Also, since this can cause symbols to be read, doing it
127 before we need to would make things slower than necessary. */
130 select_source_symtab (s)
131 register struct symtab *s;
133 struct symtabs_and_lines sals;
134 struct symtab_and_line sal;
135 struct partial_symtab *ps;
136 struct partial_symtab *cs_pst = 0;
141 current_source_symtab = s;
142 current_source_line = 1;
146 if (current_source_symtab)
149 /* Make the default place to list be the function `main'
151 if (lookup_symbol ("main", 0, VAR_NAMESPACE, 0, NULL))
153 sals = decode_line_spec ("main", 1);
156 current_source_symtab = sal.symtab;
157 current_source_line = max (sal.line - (lines_to_list - 1), 1);
158 if (current_source_symtab)
162 /* All right; find the last file in the symtab list (ignoring .h's). */
164 current_source_line = 1;
166 for (ofp = object_files; ofp != NULL; ofp = ofp->next)
168 for (s = ofp->symtabs; s; s = s->next)
170 char *name = s->filename;
171 int len = strlen (name);
172 if (!(len > 2 && (STREQ (&name[len - 2], ".h"))))
174 current_source_symtab = s;
178 if (current_source_symtab)
181 /* Howabout the partial symbol tables? */
183 for (ofp = object_files; ofp != NULL; ofp = ofp->next)
185 for (ps = ofp->psymtabs; ps != NULL; ps = ps->next)
187 char *name = ps->filename;
188 int len = strlen (name);
189 if (!(len > 2 && (STREQ (&name[len - 2], ".h"))))
199 internal_error ("select_source_symtab: readin pst found and no symtabs.");
203 current_source_symtab = PSYMTAB_TO_SYMTAB (cs_pst);
206 if (current_source_symtab)
209 error ("Can't find a default source file");
213 show_directories (ignore, from_tty)
217 puts_filtered ("Source directories searched: ");
218 puts_filtered (source_path);
219 puts_filtered ("\n");
222 /* Forget what we learned about line positions in source files, and
223 which directories contain them; must check again now since files
224 may be found in a different directory now. */
227 forget_cached_source_info ()
229 register struct symtab *s;
230 register struct objfile *objfile;
232 for (objfile = object_files; objfile != NULL; objfile = objfile->next)
234 for (s = objfile->symtabs; s != NULL; s = s->next)
236 if (s->line_charpos != NULL)
238 mfree (objfile->md, s->line_charpos);
239 s->line_charpos = NULL;
241 if (s->fullname != NULL)
243 mfree (objfile->md, s->fullname);
255 sprintf (buf, "$cdir%c$cwd", DIRNAME_SEPARATOR);
256 source_path = strsave (buf);
257 forget_cached_source_info ();
260 /* Add zero or more directories to the front of the source path. */
263 directory_command (dirname, from_tty)
268 /* FIXME, this goes to "delete dir"... */
271 if (from_tty && query ("Reinitialize source path to empty? "))
279 mod_path (dirname, &source_path);
280 last_source_visited = NULL;
283 show_directories ((char *) 0, from_tty);
284 forget_cached_source_info ();
287 /* Add zero or more directories to the front of an arbitrary path. */
290 mod_path (dirname, which_path)
294 char *old = *which_path;
300 dirname = strsave (dirname);
301 make_cleanup (free, dirname);
305 char *name = dirname;
310 char *separator = strchr (name, DIRNAME_SEPARATOR);
311 char *space = strchr (name, ' ');
312 char *tab = strchr (name, '\t');
314 if (separator == 0 && space == 0 && tab == 0)
315 p = dirname = name + strlen (name);
319 if (separator != 0 && (p == 0 || separator < p))
321 if (space != 0 && (p == 0 || space < p))
323 if (tab != 0 && (p == 0 || tab < p))
326 while (*dirname == DIRNAME_SEPARATOR
333 if (!(SLASH_P (*name) && p <= name + 1) /* "/" */
334 #if defined(_WIN32) || defined(__MSDOS__)
335 /* On MS-DOS and MS-Windows, h:\ is different from h: */
336 && !(!SLASH_P (*name) && ROOTED_P (name) && p <= name + 3) /* d:/ */
339 /* Sigh. "foo/" => "foo" */
343 while (p > name && p[-1] == '.')
347 /* "." => getwd (). */
348 name = current_directory;
351 else if (p > name + 1 && SLASH_P (p[-2]))
361 /* "...foo/." => "...foo". */
372 name = tilde_expand (name);
373 #if defined(_WIN32) || defined(__MSDOS__)
374 else if (ROOTED_P (name) && p == name + 2) /* "d:" => "d:." */
375 name = concat (name, ".", NULL);
377 else if (!ROOTED_P (name) && name[0] != '$')
378 name = concat (current_directory, SLASH_STRING, name, NULL);
380 name = savestring (name, p - name);
381 make_cleanup (free, name);
383 /* Unless it's a variable, check existence. */
386 /* These are warnings, not errors, since we don't want a
387 non-existent directory in a .gdbinit file to stop processing
388 of the .gdbinit file.
390 Whether they get added to the path is more debatable. Current
391 answer is yes, in case the user wants to go make the directory
392 or whatever. If the directory continues to not exist/not be
393 a directory/etc, then having them in the path should be
395 if (stat (name, &st) < 0)
397 int save_errno = errno;
398 fprintf_unfiltered (gdb_stderr, "Warning: ");
399 print_sys_errmsg (name, save_errno);
401 else if ((st.st_mode & S_IFMT) != S_IFDIR)
402 warning ("%s is not a directory.", name);
407 register unsigned int len = strlen (name);
412 /* FIXME: strncmp loses in interesting ways on MS-DOS and
413 MS-Windows because of case-insensitivity and two different
414 but functionally identical slash characters. We need a
415 special filesystem-dependent file-name comparison function.
417 Actually, even on Unix I would use realpath() or its work-
418 alike before comparing. Then all the code above which
419 removes excess slashes and dots could simply go away. */
420 if (!strncmp (p, name, len)
421 && (p[len] == '\0' || p[len] == DIRNAME_SEPARATOR))
423 /* Found it in the search path, remove old copy */
425 p--; /* Back over leading separator */
426 if (prefix > p - *which_path)
427 goto skip_dup; /* Same dir twice in one cmd */
428 strcpy (p, &p[len + 1]); /* Copy from next \0 or : */
430 p = strchr (p, DIRNAME_SEPARATOR);
440 tinybuf[0] = DIRNAME_SEPARATOR;
443 /* 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. */
450 temp = concat (old, tinybuf, name, NULL);
452 *which_path = concat (temp, "", &old[prefix], NULL);
453 prefix = strlen (temp);
458 *which_path = concat (name, (old[0] ? tinybuf : old), old, NULL);
459 prefix = strlen (name);
467 while (*dirname != '\0');
472 source_info (ignore, from_tty)
476 register struct symtab *s = current_source_symtab;
480 printf_filtered ("No current source file.\n");
483 printf_filtered ("Current source file is %s\n", s->filename);
485 printf_filtered ("Compilation directory is %s\n", s->dirname);
487 printf_filtered ("Located in %s\n", s->fullname);
489 printf_filtered ("Contains %d line%s.\n", s->nlines,
490 s->nlines == 1 ? "" : "s");
492 printf_filtered ("Source language is %s.\n", language_str (s->language));
493 printf_filtered ("Compiled with %s debugging format.\n", s->debugformat);
498 /* Open a file named STRING, searching path PATH (dir names sep by some char)
499 using mode MODE and protection bits PROT in the calls to open.
501 If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
502 (ie pretend the first element of PATH is "."). This also indicates
503 that a slash in STRING disables searching of the path (this is
504 so that "exec-file ./foo" or "symbol-file ./foo" insures that you
505 get that particular version of foo or an error message).
507 If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
508 the actual file opened (this string will always start with a "/". We
509 have to take special pains to avoid doubling the "/" between the directory
510 and the file, sigh! Emacs gets confuzzed by this when we print the
513 If a file is found, return the descriptor.
514 Otherwise, return -1, with errno set for the last name we tried to open. */
516 /* >>>> This should only allow files of certain types,
517 >>>> eg executable, non-directory */
519 openp (path, try_cwd_first, string, mode, prot, filename_opened)
525 char **filename_opened;
528 register char *filename;
529 register char *p, *p1;
540 if (try_cwd_first || ROOTED_P (string))
544 fd = open (filename, mode, prot);
547 for (i = 0; string[i]; i++)
548 if (SLASH_P (string[i]))
553 while (string[0] == '.' && SLASH_P (string[1]))
556 alloclen = strlen (path) + strlen (string) + 2;
557 filename = (char *) alloca (alloclen);
559 for (p = path; p; p = p1 ? p1 + 1 : 0)
561 p1 = (char *) strchr (p, DIRNAME_SEPARATOR);
567 if (len == 4 && p[0] == '$' && p[1] == 'c'
568 && p[2] == 'w' && p[3] == 'd')
570 /* Name is $cwd -- insert current directory name instead. */
573 /* First, realloc the filename buffer if too short. */
574 len = strlen (current_directory);
575 newlen = len + strlen (string) + 2;
576 if (newlen > alloclen)
579 filename = (char *) alloca (alloclen);
581 strcpy (filename, current_directory);
585 /* Normal file name in path -- just use it. */
586 strncpy (filename, p, len);
590 /* Remove trailing slashes */
591 while (len > 0 && SLASH_P (filename[len - 1]))
594 strcat (filename + len, SLASH_STRING);
595 strcat (filename, string);
597 fd = open (filename, mode);
606 *filename_opened = (char *) 0;
607 else if (ROOTED_P (filename))
608 *filename_opened = savestring (filename, strlen (filename));
611 /* Beware the // my son, the Emacs barfs, the botch that catch... */
613 *filename_opened = concat (current_directory,
614 SLASH_P (current_directory[strlen (current_directory) - 1])
620 /* This is a debugging hack that can go away when all combinations
621 of Mac and Unix names are handled reasonably. */
623 extern int debug_openp;
627 printf ("openp on %s, path %s mode %d prot %d\n returned %d",
628 string, path, mode, prot, fd);
629 if (*filename_opened)
630 printf (" (filename is %s)", *filename_opened);
640 /* This is essentially a convenience, for clients that want the behaviour
641 of openp, using source_path, but that really don't want the file to be
642 opened but want instead just to know what the full pathname is (as
643 qualified against source_path).
645 The current working directory is searched first.
647 If the file was found, this function returns 1, and FULL_PATHNAME is
648 set to the fully-qualified pathname.
650 Else, this functions returns 0, and FULL_PATHNAME is set to NULL.
653 source_full_path_of (filename, full_pathname)
655 char **full_pathname;
659 fd = openp (source_path, 1, filename, O_RDONLY, 0, full_pathname);
662 *full_pathname = NULL;
671 /* Open a source file given a symtab S. Returns a file descriptor or
672 negative number for error. */
678 char *path = source_path;
683 /* Quick way out if we already know its full name */
686 result = open (s->fullname, OPEN_MODE);
689 /* Didn't work -- free old one, try again. */
690 mfree (s->objfile->md, s->fullname);
694 if (s->dirname != NULL)
696 /* Replace a path entry of $cdir with the compilation directory name */
698 /* We cast strstr's result in case an ANSIhole has made it const,
699 which produces a "required warning" when assigned to a nonconst. */
700 p = (char *) strstr (source_path, "$cdir");
701 if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
702 && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
707 alloca (strlen (source_path) + 1 + strlen (s->dirname) + 1);
708 len = p - source_path;
709 strncpy (path, source_path, len); /* Before $cdir */
710 strcpy (path + len, s->dirname); /* new stuff */
711 strcat (path + len, source_path + len + cdir_len); /* After $cdir */
715 result = openp (path, 0, s->filename, OPEN_MODE, 0, &s->fullname);
718 /* Didn't work. Try using just the basename. */
719 p = basename (s->filename);
720 if (p != s->filename)
721 result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
726 /* Didn't work. Try using just the MPW basename. */
727 p = (char *) mpw_basename (s->filename);
728 if (p != s->filename)
729 result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
733 /* Didn't work. Try using the mixed Unix/MPW basename. */
734 p = (char *) mpw_mixed_basename (s->filename);
735 if (p != s->filename)
736 result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
742 fullname = s->fullname;
743 s->fullname = mstrsave (s->objfile->md, s->fullname);
749 /* Return the path to the source file associated with symtab. Returns NULL
753 symtab_to_filename (s)
761 /* If we've seen the file before, just return fullname. */
766 /* Try opening the file to setup fullname */
768 fd = open_source_file (s);
770 return s->filename; /* File not found. Just use short name */
772 /* Found the file. Cleanup and return the full name */
779 /* Create and initialize the table S->line_charpos that records
780 the positions of the lines in the source file, which is assumed
781 to be open on descriptor DESC.
782 All set S->nlines to the number of such lines. */
785 find_source_lines (s, desc)
790 register char *data, *p, *end;
792 int lines_allocated = 1000;
797 line_charpos = (int *) xmmalloc (s->objfile->md,
798 lines_allocated * sizeof (int));
799 if (fstat (desc, &st) < 0)
800 perror_with_name (s->filename);
802 if (s && s->objfile && s->objfile->obfd)
803 mtime = bfd_get_mtime (s->objfile->obfd);
805 mtime = bfd_get_mtime (exec_bfd);
807 if (mtime && mtime < st.st_mtime)
810 printf_filtered ("\n");
811 warning ("Source file is more recent than executable.\n");
814 #ifdef LSEEK_NOT_LINEAR
818 /* Have to read it byte by byte to find out where the chars live */
820 line_charpos[0] = lseek (desc, 0, SEEK_CUR);
822 while (myread (desc, &c, 1) > 0)
826 if (nlines == lines_allocated)
828 lines_allocated *= 2;
830 (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
831 sizeof (int) * lines_allocated);
833 line_charpos[nlines++] = lseek (desc, 0, SEEK_CUR);
837 #else /* lseek linear. */
839 struct cleanup *old_cleanups;
841 /* st_size might be a large type, but we only support source files whose
842 size fits in an int. */
843 size = (int) st.st_size;
845 /* Use malloc, not alloca, because this may be pretty large, and we may
846 run into various kinds of limits on stack size. */
847 data = (char *) xmalloc (size);
848 old_cleanups = make_cleanup (free, data);
850 /* Reassign `size' to result of read for systems where \r\n -> \n. */
851 size = myread (desc, data, size);
853 perror_with_name (s->filename);
861 /* A newline at the end does not start a new line. */
864 if (nlines == lines_allocated)
866 lines_allocated *= 2;
868 (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
869 sizeof (int) * lines_allocated);
871 line_charpos[nlines++] = p - data;
874 do_cleanups (old_cleanups);
876 #endif /* lseek linear. */
879 (int *) xmrealloc (s->objfile->md, (char *) line_charpos,
880 nlines * sizeof (int));
884 /* Return the character position of a line LINE in symtab S.
885 Return 0 if anything is invalid. */
887 #if 0 /* Currently unused */
890 source_line_charpos (s, line)
896 if (!s->line_charpos || line <= 0)
898 if (line > s->nlines)
900 return s->line_charpos[line - 1];
903 /* Return the line number of character position POS in symtab S. */
906 source_charpos_line (s, chr)
907 register struct symtab *s;
910 register int line = 0;
913 if (s == 0 || s->line_charpos == 0)
915 lnp = s->line_charpos;
916 /* Files are usually short, so sequential search is Ok */
917 while (line < s->nlines && *lnp <= chr)
922 if (line >= s->nlines)
930 /* Get full pathname and line number positions for a symtab.
931 Return nonzero if line numbers may have changed.
932 Set *FULLNAME to actual name of the file as found by `openp',
933 or to 0 if the file is not found. */
936 get_filename_and_charpos (s, fullname)
940 register int desc, linenums_changed = 0;
942 desc = open_source_file (s);
950 *fullname = s->fullname;
951 if (s->line_charpos == 0)
952 linenums_changed = 1;
953 if (linenums_changed)
954 find_source_lines (s, desc);
956 return linenums_changed;
959 /* Print text describing the full name of the source file S
960 and the line number LINE and its corresponding character position.
961 The text starts with two Ctrl-z so that the Emacs-GDB interface
964 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
966 Return 1 if successful, 0 if could not find the file. */
969 identify_source_line (s, line, mid_statement, pc)
975 if (s->line_charpos == 0)
976 get_filename_and_charpos (s, (char **) NULL);
977 if (s->fullname == 0)
979 if (line > s->nlines)
980 /* Don't index off the end of the line_charpos array. */
982 annotate_source (s->fullname, line, s->line_charpos[line - 1],
985 current_source_line = line;
986 first_line_listed = line;
987 last_line_listed = line;
988 current_source_symtab = s;
993 /* Print source lines from the file of symtab S,
994 starting with line number LINE and stopping before line number STOPLINE. */
996 static void print_source_lines_base PARAMS ((struct symtab * s, int line, int stopline, int noerror));
998 print_source_lines_base (s, line, stopline, noerror)
1006 register FILE *stream;
1007 int nlines = stopline - line;
1009 /* Regardless of whether we can open the file, set current_source_symtab. */
1010 current_source_symtab = s;
1011 current_source_line = line;
1012 first_line_listed = line;
1014 /* Only prints "No such file or directory" once */
1015 if ((s != last_source_visited) || (!last_source_error))
1017 last_source_visited = s;
1018 desc = open_source_file (s);
1022 desc = last_source_error;
1028 last_source_error = desc;
1032 char *name = alloca (strlen (s->filename) + 100);
1033 sprintf (name, "%d\t%s", line, s->filename);
1034 print_sys_errmsg (name, errno);
1037 printf_filtered ("%d\tin %s\n", line, s->filename);
1042 last_source_error = 0;
1044 if (s->line_charpos == 0)
1045 find_source_lines (s, desc);
1047 if (line < 1 || line > s->nlines)
1050 error ("Line number %d out of range; %s has %d lines.",
1051 line, s->filename, s->nlines);
1054 if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
1057 perror_with_name (s->filename);
1060 stream = fdopen (desc, FDOPEN_MODE);
1063 while (nlines-- > 0)
1068 last_line_listed = current_source_line;
1069 printf_filtered ("%d\t", current_source_line++);
1072 if (c < 040 && c != '\t' && c != '\n' && c != '\r')
1073 printf_filtered ("^%c", c + 0100);
1075 printf_filtered ("^?");
1076 #ifdef CRLF_SOURCE_FILES
1079 /* Just skip \r characters. */
1083 printf_filtered ("%c", c);
1085 while (c != '\n' && (c = fgetc (stream)) >= 0);
1091 /* Show source lines from the file of symtab S, starting with line
1092 number LINE and stopping before line number STOPLINE. If this is the
1093 not the command line version, then the source is shown in the source
1094 window otherwise it is simply printed */
1097 print_source_lines (s, line, stopline, noerror)
1099 int line, stopline, noerror;
1103 m_winPtrIsNull (srcWin) || !srcWin->generic.isVisible)
1104 print_source_lines_base (s, line, stopline, noerror);
1107 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
1108 extern void tui_vAddWinToLayout PARAMS ((va_list));
1109 extern void tui_vUpdateSourceWindowsWithLine PARAMS ((va_list));
1111 /* Regardless of whether we can open the file,
1112 set current_source_symtab. */
1113 current_source_symtab = s;
1114 current_source_line = line;
1115 first_line_listed = line;
1117 /* make sure that the source window is displayed */
1118 tuiDo ((TuiOpaqueFuncPtr) tui_vAddWinToLayout, SRC_WIN);
1120 tuiDo ((TuiOpaqueFuncPtr) tui_vUpdateSourceWindowsWithLine, s, line);
1121 tuiDo ((TuiOpaqueFuncPtr) tui_vUpdateLocatorFilename, s->filename);
1124 print_source_lines_base (s, line, stopline, noerror);
1130 /* Print a list of files and line numbers which a user may choose from
1131 in order to list a function which was specified ambiguously (as with
1132 `list classname::overloadedfuncname', for example). The vector in
1133 SALS provides the filenames and line numbers. */
1136 ambiguous_line_spec (sals)
1137 struct symtabs_and_lines *sals;
1141 for (i = 0; i < sals->nelts; ++i)
1142 printf_filtered ("file: \"%s\", line number: %d\n",
1143 sals->sals[i].symtab->filename, sals->sals[i].line);
1147 list_command (arg, from_tty)
1151 struct symtabs_and_lines sals, sals_end;
1152 struct symtab_and_line sal, sal_end;
1158 int linenum_beg = 0;
1161 if (!have_full_symbols () && !have_partial_symbols ())
1162 error ("No symbol table is loaded. Use the \"file\" command.");
1164 /* Pull in a current source symtab if necessary */
1165 if (current_source_symtab == 0 &&
1166 (arg == 0 || arg[0] == '+' || arg[0] == '-'))
1167 select_source_symtab (0);
1169 /* "l" or "l +" lists next ten lines. */
1171 if (arg == 0 || STREQ (arg, "+"))
1173 if (current_source_symtab == 0)
1174 error ("No default source file yet. Do \"help list\".");
1175 print_source_lines (current_source_symtab, current_source_line,
1176 current_source_line + lines_to_list, 0);
1180 /* "l -" lists previous ten lines, the ones before the ten just listed. */
1181 if (STREQ (arg, "-"))
1183 if (current_source_symtab == 0)
1184 error ("No default source file yet. Do \"help list\".");
1185 print_source_lines (current_source_symtab,
1186 max (first_line_listed - lines_to_list, 1),
1187 first_line_listed, 0);
1191 /* Now if there is only one argument, decode it in SAL
1193 If there are two arguments, decode them in SAL and SAL_END
1194 and clear NO_END; however, if one of the arguments is blank,
1195 set DUMMY_BEG or DUMMY_END to record that fact. */
1202 sals = decode_line_1 (&arg1, 0, 0, 0, 0);
1208 ambiguous_line_spec (&sals);
1217 /* Record whether the BEG arg is all digits. */
1219 for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
1220 linenum_beg = (p == arg1);
1222 while (*arg1 == ' ' || *arg1 == '\t')
1228 while (*arg1 == ' ' || *arg1 == '\t')
1235 sals_end = decode_line_1 (&arg1, 0, 0, 0, 0);
1237 sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0);
1238 if (sals_end.nelts == 0)
1240 if (sals_end.nelts > 1)
1242 ambiguous_line_spec (&sals_end);
1243 free (sals_end.sals);
1246 sal_end = sals_end.sals[0];
1247 free (sals_end.sals);
1252 error ("Junk at end of line specification.");
1254 if (!no_end && !dummy_beg && !dummy_end
1255 && sal.symtab != sal_end.symtab)
1256 error ("Specified start and end are in different files.");
1257 if (dummy_beg && dummy_end)
1258 error ("Two empty args do not say what lines to list.");
1260 /* if line was specified by address,
1261 first print exactly which line, and which file.
1262 In this case, sal.symtab == 0 means address is outside
1263 of all known source files, not that user failed to give a filename. */
1266 if (sal.symtab == 0)
1267 /* FIXME-32x64--assumes sal.pc fits in long. */
1268 error ("No source file for address %s.",
1269 local_hex_string ((unsigned long) sal.pc));
1270 sym = find_pc_function (sal.pc);
1273 print_address_numeric (sal.pc, 1, gdb_stdout);
1274 printf_filtered (" is in ");
1275 fputs_filtered (SYMBOL_SOURCE_NAME (sym), gdb_stdout);
1276 printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
1280 print_address_numeric (sal.pc, 1, gdb_stdout);
1281 printf_filtered (" is at %s:%d.\n",
1282 sal.symtab->filename, sal.line);
1286 /* If line was not specified by just a line number,
1287 and it does not imply a symtab, it must be an undebuggable symbol
1288 which means no source code. */
1290 if (!linenum_beg && sal.symtab == 0)
1291 error ("No line number known for %s.", arg);
1293 /* If this command is repeated with RET,
1294 turn it into the no-arg variant. */
1299 if (dummy_beg && sal_end.symtab == 0)
1300 error ("No default source file yet. Do \"help list\".");
1302 print_source_lines (sal_end.symtab,
1303 max (sal_end.line - (lines_to_list - 1), 1),
1304 sal_end.line + 1, 0);
1305 else if (sal.symtab == 0)
1306 error ("No default source file yet. Do \"help list\".");
1309 int first_line = sal.line - lines_to_list / 2;
1311 if (first_line < 1) first_line = 1;
1313 print_source_lines (sal.symtab, first_line, first_line + lines_to_list,
1317 print_source_lines (sal.symtab, sal.line,
1319 ? sal.line + lines_to_list
1320 : sal_end.line + 1),
1324 /* Print info on range of pc's in a specified line. */
1327 line_info (arg, from_tty)
1331 struct symtabs_and_lines sals;
1332 struct symtab_and_line sal;
1333 CORE_ADDR start_pc, end_pc;
1336 INIT_SAL (&sal); /* initialize to zeroes */
1340 sal.symtab = current_source_symtab;
1341 sal.line = last_line_listed;
1343 sals.sals = (struct symtab_and_line *)
1344 xmalloc (sizeof (struct symtab_and_line));
1349 sals = decode_line_spec_1 (arg, 0);
1354 /* C++ More than one line may have been specified, as when the user
1355 specifies an overloaded function name. Print info on them all. */
1356 for (i = 0; i < sals.nelts; i++)
1360 if (sal.symtab == 0)
1362 printf_filtered ("No line number information available");
1365 /* This is useful for "info line *0x7f34". If we can't tell the
1366 user about a source line, at least let them have the symbolic
1368 printf_filtered (" for address ");
1370 print_address (sal.pc, gdb_stdout);
1373 printf_filtered (".");
1374 printf_filtered ("\n");
1376 else if (sal.line > 0
1377 && find_line_pc_range (sal, &start_pc, &end_pc))
1379 if (start_pc == end_pc)
1381 printf_filtered ("Line %d of \"%s\"",
1382 sal.line, sal.symtab->filename);
1384 printf_filtered (" is at address ");
1385 print_address (start_pc, gdb_stdout);
1387 printf_filtered (" but contains no code.\n");
1391 printf_filtered ("Line %d of \"%s\"",
1392 sal.line, sal.symtab->filename);
1394 printf_filtered (" starts at address ");
1395 print_address (start_pc, gdb_stdout);
1397 printf_filtered (" and ends at ");
1398 print_address (end_pc, gdb_stdout);
1399 printf_filtered (".\n");
1402 /* x/i should display this line's code. */
1403 set_next_address (start_pc);
1405 /* Repeating "info line" should do the following line. */
1406 last_line_listed = sal.line + 1;
1408 /* If this is the only line, show the source code. If it could
1409 not find the file, don't do anything special. */
1410 if (annotation_level && sals.nelts == 1)
1411 identify_source_line (sal.symtab, sal.line, 0, start_pc);
1414 /* Is there any case in which we get here, and have an address
1415 which the user would want to see? If we have debugging symbols
1416 and no line numbers? */
1417 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1418 sal.line, sal.symtab->filename);
1423 /* Commands to search the source file for a regexp. */
1427 forward_search_command (regex, from_tty)
1433 register FILE *stream;
1439 ** If this is the TUI, search from the first line displayed in
1440 ** the source window, otherwise, search from last_line_listed+1
1441 ** in current_source_symtab
1444 line = last_line_listed;
1447 if (srcWin->generic.isVisible && srcWin->generic.contentSize > 0)
1448 line = ((TuiWinContent)
1449 srcWin->generic.content)[0]->whichElement.source.lineOrAddr.lineNo;
1452 printf_filtered ("No source displayed.\nExpression not found.\n");
1458 line = last_line_listed + 1;
1461 msg = (char *) re_comp (regex);
1465 if (current_source_symtab == 0)
1466 select_source_symtab (0);
1468 desc = open_source_file (current_source_symtab);
1470 perror_with_name (current_source_symtab->filename);
1472 if (current_source_symtab->line_charpos == 0)
1473 find_source_lines (current_source_symtab, desc);
1475 if (line < 1 || line > current_source_symtab->nlines)
1478 error ("Expression not found");
1481 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1484 perror_with_name (current_source_symtab->filename);
1487 stream = fdopen (desc, FDOPEN_MODE);
1491 static char *buf = NULL;
1493 int cursize, newsize;
1496 buf = xmalloc (cursize);
1505 if (p - buf == cursize)
1507 newsize = cursize + cursize / 2;
1508 buf = xrealloc (buf, newsize);
1513 while (c != '\n' && (c = getc (stream)) >= 0);
1515 #ifdef CRLF_SOURCE_FILES
1516 /* Remove the \r, if any, at the end of the line, otherwise
1517 regular expressions that end with $ or \n won't work. */
1518 if (p - buf > 1 && p[-2] == '\r')
1525 /* we now have a source line in buf, null terminate and match */
1527 if (re_exec (buf) > 0)
1532 print_source_lines_base (current_source_symtab, line, line + 1, 0);
1533 print_source_lines (current_source_symtab, line, line + 1, 0);
1534 set_internalvar (lookup_internalvar ("_"),
1535 value_from_longest (builtin_type_int,
1537 current_source_line = max (line - lines_to_list / 2, 1);
1543 printf_filtered ("Expression not found\n");
1549 reverse_search_command (regex, from_tty)
1555 register FILE *stream;
1560 ** If this is the TUI, search from the first line displayed in
1561 ** the source window, otherwise, search from last_line_listed-1
1562 ** in current_source_symtab
1565 line = last_line_listed;
1568 if (srcWin->generic.isVisible && srcWin->generic.contentSize > 0)
1569 line = ((TuiWinContent)
1570 srcWin->generic.content)[0]->whichElement.source.lineOrAddr.lineNo;
1573 printf_filtered ("No source displayed.\nExpression not found.\n");
1579 line = last_line_listed - 1;
1582 msg = (char *) re_comp (regex);
1586 if (current_source_symtab == 0)
1587 select_source_symtab (0);
1589 desc = open_source_file (current_source_symtab);
1591 perror_with_name (current_source_symtab->filename);
1593 if (current_source_symtab->line_charpos == 0)
1594 find_source_lines (current_source_symtab, desc);
1596 if (line < 1 || line > current_source_symtab->nlines)
1599 error ("Expression not found");
1602 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1605 perror_with_name (current_source_symtab->filename);
1608 stream = fdopen (desc, FDOPEN_MODE);
1612 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1613 char buf[4096]; /* Should be reasonable??? */
1614 register char *p = buf;
1623 while (c != '\n' && (c = getc (stream)) >= 0);
1625 #ifdef CRLF_SOURCE_FILES
1626 /* Remove the \r, if any, at the end of the line, otherwise
1627 regular expressions that end with $ or \n won't work. */
1628 if (p - buf > 1 && p[-2] == '\r')
1635 /* We now have a source line in buf; null terminate and match. */
1637 if (re_exec (buf) > 0)
1642 print_source_lines_base (current_source_symtab, line, line + 1, 0);
1643 print_source_lines (current_source_symtab, line, line + 1, 0);
1644 set_internalvar (lookup_internalvar ("_"),
1645 value_from_longest (builtin_type_int,
1647 current_source_line = max (line - lines_to_list / 2, 1);
1651 if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1654 perror_with_name (current_source_symtab->filename);
1658 printf_filtered ("Expression not found\n");
1664 _initialize_source ()
1666 struct cmd_list_element *c;
1667 current_source_symtab = 0;
1668 init_source_path ();
1670 /* The intention is to use POSIX Basic Regular Expressions.
1671 Always use the GNU regex routine for consistency across all hosts.
1672 Our current GNU regex.c does not have all the POSIX features, so this is
1673 just an approximation. */
1674 re_set_syntax (RE_SYNTAX_GREP);
1676 c = add_cmd ("directory", class_files, directory_command,
1677 "Add directory DIR to beginning of search path for source files.\n\
1678 Forget cached info on source file locations and line positions.\n\
1679 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1680 directory in which the source file was compiled into object code.\n\
1681 With no argument, reset the search path to $cdir:$cwd, the default.",
1685 add_com_alias ("use", "directory", class_files, 0);
1687 c->completer = filename_completer;
1689 add_cmd ("directories", no_class, show_directories,
1690 "Current search path for finding source files.\n\
1691 $cwd in the path means the current working directory.\n\
1692 $cdir in the path means the compilation directory of the source file.",
1697 add_com_alias ("D", "directory", class_files, 0);
1698 add_cmd ("ld", no_class, show_directories,
1699 "Current search path for finding source files.\n\
1700 $cwd in the path means the current working directory.\n\
1701 $cdir in the path means the compilation directory of the source file.",
1705 add_info ("source", source_info,
1706 "Information about the current source file.");
1708 add_info ("line", line_info,
1709 concat ("Core addresses of the code for a source line.\n\
1710 Line can be specified as\n\
1711 LINENUM, to list around that line in current file,\n\
1712 FILE:LINENUM, to list around that line in that file,\n\
1713 FUNCTION, to list around beginning of that function,\n\
1714 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1716 Default is to describe the last source line that was listed.\n\n\
1717 This sets the default address for \"x\" to the line's first instruction\n\
1718 so that \"x/i\" suffices to start examining the machine code.\n\
1719 The address is also stored as the value of \"$_\".", NULL));
1721 add_com ("forward-search", class_files, forward_search_command,
1722 "Search for regular expression (see regex(3)) from last line listed.\n\
1723 The matching line number is also stored as the value of \"$_\".");
1724 add_com_alias ("search", "forward-search", class_files, 0);
1726 add_com ("reverse-search", class_files, reverse_search_command,
1727 "Search backward for regular expression (see regex(3)) from last line listed.\n\
1728 The matching line number is also stored as the value of \"$_\".");
1732 add_com_alias ("/", "forward-search", class_files, 0);
1733 add_com_alias ("?", "reverse-search", class_files, 0);
1736 add_com ("list", class_files, list_command,
1737 concat ("List specified function or line.\n\
1738 With no argument, lists ten more lines after or around previous listing.\n\
1739 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1740 One argument specifies a line, and ten lines are listed around that line.\n\
1741 Two arguments with comma between specify starting and ending lines to list.\n\
1743 Lines can be specified in these ways:\n\
1744 LINENUM, to list around that line in current file,\n\
1745 FILE:LINENUM, to list around that line in that file,\n\
1746 FUNCTION, to list around beginning of that function,\n\
1747 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1748 *ADDRESS, to list around the line containing that address.\n\
1749 With two args if one is empty it stands for ten lines away from the other arg.", NULL));
1752 add_com_alias ("l", "list", class_files, 1);
1754 add_com_alias ("v", "list", class_files, 1);
1757 add_com_alias ("file", "list", class_files, 1);
1760 (add_set_cmd ("listsize", class_support, var_uinteger,
1761 (char *) &lines_to_list,
1762 "Set number of source lines gdb will list by default.",