* config/pa/tm-hppa.h: Define lots register offsets needed by
[deliverable/binutils-gdb.git] / gdb / source.c
1 /* List lines of source files for GDB, the GNU debugger.
2 Copyright 1986, 1987, 1988, 1989, 1991, 1992, 1993, 1994
3 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 #include "defs.h"
22 #include "symtab.h"
23 #include "expression.h"
24 #include "language.h"
25 #include "command.h"
26 #include "gdbcmd.h"
27 #include "frame.h"
28
29 #include <sys/types.h>
30 #include <string.h>
31 #include <sys/param.h>
32 #include <sys/stat.h>
33 #include <fcntl.h>
34 #include "gdbcore.h"
35 #include "regex.h"
36 #include "symfile.h"
37 #include "objfiles.h"
38 #include "annotate.h"
39
40 #ifndef DIRNAME_SEPARATOR
41 #define DIRNAME_SEPARATOR ':'
42 #endif
43
44 /* Prototypes for local functions. */
45
46 static int open_source_file PARAMS ((struct symtab *));
47
48 static int get_filename_and_charpos PARAMS ((struct symtab *, char **));
49
50 static void reverse_search_command PARAMS ((char *, int));
51
52 static void forward_search_command PARAMS ((char *, int));
53
54 static void line_info PARAMS ((char *, int));
55
56 static void list_command PARAMS ((char *, int));
57
58 static void ambiguous_line_spec PARAMS ((struct symtabs_and_lines *));
59
60 static void source_info PARAMS ((char *, int));
61
62 static void show_directories PARAMS ((char *, int));
63
64 static void find_source_lines PARAMS ((struct symtab *, int));
65
66 /* If we use this declaration, it breaks because of fucking ANSI "const" stuff
67 on some systems. We just have to not declare it at all, have it default
68 to int, and possibly botch on a few systems. Thanks, ANSIholes... */
69 /* extern char *strstr(); */
70
71 /* Path of directories to search for source files.
72 Same format as the PATH environment variable's value. */
73
74 char *source_path;
75
76 /* Symtab of default file for listing lines of. */
77
78 struct symtab *current_source_symtab;
79
80 /* Default next line to list. */
81
82 int current_source_line;
83
84 /* Default number of lines to print with commands like "list".
85 This is based on guessing how many long (i.e. more than chars_per_line
86 characters) lines there will be. To be completely correct, "list"
87 and friends should be rewritten to count characters and see where
88 things are wrapping, but that would be a fair amount of work. */
89
90 int lines_to_list = 10;
91
92 /* Line number of last line printed. Default for various commands.
93 current_source_line is usually, but not always, the same as this. */
94
95 static int last_line_listed;
96
97 /* First line number listed by last listing command. */
98
99 static int first_line_listed;
100
101 \f
102 /* Set the source file default for the "list" command to be S.
103
104 If S is NULL, and we don't have a default, find one. This
105 should only be called when the user actually tries to use the
106 default, since we produce an error if we can't find a reasonable
107 default. Also, since this can cause symbols to be read, doing it
108 before we need to would make things slower than necessary. */
109
110 void
111 select_source_symtab (s)
112 register struct symtab *s;
113 {
114 struct symtabs_and_lines sals;
115 struct symtab_and_line sal;
116 struct partial_symtab *ps;
117 struct partial_symtab *cs_pst = 0;
118 struct objfile *ofp;
119
120 if (s)
121 {
122 current_source_symtab = s;
123 current_source_line = 1;
124 return;
125 }
126
127 if (current_source_symtab)
128 return;
129
130 /* Make the default place to list be the function `main'
131 if one exists. */
132 if (lookup_symbol ("main", 0, VAR_NAMESPACE, 0, NULL))
133 {
134 sals = decode_line_spec ("main", 1);
135 sal = sals.sals[0];
136 free (sals.sals);
137 current_source_symtab = sal.symtab;
138 current_source_line = max (sal.line - (lines_to_list - 1), 1);
139 if (current_source_symtab)
140 return;
141 }
142
143 /* All right; find the last file in the symtab list (ignoring .h's). */
144
145 current_source_line = 1;
146
147 for (ofp = object_files; ofp != NULL; ofp = ofp -> next)
148 {
149 for (s = ofp -> symtabs; s; s = s->next)
150 {
151 char *name = s -> filename;
152 int len = strlen (name);
153 if (! (len > 2 && (STREQ (&name[len - 2], ".h"))))
154 {
155 current_source_symtab = s;
156 }
157 }
158 }
159 if (current_source_symtab)
160 return;
161
162 /* Howabout the partial symbol tables? */
163
164 for (ofp = object_files; ofp != NULL; ofp = ofp -> next)
165 {
166 for (ps = ofp -> psymtabs; ps != NULL; ps = ps -> next)
167 {
168 char *name = ps -> filename;
169 int len = strlen (name);
170 if (! (len > 2 && (STREQ (&name[len - 2], ".h"))))
171 {
172 cs_pst = ps;
173 }
174 }
175 }
176 if (cs_pst)
177 {
178 if (cs_pst -> readin)
179 {
180 fatal ("Internal: select_source_symtab: readin pst found and no symtabs.");
181 }
182 else
183 {
184 current_source_symtab = PSYMTAB_TO_SYMTAB (cs_pst);
185 }
186 }
187
188 error ("Can't find a default source file");
189 }
190 \f
191 static void
192 show_directories (ignore, from_tty)
193 char *ignore;
194 int from_tty;
195 {
196 puts_filtered ("Source directories searched: ");
197 puts_filtered (source_path);
198 puts_filtered ("\n");
199 }
200
201 /* Forget what we learned about line positions in source files, and
202 which directories contain them; must check again now since files
203 may be found in a different directory now. */
204
205 void
206 forget_cached_source_info ()
207 {
208 register struct symtab *s;
209 register struct objfile *objfile;
210
211 for (objfile = object_files; objfile != NULL; objfile = objfile -> next)
212 {
213 for (s = objfile -> symtabs; s != NULL; s = s -> next)
214 {
215 if (s -> line_charpos != NULL)
216 {
217 mfree (objfile -> md, s -> line_charpos);
218 s -> line_charpos = NULL;
219 }
220 if (s -> fullname != NULL)
221 {
222 mfree (objfile -> md, s -> fullname);
223 s -> fullname = NULL;
224 }
225 }
226 }
227 }
228
229 void
230 init_source_path ()
231 {
232 char buf[20];
233
234 sprintf (buf, "$cdir%c$cwd", DIRNAME_SEPARATOR);
235 source_path = strsave (buf);
236 forget_cached_source_info ();
237 }
238
239 /* Add zero or more directories to the front of the source path. */
240
241 void
242 directory_command (dirname, from_tty)
243 char *dirname;
244 int from_tty;
245 {
246 dont_repeat ();
247 /* FIXME, this goes to "delete dir"... */
248 if (dirname == 0)
249 {
250 if (query ("Reinitialize source path to empty? ", ""))
251 {
252 free (source_path);
253 init_source_path ();
254 }
255 }
256 else
257 mod_path (dirname, &source_path);
258 if (from_tty)
259 show_directories ((char *)0, from_tty);
260 forget_cached_source_info ();
261 }
262
263 /* Add zero or more directories to the front of an arbitrary path. */
264
265 void
266 mod_path (dirname, which_path)
267 char *dirname;
268 char **which_path;
269 {
270 char *old = *which_path;
271 int prefix = 0;
272
273 if (dirname == 0)
274 return;
275
276 dirname = strsave (dirname);
277 make_cleanup (free, dirname);
278
279 do
280 {
281 char *name = dirname;
282 register char *p;
283 struct stat st;
284
285 {
286 char *separator = strchr (name, DIRNAME_SEPARATOR);
287 char *space = strchr (name, ' ');
288 char *tab = strchr (name, '\t');
289
290 if (separator == 0 && space == 0 && tab == 0)
291 p = dirname = name + strlen (name);
292 else
293 {
294 p = 0;
295 if (separator != 0 && (p == 0 || separator < p))
296 p = separator;
297 if (space != 0 && (p == 0 || space < p))
298 p = space;
299 if (tab != 0 && (p == 0 || tab < p))
300 p = tab;
301 dirname = p + 1;
302 while (*dirname == DIRNAME_SEPARATOR
303 || *dirname == ' '
304 || *dirname == '\t')
305 ++dirname;
306 }
307 }
308
309 if (p[-1] == '/')
310 /* Sigh. "foo/" => "foo" */
311 --p;
312 *p = '\0';
313
314 while (p[-1] == '.')
315 {
316 if (p - name == 1)
317 {
318 /* "." => getwd (). */
319 name = current_directory;
320 goto append;
321 }
322 else if (p[-2] == '/')
323 {
324 if (p - name == 2)
325 {
326 /* "/." => "/". */
327 *--p = '\0';
328 goto append;
329 }
330 else
331 {
332 /* "...foo/." => "...foo". */
333 p -= 2;
334 *p = '\0';
335 continue;
336 }
337 }
338 else
339 break;
340 }
341
342 if (name[0] == '~')
343 name = tilde_expand (name);
344 else if (name[0] != '/' && name[0] != '$')
345 name = concat (current_directory, "/", name, NULL);
346 else
347 name = savestring (name, p - name);
348 make_cleanup (free, name);
349
350 /* Unless it's a variable, check existence. */
351 if (name[0] != '$') {
352 /* These are warnings, not errors, since we don't want a
353 non-existent directory in a .gdbinit file to stop processing
354 of the .gdbinit file.
355
356 Whether they get added to the path is more debatable. Current
357 answer is yes, in case the user wants to go make the directory
358 or whatever. If the directory continues to not exist/not be
359 a directory/etc, then having them in the path should be
360 harmless. */
361 if (stat (name, &st) < 0)
362 {
363 int save_errno = errno;
364 fprintf_unfiltered (gdb_stderr, "Warning: ");
365 print_sys_errmsg (name, save_errno);
366 }
367 else if ((st.st_mode & S_IFMT) != S_IFDIR)
368 warning ("%s is not a directory.", name);
369 }
370
371 append:
372 {
373 register unsigned int len = strlen (name);
374
375 p = *which_path;
376 while (1)
377 {
378 if (!strncmp (p, name, len)
379 && (p[len] == '\0' || p[len] == DIRNAME_SEPARATOR))
380 {
381 /* Found it in the search path, remove old copy */
382 if (p > *which_path)
383 p--; /* Back over leading separator */
384 if (prefix > p - *which_path)
385 goto skip_dup; /* Same dir twice in one cmd */
386 strcpy (p, &p[len+1]); /* Copy from next \0 or : */
387 }
388 p = strchr (p, DIRNAME_SEPARATOR);
389 if (p != 0)
390 ++p;
391 else
392 break;
393 }
394 if (p == 0)
395 {
396 char tinybuf[2];
397
398 tinybuf[0] = DIRNAME_SEPARATOR;
399 tinybuf[1] = '\0';
400
401 /* 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. */
402 if (prefix)
403 {
404 char *temp, c;
405
406 c = old[prefix];
407 old[prefix] = '\0';
408 temp = concat (old, tinybuf, name, NULL);
409 old[prefix] = c;
410 *which_path = concat (temp, "", &old[prefix], NULL);
411 prefix = strlen (temp);
412 free (temp);
413 }
414 else
415 {
416 *which_path = concat (name, (old[0] ? tinybuf : old), old, NULL);
417 prefix = strlen (name);
418 }
419 free (old);
420 old = *which_path;
421 }
422 }
423 skip_dup: ;
424 } while (*dirname != '\0');
425 }
426
427
428 static void
429 source_info (ignore, from_tty)
430 char *ignore;
431 int from_tty;
432 {
433 register struct symtab *s = current_source_symtab;
434
435 if (!s)
436 {
437 printf_filtered("No current source file.\n");
438 return;
439 }
440 printf_filtered ("Current source file is %s\n", s->filename);
441 if (s->dirname)
442 printf_filtered ("Compilation directory is %s\n", s->dirname);
443 if (s->fullname)
444 printf_filtered ("Located in %s\n", s->fullname);
445 if (s->nlines)
446 printf_filtered ("Contains %d line%s.\n", s->nlines,
447 s->nlines == 1 ? "" : "s");
448
449 printf_filtered("Source language is %s.\n", language_str (s->language));
450 }
451
452
453 \f
454 /* Open a file named STRING, searching path PATH (dir names sep by some char)
455 using mode MODE and protection bits PROT in the calls to open.
456
457 If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
458 (ie pretend the first element of PATH is "."). This also indicates
459 that a slash in STRING disables searching of the path (this is
460 so that "exec-file ./foo" or "symbol-file ./foo" insures that you
461 get that particular version of foo or an error message).
462
463 If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
464 the actual file opened (this string will always start with a "/". We
465 have to take special pains to avoid doubling the "/" between the directory
466 and the file, sigh! Emacs gets confuzzed by this when we print the
467 source file name!!!
468
469 If a file is found, return the descriptor.
470 Otherwise, return -1, with errno set for the last name we tried to open. */
471
472 /* >>>> This should only allow files of certain types,
473 >>>> eg executable, non-directory */
474 int
475 openp (path, try_cwd_first, string, mode, prot, filename_opened)
476 char *path;
477 int try_cwd_first;
478 char *string;
479 int mode;
480 int prot;
481 char **filename_opened;
482 {
483 register int fd;
484 register char *filename;
485 register char *p, *p1;
486 register int len;
487 int alloclen;
488
489 if (!path)
490 path = ".";
491
492 if (try_cwd_first || string[0] == '/')
493 {
494 filename = string;
495 fd = open (filename, mode, prot);
496 if (fd >= 0 || string[0] == '/' || strchr (string, '/'))
497 goto done;
498 }
499
500 /* ./foo => foo */
501 while (string[0] == '.' && string[1] == '/')
502 string += 2;
503
504 alloclen = strlen (path) + strlen (string) + 2;
505 filename = (char *) alloca (alloclen);
506 fd = -1;
507 for (p = path; p; p = p1 ? p1 + 1 : 0)
508 {
509 p1 = (char *) strchr (p, DIRNAME_SEPARATOR);
510 if (p1)
511 len = p1 - p;
512 else
513 len = strlen (p);
514
515 if (len == 4 && p[0] == '$' && p[1] == 'c'
516 && p[2] == 'w' && p[3] == 'd') {
517 /* Name is $cwd -- insert current directory name instead. */
518 int newlen;
519
520 /* First, realloc the filename buffer if too short. */
521 len = strlen (current_directory);
522 newlen = len + strlen (string) + 2;
523 if (newlen > alloclen) {
524 alloclen = newlen;
525 filename = (char *) alloca (alloclen);
526 }
527 strcpy (filename, current_directory);
528 } else {
529 /* Normal file name in path -- just use it. */
530 strncpy (filename, p, len);
531 filename[len] = 0;
532 }
533
534 /* Remove trailing slashes */
535 while (len > 0 && filename[len-1] == '/')
536 filename[--len] = 0;
537
538 strcat (filename+len, "/");
539 strcat (filename, string);
540
541 fd = open (filename, mode);
542 if (fd >= 0) break;
543 }
544
545 done:
546 if (filename_opened)
547 {
548 if (fd < 0)
549 *filename_opened = (char *) 0;
550 else if (filename[0] == '/')
551 *filename_opened = savestring (filename, strlen (filename));
552 else
553 {
554 /* Beware the // my son, the Emacs barfs, the botch that catch... */
555
556 *filename_opened = concat (current_directory,
557 '/' == current_directory[strlen(current_directory)-1]? "": "/",
558 filename, NULL);
559 }
560 }
561 /* start-sanitize-mpw */
562 #ifdef MPW
563 if (1) {
564 printf("openp on %s, path %s mode %d prot %d\n returned %d",
565 string, path, mode, prot, fd);
566 if (*filename_opened)
567 printf(" (filename is %s)", *filename_opened);
568 printf("\n");
569 }
570 #endif
571 /* end-sanitize-mpw */
572
573 return fd;
574 }
575
576 /* Open a source file given a symtab S. Returns a file descriptor or
577 negative number for error. */
578
579 static int
580 open_source_file (s)
581 struct symtab *s;
582 {
583 char *path = source_path;
584 char *p;
585 int result;
586 char *fullname;
587
588 /* Quick way out if we already know its full name */
589 if (s->fullname)
590 {
591 result = open (s->fullname, O_RDONLY);
592 if (result >= 0)
593 return result;
594 /* Didn't work -- free old one, try again. */
595 mfree (s->objfile->md, s->fullname);
596 s->fullname = NULL;
597 }
598
599 if (s->dirname != NULL)
600 {
601 /* Replace a path entry of $cdir with the compilation directory name */
602 #define cdir_len 5
603 /* We cast strstr's result in case an ANSIhole has made it const,
604 which produces a "required warning" when assigned to a nonconst. */
605 p = (char *)strstr (source_path, "$cdir");
606 if (p && (p == path || p[-1] == DIRNAME_SEPARATOR)
607 && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0'))
608 {
609 int len;
610
611 path = (char *)
612 alloca (strlen (source_path) + 1 + strlen (s->dirname) + 1);
613 len = p - source_path;
614 strncpy (path, source_path, len); /* Before $cdir */
615 strcpy (path + len, s->dirname); /* new stuff */
616 strcat (path + len, source_path + len + cdir_len); /* After $cdir */
617 }
618 }
619
620 result = openp (path, 0, s->filename, O_RDONLY, 0, &s->fullname);
621 if (result < 0)
622 {
623 /* Didn't work. Try using just the basename. */
624 p = basename (s->filename);
625 if (p != s->filename)
626 result = openp (path, 0, p, O_RDONLY, 0, &s->fullname);
627 }
628 /* start-sanitize-mpw */
629 #ifdef MPW
630 if (result < 0)
631 {
632 /* Didn't work. Try using just the MPW basename. */
633 p = (char *) mpw_basename (s->filename);
634 if (p != s->filename)
635 result = openp (path, 0, p, O_RDONLY, 0, &s->fullname);
636 }
637 if (result < 0)
638 {
639 /* Didn't work. Try using the mixed Unix/MPW basename. */
640 p = (char *) mpw_mixed_basename (s->filename);
641 if (p != s->filename)
642 result = openp (path, 0, p, O_RDONLY, 0, &s->fullname);
643 }
644 #endif
645 /* end-sanitize-mpw */
646 if (result >= 0)
647 {
648 fullname = s->fullname;
649 s->fullname = mstrsave (s->objfile->md, s->fullname);
650 free (fullname);
651 }
652 return result;
653 }
654
655 /* Return the path to the source file associated with symtab. Returns NULL
656 if no symtab. */
657
658 char *
659 symtab_to_filename (s)
660 struct symtab *s;
661 {
662 int fd;
663
664 if (!s)
665 return NULL;
666
667 /* If we've seen the file before, just return fullname. */
668
669 if (s->fullname)
670 return s->fullname;
671
672 /* Try opening the file to setup fullname */
673
674 fd = open_source_file (s);
675 if (fd < 0)
676 return s->filename; /* File not found. Just use short name */
677
678 /* Found the file. Cleanup and return the full name */
679
680 close (fd);
681 return s->fullname;
682 }
683
684 \f
685 /* Create and initialize the table S->line_charpos that records
686 the positions of the lines in the source file, which is assumed
687 to be open on descriptor DESC.
688 All set S->nlines to the number of such lines. */
689
690 static void
691 find_source_lines (s, desc)
692 struct symtab *s;
693 int desc;
694 {
695 struct stat st;
696 register char *data, *p, *end;
697 int nlines = 0;
698 int lines_allocated = 1000;
699 int *line_charpos;
700 long exec_mtime;
701 int size;
702
703 line_charpos = (int *) xmmalloc (s -> objfile -> md,
704 lines_allocated * sizeof (int));
705 if (fstat (desc, &st) < 0)
706 perror_with_name (s->filename);
707
708 if (exec_bfd)
709 {
710 exec_mtime = bfd_get_mtime(exec_bfd);
711 if (exec_mtime && exec_mtime < st.st_mtime)
712 printf_filtered ("Source file is more recent than executable.\n");
713 }
714
715 #ifdef LSEEK_NOT_LINEAR
716 {
717 char c;
718
719 /* Have to read it byte by byte to find out where the chars live */
720
721 line_charpos[0] = tell(desc);
722 nlines = 1;
723 while (myread(desc, &c, 1)>0)
724 {
725 if (c == '\n')
726 {
727 if (nlines == lines_allocated)
728 {
729 lines_allocated *= 2;
730 line_charpos =
731 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
732 sizeof (int) * lines_allocated);
733 }
734 line_charpos[nlines++] = tell(desc);
735 }
736 }
737 }
738 #else /* lseek linear. */
739 {
740 struct cleanup *old_cleanups;
741
742 /* st_size might be a large type, but we only support source files whose
743 size fits in an int. */
744 size = (int) st.st_size;
745
746 /* Use malloc, not alloca, because this may be pretty large, and we may
747 run into various kinds of limits on stack size. */
748 data = (char *) xmalloc (size);
749 old_cleanups = make_cleanup (free, data);
750
751 if (myread (desc, data, size) < 0)
752 perror_with_name (s->filename);
753 end = data + size;
754 p = data;
755 line_charpos[0] = 0;
756 nlines = 1;
757 while (p != end)
758 {
759 if (*p++ == '\n'
760 /* A newline at the end does not start a new line. */
761 && p != end)
762 {
763 if (nlines == lines_allocated)
764 {
765 lines_allocated *= 2;
766 line_charpos =
767 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
768 sizeof (int) * lines_allocated);
769 }
770 line_charpos[nlines++] = p - data;
771 }
772 }
773 do_cleanups (old_cleanups);
774 }
775 #endif /* lseek linear. */
776 s->nlines = nlines;
777 s->line_charpos =
778 (int *) xmrealloc (s -> objfile -> md, (char *) line_charpos,
779 nlines * sizeof (int));
780
781 }
782
783 /* Return the character position of a line LINE in symtab S.
784 Return 0 if anything is invalid. */
785
786 #if 0 /* Currently unused */
787
788 int
789 source_line_charpos (s, line)
790 struct symtab *s;
791 int line;
792 {
793 if (!s) return 0;
794 if (!s->line_charpos || line <= 0) return 0;
795 if (line > s->nlines)
796 line = s->nlines;
797 return s->line_charpos[line - 1];
798 }
799
800 /* Return the line number of character position POS in symtab S. */
801
802 int
803 source_charpos_line (s, chr)
804 register struct symtab *s;
805 register int chr;
806 {
807 register int line = 0;
808 register int *lnp;
809
810 if (s == 0 || s->line_charpos == 0) return 0;
811 lnp = s->line_charpos;
812 /* Files are usually short, so sequential search is Ok */
813 while (line < s->nlines && *lnp <= chr)
814 {
815 line++;
816 lnp++;
817 }
818 if (line >= s->nlines)
819 line = s->nlines;
820 return line;
821 }
822
823 #endif /* 0 */
824
825 \f
826 /* Get full pathname and line number positions for a symtab.
827 Return nonzero if line numbers may have changed.
828 Set *FULLNAME to actual name of the file as found by `openp',
829 or to 0 if the file is not found. */
830
831 static int
832 get_filename_and_charpos (s, fullname)
833 struct symtab *s;
834 char **fullname;
835 {
836 register int desc, linenums_changed = 0;
837
838 desc = open_source_file (s);
839 if (desc < 0)
840 {
841 if (fullname)
842 *fullname = NULL;
843 return 0;
844 }
845 if (fullname)
846 *fullname = s->fullname;
847 if (s->line_charpos == 0) linenums_changed = 1;
848 if (linenums_changed) find_source_lines (s, desc);
849 close (desc);
850 return linenums_changed;
851 }
852
853 /* Print text describing the full name of the source file S
854 and the line number LINE and its corresponding character position.
855 The text starts with two Ctrl-z so that the Emacs-GDB interface
856 can easily find it.
857
858 MID_STATEMENT is nonzero if the PC is not at the beginning of that line.
859
860 Return 1 if successful, 0 if could not find the file. */
861
862 int
863 identify_source_line (s, line, mid_statement, pc)
864 struct symtab *s;
865 int line;
866 int mid_statement;
867 CORE_ADDR pc;
868 {
869 if (s->line_charpos == 0)
870 get_filename_and_charpos (s, (char **)NULL);
871 if (s->fullname == 0)
872 return 0;
873 if (line > s->nlines)
874 /* Don't index off the end of the line_charpos array. */
875 return 0;
876 annotate_source (s->fullname, line, s->line_charpos[line - 1],
877 mid_statement, pc);
878
879 current_source_line = line;
880 first_line_listed = line;
881 last_line_listed = line;
882 current_source_symtab = s;
883 return 1;
884 }
885 \f
886 /* Print source lines from the file of symtab S,
887 starting with line number LINE and stopping before line number STOPLINE. */
888
889 void
890 print_source_lines (s, line, stopline, noerror)
891 struct symtab *s;
892 int line, stopline;
893 int noerror;
894 {
895 register int c;
896 register int desc;
897 register FILE *stream;
898 int nlines = stopline - line;
899
900 /* Regardless of whether we can open the file, set current_source_symtab. */
901 current_source_symtab = s;
902 current_source_line = line;
903 first_line_listed = line;
904
905 desc = open_source_file (s);
906 if (desc < 0)
907 {
908 if (! noerror) {
909 char *name = alloca (strlen (s->filename) + 100);
910 sprintf (name, "%s:%d", s->filename, line);
911 print_sys_errmsg (name, errno);
912 }
913 return;
914 }
915
916 if (s->line_charpos == 0)
917 find_source_lines (s, desc);
918
919 if (line < 1 || line > s->nlines)
920 {
921 close (desc);
922 error ("Line number %d out of range; %s has %d lines.",
923 line, s->filename, s->nlines);
924 }
925
926 if (lseek (desc, s->line_charpos[line - 1], 0) < 0)
927 {
928 close (desc);
929 perror_with_name (s->filename);
930 }
931
932 stream = fdopen (desc, FOPEN_RT);
933 clearerr (stream);
934
935 while (nlines-- > 0)
936 {
937 c = fgetc (stream);
938 if (c == EOF) break;
939 last_line_listed = current_source_line;
940 printf_filtered ("%d\t", current_source_line++);
941 do
942 {
943 if (c < 040 && c != '\t' && c != '\n' && c != '\r')
944 printf_filtered ("^%c", c + 0100);
945 else if (c == 0177)
946 printf_filtered ("^?");
947 else
948 printf_filtered ("%c", c);
949 } while (c != '\n' && (c = fgetc (stream)) >= 0);
950 }
951
952 fclose (stream);
953 }
954 \f
955
956
957 /* Print a list of files and line numbers which a user may choose from
958 in order to list a function which was specified ambiguously (as with
959 `list classname::overloadedfuncname', for example). The vector in
960 SALS provides the filenames and line numbers. */
961
962 static void
963 ambiguous_line_spec (sals)
964 struct symtabs_and_lines *sals;
965 {
966 int i;
967
968 for (i = 0; i < sals->nelts; ++i)
969 printf_filtered("file: \"%s\", line number: %d\n",
970 sals->sals[i].symtab->filename, sals->sals[i].line);
971 }
972
973 static void
974 list_command (arg, from_tty)
975 char *arg;
976 int from_tty;
977 {
978 struct symtabs_and_lines sals, sals_end;
979 struct symtab_and_line sal, sal_end;
980 struct symbol *sym;
981 char *arg1;
982 int no_end = 1;
983 int dummy_end = 0;
984 int dummy_beg = 0;
985 int linenum_beg = 0;
986 char *p;
987
988 if (!have_full_symbols () && !have_partial_symbols())
989 error ("No symbol table is loaded. Use the \"file\" command.");
990
991 /* Pull in a current source symtab if necessary */
992 if (current_source_symtab == 0 &&
993 (arg == 0 || arg[0] == '+' || arg[0] == '-'))
994 select_source_symtab (0);
995
996 /* "l" or "l +" lists next ten lines. */
997
998 if (arg == 0 || STREQ (arg, "+"))
999 {
1000 if (current_source_symtab == 0)
1001 error ("No default source file yet. Do \"help list\".");
1002 print_source_lines (current_source_symtab, current_source_line,
1003 current_source_line + lines_to_list, 0);
1004 return;
1005 }
1006
1007 /* "l -" lists previous ten lines, the ones before the ten just listed. */
1008 if (STREQ (arg, "-"))
1009 {
1010 if (current_source_symtab == 0)
1011 error ("No default source file yet. Do \"help list\".");
1012 print_source_lines (current_source_symtab,
1013 max (first_line_listed - lines_to_list, 1),
1014 first_line_listed, 0);
1015 return;
1016 }
1017
1018 /* Now if there is only one argument, decode it in SAL
1019 and set NO_END.
1020 If there are two arguments, decode them in SAL and SAL_END
1021 and clear NO_END; however, if one of the arguments is blank,
1022 set DUMMY_BEG or DUMMY_END to record that fact. */
1023
1024 arg1 = arg;
1025 if (*arg1 == ',')
1026 dummy_beg = 1;
1027 else
1028 {
1029 sals = decode_line_1 (&arg1, 0, 0, 0, 0);
1030
1031 if (! sals.nelts) return; /* C++ */
1032 if (sals.nelts > 1)
1033 {
1034 ambiguous_line_spec (&sals);
1035 free (sals.sals);
1036 return;
1037 }
1038
1039 sal = sals.sals[0];
1040 free (sals.sals);
1041 }
1042
1043 /* Record whether the BEG arg is all digits. */
1044
1045 for (p = arg; p != arg1 && *p >= '0' && *p <= '9'; p++);
1046 linenum_beg = (p == arg1);
1047
1048 while (*arg1 == ' ' || *arg1 == '\t')
1049 arg1++;
1050 if (*arg1 == ',')
1051 {
1052 no_end = 0;
1053 arg1++;
1054 while (*arg1 == ' ' || *arg1 == '\t')
1055 arg1++;
1056 if (*arg1 == 0)
1057 dummy_end = 1;
1058 else
1059 {
1060 if (dummy_beg)
1061 sals_end = decode_line_1 (&arg1, 0, 0, 0, 0);
1062 else
1063 sals_end = decode_line_1 (&arg1, 0, sal.symtab, sal.line, 0);
1064 if (sals_end.nelts == 0)
1065 return;
1066 if (sals_end.nelts > 1)
1067 {
1068 ambiguous_line_spec (&sals_end);
1069 free (sals_end.sals);
1070 return;
1071 }
1072 sal_end = sals_end.sals[0];
1073 free (sals_end.sals);
1074 }
1075 }
1076
1077 if (*arg1)
1078 error ("Junk at end of line specification.");
1079
1080 if (!no_end && !dummy_beg && !dummy_end
1081 && sal.symtab != sal_end.symtab)
1082 error ("Specified start and end are in different files.");
1083 if (dummy_beg && dummy_end)
1084 error ("Two empty args do not say what lines to list.");
1085
1086 /* if line was specified by address,
1087 first print exactly which line, and which file.
1088 In this case, sal.symtab == 0 means address is outside
1089 of all known source files, not that user failed to give a filename. */
1090 if (*arg == '*')
1091 {
1092 if (sal.symtab == 0)
1093 /* FIXME-32x64--assumes sal.pc fits in long. */
1094 error ("No source file for address %s.",
1095 local_hex_string((unsigned long) sal.pc));
1096 sym = find_pc_function (sal.pc);
1097 if (sym)
1098 {
1099 print_address_numeric (sal.pc, 1, gdb_stdout);
1100 printf_filtered (" is in ");
1101 fputs_filtered (SYMBOL_SOURCE_NAME (sym), gdb_stdout);
1102 printf_filtered (" (%s:%d).\n", sal.symtab->filename, sal.line);
1103 }
1104 else
1105 {
1106 print_address_numeric (sal.pc, 1, gdb_stdout);
1107 printf_filtered (" is at %s:%d.\n",
1108 sal.symtab->filename, sal.line);
1109 }
1110 }
1111
1112 /* If line was not specified by just a line number,
1113 and it does not imply a symtab, it must be an undebuggable symbol
1114 which means no source code. */
1115
1116 if (! linenum_beg && sal.symtab == 0)
1117 error ("No line number known for %s.", arg);
1118
1119 /* If this command is repeated with RET,
1120 turn it into the no-arg variant. */
1121
1122 if (from_tty)
1123 *arg = 0;
1124
1125 if (dummy_beg && sal_end.symtab == 0)
1126 error ("No default source file yet. Do \"help list\".");
1127 if (dummy_beg)
1128 print_source_lines (sal_end.symtab,
1129 max (sal_end.line - (lines_to_list - 1), 1),
1130 sal_end.line + 1, 0);
1131 else if (sal.symtab == 0)
1132 error ("No default source file yet. Do \"help list\".");
1133 else if (no_end)
1134 print_source_lines (sal.symtab,
1135 max (sal.line - (lines_to_list / 2), 1),
1136 sal.line + (lines_to_list / 2), 0);
1137 else
1138 print_source_lines (sal.symtab, sal.line,
1139 (dummy_end
1140 ? sal.line + lines_to_list
1141 : sal_end.line + 1),
1142 0);
1143 }
1144 \f
1145 /* Print info on range of pc's in a specified line. */
1146
1147 static void
1148 line_info (arg, from_tty)
1149 char *arg;
1150 int from_tty;
1151 {
1152 struct symtabs_and_lines sals;
1153 struct symtab_and_line sal;
1154 CORE_ADDR start_pc, end_pc;
1155 int i;
1156
1157 if (arg == 0)
1158 {
1159 sal.symtab = current_source_symtab;
1160 sal.line = last_line_listed;
1161 sals.nelts = 1;
1162 sals.sals = (struct symtab_and_line *)
1163 xmalloc (sizeof (struct symtab_and_line));
1164 sals.sals[0] = sal;
1165 }
1166 else
1167 {
1168 sals = decode_line_spec_1 (arg, 0);
1169
1170 dont_repeat ();
1171 }
1172
1173 /* C++ More than one line may have been specified, as when the user
1174 specifies an overloaded function name. Print info on them all. */
1175 for (i = 0; i < sals.nelts; i++)
1176 {
1177 sal = sals.sals[i];
1178
1179 if (sal.symtab == 0)
1180 {
1181 printf_filtered ("No line number information available");
1182 if (sal.pc != 0)
1183 {
1184 /* This is useful for "info line *0x7f34". If we can't tell the
1185 user about a source line, at least let them have the symbolic
1186 address. */
1187 printf_filtered (" for address ");
1188 wrap_here (" ");
1189 print_address (sal.pc, gdb_stdout);
1190 }
1191 else
1192 printf_filtered (".");
1193 printf_filtered ("\n");
1194 }
1195 else if (sal.line > 0
1196 && find_line_pc_range (sal, &start_pc, &end_pc))
1197 {
1198 if (start_pc == end_pc)
1199 {
1200 printf_filtered ("Line %d of \"%s\"",
1201 sal.line, sal.symtab->filename);
1202 wrap_here (" ");
1203 printf_filtered (" is at address ");
1204 print_address (start_pc, gdb_stdout);
1205 wrap_here (" ");
1206 printf_filtered (" but contains no code.\n");
1207 }
1208 else
1209 {
1210 printf_filtered ("Line %d of \"%s\"",
1211 sal.line, sal.symtab->filename);
1212 wrap_here (" ");
1213 printf_filtered (" starts at address ");
1214 print_address (start_pc, gdb_stdout);
1215 wrap_here (" ");
1216 printf_filtered (" and ends at ");
1217 print_address (end_pc, gdb_stdout);
1218 printf_filtered (".\n");
1219 }
1220
1221 /* x/i should display this line's code. */
1222 set_next_address (start_pc);
1223
1224 /* Repeating "info line" should do the following line. */
1225 last_line_listed = sal.line + 1;
1226
1227 /* If this is the only line, show the source code. If it could
1228 not find the file, don't do anything special. */
1229 if (annotation_level && sals.nelts == 1)
1230 identify_source_line (sal.symtab, sal.line, 0, start_pc);
1231 }
1232 else
1233 /* Is there any case in which we get here, and have an address
1234 which the user would want to see? If we have debugging symbols
1235 and no line numbers? */
1236 printf_filtered ("Line number %d is out of range for \"%s\".\n",
1237 sal.line, sal.symtab->filename);
1238 }
1239 free (sals.sals);
1240 }
1241 \f
1242 /* Commands to search the source file for a regexp. */
1243
1244 /* ARGSUSED */
1245 static void
1246 forward_search_command (regex, from_tty)
1247 char *regex;
1248 int from_tty;
1249 {
1250 register int c;
1251 register int desc;
1252 register FILE *stream;
1253 int line = last_line_listed + 1;
1254 char *msg;
1255
1256 msg = (char *) re_comp (regex);
1257 if (msg)
1258 error (msg);
1259
1260 if (current_source_symtab == 0)
1261 select_source_symtab (0);
1262
1263 /* Search from last_line_listed+1 in current_source_symtab */
1264
1265 desc = open_source_file (current_source_symtab);
1266 if (desc < 0)
1267 perror_with_name (current_source_symtab->filename);
1268
1269 if (current_source_symtab->line_charpos == 0)
1270 find_source_lines (current_source_symtab, desc);
1271
1272 if (line < 1 || line > current_source_symtab->nlines)
1273 {
1274 close (desc);
1275 error ("Expression not found");
1276 }
1277
1278 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1279 {
1280 close (desc);
1281 perror_with_name (current_source_symtab->filename);
1282 }
1283
1284 stream = fdopen (desc, FOPEN_RT);
1285 clearerr (stream);
1286 while (1) {
1287 static char *buf = NULL;
1288 register char *p;
1289 int cursize, newsize;
1290
1291 cursize = 256;
1292 buf = xmalloc (cursize);
1293 p = buf;
1294
1295 c = getc (stream);
1296 if (c == EOF)
1297 break;
1298 do {
1299 *p++ = c;
1300 if (p - buf == cursize)
1301 {
1302 newsize = cursize + cursize / 2;
1303 buf = xrealloc (buf, newsize);
1304 p = buf + cursize;
1305 cursize = newsize;
1306 }
1307 } while (c != '\n' && (c = getc (stream)) >= 0);
1308
1309 /* we now have a source line in buf, null terminate and match */
1310 *p = 0;
1311 if (re_exec (buf) > 0)
1312 {
1313 /* Match! */
1314 fclose (stream);
1315 print_source_lines (current_source_symtab, line, line+1, 0);
1316 current_source_line = max (line - lines_to_list / 2, 1);
1317 return;
1318 }
1319 line++;
1320 }
1321
1322 printf_filtered ("Expression not found\n");
1323 fclose (stream);
1324 }
1325
1326 /* ARGSUSED */
1327 static void
1328 reverse_search_command (regex, from_tty)
1329 char *regex;
1330 int from_tty;
1331 {
1332 register int c;
1333 register int desc;
1334 register FILE *stream;
1335 int line = last_line_listed - 1;
1336 char *msg;
1337
1338 msg = (char *) re_comp (regex);
1339 if (msg)
1340 error (msg);
1341
1342 if (current_source_symtab == 0)
1343 select_source_symtab (0);
1344
1345 /* Search from last_line_listed-1 in current_source_symtab */
1346
1347 desc = open_source_file (current_source_symtab);
1348 if (desc < 0)
1349 perror_with_name (current_source_symtab->filename);
1350
1351 if (current_source_symtab->line_charpos == 0)
1352 find_source_lines (current_source_symtab, desc);
1353
1354 if (line < 1 || line > current_source_symtab->nlines)
1355 {
1356 close (desc);
1357 error ("Expression not found");
1358 }
1359
1360 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0)
1361 {
1362 close (desc);
1363 perror_with_name (current_source_symtab->filename);
1364 }
1365
1366 stream = fdopen (desc, FOPEN_RT);
1367 clearerr (stream);
1368 while (line > 1)
1369 {
1370 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */
1371 char buf[4096]; /* Should be reasonable??? */
1372 register char *p = buf;
1373
1374 c = getc (stream);
1375 if (c == EOF)
1376 break;
1377 do {
1378 *p++ = c;
1379 } while (c != '\n' && (c = getc (stream)) >= 0);
1380
1381 /* We now have a source line in buf; null terminate and match. */
1382 *p = 0;
1383 if (re_exec (buf) > 0)
1384 {
1385 /* Match! */
1386 fclose (stream);
1387 print_source_lines (current_source_symtab,
1388 line, line+1, 0);
1389 current_source_line = max (line - lines_to_list / 2, 1);
1390 return;
1391 }
1392 line--;
1393 if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0)
1394 {
1395 fclose (stream);
1396 perror_with_name (current_source_symtab->filename);
1397 }
1398 }
1399
1400 printf_filtered ("Expression not found\n");
1401 fclose (stream);
1402 return;
1403 }
1404 \f
1405 void
1406 _initialize_source ()
1407 {
1408 struct cmd_list_element *c;
1409 current_source_symtab = 0;
1410 init_source_path ();
1411
1412 /* The intention is to use POSIX Basic Regular Expressions.
1413 Always use the GNU regex routine for consistency across all hosts.
1414 Our current GNU regex.c does not have all the POSIX features, so this is
1415 just an approximation. */
1416 re_set_syntax (RE_SYNTAX_GREP);
1417
1418 c = add_cmd ("directory", class_files, directory_command,
1419 "Add directory DIR to beginning of search path for source files.\n\
1420 Forget cached info on source file locations and line positions.\n\
1421 DIR can also be $cwd for the current working directory, or $cdir for the\n\
1422 directory in which the source file was compiled into object code.\n\
1423 With no argument, reset the search path to $cdir:$cwd, the default.",
1424 &cmdlist);
1425 c->completer = filename_completer;
1426
1427 add_cmd ("directories", no_class, show_directories,
1428 "Current search path for finding source files.\n\
1429 $cwd in the path means the current working directory.\n\
1430 $cdir in the path means the compilation directory of the source file.",
1431 &showlist);
1432
1433 add_info ("source", source_info,
1434 "Information about the current source file.");
1435
1436 /* start-sanitize-mpw */
1437 #ifndef MPW_C
1438 /* end-sanitize-mpw */
1439 add_info ("line", line_info,
1440 "Core addresses of the code for a source line.\n\
1441 Line can be specified as\n\
1442 LINENUM, to list around that line in current file,\n\
1443 FILE:LINENUM, to list around that line in that file,\n\
1444 FUNCTION, to list around beginning of that function,\n\
1445 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1446 Default is to describe the last source line that was listed.\n\n\
1447 This sets the default address for \"x\" to the line's first instruction\n\
1448 so that \"x/i\" suffices to start examining the machine code.\n\
1449 The address is also stored as the value of \"$_\".");
1450 /* start-sanitize-mpw */
1451 #else
1452 add_info ("line", line_info,
1453 "Core addresses of the code for a source line. \n\
1454 Line can be specified as \n\
1455 LINENUM, to list around that line in current file, \n\
1456 FILE:LINENUM, to list around that line in that file, \n\
1457 Default is to describe the last source line that was listed. \n\n\
1458 The address is also stored as the value of \"$_\". ");
1459 #endif
1460 /* end-sanitize-mpw */
1461
1462 add_com ("forward-search", class_files, forward_search_command,
1463 "Search for regular expression (see regex(3)) from last line listed.");
1464 add_com_alias ("search", "forward-search", class_files, 0);
1465
1466 add_com ("reverse-search", class_files, reverse_search_command,
1467 "Search backward for regular expression (see regex(3)) from last line listed.");
1468
1469 /* start-sanitize-mpw */
1470 #ifndef MPW_C
1471 /* end-sanitize-mpw */
1472 add_com ("list", class_files, list_command,
1473 "List specified function or line.\n\
1474 With no argument, lists ten more lines after or around previous listing.\n\
1475 \"list -\" lists the ten lines before a previous ten-line listing.\n\
1476 One argument specifies a line, and ten lines are listed around that line.\n\
1477 Two arguments with comma between specify starting and ending lines to list.\n\
1478 Lines can be specified in these ways:\n\
1479 LINENUM, to list around that line in current file,\n\
1480 FILE:LINENUM, to list around that line in that file,\n\
1481 FUNCTION, to list around beginning of that function,\n\
1482 FILE:FUNCTION, to distinguish among like-named static functions.\n\
1483 *ADDRESS, to list around the line containing that address.\n\
1484 With two args if one is empty it stands for ten lines away from the other arg.");
1485 /* start-sanitize-mpw */
1486 #else /* MPW_C */
1487 add_com ("list", class_files, list_command,
1488 "List specified function or line.\n\
1489 With no argument, lists ten more lines after or around previous listing. \n\
1490 One argument specifies a line, and ten lines are listed around that line. \n\
1491 Two arguments with comma between specify starting and ending lines to list. \n\
1492 Lines can be specified in these ways:\n\
1493 With two args if one is empty it stands for ten lines away from the other arg. ");
1494 #endif /* MPW_C */
1495 /* end-sanitize-mpw */
1496 add_com_alias ("l", "list", class_files, 1);
1497
1498 add_show_from_set
1499 (add_set_cmd ("listsize", class_support, var_uinteger,
1500 (char *)&lines_to_list,
1501 "Set number of source lines gdb will list by default.",
1502 &setlist),
1503 &showlist);
1504 }
This page took 0.061525 seconds and 4 git commands to generate.