1 /* List lines of source files for GDB, the GNU debugger.
2 Copyright 1986, 87, 88, 89, 91, 92, 93, 94, 95, 96, 97, 1998
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 #include "expression.h"
30 #include <sys/types.h>
31 #include "gdb_string.h"
38 #include "gnu-regex.h"
44 #ifdef CRLF_SOURCE_FILES
46 /* Define CRLF_SOURCE_FILES in an xm-*.h file if source files on the
47 host use \r\n rather than just \n. Defining CRLF_SOURCE_FILES is
48 much faster than defining LSEEK_NOT_LINEAR. */
54 #define OPEN_MODE (O_RDONLY | O_BINARY)
55 #define FDOPEN_MODE FOPEN_RB
57 #else /* ! defined (CRLF_SOURCE_FILES) */
59 #define OPEN_MODE O_RDONLY
60 #define FDOPEN_MODE FOPEN_RT
62 #endif /* ! defined (CRLF_SOURCE_FILES) */
64 /* Prototypes for local functions. */
66 static int open_source_file
PARAMS ((struct symtab
*));
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 static void find_source_lines
PARAMS ((struct symtab
*, int));
86 /* Path of directories to search for source files.
87 Same format as the PATH environment variable's value. */
91 /* Symtab of default file for listing lines of. */
93 struct symtab
*current_source_symtab
;
95 /* Default next line to list. */
97 int current_source_line
;
99 /* Default number of lines to print with commands like "list".
100 This is based on guessing how many long (i.e. more than chars_per_line
101 characters) lines there will be. To be completely correct, "list"
102 and friends should be rewritten to count characters and see where
103 things are wrapping, but that would be a fair amount of work. */
105 int lines_to_list
= 10;
107 /* Line number of last line printed. Default for various commands.
108 current_source_line is usually, but not always, the same as this. */
110 static int last_line_listed
;
112 /* First line number listed by last listing command. */
114 static int first_line_listed
;
117 /* Set the source file default for the "list" command to be S.
119 If S is NULL, and we don't have a default, find one. This
120 should only be called when the user actually tries to use the
121 default, since we produce an error if we can't find a reasonable
122 default. Also, since this can cause symbols to be read, doing it
123 before we need to would make things slower than necessary. */
126 select_source_symtab (s
)
127 register struct symtab
*s
;
129 struct symtabs_and_lines sals
;
130 struct symtab_and_line sal
;
131 struct partial_symtab
*ps
;
132 struct partial_symtab
*cs_pst
= 0;
137 current_source_symtab
= s
;
138 current_source_line
= 1;
142 if (current_source_symtab
)
145 /* Make the default place to list be the function `main'
147 if (lookup_symbol ("main", 0, VAR_NAMESPACE
, 0, NULL
))
149 sals
= decode_line_spec ("main", 1);
152 current_source_symtab
= sal
.symtab
;
153 current_source_line
= max (sal
.line
- (lines_to_list
- 1), 1);
154 if (current_source_symtab
)
158 /* All right; find the last file in the symtab list (ignoring .h's). */
160 current_source_line
= 1;
162 for (ofp
= object_files
; ofp
!= NULL
; ofp
= ofp
-> next
)
164 for (s
= ofp
-> symtabs
; s
; s
= s
->next
)
166 char *name
= s
-> filename
;
167 int len
= strlen (name
);
168 if (! (len
> 2 && (STREQ (&name
[len
- 2], ".h"))))
170 current_source_symtab
= s
;
174 if (current_source_symtab
)
177 /* Howabout the partial symbol tables? */
179 for (ofp
= object_files
; ofp
!= NULL
; ofp
= ofp
-> next
)
181 for (ps
= ofp
-> psymtabs
; ps
!= NULL
; ps
= ps
-> next
)
183 char *name
= ps
-> filename
;
184 int len
= strlen (name
);
185 if (! (len
> 2 && (STREQ (&name
[len
- 2], ".h"))))
193 if (cs_pst
-> readin
)
195 fatal ("Internal: select_source_symtab: readin pst found and no symtabs.");
199 current_source_symtab
= PSYMTAB_TO_SYMTAB (cs_pst
);
202 if (current_source_symtab
)
205 error ("Can't find a default source file");
209 show_directories (ignore
, from_tty
)
213 puts_filtered ("Source directories searched: ");
214 puts_filtered (source_path
);
215 puts_filtered ("\n");
218 /* Forget what we learned about line positions in source files, and
219 which directories contain them; must check again now since files
220 may be found in a different directory now. */
223 forget_cached_source_info ()
225 register struct symtab
*s
;
226 register struct objfile
*objfile
;
228 for (objfile
= object_files
; objfile
!= NULL
; objfile
= objfile
-> next
)
230 for (s
= objfile
-> symtabs
; s
!= NULL
; s
= s
-> next
)
232 if (s
-> line_charpos
!= NULL
)
234 mfree (objfile
-> md
, s
-> line_charpos
);
235 s
-> line_charpos
= NULL
;
237 if (s
-> fullname
!= NULL
)
239 mfree (objfile
-> md
, s
-> fullname
);
240 s
-> fullname
= NULL
;
251 sprintf (buf
, "$cdir%c$cwd", DIRNAME_SEPARATOR
);
252 source_path
= strsave (buf
);
253 forget_cached_source_info ();
256 /* Add zero or more directories to the front of the source path. */
259 directory_command (dirname
, from_tty
)
264 /* FIXME, this goes to "delete dir"... */
267 if (query ("Reinitialize source path to empty? "))
274 mod_path (dirname
, &source_path
);
276 show_directories ((char *)0, from_tty
);
277 forget_cached_source_info ();
280 /* Add zero or more directories to the front of an arbitrary path. */
283 mod_path (dirname
, which_path
)
287 char *old
= *which_path
;
293 dirname
= strsave (dirname
);
294 make_cleanup (free
, dirname
);
298 char *name
= dirname
;
303 char *separator
= strchr (name
, DIRNAME_SEPARATOR
);
304 char *space
= strchr (name
, ' ');
305 char *tab
= strchr (name
, '\t');
307 if (separator
== 0 && space
== 0 && tab
== 0)
308 p
= dirname
= name
+ strlen (name
);
312 if (separator
!= 0 && (p
== 0 || separator
< p
))
314 if (space
!= 0 && (p
== 0 || space
< p
))
316 if (tab
!= 0 && (p
== 0 || tab
< p
))
319 while (*dirname
== DIRNAME_SEPARATOR
327 /* On win32 h:\ is different to h: */
329 /* Sigh. "foo/" => "foo" */
338 /* "." => getwd (). */
339 name
= current_directory
;
342 else if (SLASH_P (p
[-2]))
352 /* "...foo/." => "...foo". */
363 name
= tilde_expand (name
);
364 else if (!ROOTED_P (name
) && name
[0] != '$')
365 name
= concat (current_directory
, SLASH_STRING
, name
, NULL
);
367 name
= savestring (name
, p
- name
);
368 make_cleanup (free
, name
);
370 /* Unless it's a variable, check existence. */
371 if (name
[0] != '$') {
372 /* These are warnings, not errors, since we don't want a
373 non-existent directory in a .gdbinit file to stop processing
374 of the .gdbinit file.
376 Whether they get added to the path is more debatable. Current
377 answer is yes, in case the user wants to go make the directory
378 or whatever. If the directory continues to not exist/not be
379 a directory/etc, then having them in the path should be
381 if (stat (name
, &st
) < 0)
383 int save_errno
= errno
;
384 fprintf_unfiltered (gdb_stderr
, "Warning: ");
385 print_sys_errmsg (name
, save_errno
);
387 else if ((st
.st_mode
& S_IFMT
) != S_IFDIR
)
388 warning ("%s is not a directory.", name
);
393 register unsigned int len
= strlen (name
);
398 if (!strncmp (p
, name
, len
)
399 && (p
[len
] == '\0' || p
[len
] == DIRNAME_SEPARATOR
))
401 /* Found it in the search path, remove old copy */
403 p
--; /* Back over leading separator */
404 if (prefix
> p
- *which_path
)
405 goto skip_dup
; /* Same dir twice in one cmd */
406 strcpy (p
, &p
[len
+1]); /* Copy from next \0 or : */
408 p
= strchr (p
, DIRNAME_SEPARATOR
);
418 tinybuf
[0] = DIRNAME_SEPARATOR
;
421 /* 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. */
428 temp
= concat (old
, tinybuf
, name
, NULL
);
430 *which_path
= concat (temp
, "", &old
[prefix
], NULL
);
431 prefix
= strlen (temp
);
436 *which_path
= concat (name
, (old
[0] ? tinybuf
: old
), old
, NULL
);
437 prefix
= strlen (name
);
444 } while (*dirname
!= '\0');
449 source_info (ignore
, from_tty
)
453 register struct symtab
*s
= current_source_symtab
;
457 printf_filtered("No current source file.\n");
460 printf_filtered ("Current source file is %s\n", s
->filename
);
462 printf_filtered ("Compilation directory is %s\n", s
->dirname
);
464 printf_filtered ("Located in %s\n", s
->fullname
);
466 printf_filtered ("Contains %d line%s.\n", s
->nlines
,
467 s
->nlines
== 1 ? "" : "s");
469 printf_filtered ("Source language is %s.\n", language_str (s
->language
));
470 printf_filtered ("Compiled with %s debugging format.\n", s
->debugformat
);
475 /* Open a file named STRING, searching path PATH (dir names sep by some char)
476 using mode MODE and protection bits PROT in the calls to open.
478 If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
479 (ie pretend the first element of PATH is "."). This also indicates
480 that a slash in STRING disables searching of the path (this is
481 so that "exec-file ./foo" or "symbol-file ./foo" insures that you
482 get that particular version of foo or an error message).
484 If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
485 the actual file opened (this string will always start with a "/". We
486 have to take special pains to avoid doubling the "/" between the directory
487 and the file, sigh! Emacs gets confuzzed by this when we print the
490 If a file is found, return the descriptor.
491 Otherwise, return -1, with errno set for the last name we tried to open. */
493 /* >>>> This should only allow files of certain types,
494 >>>> eg executable, non-directory */
496 openp (path
, try_cwd_first
, string
, mode
, prot
, filename_opened
)
502 char **filename_opened
;
505 register char *filename
;
506 register char *p
, *p1
;
517 if (try_cwd_first
|| SLASH_P (string
[0]))
521 fd
= open (filename
, mode
, prot
);
524 for (i
= 0; string
[i
]; i
++)
525 if (SLASH_P (string
[i
]))
530 while (string
[0] == '.' && SLASH_P (string
[1]))
533 alloclen
= strlen (path
) + strlen (string
) + 2;
534 filename
= (char *) alloca (alloclen
);
536 for (p
= path
; p
; p
= p1
? p1
+ 1 : 0)
538 p1
= (char *) strchr (p
, DIRNAME_SEPARATOR
);
544 if (len
== 4 && p
[0] == '$' && p
[1] == 'c'
545 && p
[2] == 'w' && p
[3] == 'd') {
546 /* Name is $cwd -- insert current directory name instead. */
549 /* First, realloc the filename buffer if too short. */
550 len
= strlen (current_directory
);
551 newlen
= len
+ strlen (string
) + 2;
552 if (newlen
> alloclen
) {
554 filename
= (char *) alloca (alloclen
);
556 strcpy (filename
, current_directory
);
558 /* Normal file name in path -- just use it. */
559 strncpy (filename
, p
, len
);
563 /* Remove trailing slashes */
564 while (len
> 0 && SLASH_P (filename
[len
-1]))
567 strcat (filename
+len
, SLASH_STRING
);
568 strcat (filename
, string
);
570 fd
= open (filename
, mode
);
578 *filename_opened
= (char *) 0;
579 else if (ROOTED_P (filename
))
580 *filename_opened
= savestring (filename
, strlen (filename
));
583 /* Beware the // my son, the Emacs barfs, the botch that catch... */
585 *filename_opened
= concat (current_directory
,
587 == current_directory
[strlen(current_directory
)-1]
593 /* This is a debugging hack that can go away when all combinations
594 of Mac and Unix names are handled reasonably. */
596 extern int debug_openp
;
600 printf("openp on %s, path %s mode %d prot %d\n returned %d",
601 string
, path
, mode
, prot
, fd
);
602 if (*filename_opened
)
603 printf(" (filename is %s)", *filename_opened
);
612 /* Open a source file given a symtab S. Returns a file descriptor or
613 negative number for error. */
619 char *path
= source_path
;
624 /* Quick way out if we already know its full name */
627 result
= open (s
->fullname
, OPEN_MODE
);
630 /* Didn't work -- free old one, try again. */
631 mfree (s
->objfile
->md
, s
->fullname
);
635 if (s
->dirname
!= NULL
)
637 /* Replace a path entry of $cdir with the compilation directory name */
639 /* We cast strstr's result in case an ANSIhole has made it const,
640 which produces a "required warning" when assigned to a nonconst. */
641 p
= (char *)strstr (source_path
, "$cdir");
642 if (p
&& (p
== path
|| p
[-1] == DIRNAME_SEPARATOR
)
643 && (p
[cdir_len
] == DIRNAME_SEPARATOR
|| p
[cdir_len
] == '\0'))
648 alloca (strlen (source_path
) + 1 + strlen (s
->dirname
) + 1);
649 len
= p
- source_path
;
650 strncpy (path
, source_path
, len
); /* Before $cdir */
651 strcpy (path
+ len
, s
->dirname
); /* new stuff */
652 strcat (path
+ len
, source_path
+ len
+ cdir_len
); /* After $cdir */
656 result
= openp (path
, 0, s
->filename
, OPEN_MODE
, 0, &s
->fullname
);
659 /* Didn't work. Try using just the basename. */
660 p
= basename (s
->filename
);
661 if (p
!= s
->filename
)
662 result
= openp (path
, 0, p
, OPEN_MODE
, 0, &s
->fullname
);
667 /* Didn't work. Try using just the MPW basename. */
668 p
= (char *) mpw_basename (s
->filename
);
669 if (p
!= s
->filename
)
670 result
= openp (path
, 0, p
, OPEN_MODE
, 0, &s
->fullname
);
674 /* Didn't work. Try using the mixed Unix/MPW basename. */
675 p
= (char *) mpw_mixed_basename (s
->filename
);
676 if (p
!= s
->filename
)
677 result
= openp (path
, 0, p
, OPEN_MODE
, 0, &s
->fullname
);
683 fullname
= s
->fullname
;
684 s
->fullname
= mstrsave (s
->objfile
->md
, s
->fullname
);
690 /* Return the path to the source file associated with symtab. Returns NULL
694 symtab_to_filename (s
)
702 /* If we've seen the file before, just return fullname. */
707 /* Try opening the file to setup fullname */
709 fd
= open_source_file (s
);
711 return s
->filename
; /* File not found. Just use short name */
713 /* Found the file. Cleanup and return the full name */
720 /* Create and initialize the table S->line_charpos that records
721 the positions of the lines in the source file, which is assumed
722 to be open on descriptor DESC.
723 All set S->nlines to the number of such lines. */
726 find_source_lines (s
, desc
)
731 register char *data
, *p
, *end
;
733 int lines_allocated
= 1000;
738 line_charpos
= (int *) xmmalloc (s
-> objfile
-> md
,
739 lines_allocated
* sizeof (int));
740 if (fstat (desc
, &st
) < 0)
741 perror_with_name (s
->filename
);
743 if (s
&& s
->objfile
&& s
->objfile
->obfd
)
745 mtime
= bfd_get_mtime(s
->objfile
->obfd
);
746 if (mtime
&& mtime
< st
.st_mtime
)
747 printf_filtered ("Source file is more recent than executable.\n");
751 mtime
= bfd_get_mtime(exec_bfd
);
752 if (mtime
&& mtime
< st
.st_mtime
)
753 printf_filtered ("Source file is more recent than executable.\n");
756 #ifdef LSEEK_NOT_LINEAR
760 /* Have to read it byte by byte to find out where the chars live */
762 line_charpos
[0] = lseek (desc
, 0, SEEK_CUR
);
764 while (myread(desc
, &c
, 1)>0)
768 if (nlines
== lines_allocated
)
770 lines_allocated
*= 2;
772 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
773 sizeof (int) * lines_allocated
);
775 line_charpos
[nlines
++] = lseek (desc
, 0, SEEK_CUR
);
779 #else /* lseek linear. */
781 struct cleanup
*old_cleanups
;
783 /* st_size might be a large type, but we only support source files whose
784 size fits in an int. */
785 size
= (int) st
.st_size
;
787 /* Use malloc, not alloca, because this may be pretty large, and we may
788 run into various kinds of limits on stack size. */
789 data
= (char *) xmalloc (size
);
790 old_cleanups
= make_cleanup (free
, data
);
792 /* Reassign `size' to result of read for systems where \r\n -> \n. */
793 size
= myread (desc
, data
, size
);
795 perror_with_name (s
->filename
);
803 /* A newline at the end does not start a new line. */
806 if (nlines
== lines_allocated
)
808 lines_allocated
*= 2;
810 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
811 sizeof (int) * lines_allocated
);
813 line_charpos
[nlines
++] = p
- data
;
816 do_cleanups (old_cleanups
);
818 #endif /* lseek linear. */
821 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
822 nlines
* sizeof (int));
826 /* Return the character position of a line LINE in symtab S.
827 Return 0 if anything is invalid. */
829 #if 0 /* Currently unused */
832 source_line_charpos (s
, line
)
837 if (!s
->line_charpos
|| line
<= 0) return 0;
838 if (line
> s
->nlines
)
840 return s
->line_charpos
[line
- 1];
843 /* Return the line number of character position POS in symtab S. */
846 source_charpos_line (s
, chr
)
847 register struct symtab
*s
;
850 register int line
= 0;
853 if (s
== 0 || s
->line_charpos
== 0) return 0;
854 lnp
= s
->line_charpos
;
855 /* Files are usually short, so sequential search is Ok */
856 while (line
< s
->nlines
&& *lnp
<= chr
)
861 if (line
>= s
->nlines
)
869 /* Get full pathname and line number positions for a symtab.
870 Return nonzero if line numbers may have changed.
871 Set *FULLNAME to actual name of the file as found by `openp',
872 or to 0 if the file is not found. */
875 get_filename_and_charpos (s
, fullname
)
879 register int desc
, linenums_changed
= 0;
881 desc
= open_source_file (s
);
889 *fullname
= s
->fullname
;
890 if (s
->line_charpos
== 0) linenums_changed
= 1;
891 if (linenums_changed
) find_source_lines (s
, desc
);
893 return linenums_changed
;
896 /* Print text describing the full name of the source file S
897 and the line number LINE and its corresponding character position.
898 The text starts with two Ctrl-z so that the Emacs-GDB interface
901 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
903 Return 1 if successful, 0 if could not find the file. */
906 identify_source_line (s
, line
, mid_statement
, pc
)
912 if (s
->line_charpos
== 0)
913 get_filename_and_charpos (s
, (char **)NULL
);
914 if (s
->fullname
== 0)
916 if (line
> s
->nlines
)
917 /* Don't index off the end of the line_charpos array. */
919 annotate_source (s
->fullname
, line
, s
->line_charpos
[line
- 1],
922 current_source_line
= line
;
923 first_line_listed
= line
;
924 last_line_listed
= line
;
925 current_source_symtab
= s
;
929 /* Print source lines from the file of symtab S,
930 starting with line number LINE and stopping before line number STOPLINE. */
933 print_source_lines (s
, line
, stopline
, noerror
)
940 register FILE *stream
;
941 int nlines
= stopline
- line
;
943 /* Regardless of whether we can open the file, set current_source_symtab. */
944 current_source_symtab
= s
;
945 current_source_line
= line
;
946 first_line_listed
= line
;
948 desc
= open_source_file (s
);
952 char *name
= alloca (strlen (s
->filename
) + 100);
953 sprintf (name
, "%s:%d", s
->filename
, line
);
954 print_sys_errmsg (name
, errno
);
959 if (s
->line_charpos
== 0)
960 find_source_lines (s
, desc
);
962 if (line
< 1 || line
> s
->nlines
)
965 error ("Line number %d out of range; %s has %d lines.",
966 line
, s
->filename
, s
->nlines
);
969 if (lseek (desc
, s
->line_charpos
[line
- 1], 0) < 0)
972 perror_with_name (s
->filename
);
975 stream
= fdopen (desc
, FDOPEN_MODE
);
982 last_line_listed
= current_source_line
;
983 printf_filtered ("%d\t", current_source_line
++);
986 if (c
< 040 && c
!= '\t' && c
!= '\n' && c
!= '\r')
987 printf_filtered ("^%c", c
+ 0100);
989 printf_filtered ("^?");
990 #ifdef CRLF_SOURCE_FILES
993 /* Just skip \r characters. */
997 printf_filtered ("%c", c
);
998 } while (c
!= '\n' && (c
= fgetc (stream
)) >= 0);
1006 /* Print a list of files and line numbers which a user may choose from
1007 in order to list a function which was specified ambiguously (as with
1008 `list classname::overloadedfuncname', for example). The vector in
1009 SALS provides the filenames and line numbers. */
1012 ambiguous_line_spec (sals
)
1013 struct symtabs_and_lines
*sals
;
1017 for (i
= 0; i
< sals
->nelts
; ++i
)
1018 printf_filtered("file: \"%s\", line number: %d\n",
1019 sals
->sals
[i
].symtab
->filename
, sals
->sals
[i
].line
);
1023 list_command (arg
, from_tty
)
1027 struct symtabs_and_lines sals
, sals_end
;
1028 struct symtab_and_line sal
, sal_end
;
1034 int linenum_beg
= 0;
1037 if (!have_full_symbols () && !have_partial_symbols())
1038 error ("No symbol table is loaded. Use the \"file\" command.");
1040 /* Pull in a current source symtab if necessary */
1041 if (current_source_symtab
== 0 &&
1042 (arg
== 0 || arg
[0] == '+' || arg
[0] == '-'))
1043 select_source_symtab (0);
1045 /* "l" or "l +" lists next ten lines. */
1047 if (arg
== 0 || STREQ (arg
, "+"))
1049 if (current_source_symtab
== 0)
1050 error ("No default source file yet. Do \"help list\".");
1051 print_source_lines (current_source_symtab
, current_source_line
,
1052 current_source_line
+ lines_to_list
, 0);
1056 /* "l -" lists previous ten lines, the ones before the ten just listed. */
1057 if (STREQ (arg
, "-"))
1059 if (current_source_symtab
== 0)
1060 error ("No default source file yet. Do \"help list\".");
1061 print_source_lines (current_source_symtab
,
1062 max (first_line_listed
- lines_to_list
, 1),
1063 first_line_listed
, 0);
1067 /* Now if there is only one argument, decode it in SAL
1069 If there are two arguments, decode them in SAL and SAL_END
1070 and clear NO_END; however, if one of the arguments is blank,
1071 set DUMMY_BEG or DUMMY_END to record that fact. */
1078 sals
= decode_line_1 (&arg1
, 0, 0, 0, 0);
1080 if (! sals
.nelts
) return; /* C++ */
1083 ambiguous_line_spec (&sals
);
1092 /* Record whether the BEG arg is all digits. */
1094 for (p
= arg
; p
!= arg1
&& *p
>= '0' && *p
<= '9'; p
++);
1095 linenum_beg
= (p
== arg1
);
1097 while (*arg1
== ' ' || *arg1
== '\t')
1103 while (*arg1
== ' ' || *arg1
== '\t')
1110 sals_end
= decode_line_1 (&arg1
, 0, 0, 0, 0);
1112 sals_end
= decode_line_1 (&arg1
, 0, sal
.symtab
, sal
.line
, 0);
1113 if (sals_end
.nelts
== 0)
1115 if (sals_end
.nelts
> 1)
1117 ambiguous_line_spec (&sals_end
);
1118 free (sals_end
.sals
);
1121 sal_end
= sals_end
.sals
[0];
1122 free (sals_end
.sals
);
1127 error ("Junk at end of line specification.");
1129 if (!no_end
&& !dummy_beg
&& !dummy_end
1130 && sal
.symtab
!= sal_end
.symtab
)
1131 error ("Specified start and end are in different files.");
1132 if (dummy_beg
&& dummy_end
)
1133 error ("Two empty args do not say what lines to list.");
1135 /* if line was specified by address,
1136 first print exactly which line, and which file.
1137 In this case, sal.symtab == 0 means address is outside
1138 of all known source files, not that user failed to give a filename. */
1141 if (sal
.symtab
== 0)
1142 /* FIXME-32x64--assumes sal.pc fits in long. */
1143 error ("No source file for address %s.",
1144 local_hex_string((unsigned long) sal
.pc
));
1145 sym
= find_pc_function (sal
.pc
);
1148 print_address_numeric (sal
.pc
, 1, gdb_stdout
);
1149 printf_filtered (" is in ");
1150 fputs_filtered (SYMBOL_SOURCE_NAME (sym
), gdb_stdout
);
1151 printf_filtered (" (%s:%d).\n", sal
.symtab
->filename
, sal
.line
);
1155 print_address_numeric (sal
.pc
, 1, gdb_stdout
);
1156 printf_filtered (" is at %s:%d.\n",
1157 sal
.symtab
->filename
, sal
.line
);
1161 /* If line was not specified by just a line number,
1162 and it does not imply a symtab, it must be an undebuggable symbol
1163 which means no source code. */
1165 if (! linenum_beg
&& sal
.symtab
== 0)
1166 error ("No line number known for %s.", arg
);
1168 /* If this command is repeated with RET,
1169 turn it into the no-arg variant. */
1174 if (dummy_beg
&& sal_end
.symtab
== 0)
1175 error ("No default source file yet. Do \"help list\".");
1177 print_source_lines (sal_end
.symtab
,
1178 max (sal_end
.line
- (lines_to_list
- 1), 1),
1179 sal_end
.line
+ 1, 0);
1180 else if (sal
.symtab
== 0)
1181 error ("No default source file yet. Do \"help list\".");
1183 print_source_lines (sal
.symtab
,
1184 max (sal
.line
- (lines_to_list
/ 2), 1),
1185 sal
.line
+ (lines_to_list
/ 2), 0);
1187 print_source_lines (sal
.symtab
, sal
.line
,
1189 ? sal
.line
+ lines_to_list
1190 : sal_end
.line
+ 1),
1194 /* Print info on range of pc's in a specified line. */
1197 line_info (arg
, from_tty
)
1201 struct symtabs_and_lines sals
;
1202 struct symtab_and_line sal
;
1203 CORE_ADDR start_pc
, end_pc
;
1206 INIT_SAL (&sal
); /* initialize to zeroes */
1210 sal
.symtab
= current_source_symtab
;
1211 sal
.line
= last_line_listed
;
1213 sals
.sals
= (struct symtab_and_line
*)
1214 xmalloc (sizeof (struct symtab_and_line
));
1219 sals
= decode_line_spec_1 (arg
, 0);
1224 /* C++ More than one line may have been specified, as when the user
1225 specifies an overloaded function name. Print info on them all. */
1226 for (i
= 0; i
< sals
.nelts
; i
++)
1230 if (sal
.symtab
== 0)
1232 printf_filtered ("No line number information available");
1235 /* This is useful for "info line *0x7f34". If we can't tell the
1236 user about a source line, at least let them have the symbolic
1238 printf_filtered (" for address ");
1240 print_address (sal
.pc
, gdb_stdout
);
1243 printf_filtered (".");
1244 printf_filtered ("\n");
1246 else if (sal
.line
> 0
1247 && find_line_pc_range (sal
, &start_pc
, &end_pc
))
1249 if (start_pc
== end_pc
)
1251 printf_filtered ("Line %d of \"%s\"",
1252 sal
.line
, sal
.symtab
->filename
);
1254 printf_filtered (" is at address ");
1255 print_address (start_pc
, gdb_stdout
);
1257 printf_filtered (" but contains no code.\n");
1261 printf_filtered ("Line %d of \"%s\"",
1262 sal
.line
, sal
.symtab
->filename
);
1264 printf_filtered (" starts at address ");
1265 print_address (start_pc
, gdb_stdout
);
1267 printf_filtered (" and ends at ");
1268 print_address (end_pc
, gdb_stdout
);
1269 printf_filtered (".\n");
1272 /* x/i should display this line's code. */
1273 set_next_address (start_pc
);
1275 /* Repeating "info line" should do the following line. */
1276 last_line_listed
= sal
.line
+ 1;
1278 /* If this is the only line, show the source code. If it could
1279 not find the file, don't do anything special. */
1280 if (annotation_level
&& sals
.nelts
== 1)
1281 identify_source_line (sal
.symtab
, sal
.line
, 0, start_pc
);
1284 /* Is there any case in which we get here, and have an address
1285 which the user would want to see? If we have debugging symbols
1286 and no line numbers? */
1287 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1288 sal
.line
, sal
.symtab
->filename
);
1293 /* Commands to search the source file for a regexp. */
1297 forward_search_command (regex
, from_tty
)
1303 register FILE *stream
;
1304 int line
= last_line_listed
+ 1;
1307 msg
= (char *) re_comp (regex
);
1311 if (current_source_symtab
== 0)
1312 select_source_symtab (0);
1314 /* Search from last_line_listed+1 in current_source_symtab */
1316 desc
= open_source_file (current_source_symtab
);
1318 perror_with_name (current_source_symtab
->filename
);
1320 if (current_source_symtab
->line_charpos
== 0)
1321 find_source_lines (current_source_symtab
, desc
);
1323 if (line
< 1 || line
> current_source_symtab
->nlines
)
1326 error ("Expression not found");
1329 if (lseek (desc
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1332 perror_with_name (current_source_symtab
->filename
);
1335 stream
= fdopen (desc
, FDOPEN_MODE
);
1338 static char *buf
= NULL
;
1340 int cursize
, newsize
;
1343 buf
= xmalloc (cursize
);
1351 if (p
- buf
== cursize
)
1353 newsize
= cursize
+ cursize
/ 2;
1354 buf
= xrealloc (buf
, newsize
);
1358 } while (c
!= '\n' && (c
= getc (stream
)) >= 0);
1360 /* we now have a source line in buf, null terminate and match */
1362 if (re_exec (buf
) > 0)
1366 print_source_lines (current_source_symtab
, line
, line
+1, 0);
1367 set_internalvar (lookup_internalvar ("_"),
1368 value_from_longest (builtin_type_int
,
1370 current_source_line
= max (line
- lines_to_list
/ 2, 1);
1376 printf_filtered ("Expression not found\n");
1382 reverse_search_command (regex
, from_tty
)
1388 register FILE *stream
;
1389 int line
= last_line_listed
- 1;
1392 msg
= (char *) re_comp (regex
);
1396 if (current_source_symtab
== 0)
1397 select_source_symtab (0);
1399 /* Search from last_line_listed-1 in current_source_symtab */
1401 desc
= open_source_file (current_source_symtab
);
1403 perror_with_name (current_source_symtab
->filename
);
1405 if (current_source_symtab
->line_charpos
== 0)
1406 find_source_lines (current_source_symtab
, desc
);
1408 if (line
< 1 || line
> current_source_symtab
->nlines
)
1411 error ("Expression not found");
1414 if (lseek (desc
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1417 perror_with_name (current_source_symtab
->filename
);
1420 stream
= fdopen (desc
, FDOPEN_MODE
);
1424 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1425 char buf
[4096]; /* Should be reasonable??? */
1426 register char *p
= buf
;
1433 } while (c
!= '\n' && (c
= getc (stream
)) >= 0);
1435 /* We now have a source line in buf; null terminate and match. */
1437 if (re_exec (buf
) > 0)
1441 print_source_lines (current_source_symtab
,
1443 set_internalvar (lookup_internalvar ("_"),
1444 value_from_longest (builtin_type_int
,
1446 current_source_line
= max (line
- lines_to_list
/ 2, 1);
1450 if (fseek (stream
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1453 perror_with_name (current_source_symtab
->filename
);
1457 printf_filtered ("Expression not found\n");
1463 _initialize_source ()
1465 struct cmd_list_element
*c
;
1466 current_source_symtab
= 0;
1467 init_source_path ();
1469 /* The intention is to use POSIX Basic Regular Expressions.
1470 Always use the GNU regex routine for consistency across all hosts.
1471 Our current GNU regex.c does not have all the POSIX features, so this is
1472 just an approximation. */
1473 re_set_syntax (RE_SYNTAX_GREP
);
1475 c
= add_cmd ("directory", class_files
, directory_command
,
1476 "Add directory DIR to beginning of search path for source files.\n\
1477 Forget cached info on source file locations and line positions.\n\
1478 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1479 directory in which the source file was compiled into object code.\n\
1480 With no argument, reset the search path to $cdir:$cwd, the default.",
1482 c
->completer
= filename_completer
;
1484 add_cmd ("directories", no_class
, show_directories
,
1485 "Current search path for finding source files.\n\
1486 $cwd in the path means the current working directory.\n\
1487 $cdir in the path means the compilation directory of the source file.",
1490 add_info ("source", source_info
,
1491 "Information about the current source file.");
1493 add_info ("line", line_info
,
1494 concat ("Core addresses of the code for a source line.\n\
1495 Line can be specified as\n\
1496 LINENUM, to list around that line in current file,\n\
1497 FILE:LINENUM, to list around that line in that file,\n\
1498 FUNCTION, to list around beginning of that function,\n\
1499 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1501 Default is to describe the last source line that was listed.\n\n\
1502 This sets the default address for \"x\" to the line's first instruction\n\
1503 so that \"x/i\" suffices to start examining the machine code.\n\
1504 The address is also stored as the value of \"$_\".", NULL
));
1506 add_com ("forward-search", class_files
, forward_search_command
,
1507 "Search for regular expression (see regex(3)) from last line listed.\n\
1508 The matching line number is also stored as the value of \"$_\".");
1509 add_com_alias ("search", "forward-search", class_files
, 0);
1511 add_com ("reverse-search", class_files
, reverse_search_command
,
1512 "Search backward for regular expression (see regex(3)) from last line listed.\n\
1513 The matching line number is also stored as the value of \"$_\".");
1515 add_com ("list", class_files
, list_command
,
1516 concat ("List specified function or line.\n\
1517 With no argument, lists ten more lines after or around previous listing.\n\
1518 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1519 One argument specifies a line, and ten lines are listed around that line.\n\
1520 Two arguments with comma between specify starting and ending lines to list.\n\
1522 Lines can be specified in these ways:\n\
1523 LINENUM, to list around that line in current file,\n\
1524 FILE:LINENUM, to list around that line in that file,\n\
1525 FUNCTION, to list around beginning of that function,\n\
1526 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1527 *ADDRESS, to list around the line containing that address.\n\
1528 With two args if one is empty it stands for ten lines away from the other arg.", NULL
));
1530 add_com_alias ("l", "list", class_files
, 1);
1533 (add_set_cmd ("listsize", class_support
, var_uinteger
,
1534 (char *)&lines_to_list
,
1535 "Set number of source lines gdb will list by default.",
This page took 0.082537 seconds and 4 git commands to generate.