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