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