OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [source.c] - Blame information for rev 859

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.