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