1 /* List lines of source files for GDB, the GNU debugger. 2 Copyright (C) 1986-2014 Free Software Foundation, Inc. 3 4 This file is part of GDB. 5 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 3 of the License, or 9 (at your option) any later version. 10 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. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18 19 #include "defs.h" 20 #include "arch-utils.h" 21 #include "symtab.h" 22 #include "expression.h" 23 #include "language.h" 24 #include "command.h" 25 #include "source.h" 26 #include "gdbcmd.h" 27 #include "frame.h" 28 #include "value.h" 29 #include "gdb_assert.h" 30 #include "filestuff.h" 31 32 #include <sys/types.h> 33 #include <string.h> 34 #include <sys/stat.h> 35 #include <fcntl.h> 36 #include "gdbcore.h" 37 #include "gdb_regex.h" 38 #include "symfile.h" 39 #include "objfiles.h" 40 #include "annotate.h" 41 #include "gdbtypes.h" 42 #include "linespec.h" 43 #include "filenames.h" /* for DOSish file names */ 44 #include "completer.h" 45 #include "ui-out.h" 46 #include "readline/readline.h" 47 48 #define OPEN_MODE (O_RDONLY | O_BINARY) 49 #define FDOPEN_MODE FOPEN_RB 50 51 /* Prototypes for exported functions. */ 52 53 void _initialize_source (void); 54 55 /* Prototypes for local functions. */ 56 57 static int get_filename_and_charpos (struct symtab *, char **); 58 59 static void reverse_search_command (char *, int); 60 61 static void forward_search_command (char *, int); 62 63 static void line_info (char *, int); 64 65 static void source_info (char *, int); 66 67 /* Path of directories to search for source files. 68 Same format as the PATH environment variable's value. */ 69 70 char *source_path; 71 72 /* Support for source path substitution commands. */ 73 74 struct substitute_path_rule 75 { 76 char *from; 77 char *to; 78 struct substitute_path_rule *next; 79 }; 80 81 static struct substitute_path_rule *substitute_path_rules = NULL; 82 83 /* Symtab of default file for listing lines of. */ 84 85 static struct symtab *current_source_symtab; 86 87 /* Default next line to list. */ 88 89 static int current_source_line; 90 91 static struct program_space *current_source_pspace; 92 93 /* Default number of lines to print with commands like "list". 94 This is based on guessing how many long (i.e. more than chars_per_line 95 characters) lines there will be. To be completely correct, "list" 96 and friends should be rewritten to count characters and see where 97 things are wrapping, but that would be a fair amount of work. */ 98 99 int lines_to_list = 10; 100 static void 101 show_lines_to_list (struct ui_file *file, int from_tty, 102 struct cmd_list_element *c, const char *value) 103 { 104 fprintf_filtered (file, 105 _("Number of source lines gdb " 106 "will list by default is %s.\n"), 107 value); 108 } 109 110 /* Possible values of 'set filename-display'. */ 111 static const char filename_display_basename[] = "basename"; 112 static const char filename_display_relative[] = "relative"; 113 static const char filename_display_absolute[] = "absolute"; 114 115 static const char *const filename_display_kind_names[] = { 116 filename_display_basename, 117 filename_display_relative, 118 filename_display_absolute, 119 NULL 120 }; 121 122 static const char *filename_display_string = filename_display_relative; 123 124 static void 125 show_filename_display_string (struct ui_file *file, int from_tty, 126 struct cmd_list_element *c, const char *value) 127 { 128 fprintf_filtered (file, _("Filenames are displayed as \"%s\".\n"), value); 129 } 130 131 /* Line number of last line printed. Default for various commands. 132 current_source_line is usually, but not always, the same as this. */ 133 134 static int last_line_listed; 135 136 /* First line number listed by last listing command. */ 137 138 static int first_line_listed; 139 140 /* Saves the name of the last source file visited and a possible error code. 141 Used to prevent repeating annoying "No such file or directories" msgs. */ 142 143 static struct symtab *last_source_visited = NULL; 144 static int last_source_error = 0; 145 146 /* Return the first line listed by print_source_lines. 147 Used by command interpreters to request listing from 148 a previous point. */ 149 150 int 151 get_first_line_listed (void) 152 { 153 return first_line_listed; 154 } 155 156 /* Return the default number of lines to print with commands like the 157 cli "list". The caller of print_source_lines must use this to 158 calculate the end line and use it in the call to print_source_lines 159 as it does not automatically use this value. */ 160 161 int 162 get_lines_to_list (void) 163 { 164 return lines_to_list; 165 } 166 167 /* Return the current source file for listing and next line to list. 168 NOTE: The returned sal pc and end fields are not valid. */ 169 170 struct symtab_and_line 171 get_current_source_symtab_and_line (void) 172 { 173 struct symtab_and_line cursal = { 0 }; 174 175 cursal.pspace = current_source_pspace; 176 cursal.symtab = current_source_symtab; 177 cursal.line = current_source_line; 178 cursal.pc = 0; 179 cursal.end = 0; 180 181 return cursal; 182 } 183 184 /* If the current source file for listing is not set, try and get a default. 185 Usually called before get_current_source_symtab_and_line() is called. 186 It may err out if a default cannot be determined. 187 We must be cautious about where it is called, as it can recurse as the 188 process of determining a new default may call the caller! 189 Use get_current_source_symtab_and_line only to get whatever 190 we have without erroring out or trying to get a default. */ 191 192 void 193 set_default_source_symtab_and_line (void) 194 { 195 if (!have_full_symbols () && !have_partial_symbols ()) 196 error (_("No symbol table is loaded. Use the \"file\" command.")); 197 198 /* Pull in a current source symtab if necessary. */ 199 if (current_source_symtab == 0) 200 select_source_symtab (0); 201 } 202 203 /* Return the current default file for listing and next line to list 204 (the returned sal pc and end fields are not valid.) 205 and set the current default to whatever is in SAL. 206 NOTE: The returned sal pc and end fields are not valid. */ 207 208 struct symtab_and_line 209 set_current_source_symtab_and_line (const struct symtab_and_line *sal) 210 { 211 struct symtab_and_line cursal = { 0 }; 212 213 cursal.pspace = current_source_pspace; 214 cursal.symtab = current_source_symtab; 215 cursal.line = current_source_line; 216 cursal.pc = 0; 217 cursal.end = 0; 218 219 current_source_pspace = sal->pspace; 220 current_source_symtab = sal->symtab; 221 current_source_line = sal->line; 222 223 return cursal; 224 } 225 226 /* Reset any information stored about a default file and line to print. */ 227 228 void 229 clear_current_source_symtab_and_line (void) 230 { 231 current_source_symtab = 0; 232 current_source_line = 0; 233 } 234 235 /* Set the source file default for the "list" command to be S. 236 237 If S is NULL, and we don't have a default, find one. This 238 should only be called when the user actually tries to use the 239 default, since we produce an error if we can't find a reasonable 240 default. Also, since this can cause symbols to be read, doing it 241 before we need to would make things slower than necessary. */ 242 243 void 244 select_source_symtab (struct symtab *s) 245 { 246 struct symtabs_and_lines sals; 247 struct symtab_and_line sal; 248 struct objfile *ofp; 249 250 if (s) 251 { 252 current_source_symtab = s; 253 current_source_line = 1; 254 current_source_pspace = SYMTAB_PSPACE (s); 255 return; 256 } 257 258 if (current_source_symtab) 259 return; 260 261 /* Make the default place to list be the function `main' 262 if one exists. */ 263 if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0)) 264 { 265 sals = decode_line_with_current_source (main_name (), 266 DECODE_LINE_FUNFIRSTLINE); 267 sal = sals.sals[0]; 268 xfree (sals.sals); 269 current_source_pspace = sal.pspace; 270 current_source_symtab = sal.symtab; 271 current_source_line = max (sal.line - (lines_to_list - 1), 1); 272 if (current_source_symtab) 273 return; 274 } 275 276 /* Alright; find the last file in the symtab list (ignoring .h's 277 and namespace symtabs). */ 278 279 current_source_line = 1; 280 281 ALL_OBJFILES (ofp) 282 { 283 for (s = ofp->symtabs; s; s = s->next) 284 { 285 const char *name = s->filename; 286 int len = strlen (name); 287 288 if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0 289 || strcmp (name, "<<C++-namespaces>>") == 0))) 290 { 291 current_source_pspace = current_program_space; 292 current_source_symtab = s; 293 } 294 } 295 } 296 297 if (current_source_symtab) 298 return; 299 300 ALL_OBJFILES (ofp) 301 { 302 if (ofp->sf) 303 s = ofp->sf->qf->find_last_source_symtab (ofp); 304 if (s) 305 current_source_symtab = s; 306 } 307 if (current_source_symtab) 308 return; 309 310 error (_("Can't find a default source file")); 311 } 312 313 /* Handler for "set directories path-list" command. 314 "set dir mumble" doesn't prepend paths, it resets the entire 315 path list. The theory is that set(show(dir)) should be a no-op. */ 316 317 static void 318 set_directories_command (char *args, int from_tty, struct cmd_list_element *c) 319 { 320 /* This is the value that was set. 321 It needs to be processed to maintain $cdir:$cwd and remove dups. */ 322 char *set_path = source_path; 323 324 /* We preserve the invariant that $cdir:$cwd begins life at the end of 325 the list by calling init_source_path. If they appear earlier in 326 SET_PATH then mod_path will move them appropriately. 327 mod_path will also remove duplicates. */ 328 init_source_path (); 329 if (*set_path != '\0') 330 mod_path (set_path, &source_path); 331 332 xfree (set_path); 333 } 334 335 /* Print the list of source directories. 336 This is used by the "ld" command, so it has the signature of a command 337 function. */ 338 339 static void 340 show_directories_1 (char *ignore, int from_tty) 341 { 342 puts_filtered ("Source directories searched: "); 343 puts_filtered (source_path); 344 puts_filtered ("\n"); 345 } 346 347 /* Handler for "show directories" command. */ 348 349 static void 350 show_directories_command (struct ui_file *file, int from_tty, 351 struct cmd_list_element *c, const char *value) 352 { 353 show_directories_1 (NULL, from_tty); 354 } 355 356 /* Forget line positions and file names for the symtabs in a 357 particular objfile. */ 358 359 void 360 forget_cached_source_info_for_objfile (struct objfile *objfile) 361 { 362 struct symtab *s; 363 364 ALL_OBJFILE_SYMTABS (objfile, s) 365 { 366 if (s->line_charpos != NULL) 367 { 368 xfree (s->line_charpos); 369 s->line_charpos = NULL; 370 } 371 if (s->fullname != NULL) 372 { 373 xfree (s->fullname); 374 s->fullname = NULL; 375 } 376 } 377 378 if (objfile->sf) 379 objfile->sf->qf->forget_cached_source_info (objfile); 380 } 381 382 /* Forget what we learned about line positions in source files, and 383 which directories contain them; must check again now since files 384 may be found in a different directory now. */ 385 386 void 387 forget_cached_source_info (void) 388 { 389 struct program_space *pspace; 390 struct objfile *objfile; 391 392 ALL_PSPACES (pspace) 393 ALL_PSPACE_OBJFILES (pspace, objfile) 394 { 395 forget_cached_source_info_for_objfile (objfile); 396 } 397 398 last_source_visited = NULL; 399 } 400 401 void 402 init_source_path (void) 403 { 404 char buf[20]; 405 406 xsnprintf (buf, sizeof (buf), "$cdir%c$cwd", DIRNAME_SEPARATOR); 407 source_path = xstrdup (buf); 408 forget_cached_source_info (); 409 } 410 411 /* Add zero or more directories to the front of the source path. */ 412 413 static void 414 directory_command (char *dirname, int from_tty) 415 { 416 dont_repeat (); 417 /* FIXME, this goes to "delete dir"... */ 418 if (dirname == 0) 419 { 420 if (!from_tty || query (_("Reinitialize source path to empty? "))) 421 { 422 xfree (source_path); 423 init_source_path (); 424 } 425 } 426 else 427 { 428 mod_path (dirname, &source_path); 429 forget_cached_source_info (); 430 } 431 if (from_tty) 432 show_directories_1 ((char *) 0, from_tty); 433 } 434 435 /* Add a path given with the -d command line switch. 436 This will not be quoted so we must not treat spaces as separators. */ 437 438 void 439 directory_switch (char *dirname, int from_tty) 440 { 441 add_path (dirname, &source_path, 0); 442 } 443 444 /* Add zero or more directories to the front of an arbitrary path. */ 445 446 void 447 mod_path (char *dirname, char **which_path) 448 { 449 add_path (dirname, which_path, 1); 450 } 451 452 /* Workhorse of mod_path. Takes an extra argument to determine 453 if dirname should be parsed for separators that indicate multiple 454 directories. This allows for interfaces that pre-parse the dirname 455 and allow specification of traditional separator characters such 456 as space or tab. */ 457 458 void 459 add_path (char *dirname, char **which_path, int parse_separators) 460 { 461 char *old = *which_path; 462 int prefix = 0; 463 VEC (char_ptr) *dir_vec = NULL; 464 struct cleanup *back_to; 465 int ix; 466 char *name; 467 468 if (dirname == 0) 469 return; 470 471 if (parse_separators) 472 { 473 char **argv, **argvp; 474 475 /* This will properly parse the space and tab separators 476 and any quotes that may exist. */ 477 argv = gdb_buildargv (dirname); 478 479 for (argvp = argv; *argvp; argvp++) 480 dirnames_to_char_ptr_vec_append (&dir_vec, *argvp); 481 482 freeargv (argv); 483 } 484 else 485 VEC_safe_push (char_ptr, dir_vec, xstrdup (dirname)); 486 back_to = make_cleanup_free_char_ptr_vec (dir_vec); 487 488 for (ix = 0; VEC_iterate (char_ptr, dir_vec, ix, name); ++ix) 489 { 490 char *p; 491 struct stat st; 492 493 /* Spaces and tabs will have been removed by buildargv(). 494 NAME is the start of the directory. 495 P is the '\0' following the end. */ 496 p = name + strlen (name); 497 498 while (!(IS_DIR_SEPARATOR (*name) && p <= name + 1) /* "/" */ 499 #ifdef HAVE_DOS_BASED_FILE_SYSTEM 500 /* On MS-DOS and MS-Windows, h:\ is different from h: */ 501 && !(p == name + 3 && name[1] == ':') /* "d:/" */ 502 #endif 503 && IS_DIR_SEPARATOR (p[-1])) 504 /* Sigh. "foo/" => "foo" */ 505 --p; 506 *p = '\0'; 507 508 while (p > name && p[-1] == '.') 509 { 510 if (p - name == 1) 511 { 512 /* "." => getwd (). */ 513 name = current_directory; 514 goto append; 515 } 516 else if (p > name + 1 && IS_DIR_SEPARATOR (p[-2])) 517 { 518 if (p - name == 2) 519 { 520 /* "/." => "/". */ 521 *--p = '\0'; 522 goto append; 523 } 524 else 525 { 526 /* "...foo/." => "...foo". */ 527 p -= 2; 528 *p = '\0'; 529 continue; 530 } 531 } 532 else 533 break; 534 } 535 536 if (name[0] == '~') 537 name = tilde_expand (name); 538 #ifdef HAVE_DOS_BASED_FILE_SYSTEM 539 else if (IS_ABSOLUTE_PATH (name) && p == name + 2) /* "d:" => "d:." */ 540 name = concat (name, ".", (char *)NULL); 541 #endif 542 else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$') 543 name = concat (current_directory, SLASH_STRING, name, (char *)NULL); 544 else 545 name = savestring (name, p - name); 546 make_cleanup (xfree, name); 547 548 /* Unless it's a variable, check existence. */ 549 if (name[0] != '$') 550 { 551 /* These are warnings, not errors, since we don't want a 552 non-existent directory in a .gdbinit file to stop processing 553 of the .gdbinit file. 554 555 Whether they get added to the path is more debatable. Current 556 answer is yes, in case the user wants to go make the directory 557 or whatever. If the directory continues to not exist/not be 558 a directory/etc, then having them in the path should be 559 harmless. */ 560 if (stat (name, &st) < 0) 561 { 562 int save_errno = errno; 563 564 fprintf_unfiltered (gdb_stderr, "Warning: "); 565 print_sys_errmsg (name, save_errno); 566 } 567 else if ((st.st_mode & S_IFMT) != S_IFDIR) 568 warning (_("%s is not a directory."), name); 569 } 570 571 append: 572 { 573 unsigned int len = strlen (name); 574 char tinybuf[2]; 575 576 p = *which_path; 577 while (1) 578 { 579 /* FIXME: we should use realpath() or its work-alike 580 before comparing. Then all the code above which 581 removes excess slashes and dots could simply go away. */ 582 if (!filename_ncmp (p, name, len) 583 && (p[len] == '\0' || p[len] == DIRNAME_SEPARATOR)) 584 { 585 /* Found it in the search path, remove old copy. */ 586 if (p > *which_path) 587 { 588 /* Back over leading separator. */ 589 p--; 590 } 591 if (prefix > p - *which_path) 592 { 593 /* Same dir twice in one cmd. */ 594 goto skip_dup; 595 } 596 /* Copy from next '\0' or ':'. */ 597 memmove (p, &p[len + 1], strlen (&p[len + 1]) + 1); 598 } 599 p = strchr (p, DIRNAME_SEPARATOR); 600 if (p != 0) 601 ++p; 602 else 603 break; 604 } 605 606 tinybuf[0] = DIRNAME_SEPARATOR; 607 tinybuf[1] = '\0'; 608 609 /* If we have already tacked on a name(s) in this command, 610 be sure they stay on the front as we tack on some 611 more. */ 612 if (prefix) 613 { 614 char *temp, c; 615 616 c = old[prefix]; 617 old[prefix] = '\0'; 618 temp = concat (old, tinybuf, name, (char *)NULL); 619 old[prefix] = c; 620 *which_path = concat (temp, "", &old[prefix], (char *) NULL); 621 prefix = strlen (temp); 622 xfree (temp); 623 } 624 else 625 { 626 *which_path = concat (name, (old[0] ? tinybuf : old), 627 old, (char *)NULL); 628 prefix = strlen (name); 629 } 630 xfree (old); 631 old = *which_path; 632 } 633 skip_dup: 634 ; 635 } 636 637 do_cleanups (back_to); 638 } 639 640 641 static void 642 source_info (char *ignore, int from_tty) 643 { 644 struct symtab *s = current_source_symtab; 645 646 if (!s) 647 { 648 printf_filtered (_("No current source file.\n")); 649 return; 650 } 651 printf_filtered (_("Current source file is %s\n"), s->filename); 652 if (s->dirname) 653 printf_filtered (_("Compilation directory is %s\n"), s->dirname); 654 if (s->fullname) 655 printf_filtered (_("Located in %s\n"), s->fullname); 656 if (s->nlines) 657 printf_filtered (_("Contains %d line%s.\n"), s->nlines, 658 s->nlines == 1 ? "" : "s"); 659 660 printf_filtered (_("Source language is %s.\n"), language_str (s->language)); 661 printf_filtered (_("Compiled with %s debugging format.\n"), s->debugformat); 662 printf_filtered (_("%s preprocessor macro info.\n"), 663 s->macro_table ? "Includes" : "Does not include"); 664 } 665 666 667 /* Return True if the file NAME exists and is a regular file. */ 668 static int 669 is_regular_file (const char *name) 670 { 671 struct stat st; 672 const int status = stat (name, &st); 673 674 /* Stat should never fail except when the file does not exist. 675 If stat fails, analyze the source of error and return True 676 unless the file does not exist, to avoid returning false results 677 on obscure systems where stat does not work as expected. */ 678 679 if (status != 0) 680 return (errno != ENOENT); 681 682 return S_ISREG (st.st_mode); 683 } 684 685 /* Open a file named STRING, searching path PATH (dir names sep by some char) 686 using mode MODE in the calls to open. You cannot use this function to 687 create files (O_CREAT). 688 689 OPTS specifies the function behaviour in specific cases. 690 691 If OPF_TRY_CWD_FIRST, try to open ./STRING before searching PATH. 692 (ie pretend the first element of PATH is "."). This also indicates 693 that, unless OPF_SEARCH_IN_PATH is also specified, a slash in STRING 694 disables searching of the path (this is so that "exec-file ./foo" or 695 "symbol-file ./foo" insures that you get that particular version of 696 foo or an error message). 697 698 If OPTS has OPF_SEARCH_IN_PATH set, absolute names will also be 699 searched in path (we usually want this for source files but not for 700 executables). 701 702 If FILENAME_OPENED is non-null, set it to a newly allocated string naming 703 the actual file opened (this string will always start with a "/"). We 704 have to take special pains to avoid doubling the "/" between the directory 705 and the file, sigh! Emacs gets confuzzed by this when we print the 706 source file name!!! 707 708 If OPTS has OPF_RETURN_REALPATH set return FILENAME_OPENED resolved by 709 gdb_realpath. Even without OPF_RETURN_REALPATH this function still returns 710 filename starting with "/". If FILENAME_OPENED is NULL this option has no 711 effect. 712 713 If a file is found, return the descriptor. 714 Otherwise, return -1, with errno set for the last name we tried to open. */ 715 716 /* >>>> This should only allow files of certain types, 717 >>>> eg executable, non-directory. */ 718 int 719 openp (const char *path, int opts, const char *string, 720 int mode, char **filename_opened) 721 { 722 int fd; 723 char *filename; 724 int alloclen; 725 VEC (char_ptr) *dir_vec; 726 struct cleanup *back_to; 727 int ix; 728 char *dir; 729 730 /* The open syscall MODE parameter is not specified. */ 731 gdb_assert ((mode & O_CREAT) == 0); 732 gdb_assert (string != NULL); 733 734 /* A file with an empty name cannot possibly exist. Report a failure 735 without further checking. 736 737 This is an optimization which also defends us against buggy 738 implementations of the "stat" function. For instance, we have 739 noticed that a MinGW debugger built on Windows XP 32bits crashes 740 when the debugger is started with an empty argument. */ 741 if (string[0] == '\0') 742 { 743 errno = ENOENT; 744 return -1; 745 } 746 747 if (!path) 748 path = "."; 749 750 mode |= O_BINARY; 751 752 if ((opts & OPF_TRY_CWD_FIRST) || IS_ABSOLUTE_PATH (string)) 753 { 754 int i; 755 756 if (is_regular_file (string)) 757 { 758 filename = alloca (strlen (string) + 1); 759 strcpy (filename, string); 760 fd = gdb_open_cloexec (filename, mode, 0); 761 if (fd >= 0) 762 goto done; 763 } 764 else 765 { 766 filename = NULL; 767 fd = -1; 768 } 769 770 if (!(opts & OPF_SEARCH_IN_PATH)) 771 for (i = 0; string[i]; i++) 772 if (IS_DIR_SEPARATOR (string[i])) 773 goto done; 774 } 775 776 /* For dos paths, d:/foo -> /foo, and d:foo -> foo. */ 777 if (HAS_DRIVE_SPEC (string)) 778 string = STRIP_DRIVE_SPEC (string); 779 780 /* /foo => foo, to avoid multiple slashes that Emacs doesn't like. */ 781 while (IS_DIR_SEPARATOR(string[0])) 782 string++; 783 784 /* ./foo => foo */ 785 while (string[0] == '.' && IS_DIR_SEPARATOR (string[1])) 786 string += 2; 787 788 alloclen = strlen (path) + strlen (string) + 2; 789 filename = alloca (alloclen); 790 fd = -1; 791 792 dir_vec = dirnames_to_char_ptr_vec (path); 793 back_to = make_cleanup_free_char_ptr_vec (dir_vec); 794 795 for (ix = 0; VEC_iterate (char_ptr, dir_vec, ix, dir); ++ix) 796 { 797 size_t len = strlen (dir); 798 799 if (strcmp (dir, "$cwd") == 0) 800 { 801 /* Name is $cwd -- insert current directory name instead. */ 802 int newlen; 803 804 /* First, realloc the filename buffer if too short. */ 805 len = strlen (current_directory); 806 newlen = len + strlen (string) + 2; 807 if (newlen > alloclen) 808 { 809 alloclen = newlen; 810 filename = alloca (alloclen); 811 } 812 strcpy (filename, current_directory); 813 } 814 else if (strchr(dir, '~')) 815 { 816 /* See whether we need to expand the tilde. */ 817 int newlen; 818 char *tilde_expanded; 819 820 tilde_expanded = tilde_expand (dir); 821 822 /* First, realloc the filename buffer if too short. */ 823 len = strlen (tilde_expanded); 824 newlen = len + strlen (string) + 2; 825 if (newlen > alloclen) 826 { 827 alloclen = newlen; 828 filename = alloca (alloclen); 829 } 830 strcpy (filename, tilde_expanded); 831 xfree (tilde_expanded); 832 } 833 else 834 { 835 /* Normal file name in path -- just use it. */ 836 strcpy (filename, dir); 837 838 /* Don't search $cdir. It's also a magic path like $cwd, but we 839 don't have enough information to expand it. The user *could* 840 have an actual directory named '$cdir' but handling that would 841 be confusing, it would mean different things in different 842 contexts. If the user really has '$cdir' one can use './$cdir'. 843 We can get $cdir when loading scripts. When loading source files 844 $cdir must have already been expanded to the correct value. */ 845 if (strcmp (dir, "$cdir") == 0) 846 continue; 847 } 848 849 /* Remove trailing slashes. */ 850 while (len > 0 && IS_DIR_SEPARATOR (filename[len - 1])) 851 filename[--len] = 0; 852 853 strcat (filename + len, SLASH_STRING); 854 strcat (filename, string); 855 856 if (is_regular_file (filename)) 857 { 858 fd = gdb_open_cloexec (filename, mode, 0); 859 if (fd >= 0) 860 break; 861 } 862 } 863 864 do_cleanups (back_to); 865 866 done: 867 if (filename_opened) 868 { 869 /* If a file was opened, canonicalize its filename. */ 870 if (fd < 0) 871 *filename_opened = NULL; 872 else if ((opts & OPF_RETURN_REALPATH) != 0) 873 *filename_opened = gdb_realpath (filename); 874 else 875 *filename_opened = gdb_abspath (filename); 876 } 877 878 return fd; 879 } 880 881 882 /* This is essentially a convenience, for clients that want the behaviour 883 of openp, using source_path, but that really don't want the file to be 884 opened but want instead just to know what the full pathname is (as 885 qualified against source_path). 886 887 The current working directory is searched first. 888 889 If the file was found, this function returns 1, and FULL_PATHNAME is 890 set to the fully-qualified pathname. 891 892 Else, this functions returns 0, and FULL_PATHNAME is set to NULL. */ 893 int 894 source_full_path_of (const char *filename, char **full_pathname) 895 { 896 int fd; 897 898 fd = openp (source_path, 899 OPF_TRY_CWD_FIRST | OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, 900 filename, O_RDONLY, full_pathname); 901 if (fd < 0) 902 { 903 *full_pathname = NULL; 904 return 0; 905 } 906 907 close (fd); 908 return 1; 909 } 910 911 /* Return non-zero if RULE matches PATH, that is if the rule can be 912 applied to PATH. */ 913 914 static int 915 substitute_path_rule_matches (const struct substitute_path_rule *rule, 916 const char *path) 917 { 918 const int from_len = strlen (rule->from); 919 const int path_len = strlen (path); 920 char *path_start; 921 922 if (path_len < from_len) 923 return 0; 924 925 /* The substitution rules are anchored at the start of the path, 926 so the path should start with rule->from. There is no filename 927 comparison routine, so we need to extract the first FROM_LEN 928 characters from PATH first and use that to do the comparison. */ 929 930 path_start = alloca (from_len + 1); 931 strncpy (path_start, path, from_len); 932 path_start[from_len] = '\0'; 933 934 if (FILENAME_CMP (path_start, rule->from) != 0) 935 return 0; 936 937 /* Make sure that the region in the path that matches the substitution 938 rule is immediately followed by a directory separator (or the end of 939 string character). */ 940 941 if (path[from_len] != '\0' && !IS_DIR_SEPARATOR (path[from_len])) 942 return 0; 943 944 return 1; 945 } 946 947 /* Find the substitute-path rule that applies to PATH and return it. 948 Return NULL if no rule applies. */ 949 950 static struct substitute_path_rule * 951 get_substitute_path_rule (const char *path) 952 { 953 struct substitute_path_rule *rule = substitute_path_rules; 954 955 while (rule != NULL && !substitute_path_rule_matches (rule, path)) 956 rule = rule->next; 957 958 return rule; 959 } 960 961 /* If the user specified a source path substitution rule that applies 962 to PATH, then apply it and return the new path. This new path must 963 be deallocated afterwards. 964 965 Return NULL if no substitution rule was specified by the user, 966 or if no rule applied to the given PATH. */ 967 968 char * 969 rewrite_source_path (const char *path) 970 { 971 const struct substitute_path_rule *rule = get_substitute_path_rule (path); 972 char *new_path; 973 int from_len; 974 975 if (rule == NULL) 976 return NULL; 977 978 from_len = strlen (rule->from); 979 980 /* Compute the rewritten path and return it. */ 981 982 new_path = 983 (char *) xmalloc (strlen (path) + 1 + strlen (rule->to) - from_len); 984 strcpy (new_path, rule->to); 985 strcat (new_path, path + from_len); 986 987 return new_path; 988 } 989 990 int 991 find_and_open_source (const char *filename, 992 const char *dirname, 993 char **fullname) 994 { 995 char *path = source_path; 996 const char *p; 997 int result; 998 struct cleanup *cleanup; 999 1000 /* Quick way out if we already know its full name. */ 1001 1002 if (*fullname) 1003 { 1004 /* The user may have requested that source paths be rewritten 1005 according to substitution rules he provided. If a substitution 1006 rule applies to this path, then apply it. */ 1007 char *rewritten_fullname = rewrite_source_path (*fullname); 1008 1009 if (rewritten_fullname != NULL) 1010 { 1011 xfree (*fullname); 1012 *fullname = rewritten_fullname; 1013 } 1014 1015 result = gdb_open_cloexec (*fullname, OPEN_MODE, 0); 1016 if (result >= 0) 1017 { 1018 char *lpath = gdb_realpath (*fullname); 1019 1020 xfree (*fullname); 1021 *fullname = lpath; 1022 return result; 1023 } 1024 1025 /* Didn't work -- free old one, try again. */ 1026 xfree (*fullname); 1027 *fullname = NULL; 1028 } 1029 1030 cleanup = make_cleanup (null_cleanup, NULL); 1031 1032 if (dirname != NULL) 1033 { 1034 /* If necessary, rewrite the compilation directory name according 1035 to the source path substitution rules specified by the user. */ 1036 1037 char *rewritten_dirname = rewrite_source_path (dirname); 1038 1039 if (rewritten_dirname != NULL) 1040 { 1041 make_cleanup (xfree, rewritten_dirname); 1042 dirname = rewritten_dirname; 1043 } 1044 1045 /* Replace a path entry of $cdir with the compilation directory 1046 name. */ 1047 #define cdir_len 5 1048 /* We cast strstr's result in case an ANSIhole has made it const, 1049 which produces a "required warning" when assigned to a nonconst. */ 1050 p = (char *) strstr (source_path, "$cdir"); 1051 if (p && (p == path || p[-1] == DIRNAME_SEPARATOR) 1052 && (p[cdir_len] == DIRNAME_SEPARATOR || p[cdir_len] == '\0')) 1053 { 1054 int len; 1055 1056 path = (char *) 1057 alloca (strlen (source_path) + 1 + strlen (dirname) + 1); 1058 len = p - source_path; 1059 strncpy (path, source_path, len); /* Before $cdir */ 1060 strcpy (path + len, dirname); /* new stuff */ 1061 strcat (path + len, source_path + len + cdir_len); /* After 1062 $cdir */ 1063 } 1064 } 1065 1066 if (IS_ABSOLUTE_PATH (filename)) 1067 { 1068 /* If filename is absolute path, try the source path 1069 substitution on it. */ 1070 char *rewritten_filename = rewrite_source_path (filename); 1071 1072 if (rewritten_filename != NULL) 1073 { 1074 make_cleanup (xfree, rewritten_filename); 1075 filename = rewritten_filename; 1076 } 1077 } 1078 1079 result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename, 1080 OPEN_MODE, fullname); 1081 if (result < 0) 1082 { 1083 /* Didn't work. Try using just the basename. */ 1084 p = lbasename (filename); 1085 if (p != filename) 1086 result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, p, 1087 OPEN_MODE, fullname); 1088 } 1089 1090 do_cleanups (cleanup); 1091 return result; 1092 } 1093 1094 /* Open a source file given a symtab S. Returns a file descriptor or 1095 negative number for error. 1096 1097 This function is a convience function to find_and_open_source. */ 1098 1099 int 1100 open_source_file (struct symtab *s) 1101 { 1102 if (!s) 1103 return -1; 1104 1105 return find_and_open_source (s->filename, s->dirname, &s->fullname); 1106 } 1107 1108 /* Finds the fullname that a symtab represents. 1109 1110 This functions finds the fullname and saves it in s->fullname. 1111 It will also return the value. 1112 1113 If this function fails to find the file that this symtab represents, 1114 the expected fullname is used. Therefore the files does not have to 1115 exist. */ 1116 1117 const char * 1118 symtab_to_fullname (struct symtab *s) 1119 { 1120 /* Use cached copy if we have it. 1121 We rely on forget_cached_source_info being called appropriately 1122 to handle cases like the file being moved. */ 1123 if (s->fullname == NULL) 1124 { 1125 int fd = find_and_open_source (s->filename, s->dirname, &s->fullname); 1126 1127 if (fd >= 0) 1128 close (fd); 1129 else 1130 { 1131 char *fullname; 1132 struct cleanup *back_to; 1133 1134 /* rewrite_source_path would be applied by find_and_open_source, we 1135 should report the pathname where GDB tried to find the file. */ 1136 1137 if (s->dirname == NULL || IS_ABSOLUTE_PATH (s->filename)) 1138 fullname = xstrdup (s->filename); 1139 else 1140 fullname = concat (s->dirname, SLASH_STRING, s->filename, NULL); 1141 1142 back_to = make_cleanup (xfree, fullname); 1143 s->fullname = rewrite_source_path (fullname); 1144 if (s->fullname == NULL) 1145 s->fullname = xstrdup (fullname); 1146 do_cleanups (back_to); 1147 } 1148 } 1149 1150 return s->fullname; 1151 } 1152 1153 /* See commentary in source.h. */ 1154 1155 const char * 1156 symtab_to_filename_for_display (struct symtab *symtab) 1157 { 1158 if (filename_display_string == filename_display_basename) 1159 return lbasename (symtab->filename); 1160 else if (filename_display_string == filename_display_absolute) 1161 return symtab_to_fullname (symtab); 1162 else if (filename_display_string == filename_display_relative) 1163 return symtab->filename; 1164 else 1165 internal_error (__FILE__, __LINE__, _("invalid filename_display_string")); 1166 } 1167 1168 /* Create and initialize the table S->line_charpos that records 1169 the positions of the lines in the source file, which is assumed 1170 to be open on descriptor DESC. 1171 All set S->nlines to the number of such lines. */ 1172 1173 void 1174 find_source_lines (struct symtab *s, int desc) 1175 { 1176 struct stat st; 1177 char *data, *p, *end; 1178 int nlines = 0; 1179 int lines_allocated = 1000; 1180 int *line_charpos; 1181 long mtime = 0; 1182 int size; 1183 1184 gdb_assert (s); 1185 line_charpos = (int *) xmalloc (lines_allocated * sizeof (int)); 1186 if (fstat (desc, &st) < 0) 1187 perror_with_name (symtab_to_filename_for_display (s)); 1188 1189 if (s->objfile && s->objfile->obfd) 1190 mtime = s->objfile->mtime; 1191 else if (exec_bfd) 1192 mtime = exec_bfd_mtime; 1193 1194 if (mtime && mtime < st.st_mtime) 1195 warning (_("Source file is more recent than executable.")); 1196 1197 { 1198 struct cleanup *old_cleanups; 1199 1200 /* st_size might be a large type, but we only support source files whose 1201 size fits in an int. */ 1202 size = (int) st.st_size; 1203 1204 /* Use malloc, not alloca, because this may be pretty large, and we may 1205 run into various kinds of limits on stack size. */ 1206 data = (char *) xmalloc (size); 1207 old_cleanups = make_cleanup (xfree, data); 1208 1209 /* Reassign `size' to result of read for systems where \r\n -> \n. */ 1210 size = myread (desc, data, size); 1211 if (size < 0) 1212 perror_with_name (symtab_to_filename_for_display (s)); 1213 end = data + size; 1214 p = data; 1215 line_charpos[0] = 0; 1216 nlines = 1; 1217 while (p != end) 1218 { 1219 if (*p++ == '\n' 1220 /* A newline at the end does not start a new line. */ 1221 && p != end) 1222 { 1223 if (nlines == lines_allocated) 1224 { 1225 lines_allocated *= 2; 1226 line_charpos = 1227 (int *) xrealloc ((char *) line_charpos, 1228 sizeof (int) * lines_allocated); 1229 } 1230 line_charpos[nlines++] = p - data; 1231 } 1232 } 1233 do_cleanups (old_cleanups); 1234 } 1235 1236 s->nlines = nlines; 1237 s->line_charpos = 1238 (int *) xrealloc ((char *) line_charpos, nlines * sizeof (int)); 1239 1240 } 1241 1242 1243 1244 /* Get full pathname and line number positions for a symtab. 1245 Return nonzero if line numbers may have changed. 1246 Set *FULLNAME to actual name of the file as found by `openp', 1247 or to 0 if the file is not found. */ 1248 1249 static int 1250 get_filename_and_charpos (struct symtab *s, char **fullname) 1251 { 1252 int desc, linenums_changed = 0; 1253 struct cleanup *cleanups; 1254 1255 desc = open_source_file (s); 1256 if (desc < 0) 1257 { 1258 if (fullname) 1259 *fullname = NULL; 1260 return 0; 1261 } 1262 cleanups = make_cleanup_close (desc); 1263 if (fullname) 1264 *fullname = s->fullname; 1265 if (s->line_charpos == 0) 1266 linenums_changed = 1; 1267 if (linenums_changed) 1268 find_source_lines (s, desc); 1269 do_cleanups (cleanups); 1270 return linenums_changed; 1271 } 1272 1273 /* Print text describing the full name of the source file S 1274 and the line number LINE and its corresponding character position. 1275 The text starts with two Ctrl-z so that the Emacs-GDB interface 1276 can easily find it. 1277 1278 MID_STATEMENT is nonzero if the PC is not at the beginning of that line. 1279 1280 Return 1 if successful, 0 if could not find the file. */ 1281 1282 int 1283 identify_source_line (struct symtab *s, int line, int mid_statement, 1284 CORE_ADDR pc) 1285 { 1286 if (s->line_charpos == 0) 1287 get_filename_and_charpos (s, (char **) NULL); 1288 if (s->fullname == 0) 1289 return 0; 1290 if (line > s->nlines) 1291 /* Don't index off the end of the line_charpos array. */ 1292 return 0; 1293 annotate_source (s->fullname, line, s->line_charpos[line - 1], 1294 mid_statement, get_objfile_arch (s->objfile), pc); 1295 1296 current_source_line = line; 1297 first_line_listed = line; 1298 last_line_listed = line; 1299 current_source_symtab = s; 1300 return 1; 1301 } 1302 1303 1304 /* Print source lines from the file of symtab S, 1305 starting with line number LINE and stopping before line number STOPLINE. */ 1306 1307 static void 1308 print_source_lines_base (struct symtab *s, int line, int stopline, 1309 enum print_source_lines_flags flags) 1310 { 1311 int c; 1312 int desc; 1313 int noprint = 0; 1314 FILE *stream; 1315 int nlines = stopline - line; 1316 struct cleanup *cleanup; 1317 struct ui_out *uiout = current_uiout; 1318 1319 /* Regardless of whether we can open the file, set current_source_symtab. */ 1320 current_source_symtab = s; 1321 current_source_line = line; 1322 first_line_listed = line; 1323 1324 /* If printing of source lines is disabled, just print file and line 1325 number. */ 1326 if (ui_out_test_flags (uiout, ui_source_list)) 1327 { 1328 /* Only prints "No such file or directory" once. */ 1329 if ((s != last_source_visited) || (!last_source_error)) 1330 { 1331 last_source_visited = s; 1332 desc = open_source_file (s); 1333 } 1334 else 1335 { 1336 desc = last_source_error; 1337 flags |= PRINT_SOURCE_LINES_NOERROR; 1338 } 1339 } 1340 else 1341 { 1342 desc = last_source_error; 1343 flags |= PRINT_SOURCE_LINES_NOERROR; 1344 noprint = 1; 1345 } 1346 1347 if (desc < 0 || noprint) 1348 { 1349 last_source_error = desc; 1350 1351 if (!(flags & PRINT_SOURCE_LINES_NOERROR)) 1352 { 1353 const char *filename = symtab_to_filename_for_display (s); 1354 int len = strlen (filename) + 100; 1355 char *name = alloca (len); 1356 1357 xsnprintf (name, len, "%d\t%s", line, filename); 1358 print_sys_errmsg (name, errno); 1359 } 1360 else 1361 { 1362 ui_out_field_int (uiout, "line", line); 1363 ui_out_text (uiout, "\tin "); 1364 1365 /* CLI expects only the "file" field. TUI expects only the 1366 "fullname" field (and TUI does break if "file" is printed). 1367 MI expects both fields. ui_source_list is set only for CLI, 1368 not for TUI. */ 1369 if (ui_out_is_mi_like_p (uiout) 1370 || ui_out_test_flags (uiout, ui_source_list)) 1371 ui_out_field_string (uiout, "file", 1372 symtab_to_filename_for_display (s)); 1373 if (ui_out_is_mi_like_p (uiout) 1374 || !ui_out_test_flags (uiout, ui_source_list)) 1375 { 1376 const char *s_fullname = symtab_to_fullname (s); 1377 char *local_fullname; 1378 1379 /* ui_out_field_string may free S_FULLNAME by calling 1380 open_source_file for it again. See e.g., 1381 tui_field_string->tui_show_source. */ 1382 local_fullname = alloca (strlen (s_fullname) + 1); 1383 strcpy (local_fullname, s_fullname); 1384 1385 ui_out_field_string (uiout, "fullname", local_fullname); 1386 } 1387 1388 ui_out_text (uiout, "\n"); 1389 } 1390 1391 return; 1392 } 1393 1394 last_source_error = 0; 1395 1396 if (s->line_charpos == 0) 1397 find_source_lines (s, desc); 1398 1399 if (line < 1 || line > s->nlines) 1400 { 1401 close (desc); 1402 error (_("Line number %d out of range; %s has %d lines."), 1403 line, symtab_to_filename_for_display (s), s->nlines); 1404 } 1405 1406 if (lseek (desc, s->line_charpos[line - 1], 0) < 0) 1407 { 1408 close (desc); 1409 perror_with_name (symtab_to_filename_for_display (s)); 1410 } 1411 1412 stream = fdopen (desc, FDOPEN_MODE); 1413 clearerr (stream); 1414 cleanup = make_cleanup_fclose (stream); 1415 1416 while (nlines-- > 0) 1417 { 1418 char buf[20]; 1419 1420 c = fgetc (stream); 1421 if (c == EOF) 1422 break; 1423 last_line_listed = current_source_line; 1424 if (flags & PRINT_SOURCE_LINES_FILENAME) 1425 { 1426 ui_out_text (uiout, symtab_to_filename_for_display (s)); 1427 ui_out_text (uiout, ":"); 1428 } 1429 xsnprintf (buf, sizeof (buf), "%d\t", current_source_line++); 1430 ui_out_text (uiout, buf); 1431 do 1432 { 1433 if (c < 040 && c != '\t' && c != '\n' && c != '\r') 1434 { 1435 xsnprintf (buf, sizeof (buf), "^%c", c + 0100); 1436 ui_out_text (uiout, buf); 1437 } 1438 else if (c == 0177) 1439 ui_out_text (uiout, "^?"); 1440 else if (c == '\r') 1441 { 1442 /* Skip a \r character, but only before a \n. */ 1443 int c1 = fgetc (stream); 1444 1445 if (c1 != '\n') 1446 printf_filtered ("^%c", c + 0100); 1447 if (c1 != EOF) 1448 ungetc (c1, stream); 1449 } 1450 else 1451 { 1452 xsnprintf (buf, sizeof (buf), "%c", c); 1453 ui_out_text (uiout, buf); 1454 } 1455 } 1456 while (c != '\n' && (c = fgetc (stream)) >= 0); 1457 } 1458 1459 do_cleanups (cleanup); 1460 } 1461 1462 /* Show source lines from the file of symtab S, starting with line 1463 number LINE and stopping before line number STOPLINE. If this is 1464 not the command line version, then the source is shown in the source 1465 window otherwise it is simply printed. */ 1466 1467 void 1468 print_source_lines (struct symtab *s, int line, int stopline, 1469 enum print_source_lines_flags flags) 1470 { 1471 print_source_lines_base (s, line, stopline, flags); 1472 } 1473 1474 /* Print info on range of pc's in a specified line. */ 1475 1476 static void 1477 line_info (char *arg, int from_tty) 1478 { 1479 struct symtabs_and_lines sals; 1480 struct symtab_and_line sal; 1481 CORE_ADDR start_pc, end_pc; 1482 int i; 1483 struct cleanup *cleanups; 1484 1485 init_sal (&sal); /* initialize to zeroes */ 1486 1487 if (arg == 0) 1488 { 1489 sal.symtab = current_source_symtab; 1490 sal.pspace = current_program_space; 1491 sal.line = last_line_listed; 1492 sals.nelts = 1; 1493 sals.sals = (struct symtab_and_line *) 1494 xmalloc (sizeof (struct symtab_and_line)); 1495 sals.sals[0] = sal; 1496 } 1497 else 1498 { 1499 sals = decode_line_with_last_displayed (arg, DECODE_LINE_LIST_MODE); 1500 1501 dont_repeat (); 1502 } 1503 1504 cleanups = make_cleanup (xfree, sals.sals); 1505 1506 /* C++ More than one line may have been specified, as when the user 1507 specifies an overloaded function name. Print info on them all. */ 1508 for (i = 0; i < sals.nelts; i++) 1509 { 1510 sal = sals.sals[i]; 1511 if (sal.pspace != current_program_space) 1512 continue; 1513 1514 if (sal.symtab == 0) 1515 { 1516 struct gdbarch *gdbarch = get_current_arch (); 1517 1518 printf_filtered (_("No line number information available")); 1519 if (sal.pc != 0) 1520 { 1521 /* This is useful for "info line *0x7f34". If we can't tell the 1522 user about a source line, at least let them have the symbolic 1523 address. */ 1524 printf_filtered (" for address "); 1525 wrap_here (" "); 1526 print_address (gdbarch, sal.pc, gdb_stdout); 1527 } 1528 else 1529 printf_filtered ("."); 1530 printf_filtered ("\n"); 1531 } 1532 else if (sal.line > 0 1533 && find_line_pc_range (sal, &start_pc, &end_pc)) 1534 { 1535 struct gdbarch *gdbarch = get_objfile_arch (sal.symtab->objfile); 1536 1537 if (start_pc == end_pc) 1538 { 1539 printf_filtered ("Line %d of \"%s\"", 1540 sal.line, 1541 symtab_to_filename_for_display (sal.symtab)); 1542 wrap_here (" "); 1543 printf_filtered (" is at address "); 1544 print_address (gdbarch, start_pc, gdb_stdout); 1545 wrap_here (" "); 1546 printf_filtered (" but contains no code.\n"); 1547 } 1548 else 1549 { 1550 printf_filtered ("Line %d of \"%s\"", 1551 sal.line, 1552 symtab_to_filename_for_display (sal.symtab)); 1553 wrap_here (" "); 1554 printf_filtered (" starts at address "); 1555 print_address (gdbarch, start_pc, gdb_stdout); 1556 wrap_here (" "); 1557 printf_filtered (" and ends at "); 1558 print_address (gdbarch, end_pc, gdb_stdout); 1559 printf_filtered (".\n"); 1560 } 1561 1562 /* x/i should display this line's code. */ 1563 set_next_address (gdbarch, start_pc); 1564 1565 /* Repeating "info line" should do the following line. */ 1566 last_line_listed = sal.line + 1; 1567 1568 /* If this is the only line, show the source code. If it could 1569 not find the file, don't do anything special. */ 1570 if (annotation_level && sals.nelts == 1) 1571 identify_source_line (sal.symtab, sal.line, 0, start_pc); 1572 } 1573 else 1574 /* Is there any case in which we get here, and have an address 1575 which the user would want to see? If we have debugging symbols 1576 and no line numbers? */ 1577 printf_filtered (_("Line number %d is out of range for \"%s\".\n"), 1578 sal.line, symtab_to_filename_for_display (sal.symtab)); 1579 } 1580 do_cleanups (cleanups); 1581 } 1582 1583 /* Commands to search the source file for a regexp. */ 1584 1585 static void 1586 forward_search_command (char *regex, int from_tty) 1587 { 1588 int c; 1589 int desc; 1590 FILE *stream; 1591 int line; 1592 char *msg; 1593 struct cleanup *cleanups; 1594 1595 line = last_line_listed + 1; 1596 1597 msg = (char *) re_comp (regex); 1598 if (msg) 1599 error (("%s"), msg); 1600 1601 if (current_source_symtab == 0) 1602 select_source_symtab (0); 1603 1604 desc = open_source_file (current_source_symtab); 1605 if (desc < 0) 1606 perror_with_name (symtab_to_filename_for_display (current_source_symtab)); 1607 cleanups = make_cleanup_close (desc); 1608 1609 if (current_source_symtab->line_charpos == 0) 1610 find_source_lines (current_source_symtab, desc); 1611 1612 if (line < 1 || line > current_source_symtab->nlines) 1613 error (_("Expression not found")); 1614 1615 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0) 1616 perror_with_name (symtab_to_filename_for_display (current_source_symtab)); 1617 1618 discard_cleanups (cleanups); 1619 stream = fdopen (desc, FDOPEN_MODE); 1620 clearerr (stream); 1621 cleanups = make_cleanup_fclose (stream); 1622 while (1) 1623 { 1624 static char *buf = NULL; 1625 char *p; 1626 int cursize, newsize; 1627 1628 cursize = 256; 1629 buf = xmalloc (cursize); 1630 p = buf; 1631 1632 c = fgetc (stream); 1633 if (c == EOF) 1634 break; 1635 do 1636 { 1637 *p++ = c; 1638 if (p - buf == cursize) 1639 { 1640 newsize = cursize + cursize / 2; 1641 buf = xrealloc (buf, newsize); 1642 p = buf + cursize; 1643 cursize = newsize; 1644 } 1645 } 1646 while (c != '\n' && (c = fgetc (stream)) >= 0); 1647 1648 /* Remove the \r, if any, at the end of the line, otherwise 1649 regular expressions that end with $ or \n won't work. */ 1650 if (p - buf > 1 && p[-2] == '\r') 1651 { 1652 p--; 1653 p[-1] = '\n'; 1654 } 1655 1656 /* We now have a source line in buf, null terminate and match. */ 1657 *p = 0; 1658 if (re_exec (buf) > 0) 1659 { 1660 /* Match! */ 1661 do_cleanups (cleanups); 1662 print_source_lines (current_source_symtab, line, line + 1, 0); 1663 set_internalvar_integer (lookup_internalvar ("_"), line); 1664 current_source_line = max (line - lines_to_list / 2, 1); 1665 return; 1666 } 1667 line++; 1668 } 1669 1670 printf_filtered (_("Expression not found\n")); 1671 do_cleanups (cleanups); 1672 } 1673 1674 static void 1675 reverse_search_command (char *regex, int from_tty) 1676 { 1677 int c; 1678 int desc; 1679 FILE *stream; 1680 int line; 1681 char *msg; 1682 struct cleanup *cleanups; 1683 1684 line = last_line_listed - 1; 1685 1686 msg = (char *) re_comp (regex); 1687 if (msg) 1688 error (("%s"), msg); 1689 1690 if (current_source_symtab == 0) 1691 select_source_symtab (0); 1692 1693 desc = open_source_file (current_source_symtab); 1694 if (desc < 0) 1695 perror_with_name (symtab_to_filename_for_display (current_source_symtab)); 1696 cleanups = make_cleanup_close (desc); 1697 1698 if (current_source_symtab->line_charpos == 0) 1699 find_source_lines (current_source_symtab, desc); 1700 1701 if (line < 1 || line > current_source_symtab->nlines) 1702 error (_("Expression not found")); 1703 1704 if (lseek (desc, current_source_symtab->line_charpos[line - 1], 0) < 0) 1705 perror_with_name (symtab_to_filename_for_display (current_source_symtab)); 1706 1707 discard_cleanups (cleanups); 1708 stream = fdopen (desc, FDOPEN_MODE); 1709 clearerr (stream); 1710 cleanups = make_cleanup_fclose (stream); 1711 while (line > 1) 1712 { 1713 /* FIXME!!! We walk right off the end of buf if we get a long line!!! */ 1714 char buf[4096]; /* Should be reasonable??? */ 1715 char *p = buf; 1716 1717 c = fgetc (stream); 1718 if (c == EOF) 1719 break; 1720 do 1721 { 1722 *p++ = c; 1723 } 1724 while (c != '\n' && (c = fgetc (stream)) >= 0); 1725 1726 /* Remove the \r, if any, at the end of the line, otherwise 1727 regular expressions that end with $ or \n won't work. */ 1728 if (p - buf > 1 && p[-2] == '\r') 1729 { 1730 p--; 1731 p[-1] = '\n'; 1732 } 1733 1734 /* We now have a source line in buf; null terminate and match. */ 1735 *p = 0; 1736 if (re_exec (buf) > 0) 1737 { 1738 /* Match! */ 1739 do_cleanups (cleanups); 1740 print_source_lines (current_source_symtab, line, line + 1, 0); 1741 set_internalvar_integer (lookup_internalvar ("_"), line); 1742 current_source_line = max (line - lines_to_list / 2, 1); 1743 return; 1744 } 1745 line--; 1746 if (fseek (stream, current_source_symtab->line_charpos[line - 1], 0) < 0) 1747 { 1748 const char *filename; 1749 1750 do_cleanups (cleanups); 1751 filename = symtab_to_filename_for_display (current_source_symtab); 1752 perror_with_name (filename); 1753 } 1754 } 1755 1756 printf_filtered (_("Expression not found\n")); 1757 do_cleanups (cleanups); 1758 return; 1759 } 1760 1761 /* If the last character of PATH is a directory separator, then strip it. */ 1762 1763 static void 1764 strip_trailing_directory_separator (char *path) 1765 { 1766 const int last = strlen (path) - 1; 1767 1768 if (last < 0) 1769 return; /* No stripping is needed if PATH is the empty string. */ 1770 1771 if (IS_DIR_SEPARATOR (path[last])) 1772 path[last] = '\0'; 1773 } 1774 1775 /* Return the path substitution rule that matches FROM. 1776 Return NULL if no rule matches. */ 1777 1778 static struct substitute_path_rule * 1779 find_substitute_path_rule (const char *from) 1780 { 1781 struct substitute_path_rule *rule = substitute_path_rules; 1782 1783 while (rule != NULL) 1784 { 1785 if (FILENAME_CMP (rule->from, from) == 0) 1786 return rule; 1787 rule = rule->next; 1788 } 1789 1790 return NULL; 1791 } 1792 1793 /* Add a new substitute-path rule at the end of the current list of rules. 1794 The new rule will replace FROM into TO. */ 1795 1796 void 1797 add_substitute_path_rule (char *from, char *to) 1798 { 1799 struct substitute_path_rule *rule; 1800 struct substitute_path_rule *new_rule; 1801 1802 new_rule = xmalloc (sizeof (struct substitute_path_rule)); 1803 new_rule->from = xstrdup (from); 1804 new_rule->to = xstrdup (to); 1805 new_rule->next = NULL; 1806 1807 /* If the list of rules are empty, then insert the new rule 1808 at the head of the list. */ 1809 1810 if (substitute_path_rules == NULL) 1811 { 1812 substitute_path_rules = new_rule; 1813 return; 1814 } 1815 1816 /* Otherwise, skip to the last rule in our list and then append 1817 the new rule. */ 1818 1819 rule = substitute_path_rules; 1820 while (rule->next != NULL) 1821 rule = rule->next; 1822 1823 rule->next = new_rule; 1824 } 1825 1826 /* Remove the given source path substitution rule from the current list 1827 of rules. The memory allocated for that rule is also deallocated. */ 1828 1829 static void 1830 delete_substitute_path_rule (struct substitute_path_rule *rule) 1831 { 1832 if (rule == substitute_path_rules) 1833 substitute_path_rules = rule->next; 1834 else 1835 { 1836 struct substitute_path_rule *prev = substitute_path_rules; 1837 1838 while (prev != NULL && prev->next != rule) 1839 prev = prev->next; 1840 1841 gdb_assert (prev != NULL); 1842 1843 prev->next = rule->next; 1844 } 1845 1846 xfree (rule->from); 1847 xfree (rule->to); 1848 xfree (rule); 1849 } 1850 1851 /* Implement the "show substitute-path" command. */ 1852 1853 static void 1854 show_substitute_path_command (char *args, int from_tty) 1855 { 1856 struct substitute_path_rule *rule = substitute_path_rules; 1857 char **argv; 1858 char *from = NULL; 1859 struct cleanup *cleanup; 1860 1861 argv = gdb_buildargv (args); 1862 cleanup = make_cleanup_freeargv (argv); 1863 1864 /* We expect zero or one argument. */ 1865 1866 if (argv != NULL && argv[0] != NULL && argv[1] != NULL) 1867 error (_("Too many arguments in command")); 1868 1869 if (argv != NULL && argv[0] != NULL) 1870 from = argv[0]; 1871 1872 /* Print the substitution rules. */ 1873 1874 if (from != NULL) 1875 printf_filtered 1876 (_("Source path substitution rule matching `%s':\n"), from); 1877 else 1878 printf_filtered (_("List of all source path substitution rules:\n")); 1879 1880 while (rule != NULL) 1881 { 1882 if (from == NULL || FILENAME_CMP (rule->from, from) == 0) 1883 printf_filtered (" `%s' -> `%s'.\n", rule->from, rule->to); 1884 rule = rule->next; 1885 } 1886 1887 do_cleanups (cleanup); 1888 } 1889 1890 /* Implement the "unset substitute-path" command. */ 1891 1892 static void 1893 unset_substitute_path_command (char *args, int from_tty) 1894 { 1895 struct substitute_path_rule *rule = substitute_path_rules; 1896 char **argv = gdb_buildargv (args); 1897 char *from = NULL; 1898 int rule_found = 0; 1899 struct cleanup *cleanup; 1900 1901 /* This function takes either 0 or 1 argument. */ 1902 1903 cleanup = make_cleanup_freeargv (argv); 1904 if (argv != NULL && argv[0] != NULL && argv[1] != NULL) 1905 error (_("Incorrect usage, too many arguments in command")); 1906 1907 if (argv != NULL && argv[0] != NULL) 1908 from = argv[0]; 1909 1910 /* If the user asked for all the rules to be deleted, ask him 1911 to confirm and give him a chance to abort before the action 1912 is performed. */ 1913 1914 if (from == NULL 1915 && !query (_("Delete all source path substitution rules? "))) 1916 error (_("Canceled")); 1917 1918 /* Delete the rule matching the argument. No argument means that 1919 all rules should be deleted. */ 1920 1921 while (rule != NULL) 1922 { 1923 struct substitute_path_rule *next = rule->next; 1924 1925 if (from == NULL || FILENAME_CMP (from, rule->from) == 0) 1926 { 1927 delete_substitute_path_rule (rule); 1928 rule_found = 1; 1929 } 1930 1931 rule = next; 1932 } 1933 1934 /* If the user asked for a specific rule to be deleted but 1935 we could not find it, then report an error. */ 1936 1937 if (from != NULL && !rule_found) 1938 error (_("No substitution rule defined for `%s'"), from); 1939 1940 forget_cached_source_info (); 1941 1942 do_cleanups (cleanup); 1943 } 1944 1945 /* Add a new source path substitution rule. */ 1946 1947 static void 1948 set_substitute_path_command (char *args, int from_tty) 1949 { 1950 char **argv; 1951 struct substitute_path_rule *rule; 1952 struct cleanup *cleanup; 1953 1954 argv = gdb_buildargv (args); 1955 cleanup = make_cleanup_freeargv (argv); 1956 1957 if (argv == NULL || argv[0] == NULL || argv [1] == NULL) 1958 error (_("Incorrect usage, too few arguments in command")); 1959 1960 if (argv[2] != NULL) 1961 error (_("Incorrect usage, too many arguments in command")); 1962 1963 if (*(argv[0]) == '\0') 1964 error (_("First argument must be at least one character long")); 1965 1966 /* Strip any trailing directory separator character in either FROM 1967 or TO. The substitution rule already implicitly contains them. */ 1968 strip_trailing_directory_separator (argv[0]); 1969 strip_trailing_directory_separator (argv[1]); 1970 1971 /* If a rule with the same "from" was previously defined, then 1972 delete it. This new rule replaces it. */ 1973 1974 rule = find_substitute_path_rule (argv[0]); 1975 if (rule != NULL) 1976 delete_substitute_path_rule (rule); 1977 1978 /* Insert the new substitution rule. */ 1979 1980 add_substitute_path_rule (argv[0], argv[1]); 1981 forget_cached_source_info (); 1982 1983 do_cleanups (cleanup); 1984 } 1985 1986 1987 void 1988 _initialize_source (void) 1989 { 1990 struct cmd_list_element *c; 1991 1992 current_source_symtab = 0; 1993 init_source_path (); 1994 1995 /* The intention is to use POSIX Basic Regular Expressions. 1996 Always use the GNU regex routine for consistency across all hosts. 1997 Our current GNU regex.c does not have all the POSIX features, so this is 1998 just an approximation. */ 1999 re_set_syntax (RE_SYNTAX_GREP); 2000 2001 c = add_cmd ("directory", class_files, directory_command, _("\ 2002 Add directory DIR to beginning of search path for source files.\n\ 2003 Forget cached info on source file locations and line positions.\n\ 2004 DIR can also be $cwd for the current working directory, or $cdir for the\n\ 2005 directory in which the source file was compiled into object code.\n\ 2006 With no argument, reset the search path to $cdir:$cwd, the default."), 2007 &cmdlist); 2008 2009 if (dbx_commands) 2010 add_com_alias ("use", "directory", class_files, 0); 2011 2012 set_cmd_completer (c, filename_completer); 2013 2014 add_setshow_optional_filename_cmd ("directories", 2015 class_files, 2016 &source_path, 2017 _("\ 2018 Set the search path for finding source files."), 2019 _("\ 2020 Show the search path for finding source files."), 2021 _("\ 2022 $cwd in the path means the current working directory.\n\ 2023 $cdir in the path means the compilation directory of the source file.\n\ 2024 GDB ensures the search path always ends with $cdir:$cwd by\n\ 2025 appending these directories if necessary.\n\ 2026 Setting the value to an empty string sets it to $cdir:$cwd, the default."), 2027 set_directories_command, 2028 show_directories_command, 2029 &setlist, &showlist); 2030 2031 if (xdb_commands) 2032 { 2033 add_com_alias ("D", "directory", class_files, 0); 2034 add_cmd ("ld", no_class, show_directories_1, _("\ 2035 Current search path for finding source files.\n\ 2036 $cwd in the path means the current working directory.\n\ 2037 $cdir in the path means the compilation directory of the source file."), 2038 &cmdlist); 2039 } 2040 2041 add_info ("source", source_info, 2042 _("Information about the current source file.")); 2043 2044 add_info ("line", line_info, _("\ 2045 Core addresses of the code for a source line.\n\ 2046 Line can be specified as\n\ 2047 LINENUM, to list around that line in current file,\n\ 2048 FILE:LINENUM, to list around that line in that file,\n\ 2049 FUNCTION, to list around beginning of that function,\n\ 2050 FILE:FUNCTION, to distinguish among like-named static functions.\n\ 2051 Default is to describe the last source line that was listed.\n\n\ 2052 This sets the default address for \"x\" to the line's first instruction\n\ 2053 so that \"x/i\" suffices to start examining the machine code.\n\ 2054 The address is also stored as the value of \"$_\".")); 2055 2056 add_com ("forward-search", class_files, forward_search_command, _("\ 2057 Search for regular expression (see regex(3)) from last line listed.\n\ 2058 The matching line number is also stored as the value of \"$_\".")); 2059 add_com_alias ("search", "forward-search", class_files, 0); 2060 add_com_alias ("fo", "forward-search", class_files, 1); 2061 2062 add_com ("reverse-search", class_files, reverse_search_command, _("\ 2063 Search backward for regular expression (see regex(3)) from last line listed.\n\ 2064 The matching line number is also stored as the value of \"$_\".")); 2065 add_com_alias ("rev", "reverse-search", class_files, 1); 2066 2067 if (xdb_commands) 2068 { 2069 add_com_alias ("/", "forward-search", class_files, 0); 2070 add_com_alias ("?", "reverse-search", class_files, 0); 2071 } 2072 2073 add_setshow_integer_cmd ("listsize", class_support, &lines_to_list, _("\ 2074 Set number of source lines gdb will list by default."), _("\ 2075 Show number of source lines gdb will list by default."), _("\ 2076 Use this to choose how many source lines the \"list\" displays (unless\n\ 2077 the \"list\" argument explicitly specifies some other number).\n\ 2078 A value of \"unlimited\", or zero, means there's no limit."), 2079 NULL, 2080 show_lines_to_list, 2081 &setlist, &showlist); 2082 2083 add_cmd ("substitute-path", class_files, set_substitute_path_command, 2084 _("\ 2085 Usage: set substitute-path FROM TO\n\ 2086 Add a substitution rule replacing FROM into TO in source file names.\n\ 2087 If a substitution rule was previously set for FROM, the old rule\n\ 2088 is replaced by the new one."), 2089 &setlist); 2090 2091 add_cmd ("substitute-path", class_files, unset_substitute_path_command, 2092 _("\ 2093 Usage: unset substitute-path [FROM]\n\ 2094 Delete the rule for substituting FROM in source file names. If FROM\n\ 2095 is not specified, all substituting rules are deleted.\n\ 2096 If the debugger cannot find a rule for FROM, it will display a warning."), 2097 &unsetlist); 2098 2099 add_cmd ("substitute-path", class_files, show_substitute_path_command, 2100 _("\ 2101 Usage: show substitute-path [FROM]\n\ 2102 Print the rule for substituting FROM in source file names. If FROM\n\ 2103 is not specified, print all substitution rules."), 2104 &showlist); 2105 2106 add_setshow_enum_cmd ("filename-display", class_files, 2107 filename_display_kind_names, 2108 &filename_display_string, _("\ 2109 Set how to display filenames."), _("\ 2110 Show how to display filenames."), _("\ 2111 filename-display can be:\n\ 2112 basename - display only basename of a filename\n\ 2113 relative - display a filename relative to the compilation directory\n\ 2114 absolute - display an absolute filename\n\ 2115 By default, relative filenames are displayed."), 2116 NULL, 2117 show_filename_display_string, 2118 &setlist, &showlist); 2119 2120 } 2121