1 /* List lines of source files for GDB, the GNU debugger.
2 Copyright (C) 1986, 1987, 1988, 1989, 1991 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
22 #include "expression.h"
29 #include <sys/types.h>
33 #include <sys/param.h>
41 /* Prototypes for local functions. */
44 open_source_file
PARAMS ((struct symtab
*));
47 get_filename_and_charpos
PARAMS ((struct symtab
*, char **));
50 reverse_search_command
PARAMS ((char *, int));
53 forward_search_command
PARAMS ((char *, int));
56 line_info
PARAMS ((char *, int));
59 list_command
PARAMS ((char *, int));
62 ambiguous_line_spec
PARAMS ((struct symtabs_and_lines
*));
65 source_info
PARAMS ((char *, int));
68 show_directories
PARAMS ((char *, int));
71 find_source_lines
PARAMS ((struct symtab
*, int));
73 /* If we use this declaration, it breaks because of fucking ANSI "const" stuff
74 on some systems. We just have to not declare it at all, have it default
75 to int, and possibly botch on a few systems. Thanks, ANSIholes... */
76 /* extern char *strstr(); */
78 /* Path of directories to search for source files.
79 Same format as the PATH environment variable's value. */
83 /* Symtab of default file for listing lines of. */
85 struct symtab
*current_source_symtab
;
87 /* Default next line to list. */
89 int current_source_line
;
91 /* Default number of lines to print with commands like "list".
92 This is based on guessing how many long (i.e. more than chars_per_line
93 characters) lines there will be. To be completely correct, "list"
94 and friends should be rewritten to count characters and see where
95 things are wrapping, but that would be a fair amount of work. */
97 int lines_to_list
= 10;
99 /* Line number of last line printed. Default for various commands.
100 current_source_line is usually, but not always, the same as this. */
102 static int last_line_listed
;
104 /* First line number listed by last listing command. */
106 static int first_line_listed
;
109 /* Set the source file default for the "list" command, specifying a
110 symtab. Sigh. Behavior specification: If it is called with a
111 non-zero argument, that is the symtab to select. If it is not,
112 first lookup "main"; if it exists, use the symtab and line it
113 defines. If not, take the last symtab in the symtab lists (if it
114 exists) or the last symtab in the psymtab lists (if *it* exists). If
115 none of this works, report an error. */
118 select_source_symtab (s
)
119 register struct symtab
*s
;
121 struct symtabs_and_lines sals
;
122 struct symtab_and_line sal
;
123 struct partial_symtab
*ps
;
124 struct partial_symtab
*cs_pst
= 0;
129 current_source_symtab
= s
;
130 current_source_line
= 1;
134 /* Make the default place to list be the function `main'
136 if (lookup_symbol ("main", 0, VAR_NAMESPACE
, 0, NULL
))
138 sals
= decode_line_spec ("main", 1);
141 current_source_symtab
= sal
.symtab
;
142 current_source_line
= max (sal
.line
- (lines_to_list
- 1), 1);
143 if (current_source_symtab
)
147 /* All right; find the last file in the symtab list (ignoring .h's). */
149 current_source_line
= 1;
151 for (ofp
= object_files
; ofp
!= NULL
; ofp
= ofp
-> next
)
153 for (s
= ofp
-> symtabs
; s
; s
= s
->next
)
155 char *name
= s
-> filename
;
156 int len
= strlen (name
);
157 if (! (len
> 2 && (strcmp (&name
[len
- 2], ".h") == 0)))
159 current_source_symtab
= s
;
163 if (current_source_symtab
)
166 /* Howabout the partial symbol tables? */
168 for (ofp
= object_files
; ofp
!= NULL
; ofp
= ofp
-> next
)
170 for (ps
= ofp
-> psymtabs
; ps
!= NULL
; ps
= ps
-> next
)
172 char *name
= ps
-> filename
;
173 int len
= strlen (name
);
174 if (! (len
> 2 && (strcmp (&name
[len
- 2], ".h") == 0)))
182 if (cs_pst
-> readin
)
184 fatal ("Internal: select_source_symtab: readin pst found and no symtabs.");
188 current_source_symtab
= PSYMTAB_TO_SYMTAB (cs_pst
);
192 if (current_source_symtab
)
195 error ("Can't find a default source file");
199 show_directories (ignore
, from_tty
)
203 puts_filtered ("Source directories searched: ");
204 puts_filtered (source_path
);
205 puts_filtered ("\n");
208 /* Forget what we learned about line positions in source files,
209 and which directories contain them;
210 must check again now since files may be found in
211 a different directory now. */
214 forget_cached_source_info ()
216 register struct symtab
*s
;
217 register struct objfile
*objfile
;
219 for (objfile
= object_files
; objfile
!= NULL
; objfile
= objfile
-> next
)
221 for (s
= objfile
-> symtabs
; s
!= NULL
; s
= s
-> next
)
223 if (s
-> line_charpos
!= NULL
)
225 mfree (objfile
-> md
, s
-> line_charpos
);
226 s
-> line_charpos
= NULL
;
228 if (s
-> fullname
!= NULL
)
230 mfree (objfile
-> md
, s
-> fullname
);
231 s
-> fullname
= NULL
;
240 source_path
= savestring ("$cdir:$cwd", /* strlen of it */ 10);
241 forget_cached_source_info ();
244 /* Add zero or more directories to the front of the source path. */
247 directory_command (dirname
, from_tty
)
252 /* FIXME, this goes to "delete dir"... */
255 if (query ("Reinitialize source path to empty? ", ""))
262 mod_path (dirname
, &source_path
);
264 show_directories ((char *)0, from_tty
);
265 forget_cached_source_info ();
268 /* Add zero or more directories to the front of an arbitrary path. */
271 mod_path (dirname
, which_path
)
275 char *old
= *which_path
;
281 dirname
= strsave (dirname
);
282 make_cleanup (free
, dirname
);
286 char *name
= dirname
;
291 char *colon
= strchr (name
, ':');
292 char *space
= strchr (name
, ' ');
293 char *tab
= strchr (name
, '\t');
294 if (colon
== 0 && space
== 0 && tab
== 0)
295 p
= dirname
= name
+ strlen (name
);
299 if (colon
!= 0 && (p
== 0 || colon
< p
))
301 if (space
!= 0 && (p
== 0 || space
< p
))
303 if (tab
!= 0 && (p
== 0 || tab
< p
))
306 while (*dirname
== ':' || *dirname
== ' ' || *dirname
== '\t')
312 /* Sigh. "foo/" => "foo" */
320 /* "." => getwd (). */
321 name
= current_directory
;
324 else if (p
[-2] == '/')
334 /* "...foo/." => "...foo". */
345 name
= tilde_expand (name
);
346 else if (name
[0] != '/' && name
[0] != '$')
347 name
= concat (current_directory
, "/", name
, NULL
);
349 name
= savestring (name
, p
- name
);
350 make_cleanup (free
, name
);
352 /* Unless it's a variable, check existence. */
353 if (name
[0] != '$') {
354 if (stat (name
, &st
) < 0)
355 perror_with_name (name
);
356 if ((st
.st_mode
& S_IFMT
) != S_IFDIR
)
357 error ("%s is not a directory.", name
);
362 register unsigned int len
= strlen (name
);
367 if (!strncmp (p
, name
, len
)
368 && (p
[len
] == '\0' || p
[len
] == ':'))
370 /* Found it in the search path, remove old copy */
372 p
--; /* Back over leading colon */
373 if (prefix
> p
- *which_path
)
374 goto skip_dup
; /* Same dir twice in one cmd */
375 strcpy (p
, &p
[len
+1]); /* Copy from next \0 or : */
385 /* 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. */
392 temp
= concat (old
, ":", name
, NULL
);
394 *which_path
= concat (temp
, "", &old
[prefix
], NULL
);
395 prefix
= strlen (temp
);
400 *which_path
= concat (name
, (old
[0]? ":" : old
), old
, NULL
);
401 prefix
= strlen (name
);
408 } while (*dirname
!= '\0');
413 source_info (ignore
, from_tty
)
417 register struct symtab
*s
= current_source_symtab
;
421 printf_filtered("No current source file.\n");
424 printf_filtered ("Current source file is %s\n", s
->filename
);
426 printf_filtered ("Compilation directory is %s\n", s
->dirname
);
428 printf_filtered ("Located in %s\n", s
->fullname
);
430 printf_filtered ("Contains %d line%s.\n", s
->nlines
,
431 s
->nlines
== 1 ? "" : "s");
433 printf_filtered("Source language is %s.\n", language_str (s
->language
));
438 /* Open a file named STRING, searching path PATH (dir names sep by colons)
439 using mode MODE and protection bits PROT in the calls to open.
440 If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
441 (ie pretend the first element of PATH is ".")
442 If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
443 the actual file opened (this string will always start with a "/". We
444 have to take special pains to avoid doubling the "/" between the directory
445 and the file, sigh! Emacs gets confuzzed by this when we print the
448 If a file is found, return the descriptor.
449 Otherwise, return -1, with errno set for the last name we tried to open. */
451 /* >>>> This should only allow files of certain types,
452 >>>> eg executable, non-directory */
454 openp (path
, try_cwd_first
, string
, mode
, prot
, filename_opened
)
460 char **filename_opened
;
463 register char *filename
;
464 register char *p
, *p1
;
472 while (string
[0] == '.' && string
[1] == '/')
475 if (try_cwd_first
|| string
[0] == '/')
478 fd
= open (filename
, mode
, prot
);
479 if (fd
>= 0 || string
[0] == '/')
483 alloclen
= strlen (path
) + strlen (string
) + 2;
484 filename
= (char *) alloca (alloclen
);
486 for (p
= path
; p
; p
= p1
? p1
+ 1 : 0)
488 p1
= (char *) strchr (p
, ':');
494 if (len
== 4 && p
[0] == '$' && p
[1] == 'c'
495 && p
[2] == 'w' && p
[3] == 'd') {
496 /* Name is $cwd -- insert current directory name instead. */
499 /* First, realloc the filename buffer if too short. */
500 len
= strlen (current_directory
);
501 newlen
= len
+ strlen (string
) + 2;
502 if (newlen
> alloclen
) {
504 filename
= (char *) alloca (alloclen
);
506 strcpy (filename
, current_directory
);
508 /* Normal file name in path -- just use it. */
509 strncpy (filename
, p
, len
);
513 /* Remove trailing slashes */
514 while (len
> 0 && filename
[len
-1] == '/')
517 strcat (filename
+len
, "/");
518 strcat (filename
, string
);
520 fd
= open (filename
, mode
, prot
);
527 *filename_opened
= (char *) 0;
528 else if (filename
[0] == '/')
529 *filename_opened
= savestring (filename
, strlen (filename
));
532 /* Beware the // my son, the Emacs barfs, the botch that catch... */
534 *filename_opened
= concat (current_directory
,
535 '/' == current_directory
[strlen(current_directory
)-1]? "": "/",
542 /* Open a source file given a symtab S. Returns a file descriptor
543 or negative number for error. */
549 char *path
= source_path
;
554 /* Quick way out if we already know its full name */
557 result
= open (s
->fullname
, O_RDONLY
);
560 /* Didn't work -- free old one, try again. */
561 mfree (s
->objfile
->md
, s
->fullname
);
565 if (s
->dirname
!= NULL
)
567 /* Replace a path entry of $cdir with the compilation directory name */
569 /* We cast strstr's result in case an ANSIhole has made it const,
570 which produces a "required warning" when assigned to a nonconst. */
571 p
= (char *)strstr (source_path
, "$cdir");
572 if (p
&& (p
== path
|| p
[-1] == ':')
573 && (p
[cdir_len
] == ':' || p
[cdir_len
] == '\0')) {
577 alloca (strlen (source_path
) + 1 + strlen (s
->dirname
) + 1);
578 len
= p
- source_path
;
579 strncpy (path
, source_path
, len
); /* Before $cdir */
580 strcpy (path
+ len
, s
->dirname
); /* new stuff */
581 strcat (path
+ len
, source_path
+ len
+ cdir_len
); /* After $cdir */
585 result
= openp (path
, 0, s
->filename
, O_RDONLY
, 0, &s
->fullname
);
588 /* Didn't work. Try using just the basename. */
589 p
= basename (s
->filename
);
590 if (p
!= s
->filename
)
591 result
= openp(path
, 0, p
, O_RDONLY
,0, &s
->fullname
);
595 fullname
= s
-> fullname
;
596 s
-> fullname
= mstrsave (s
-> objfile
-> md
, s
-> fullname
);
603 /* Create and initialize the table S->line_charpos that records
604 the positions of the lines in the source file, which is assumed
605 to be open on descriptor DESC.
606 All set S->nlines to the number of such lines. */
609 find_source_lines (s
, desc
)
614 register char *data
, *p
, *end
;
616 int lines_allocated
= 1000;
620 #ifdef LSEEK_NOT_LINEAR
624 line_charpos
= (int *) xmmalloc (s
-> objfile
-> md
,
625 lines_allocated
* sizeof (int));
626 if (fstat (desc
, &st
) < 0)
627 perror_with_name (s
->filename
);
630 exec_mtime
= bfd_get_mtime(exec_bfd
);
631 if (exec_mtime
&& exec_mtime
< st
.st_mtime
)
632 printf_filtered ("Source file is more recent than executable.\n");
635 #ifdef LSEEK_NOT_LINEAR
636 /* Have to read it byte by byte to find out where the chars live */
638 line_charpos
[0] = tell(desc
);
640 while (myread(desc
, &c
, 1)>0)
644 if (nlines
== lines_allocated
)
646 lines_allocated
*= 2;
648 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
649 sizeof (int) * lines_allocated
);
651 line_charpos
[nlines
++] = tell(desc
);
656 /* st_size might be a large type, but we only support source files whose
657 size fits in an int. FIXME. */
658 size
= (int) st
.st_size
;
660 #ifdef BROKEN_LARGE_ALLOCA
661 data
= (char *) xmalloc (size
);
662 make_cleanup (free
, data
);
664 data
= (char *) alloca (size
);
666 if (myread (desc
, data
, size
) < 0)
667 perror_with_name (s
->filename
);
675 /* A newline at the end does not start a new line. */
678 if (nlines
== lines_allocated
)
680 lines_allocated
*= 2;
682 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
683 sizeof (int) * lines_allocated
);
685 line_charpos
[nlines
++] = p
- data
;
691 (int *) xmrealloc (s
-> objfile
-> md
, (char *) line_charpos
,
692 nlines
* sizeof (int));
696 /* Return the character position of a line LINE in symtab S.
697 Return 0 if anything is invalid. */
699 #if 0 /* Currently unused */
702 source_line_charpos (s
, line
)
707 if (!s
->line_charpos
|| line
<= 0) return 0;
708 if (line
> s
->nlines
)
710 return s
->line_charpos
[line
- 1];
713 /* Return the line number of character position POS in symtab S. */
716 source_charpos_line (s
, chr
)
717 register struct symtab
*s
;
720 register int line
= 0;
723 if (s
== 0 || s
->line_charpos
== 0) return 0;
724 lnp
= s
->line_charpos
;
725 /* Files are usually short, so sequential search is Ok */
726 while (line
< s
->nlines
&& *lnp
<= chr
)
731 if (line
>= s
->nlines
)
739 /* Get full pathname and line number positions for a symtab.
740 Return nonzero if line numbers may have changed.
741 Set *FULLNAME to actual name of the file as found by `openp',
742 or to 0 if the file is not found. */
745 get_filename_and_charpos (s
, fullname
)
749 register int desc
, linenums_changed
= 0;
751 desc
= open_source_file (s
);
759 *fullname
= s
->fullname
;
760 if (s
->line_charpos
== 0) linenums_changed
= 1;
761 if (linenums_changed
) find_source_lines (s
, desc
);
763 return linenums_changed
;
766 /* Print text describing the full name of the source file S
767 and the line number LINE and its corresponding character position.
768 The text starts with two Ctrl-z so that the Emacs-GDB interface
771 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
773 Return 1 if successful, 0 if could not find the file. */
776 identify_source_line (s
, line
, mid_statement
)
781 if (s
->line_charpos
== 0)
782 get_filename_and_charpos (s
, (char **)NULL
);
783 if (s
->fullname
== 0)
785 if (line
>= s
->nlines
)
787 printf ("\032\032%s:%d:%d:%s:0x%x\n", s
->fullname
,
788 line
, s
->line_charpos
[line
- 1],
789 mid_statement
? "middle" : "beg",
790 get_frame_pc (get_current_frame()));
791 current_source_line
= line
;
792 first_line_listed
= line
;
793 last_line_listed
= line
;
794 current_source_symtab
= s
;
798 /* Print source lines from the file of symtab S,
799 starting with line number LINE and stopping before line number STOPLINE. */
802 print_source_lines (s
, line
, stopline
, noerror
)
809 register FILE *stream
;
810 int nlines
= stopline
- line
;
812 /* Regardless of whether we can open the file, set current_source_symtab. */
813 current_source_symtab
= s
;
814 current_source_line
= line
;
815 first_line_listed
= line
;
817 desc
= open_source_file (s
);
821 char *name
= alloca (strlen (s
->filename
) + 100);
822 sprintf (name
, "%s:%d", s
->filename
, line
);
823 print_sys_errmsg (name
, errno
);
828 if (s
->line_charpos
== 0)
829 find_source_lines (s
, desc
);
831 if (line
< 1 || line
> s
->nlines
)
834 error ("Line number %d out of range; %s has %d lines.",
835 line
, s
->filename
, s
->nlines
);
838 if (lseek (desc
, s
->line_charpos
[line
- 1], 0) < 0)
841 perror_with_name (s
->filename
);
844 stream
= fdopen (desc
, "r");
851 last_line_listed
= current_source_line
;
852 printf_filtered ("%d\t", current_source_line
++);
855 if (c
< 040 && c
!= '\t' && c
!= '\n' && c
!= '\r')
856 printf_filtered ("^%c", c
+ 0100);
858 printf_filtered ("^?");
860 printf_filtered ("%c", c
);
861 } while (c
!= '\n' && (c
= fgetc (stream
)) >= 0);
871 Print a list of files and line numbers which a user may choose from
872 in order to list a function which was specified ambiguously
873 (as with `list classname::overloadedfuncname', for example).
874 The vector in SALS provides the filenames and line numbers.
877 ambiguous_line_spec (sals
)
878 struct symtabs_and_lines
*sals
;
882 for (i
= 0; i
< sals
->nelts
; ++i
)
883 printf_filtered("file: \"%s\", line number: %d\n",
884 sals
->sals
[i
].symtab
->filename
, sals
->sals
[i
].line
);
889 list_command (arg
, from_tty
)
893 struct symtabs_and_lines sals
, sals_end
;
894 struct symtab_and_line sal
, sal_end
;
903 if (!have_full_symbols () && !have_partial_symbols())
904 error ("No symbol table is loaded. Use the \"file\" command.");
906 /* Pull in a current source symtab if necessary */
907 if (current_source_symtab
== 0 &&
908 (arg
== 0 || arg
[0] == '+' || arg
[0] == '-'))
909 select_source_symtab (0);
911 /* "l" or "l +" lists next ten lines. */
913 if (arg
== 0 || !strcmp (arg
, "+"))
915 if (current_source_symtab
== 0)
916 error ("No default source file yet. Do \"help list\".");
917 print_source_lines (current_source_symtab
, current_source_line
,
918 current_source_line
+ lines_to_list
, 0);
922 /* "l -" lists previous ten lines, the ones before the ten just listed. */
923 if (!strcmp (arg
, "-"))
925 if (current_source_symtab
== 0)
926 error ("No default source file yet. Do \"help list\".");
927 print_source_lines (current_source_symtab
,
928 max (first_line_listed
- lines_to_list
, 1),
929 first_line_listed
, 0);
933 /* Now if there is only one argument, decode it in SAL
935 If there are two arguments, decode them in SAL and SAL_END
936 and clear NO_END; however, if one of the arguments is blank,
937 set DUMMY_BEG or DUMMY_END to record that fact. */
944 sals
= decode_line_1 (&arg1
, 0, 0, 0);
946 if (! sals
.nelts
) return; /* C++ */
949 ambiguous_line_spec (&sals
);
958 /* Record whether the BEG arg is all digits. */
960 for (p
= arg
; p
!= arg1
&& *p
>= '0' && *p
<= '9'; p
++);
961 linenum_beg
= (p
== arg1
);
963 while (*arg1
== ' ' || *arg1
== '\t')
969 while (*arg1
== ' ' || *arg1
== '\t')
976 sals_end
= decode_line_1 (&arg1
, 0, 0, 0);
978 sals_end
= decode_line_1 (&arg1
, 0, sal
.symtab
, sal
.line
);
979 if (sals_end
.nelts
== 0)
981 if (sals_end
.nelts
> 1)
983 ambiguous_line_spec (&sals_end
);
984 free (sals_end
.sals
);
987 sal_end
= sals_end
.sals
[0];
988 free (sals_end
.sals
);
993 error ("Junk at end of line specification.");
995 if (!no_end
&& !dummy_beg
&& !dummy_end
996 && sal
.symtab
!= sal_end
.symtab
)
997 error ("Specified start and end are in different files.");
998 if (dummy_beg
&& dummy_end
)
999 error ("Two empty args do not say what lines to list.");
1001 /* if line was specified by address,
1002 first print exactly which line, and which file.
1003 In this case, sal.symtab == 0 means address is outside
1004 of all known source files, not that user failed to give a filename. */
1007 if (sal
.symtab
== 0)
1008 error ("No source file for address %s.", local_hex_string(sal
.pc
));
1009 sym
= find_pc_function (sal
.pc
);
1012 printf_filtered ("%s is in ", local_hex_string(sal
.pc
));
1013 fprint_symbol (stdout
, SYMBOL_NAME (sym
));
1014 printf_filtered (" (%s:%d).\n", sal
.symtab
->filename
, sal
.line
);
1017 printf_filtered ("%s is at %s:%d.\n",
1018 local_hex_string(sal
.pc
),
1019 sal
.symtab
->filename
, sal
.line
);
1022 /* If line was not specified by just a line number,
1023 and it does not imply a symtab, it must be an undebuggable symbol
1024 which means no source code. */
1026 if (! linenum_beg
&& sal
.symtab
== 0)
1027 error ("No line number known for %s.", arg
);
1029 /* If this command is repeated with RET,
1030 turn it into the no-arg variant. */
1035 if (dummy_beg
&& sal_end
.symtab
== 0)
1036 error ("No default source file yet. Do \"help list\".");
1038 print_source_lines (sal_end
.symtab
,
1039 max (sal_end
.line
- (lines_to_list
- 1), 1),
1040 sal_end
.line
+ 1, 0);
1041 else if (sal
.symtab
== 0)
1042 error ("No default source file yet. Do \"help list\".");
1044 print_source_lines (sal
.symtab
,
1045 max (sal
.line
- (lines_to_list
/ 2), 1),
1046 sal
.line
+ (lines_to_list
/ 2), 0);
1048 print_source_lines (sal
.symtab
, sal
.line
,
1050 ? sal
.line
+ lines_to_list
1051 : sal_end
.line
+ 1),
1055 /* Print info on range of pc's in a specified line. */
1058 line_info (arg
, from_tty
)
1062 struct symtabs_and_lines sals
;
1063 struct symtab_and_line sal
;
1064 CORE_ADDR start_pc
, end_pc
;
1069 sal
.symtab
= current_source_symtab
;
1070 sal
.line
= last_line_listed
;
1072 sals
.sals
= (struct symtab_and_line
*)
1073 xmalloc (sizeof (struct symtab_and_line
));
1078 sals
= decode_line_spec_1 (arg
, 0);
1080 /* If this command is repeated with RET,
1081 turn it into the no-arg variant. */
1086 /* C++ More than one line may have been specified, as when the user
1087 specifies an overloaded function name. Print info on them all. */
1088 for (i
= 0; i
< sals
.nelts
; i
++)
1092 if (sal
.symtab
== 0)
1093 error ("No source file specified.");
1096 && find_line_pc_range (sal
.symtab
, sal
.line
, &start_pc
, &end_pc
))
1098 if (start_pc
== end_pc
)
1099 printf_filtered ("Line %d of \"%s\" is at pc %s but contains no code.\n",
1100 sal
.line
, sal
.symtab
->filename
, local_hex_string(start_pc
));
1103 printf_filtered ("Line %d of \"%s\" starts at pc %s",
1104 sal
.line
, sal
.symtab
->filename
,
1105 local_hex_string(start_pc
));
1106 printf_filtered (" and ends at %s.\n",
1107 local_hex_string(end_pc
));
1109 /* x/i should display this line's code. */
1110 set_next_address (start_pc
);
1111 /* Repeating "info line" should do the following line. */
1112 last_line_listed
= sal
.line
+ 1;
1115 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1116 sal
.line
, sal
.symtab
->filename
);
1120 /* Commands to search the source file for a regexp. */
1124 forward_search_command (regex
, from_tty
)
1130 register FILE *stream
;
1131 int line
= last_line_listed
+ 1;
1134 msg
= (char *) re_comp (regex
);
1138 if (current_source_symtab
== 0)
1139 select_source_symtab (0);
1141 /* Search from last_line_listed+1 in current_source_symtab */
1143 desc
= open_source_file (current_source_symtab
);
1145 perror_with_name (current_source_symtab
->filename
);
1147 if (current_source_symtab
->line_charpos
== 0)
1148 find_source_lines (current_source_symtab
, desc
);
1150 if (line
< 1 || line
> current_source_symtab
->nlines
)
1153 error ("Expression not found");
1156 if (lseek (desc
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1159 perror_with_name (current_source_symtab
->filename
);
1162 stream
= fdopen (desc
, "r");
1165 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1166 char buf
[4096]; /* Should be reasonable??? */
1167 register char *p
= buf
;
1174 } while (c
!= '\n' && (c
= getc (stream
)) >= 0);
1176 /* we now have a source line in buf, null terminate and match */
1178 if (re_exec (buf
) > 0)
1182 print_source_lines (current_source_symtab
,
1184 current_source_line
= max (line
- lines_to_list
/ 2, 1);
1190 printf_filtered ("Expression not found\n");
1196 reverse_search_command (regex
, from_tty
)
1202 register FILE *stream
;
1203 int line
= last_line_listed
- 1;
1206 msg
= (char *) re_comp (regex
);
1210 if (current_source_symtab
== 0)
1211 select_source_symtab (0);
1213 /* Search from last_line_listed-1 in current_source_symtab */
1215 desc
= open_source_file (current_source_symtab
);
1217 perror_with_name (current_source_symtab
->filename
);
1219 if (current_source_symtab
->line_charpos
== 0)
1220 find_source_lines (current_source_symtab
, desc
);
1222 if (line
< 1 || line
> current_source_symtab
->nlines
)
1225 error ("Expression not found");
1228 if (lseek (desc
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1231 perror_with_name (current_source_symtab
->filename
);
1234 stream
= fdopen (desc
, "r");
1238 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1239 char buf
[4096]; /* Should be reasonable??? */
1240 register char *p
= buf
;
1247 } while (c
!= '\n' && (c
= getc (stream
)) >= 0);
1249 /* We now have a source line in buf; null terminate and match. */
1251 if (re_exec (buf
) > 0)
1255 print_source_lines (current_source_symtab
,
1257 current_source_line
= max (line
- lines_to_list
/ 2, 1);
1261 if (fseek (stream
, current_source_symtab
->line_charpos
[line
- 1], 0) < 0)
1264 perror_with_name (current_source_symtab
->filename
);
1268 printf_filtered ("Expression not found\n");
1274 _initialize_source ()
1276 current_source_symtab
= 0;
1277 init_source_path ();
1279 add_com ("directory", class_files
, directory_command
,
1280 "Add directory DIR to beginning of search path for source files.\n\
1281 Forget cached info on source file locations and line positions.\n\
1282 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1283 directory in which the source file was compiled into object code.\n\
1284 With no argument, reset the search path to $cdir:$cwd, the default.");
1286 add_cmd ("directories", no_class
, show_directories
,
1287 "Current search path for finding source files.\n\
1288 $cwd in the path means the current working directory.\n\
1289 $cdir in the path means the compilation directory of the source file.",
1292 add_info ("source", source_info
,
1293 "Information about the current source file.");
1295 add_info ("line", line_info
,
1296 "Core addresses of the code for a source line.\n\
1297 Line can be specified as\n\
1298 LINENUM, to list around that line in current file,\n\
1299 FILE:LINENUM, to list around that line in that file,\n\
1300 FUNCTION, to list around beginning of that function,\n\
1301 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1302 Default is to describe the last source line that was listed.\n\n\
1303 This sets the default address for \"x\" to the line's first instruction\n\
1304 so that \"x/i\" suffices to start examining the machine code.\n\
1305 The address is also stored as the value of \"$_\".");
1307 add_com ("forward-search", class_files
, forward_search_command
,
1308 "Search for regular expression (see regex(3)) from last line listed.");
1309 add_com_alias ("search", "forward-search", class_files
, 0);
1311 add_com ("reverse-search", class_files
, reverse_search_command
,
1312 "Search backward for regular expression (see regex(3)) from last line listed.");
1314 add_com ("list", class_files
, list_command
,
1315 "List specified function or line.\n\
1316 With no argument, lists ten more lines after or around previous listing.\n\
1317 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1318 One argument specifies a line, and ten lines are listed around that line.\n\
1319 Two arguments with comma between specify starting and ending lines to list.\n\
1320 Lines can be specified in these ways:\n\
1321 LINENUM, to list around that line in current file,\n\
1322 FILE:LINENUM, to list around that line in that file,\n\
1323 FUNCTION, to list around beginning of that function,\n\
1324 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1325 *ADDRESS, to list around the line containing that address.\n\
1326 With two args if one is empty it stands for ten lines away from the other arg.");
1327 add_com_alias ("l", "list", class_files
, 1);
1330 (add_set_cmd ("listsize", class_support
, var_uinteger
,
1331 (char *)&lines_to_list
,
1332 "Set number of source lines gdb will list by default.",
This page took 0.056114 seconds and 4 git commands to generate.