]> Git Repo - binutils.git/blob - gdb/symtab.c
* xcoffread.c (struct coff_symbol): Change c_sclass to unsigned char.
[binutils.git] / gdb / symtab.c
1 /* Symbol table lookup for the GNU debugger, GDB.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992
3    Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 #include "defs.h"
22 #include "symtab.h"
23 #include "gdbtypes.h"
24 #include "gdbcore.h"
25 #include "frame.h"
26 #include "target.h"
27 #include "value.h"
28 #include "symfile.h"
29 #include "objfiles.h"
30 #include "gdbcmd.h"
31 #include "call-cmds.h"
32 #include "regex.h"
33 #include "expression.h"
34 #include "language.h"
35 #include "demangle.h"
36
37 #include <obstack.h>
38 #include <assert.h>
39
40 #include <sys/types.h>
41 #include <fcntl.h>
42 #include <string.h>
43 #include <sys/stat.h>
44 #include <ctype.h>
45
46 /* Prototypes for local functions */
47
48 extern int
49 find_methods PARAMS ((struct type *, char *, struct symbol **));
50
51 static void
52 completion_list_add_name PARAMS ((char *, char *, int));
53
54 static struct symtabs_and_lines
55 decode_line_2 PARAMS ((struct symbol *[], int, int));
56
57 static void
58 rbreak_command PARAMS ((char *, int));
59
60 static void
61 types_info PARAMS ((char *, int));
62
63 static void
64 functions_info PARAMS ((char *, int));
65
66 static void
67 variables_info PARAMS ((char *, int));
68
69 static void
70 sources_info PARAMS ((char *, int));
71
72 static void
73 list_symbols PARAMS ((char *, int, int));
74
75 static void
76 output_source_filename PARAMS ((char *, int *));
77
78 static char *
79 operator_chars PARAMS ((char *, char **));
80
81 static int
82 find_line_common PARAMS ((struct linetable *, int, int *));
83
84 static struct partial_symbol *
85 lookup_partial_symbol PARAMS ((struct partial_symtab *, const char *,
86                                int, enum namespace));
87
88 static struct symtab *
89 lookup_symtab_1 PARAMS ((char *));
90
91 /* */
92
93 /* The single non-language-specific builtin type */
94 struct type *builtin_type_error;
95
96 /* Block in which the most recently searched-for symbol was found.
97    Might be better to make this a parameter to lookup_symbol and 
98    value_of_this. */
99
100 const struct block *block_found;
101
102 char no_symtab_msg[] = "No symbol table is loaded.  Use the \"file\" command.";
103
104 /* While the C++ support is still in flux, issue a possibly helpful hint on
105    using the new command completion feature on single quoted demangled C++
106    symbols.  Remove when loose ends are cleaned up.   FIXME -fnf */
107
108 void
109 cplusplus_hint (name)
110      char *name;
111 {
112   printf ("Hint: try '%s<TAB> or '%s<ESC-?>\n", name, name);
113   printf ("(Note leading single quote.)\n");
114 }
115
116 /* Check for a symtab of a specific name; first in symtabs, then in
117    psymtabs.  *If* there is no '/' in the name, a match after a '/'
118    in the symtab filename will also work.  */
119
120 static struct symtab *
121 lookup_symtab_1 (name)
122      char *name;
123 {
124   register struct symtab *s;
125   register struct partial_symtab *ps;
126   register char *slash;
127   register struct objfile *objfile;
128
129  got_symtab:
130
131   /* First, search for an exact match */
132
133   ALL_SYMTABS (objfile, s)
134     if (STREQ (name, s->filename))
135       return s;
136
137   slash = strchr (name, '/');
138
139   /* Now, search for a matching tail (only if name doesn't have any dirs) */
140
141   if (!slash)
142     ALL_SYMTABS (objfile, s)
143       {
144         char *p = s -> filename;
145         char *tail = strrchr (p, '/');
146
147         if (tail)
148           p = tail + 1;
149
150         if (STREQ (p, name))
151           return s;
152       }
153
154   /* Same search rules as above apply here, but now we look thru the
155      psymtabs.  */
156
157   ALL_PSYMTABS (objfile, ps)
158     if (STREQ (name, ps -> filename))
159       goto got_psymtab;
160
161   if (!slash)
162     ALL_PSYMTABS (objfile, ps)
163       {
164         char *p = ps -> filename;
165         char *tail = strrchr (p, '/');
166
167         if (tail)
168           p = tail + 1;
169
170         if (STREQ (p, name))
171           goto got_psymtab;
172       }
173
174   return (NULL);
175
176  got_psymtab:
177
178   if (ps -> readin)
179     error ("Internal: readin %s pst for `%s' found when no symtab found.",
180            ps -> filename, name);
181
182   s = PSYMTAB_TO_SYMTAB (ps);
183
184   if (s)
185     return s;
186
187   /* At this point, we have located the psymtab for this file, but
188      the conversion to a symtab has failed.  This usually happens
189      when we are looking up an include file.  In this case,
190      PSYMTAB_TO_SYMTAB doesn't return a symtab, even though one has
191      been created.  So, we need to run through the symtabs again in
192      order to find the file.
193      XXX - This is a crock, and should be fixed inside of the the
194      symbol parsing routines. */
195   goto got_symtab;
196 }
197
198 /* Lookup the symbol table of a source file named NAME.  Try a couple
199    of variations if the first lookup doesn't work.  */
200
201 struct symtab *
202 lookup_symtab (name)
203      char *name;
204 {
205   register struct symtab *s;
206   register char *copy;
207
208   s = lookup_symtab_1 (name);
209   if (s) return s;
210
211   /* If name not found as specified, see if adding ".c" helps.  */
212
213   copy = (char *) alloca (strlen (name) + 3);
214   strcpy (copy, name);
215   strcat (copy, ".c");
216   s = lookup_symtab_1 (copy);
217   if (s) return s;
218
219   /* We didn't find anything; die.  */
220   return 0;
221 }
222
223 /* Lookup the partial symbol table of a source file named NAME.  This
224    only returns true on an exact match (ie. this semantics are
225    different from lookup_symtab.  */
226
227 struct partial_symtab *
228 lookup_partial_symtab (name)
229 char *name;
230 {
231   register struct partial_symtab *pst;
232   register struct objfile *objfile;
233   
234   ALL_PSYMTABS (objfile, pst)
235     {
236       if (STREQ (name, pst -> filename))
237         {
238           return (pst);
239         }
240     }
241   return (NULL);
242 }
243 \f
244 /* Demangle a GDB method stub type.  */
245 char *
246 gdb_mangle_name (type, i, j)
247      struct type *type;
248      int i, j;
249 {
250   int mangled_name_len;
251   char *mangled_name;
252   struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
253   struct fn_field *method = &f[j];
254   char *field_name = TYPE_FN_FIELDLIST_NAME (type, i);
255   char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
256   char *newname = type_name_no_tag (type);
257   int is_constructor = STREQ (field_name, newname);
258   int is_destructor = is_constructor && physname[0] == '_'
259       && physname[1] == CPLUS_MARKER && physname[2] == '_';
260   /* Need a new type prefix.  */
261   char *const_prefix = method->is_const ? "C" : "";
262   char *volatile_prefix = method->is_volatile ? "V" : "";
263   char buf[20];
264 #ifndef GCC_MANGLE_BUG
265   int len = strlen (newname);
266
267   if (is_destructor)
268     {
269       mangled_name = (char*) xmalloc(strlen(physname)+1);
270       strcpy(mangled_name, physname);
271       return mangled_name;
272     }
273
274   sprintf (buf, "__%s%s%d", const_prefix, volatile_prefix, len);
275   mangled_name_len = ((is_constructor ? 0 : strlen (field_name))
276                           + strlen (buf) + len
277                           + strlen (physname)
278                           + 1);
279
280   /* Only needed for GNU-mangled names.  ANSI-mangled names
281      work with the normal mechanisms.  */
282   if (OPNAME_PREFIX_P (field_name))
283     {
284       char *opname = cplus_mangle_opname (field_name + 3, 0);
285       if (opname == NULL)
286         error ("No mangling for \"%s\"", field_name);
287       mangled_name_len += strlen (opname);
288       mangled_name = (char *)xmalloc (mangled_name_len);
289
290       strncpy (mangled_name, field_name, 3);
291       mangled_name[3] = '\0';
292       strcat (mangled_name, opname);
293     }
294   else
295     {
296       mangled_name = (char *)xmalloc (mangled_name_len);
297       if (is_constructor)
298         mangled_name[0] = '\0';
299       else
300         strcpy (mangled_name, field_name);
301     }
302   strcat (mangled_name, buf);
303   strcat (mangled_name, newname);
304 #else
305   char *opname;
306
307   if (is_constructor)
308     {
309       buf[0] = '\0';
310     }
311   else
312     {
313       sprintf (buf, "__%s%s", const_prefix, volatile_prefix);
314     }
315
316   mangled_name_len = ((is_constructor ? 0 : strlen (field_name))
317                       + strlen (buf) + strlen (physname) + 1);
318
319   /* Only needed for GNU-mangled names.  ANSI-mangled names
320      work with the normal mechanisms.  */
321   if (OPNAME_PREFIX_P (field_name))
322     {
323       opname = cplus_mangle_opname (field_name + 3, 0);
324       if (opname == NULL)
325         {
326           error ("No mangling for \"%s\"", field_name);
327         }
328       mangled_name_len += strlen (opname);
329       mangled_name = (char *) xmalloc (mangled_name_len);
330
331       strncpy (mangled_name, field_name, 3);
332       strcpy (mangled_name + 3, opname);
333     }
334   else
335     {
336       mangled_name = (char *) xmalloc (mangled_name_len);
337       if (is_constructor)
338         {
339           mangled_name[0] = '\0';
340         }
341       else
342         {
343           strcpy (mangled_name, field_name);
344         }
345     }
346   strcat (mangled_name, buf);
347
348 #endif
349   strcat (mangled_name, physname);
350   return (mangled_name);
351 }
352
353 \f
354 /* Find which partial symtab on contains PC.  Return 0 if none.  */
355
356 struct partial_symtab *
357 find_pc_psymtab (pc)
358      register CORE_ADDR pc;
359 {
360   register struct partial_symtab *pst;
361   register struct objfile *objfile;
362
363   ALL_PSYMTABS (objfile, pst)
364     {
365       if (pc >= pst->textlow && pc < pst->texthigh)
366         return (pst);
367     }
368   return (NULL);
369 }
370
371 /* Find which partial symbol within a psymtab contains PC.  Return 0
372    if none.  Check all psymtabs if PSYMTAB is 0.  */
373 struct partial_symbol *
374 find_pc_psymbol (psymtab, pc)
375      struct partial_symtab *psymtab;
376      CORE_ADDR pc;
377 {
378   struct partial_symbol *best, *p;
379   CORE_ADDR best_pc;
380   
381   if (!psymtab)
382     psymtab = find_pc_psymtab (pc);
383   if (!psymtab)
384     return 0;
385
386   best_pc = psymtab->textlow - 1;
387
388   for (p = psymtab->objfile->static_psymbols.list + psymtab->statics_offset;
389        (p - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset)
390         < psymtab->n_static_syms);
391        p++)
392     if (SYMBOL_NAMESPACE (p) == VAR_NAMESPACE
393         && SYMBOL_CLASS (p) == LOC_BLOCK
394         && pc >= SYMBOL_VALUE_ADDRESS (p)
395         && SYMBOL_VALUE_ADDRESS (p) > best_pc)
396       {
397         best_pc = SYMBOL_VALUE_ADDRESS (p);
398         best = p;
399       }
400   if (best_pc == psymtab->textlow - 1)
401     return 0;
402   return best;
403 }
404
405 \f
406 /* Find the definition for a specified symbol name NAME
407    in namespace NAMESPACE, visible from lexical block BLOCK.
408    Returns the struct symbol pointer, or zero if no symbol is found.
409    If SYMTAB is non-NULL, store the symbol table in which the
410    symbol was found there, or NULL if not found.
411    C++: if IS_A_FIELD_OF_THIS is nonzero on entry, check to see if
412    NAME is a field of the current implied argument `this'.  If so set
413    *IS_A_FIELD_OF_THIS to 1, otherwise set it to zero. 
414    BLOCK_FOUND is set to the block in which NAME is found (in the case of
415    a field of `this', value_of_this sets BLOCK_FOUND to the proper value.) */
416
417 struct symbol *
418 lookup_symbol (name, block, namespace, is_a_field_of_this, symtab)
419      const char *name;
420      register const struct block *block;
421      const enum namespace namespace;
422      int *is_a_field_of_this;
423      struct symtab **symtab;
424 {
425   register struct symbol *sym;
426   register struct symtab *s;
427   register struct partial_symtab *ps;
428   struct blockvector *bv;
429   register struct objfile *objfile;
430   register struct block *b;
431   register struct minimal_symbol *msymbol;
432   char *temp;
433   extern char *gdb_completer_word_break_characters;
434
435   /* Search specified block and its superiors.  */
436
437   while (block != 0)
438     {
439       sym = lookup_block_symbol (block, name, namespace);
440       if (sym) 
441         {
442           block_found = block;
443           if (symtab != NULL)
444             {
445               /* Search the list of symtabs for one which contains the
446                  address of the start of this block.  */
447               ALL_SYMTABS (objfile, s)
448                 {
449                   bv = BLOCKVECTOR (s);
450                   b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
451                   if (BLOCK_START (b) <= BLOCK_START (block)
452                       && BLOCK_END (b) > BLOCK_START (block))
453                     goto found;
454                 }
455 found:
456               *symtab = s;
457             }
458
459           return (sym);
460         }
461       block = BLOCK_SUPERBLOCK (block);
462     }
463
464   /* Don't need to mess with the psymtabs; if we have a block,
465      that file is read in.  If we don't, then we deal later with
466      all the psymtab stuff that needs checking.  */
467   if (namespace == VAR_NAMESPACE && block != NULL)
468     {
469       struct block *b;
470       /* Find the right symtab.  */
471       ALL_SYMTABS (objfile, s)
472         {
473           bv = BLOCKVECTOR (s);
474           b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
475           if (BLOCK_START (b) <= BLOCK_START (block)
476               && BLOCK_END (b) > BLOCK_START (block))
477             {
478               sym = lookup_block_symbol (b, name, VAR_NAMESPACE);
479               if (sym)
480                 {
481                   block_found = b;
482                   if (symtab != NULL)
483                     *symtab = s;
484                   return sym;
485                 }
486             }
487         }
488     }
489
490
491   /* C++: If requested to do so by the caller, 
492      check to see if NAME is a field of `this'. */
493   if (is_a_field_of_this)
494     {
495       struct value *v = value_of_this (0);
496       
497       *is_a_field_of_this = 0;
498       if (v && check_field (v, name))
499         {
500           *is_a_field_of_this = 1;
501           if (symtab != NULL)
502             *symtab = NULL;
503           return 0;
504         }
505     }
506
507   /* Now search all global blocks.  Do the symtab's first, then
508      check the psymtab's */
509   
510   ALL_SYMTABS (objfile, s)
511     {
512       bv = BLOCKVECTOR (s);
513       block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
514       sym = lookup_block_symbol (block, name, namespace);
515       if (sym) 
516         {
517           block_found = block;
518           if (symtab != NULL)
519             *symtab = s;
520           return sym;
521         }
522     }
523
524   /* Check for the possibility of the symbol being a global function
525      that is stored in one of the minimal symbol tables.  Eventually, all
526      global symbols might be resolved in this way.  */
527   
528   if (namespace == VAR_NAMESPACE)
529     {
530       msymbol = lookup_minimal_symbol (name, (struct objfile *) NULL);
531       if (msymbol != NULL)
532         {
533           s = find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol));
534           /* If S is NULL, there are no debug symbols for this file.
535              Skip this stuff and check for matching static symbols below. */
536           if (s != NULL)
537             {
538               bv = BLOCKVECTOR (s);
539               block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
540               sym = lookup_block_symbol (block, SYMBOL_NAME (msymbol),
541                                          namespace);
542               /* We kept static functions in minimal symbol table as well as
543                  in static scope. We want to find them in the symbol table. */
544                 if (!sym) {
545                   block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
546                   sym = lookup_block_symbol (block, SYMBOL_NAME (msymbol),
547                                              namespace);
548                 }
549
550               /* sym == 0 if symbol was found in the minimal symbol table
551                  but not in the symtab.
552                  Return 0 to use the msymbol definition of "foo_".
553
554                  This happens for Fortran  "foo_" symbols,
555                  which are "foo" in the symtab.
556
557                  This can also happen if "asm" is used to make a
558                  regular symbol but not a debugging symbol, e.g.
559                  asm(".globl _main");
560                  asm("_main:");
561                  */
562
563               if (symtab != NULL)
564                 *symtab = s;
565               return sym;
566             }
567         }
568     }
569       
570   ALL_PSYMTABS (objfile, ps)
571     {
572       if (!ps->readin && lookup_partial_symbol (ps, name, 1, namespace))
573         {
574           s = PSYMTAB_TO_SYMTAB(ps);
575           bv = BLOCKVECTOR (s);
576           block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
577           sym = lookup_block_symbol (block, name, namespace);
578           if (!sym)
579             error ("Internal: global symbol `%s' found in %s psymtab but not in symtab", name, ps->filename);
580           if (symtab != NULL)
581             *symtab = s;
582           return sym;
583         }
584     }
585
586   /* Now search all per-file blocks.
587      Not strictly correct, but more useful than an error.
588      Do the symtabs first, then check the psymtabs */
589
590   ALL_SYMTABS (objfile, s)
591     {
592       bv = BLOCKVECTOR (s);
593       block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
594       sym = lookup_block_symbol (block, name, namespace);
595       if (sym) 
596         {
597           block_found = block;
598           if (symtab != NULL)
599             *symtab = s;
600           return sym;
601         }
602     }
603
604   ALL_PSYMTABS (objfile, ps)
605     {
606       if (!ps->readin && lookup_partial_symbol (ps, name, 0, namespace))
607         {
608           s = PSYMTAB_TO_SYMTAB(ps);
609           bv = BLOCKVECTOR (s);
610           block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
611           sym = lookup_block_symbol (block, name, namespace);
612           if (!sym)
613             error ("Internal: static symbol `%s' found in %s psymtab but not in symtab", name, ps->filename);
614           if (symtab != NULL)
615             *symtab = s;
616           return sym;
617         }
618     }
619
620   /* Now search all per-file blocks for static mangled symbols.
621      Do the symtabs first, then check the psymtabs.  */
622
623   if (namespace == VAR_NAMESPACE)
624     {
625       ALL_SYMTABS (objfile, s)
626         {
627           bv = BLOCKVECTOR (s);
628           block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
629           sym = lookup_block_symbol (block, name, VAR_NAMESPACE);
630           if (sym) 
631             {
632               block_found = block;
633               if (symtab != NULL)
634                 *symtab = s;
635               return sym;
636             }
637         }
638
639       ALL_PSYMTABS (objfile, ps)
640         {
641           if (!ps->readin && lookup_partial_symbol (ps, name, 0, VAR_NAMESPACE))
642             {
643               s = PSYMTAB_TO_SYMTAB(ps);
644               bv = BLOCKVECTOR (s);
645               block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
646               sym = lookup_block_symbol (block, name, VAR_NAMESPACE);
647               if (!sym)
648                 error ("Internal: mangled static symbol `%s' found in %s psymtab but not in symtab", name, ps->filename);
649               if (symtab != NULL)
650                 *symtab = s;
651               return sym;
652             }
653         }
654     }
655
656   if (symtab != NULL)
657     *symtab = NULL;
658   return 0;
659 }
660
661 /* Look, in partial_symtab PST, for symbol NAME.  Check the global
662    symbols if GLOBAL, the static symbols if not */
663
664 static struct partial_symbol *
665 lookup_partial_symbol (pst, name, global, namespace)
666      struct partial_symtab *pst;
667      const char *name;
668      int global;
669      enum namespace namespace;
670 {
671   struct partial_symbol *start, *psym;
672   struct partial_symbol *top, *bottom, *center;
673   int length = (global ? pst->n_global_syms : pst->n_static_syms);
674   int do_linear_search = 1;
675
676   if (length == 0)
677     {
678       return (NULL);
679     }
680   
681   start = (global ?
682            pst->objfile->global_psymbols.list + pst->globals_offset :
683            pst->objfile->static_psymbols.list + pst->statics_offset  );
684
685   if (global)           /* This means we can use a binary search. */
686     {
687       do_linear_search = 0;
688
689       /* Binary search.  This search is guaranteed to end with center
690          pointing at the earliest partial symbol with the correct
691          name.  At that point *all* partial symbols with that name
692          will be checked against the correct namespace. */
693
694       bottom = start;
695       top = start + length - 1;
696       while (top > bottom)
697         {
698           center = bottom + (top - bottom) / 2;
699           assert (center < top);
700           if (!do_linear_search && SYMBOL_LANGUAGE (center) == language_cplus)
701             {
702               do_linear_search = 1;
703             }
704           if (STRCMP (SYMBOL_NAME (center), name) >= 0)
705             {
706               top = center;
707             }
708           else
709             {
710               bottom = center + 1;
711             }
712         }
713       assert (top == bottom);
714       while (STREQ (SYMBOL_NAME (top), name))
715         {
716           if (SYMBOL_NAMESPACE (top) == namespace)
717             {
718               return top;
719             }
720           top ++;
721         }
722     }
723
724   /* Can't use a binary search or else we found during the binary search that
725      we should also do a linear search. */
726
727   if (do_linear_search)
728     {
729       for (psym = start; psym < start + length; psym++)
730         {
731           if (namespace == SYMBOL_NAMESPACE (psym))
732             {
733               if (SYMBOL_MATCHES_NAME (psym, name))
734                 {
735                   return (psym);
736                 }
737             }
738         }
739     }
740
741   return (NULL);
742 }
743
744 /* Find the psymtab containing main(). */
745 /* FIXME:  What about languages without main() or specially linked
746    executables that have no main() ? */
747
748 struct partial_symtab *
749 find_main_psymtab ()
750 {
751   register struct partial_symtab *pst;
752   register struct objfile *objfile;
753
754   ALL_PSYMTABS (objfile, pst)
755     {
756       if (lookup_partial_symbol (pst, "main", 1, VAR_NAMESPACE))
757         {
758           return (pst);
759         }
760     }
761   return (NULL);
762 }
763
764 /* Search BLOCK for symbol NAME in NAMESPACE.
765
766    Note that if NAME is the demangled form of a C++ symbol, we will fail
767    to find a match during the binary search of the non-encoded names, but
768    for now we don't worry about the slight inefficiency of looking for
769    a match we'll never find, since it will go pretty quick.  Once the
770    binary search terminates, we drop through and do a straight linear
771    search on the symbols.  Each symbol which is marked as being a C++
772    symbol (language_cplus set) has both the encoded and non-encoded names
773    tested for a match. */
774
775 struct symbol *
776 lookup_block_symbol (block, name, namespace)
777      register const struct block *block;
778      const char *name;
779      const enum namespace namespace;
780 {
781   register int bot, top, inc;
782   register struct symbol *sym;
783   register struct symbol *sym_found = NULL;
784   register int do_linear_search = 1;
785
786   /* If the blocks's symbols were sorted, start with a binary search.  */
787
788   if (BLOCK_SHOULD_SORT (block))
789     {
790       /* Reset the linear search flag so if the binary search fails, we
791          won't do the linear search once unless we find some reason to
792          do so, such as finding a C++ symbol during the binary search.
793          Note that for C++ modules, ALL the symbols in a block should
794          end up marked as C++ symbols. */
795
796       do_linear_search = 0;
797       top = BLOCK_NSYMS (block);
798       bot = 0;
799
800       /* Advance BOT to not far before the first symbol whose name is NAME. */
801
802       while (1)
803         {
804           inc = (top - bot + 1);
805           /* No need to keep binary searching for the last few bits worth.  */
806           if (inc < 4)
807             {
808               break;
809             }
810           inc = (inc >> 1) + bot;
811           sym = BLOCK_SYM (block, inc);
812           if (!do_linear_search && SYMBOL_LANGUAGE (sym) == language_cplus)
813             {
814               do_linear_search = 1;
815             }
816           if (SYMBOL_NAME (sym)[0] < name[0])
817             {
818               bot = inc;
819             }
820           else if (SYMBOL_NAME (sym)[0] > name[0])
821             {
822               top = inc;
823             }
824           else if (STRCMP (SYMBOL_NAME (sym), name) < 0)
825             {
826               bot = inc;
827             }
828           else
829             {
830               top = inc;
831             }
832         }
833
834       /* Now scan forward until we run out of symbols, find one whose name is
835          greater than NAME, or find one we want.  If there is more than one
836          symbol with the right name and namespace, we return the first one.
837          dbxread.c is careful to make sure that if one is a register then it
838          comes first.  */
839
840       top = BLOCK_NSYMS (block);
841       while (bot < top)
842         {
843           sym = BLOCK_SYM (block, bot);
844           inc = SYMBOL_NAME (sym)[0] - name[0];
845           if (inc == 0)
846             {
847               inc = STRCMP (SYMBOL_NAME (sym), name);
848             }
849           if (inc == 0 && SYMBOL_NAMESPACE (sym) == namespace)
850             {
851               return (sym);
852             }
853           if (inc > 0)
854             {
855               break;
856             }
857           bot++;
858         }
859     }
860
861   /* Here if block isn't sorted, or we fail to find a match during the
862      binary search above.  If during the binary search above, we find a
863      symbol which is a C++ symbol, then we have re-enabled the linear
864      search flag which was reset when starting the binary search.
865
866      This loop is equivalent to the loop above, but hacked greatly for speed.
867
868      Note that parameter symbols do not always show up last in the
869      list; this loop makes sure to take anything else other than
870      parameter symbols first; it only uses parameter symbols as a
871      last resort.  Note that this only takes up extra computation
872      time on a match.  */
873
874   if (do_linear_search)
875     {
876       top = BLOCK_NSYMS (block);
877       bot = 0;
878       while (bot < top)
879         {
880           sym = BLOCK_SYM (block, bot);
881           if (SYMBOL_NAMESPACE (sym) == namespace &&
882               SYMBOL_MATCHES_NAME (sym, name))
883             {
884               sym_found = sym;
885               if (SYMBOL_CLASS (sym) != LOC_ARG &&
886                   SYMBOL_CLASS (sym) != LOC_LOCAL_ARG &&
887                   SYMBOL_CLASS (sym) != LOC_REF_ARG &&
888                   SYMBOL_CLASS (sym) != LOC_REGPARM)
889                 {
890                   break;
891                 }
892             }
893           bot++;
894         }
895     }
896   return (sym_found);           /* Will be NULL if not found. */
897 }
898
899 \f
900 /* Return the symbol for the function which contains a specified
901    lexical block, described by a struct block BL.  */
902
903 struct symbol *
904 block_function (bl)
905      struct block *bl;
906 {
907   while (BLOCK_FUNCTION (bl) == 0 && BLOCK_SUPERBLOCK (bl) != 0)
908     bl = BLOCK_SUPERBLOCK (bl);
909
910   return BLOCK_FUNCTION (bl);
911 }
912
913 /* Find the symtab associated with PC.  Look through the psymtabs and read in
914    another symtab if necessary. */
915
916 struct symtab *
917 find_pc_symtab (pc)
918      register CORE_ADDR pc;
919 {
920   register struct block *b;
921   struct blockvector *bv;
922   register struct symtab *s = NULL;
923   register struct partial_symtab *ps;
924   register struct objfile *objfile;
925
926   /* Search all symtabs for one whose file contains our pc */
927
928   ALL_SYMTABS (objfile, s)
929     {
930       bv = BLOCKVECTOR (s);
931       b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
932       if (BLOCK_START (b) <= pc
933           && BLOCK_END (b) > pc)
934         return (s);
935     }
936
937   s = NULL;
938   ps = find_pc_psymtab (pc);
939   if (ps)
940     {
941       if (ps->readin)
942         printf_filtered ("(Internal error: pc 0x%x in read in psymtab, but not in symtab.)\n", pc);
943       s = PSYMTAB_TO_SYMTAB (ps);
944     }
945   return (s);
946 }
947
948 /* Find the source file and line number for a given PC value.
949    Return a structure containing a symtab pointer, a line number,
950    and a pc range for the entire source line.
951    The value's .pc field is NOT the specified pc.
952    NOTCURRENT nonzero means, if specified pc is on a line boundary,
953    use the line that ends there.  Otherwise, in that case, the line
954    that begins there is used.  */
955
956 /* The big complication here is that a line may start in one file, and end just
957    before the start of another file.  This usually occurs when you #include
958    code in the middle of a subroutine.  To properly find the end of a line's PC
959    range, we must search all symtabs associated with this compilation unit, and
960    find the one whose first PC is closer than that of the next line in this
961    symtab.
962
963    FIXME:  We used to complain here about zero length or negative length line
964    tables, but there are two problems with this: (1) some symtabs may not have
965    any line numbers due to gcc -g1 compilation, and (2) this function is called
966    during single stepping, when we don't own the terminal and thus can't
967    produce any output.  One solution might be to implement a mechanism whereby
968    complaints can be queued until we regain control of the terminal.  -fnf
969  */
970
971 struct symtab_and_line
972 find_pc_line (pc, notcurrent)
973      CORE_ADDR pc;
974      int notcurrent;
975 {
976   struct symtab *s;
977   register struct linetable *l;
978   register int len;
979   register int i;
980   register struct linetable_entry *item;
981   struct symtab_and_line val;
982   struct blockvector *bv;
983
984   /* Info on best line seen so far, and where it starts, and its file.  */
985
986   struct linetable_entry *best = NULL;
987   CORE_ADDR best_end = 0;
988   struct symtab *best_symtab = 0;
989
990   /* Store here the first line number
991      of a file which contains the line at the smallest pc after PC.
992      If we don't find a line whose range contains PC,
993      we will use a line one less than this,
994      with a range from the start of that file to the first line's pc.  */
995   struct linetable_entry *alt = NULL;
996   struct symtab *alt_symtab = 0;
997
998   /* Info on best line seen in this file.  */
999
1000   struct linetable_entry *prev;
1001
1002   /* If this pc is not from the current frame,
1003      it is the address of the end of a call instruction.
1004      Quite likely that is the start of the following statement.
1005      But what we want is the statement containing the instruction.
1006      Fudge the pc to make sure we get that.  */
1007
1008   if (notcurrent) pc -= 1;
1009
1010   s = find_pc_symtab (pc);
1011   if (!s)
1012     {
1013       val.symtab = 0;
1014       val.line = 0;
1015       val.pc = pc;
1016       val.end = 0;
1017       return val;
1018     }
1019
1020   bv = BLOCKVECTOR (s);
1021
1022   /* Look at all the symtabs that share this blockvector.
1023      They all have the same apriori range, that we found was right;
1024      but they have different line tables.  */
1025
1026   for (; s && BLOCKVECTOR (s) == bv; s = s->next)
1027     {
1028       /* Find the best line in this symtab.  */
1029       l = LINETABLE (s);
1030       if (!l)
1031         continue;
1032       len = l->nitems;
1033       if (len <= 0)               /* See FIXME above. */
1034         {
1035           continue;
1036         }
1037
1038       prev = NULL;
1039       item = l->item;           /* Get first line info */
1040
1041       /* Is this file's first line closer than the first lines of other files?
1042          If so, record this file, and its first line, as best alternate.  */
1043       if (item->pc > pc && (!alt || item->pc < alt->pc))
1044         {
1045           alt = item;
1046           alt_symtab = s;
1047         }
1048
1049       for (i = 0; i < len; i++, item++)
1050         {
1051           /* Return the last line that did not start after PC.  */
1052           if (item->pc > pc)
1053             break;
1054
1055           prev = item;
1056         }
1057
1058       /* At this point, prev points at the line whose start addr is <= pc, and
1059          item points at the next line.  If we ran off the end of the linetable
1060          (pc >= start of the last line), then prev == item.  If pc < start of
1061          the first line, prev will not be set.  */
1062
1063       /* Is this file's best line closer than the best in the other files?
1064          If so, record this file, and its best line, as best so far.  */
1065
1066       if (prev && (!best || prev->pc > best->pc))
1067         {
1068           best = prev;
1069           best_symtab = s;
1070           /* If another line is in the linetable, and its PC is closer
1071              than the best_end we currently have, take it as best_end.  */
1072           if (i < len && (best_end == 0 || best_end > item->pc))
1073             best_end = item->pc;
1074         }
1075     }
1076
1077   if (!best_symtab)
1078     {
1079       if (!alt_symtab)
1080         {                       /* If we didn't find any line # info, just
1081                                  return zeros.  */
1082           val.symtab = 0;
1083           val.line = 0;
1084           val.pc = pc;
1085           val.end = 0;
1086         }
1087       else
1088         {
1089           val.symtab = alt_symtab;
1090           val.line = alt->line - 1;
1091           val.pc = BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
1092           val.end = alt->pc;
1093         }
1094     }
1095   else
1096     {
1097       val.symtab = best_symtab;
1098       val.line = best->line;
1099       val.pc = best->pc;
1100       if (best_end && (!alt || best_end < alt->pc))
1101         val.end = best_end;
1102       else if (alt)
1103         val.end = alt->pc;
1104       else
1105         val.end = BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
1106     }
1107   return val;
1108 }
1109 \f
1110 /* Find the PC value for a given source file and line number.
1111    Returns zero for invalid line number.
1112    The source file is specified with a struct symtab.  */
1113
1114 CORE_ADDR
1115 find_line_pc (symtab, line)
1116      struct symtab *symtab;
1117      int line;
1118 {
1119   register struct linetable *l;
1120   register int ind;
1121   int dummy;
1122
1123   if (symtab == 0)
1124     return 0;
1125   l = LINETABLE (symtab);
1126   ind = find_line_common(l, line, &dummy);
1127   return (ind >= 0) ? l->item[ind].pc : 0;
1128 }
1129
1130 /* Find the range of pc values in a line.
1131    Store the starting pc of the line into *STARTPTR
1132    and the ending pc (start of next line) into *ENDPTR.
1133    Returns 1 to indicate success.
1134    Returns 0 if could not find the specified line.  */
1135
1136 int
1137 find_line_pc_range (symtab, thisline, startptr, endptr)
1138      struct symtab *symtab;
1139      int thisline;
1140      CORE_ADDR *startptr, *endptr;
1141 {
1142   register struct linetable *l;
1143   register int ind;
1144   int exact_match;              /* did we get an exact linenumber match */
1145
1146   if (symtab == 0)
1147     return 0;
1148
1149   l = LINETABLE (symtab);
1150   ind = find_line_common (l, thisline, &exact_match);
1151   if (ind >= 0)
1152     {
1153       *startptr = l->item[ind].pc;
1154       /* If we have not seen an entry for the specified line,
1155          assume that means the specified line has zero bytes.  */
1156       if (!exact_match || ind == l->nitems-1)
1157         *endptr = *startptr;
1158       else
1159         /* Perhaps the following entry is for the following line.
1160            It's worth a try.  */
1161         if (ind+1 < l->nitems
1162          && l->item[ind+1].line == thisline + 1)
1163           *endptr = l->item[ind+1].pc;
1164         else
1165           *endptr = find_line_pc (symtab, thisline+1);
1166       return 1;
1167     }
1168
1169   return 0;
1170 }
1171
1172 /* Given a line table and a line number, return the index into the line
1173    table for the pc of the nearest line whose number is >= the specified one.
1174    Return -1 if none is found.  The value is >= 0 if it is an index.
1175
1176    Set *EXACT_MATCH nonzero if the value returned is an exact match.  */
1177
1178 static int
1179 find_line_common (l, lineno, exact_match)
1180      register struct linetable *l;
1181      register int lineno;
1182      int *exact_match;
1183 {
1184   register int i;
1185   register int len;
1186
1187   /* BEST is the smallest linenumber > LINENO so far seen,
1188      or 0 if none has been seen so far.
1189      BEST_INDEX identifies the item for it.  */
1190
1191   int best_index = -1;
1192   int best = 0;
1193
1194   if (lineno <= 0)
1195     return -1;
1196   if (l == 0)
1197     return -1;
1198
1199   len = l->nitems;
1200   for (i = 0; i < len; i++)
1201     {
1202       register struct linetable_entry *item = &(l->item[i]);
1203
1204       if (item->line == lineno)
1205         {
1206           *exact_match = 1;
1207           return i;
1208         }
1209
1210       if (item->line > lineno && (best == 0 || item->line < best))
1211         {
1212           best = item->line;
1213           best_index = i;
1214         }
1215     }
1216
1217   /* If we got here, we didn't get an exact match.  */
1218
1219   *exact_match = 0;
1220   return best_index;
1221 }
1222
1223 int
1224 find_pc_line_pc_range (pc, startptr, endptr)
1225      CORE_ADDR pc;
1226      CORE_ADDR *startptr, *endptr;
1227 {
1228   struct symtab_and_line sal;
1229   sal = find_pc_line (pc, 0);
1230   *startptr = sal.pc;
1231   *endptr = sal.end;
1232   return sal.symtab != 0;
1233 }
1234 \f
1235 /* If P is of the form "operator[ \t]+..." where `...' is
1236    some legitimate operator text, return a pointer to the
1237    beginning of the substring of the operator text.
1238    Otherwise, return "".  */
1239 static char *
1240 operator_chars (p, end)
1241      char *p;
1242      char **end;
1243 {
1244   *end = "";
1245   if (strncmp (p, "operator", 8))
1246     return *end;
1247   p += 8;
1248
1249   /* Don't get faked out by `operator' being part of a longer
1250      identifier.  */
1251   if (isalpha(*p) || *p == '_' || *p == '$' || *p == '\0')
1252     return *end;
1253
1254   /* Allow some whitespace between `operator' and the operator symbol.  */
1255   while (*p == ' ' || *p == '\t')
1256     p++;
1257
1258   /* Recognize 'operator TYPENAME'. */
1259
1260   if (isalpha(*p) || *p == '_' || *p == '$')
1261     {
1262       register char *q = p+1;
1263       while (isalnum(*q) || *q == '_' || *q == '$')
1264         q++;
1265       *end = q;
1266       return p;
1267     }
1268
1269   switch (*p)
1270     {
1271     case '!':
1272     case '=':
1273     case '*':
1274     case '/':
1275     case '%':
1276     case '^':
1277       if (p[1] == '=')
1278         *end = p+2;
1279       else
1280         *end = p+1;
1281       return p;
1282     case '<':
1283     case '>':
1284     case '+':
1285     case '-':
1286     case '&':
1287     case '|':
1288       if (p[1] == '=' || p[1] == p[0])
1289         *end = p+2;
1290       else
1291         *end = p+1;
1292       return p;
1293     case '~':
1294     case ',':
1295       *end = p+1;
1296       return p;
1297     case '(':
1298       if (p[1] != ')')
1299         error ("`operator ()' must be specified without whitespace in `()'");
1300       *end = p+2;
1301       return p;
1302     case '?':
1303       if (p[1] != ':')
1304         error ("`operator ?:' must be specified without whitespace in `?:'");
1305       *end = p+2;
1306       return p;
1307     case '[':
1308       if (p[1] != ']')
1309         error ("`operator []' must be specified without whitespace in `[]'");
1310       *end = p+2;
1311       return p;
1312     default:
1313       error ("`operator %s' not supported", p);
1314       break;
1315     }
1316   *end = "";
1317   return *end;
1318 }
1319
1320 /* Recursive helper function for decode_line_1.
1321  * Look for methods named NAME in type T.
1322  * Return number of matches.
1323  * Put matches in SYM_ARR (which better be big enough!).
1324  * These allocations seem to define "big enough":
1325  * sym_arr = (struct symbol **) alloca(TYPE_NFN_FIELDS_TOTAL (t) * sizeof(struct symbol*));
1326  */
1327
1328 int
1329 find_methods (t, name, sym_arr)
1330      struct type *t;
1331      char *name;
1332      struct symbol **sym_arr;
1333 {
1334   int i1 = 0;
1335   int ibase;
1336   struct symbol *sym_class;
1337   char *class_name = type_name_no_tag (t);
1338   /* Ignore this class if it doesn't have a name.
1339      This prevents core dumps, but is just a workaround
1340      because we might not find the function in
1341      certain cases, such as
1342      struct D {virtual int f();}
1343      struct C : D {virtual int g();}
1344      (in this case g++ 1.35.1- does not put out a name
1345      for D as such, it defines type 19 (for example) in
1346      the same stab as C, and then does a
1347      .stabs "D:T19" and a .stabs "D:t19".
1348      Thus
1349      "break C::f" should not be looking for field f in
1350      the class named D, 
1351      but just for the field f in the baseclasses of C
1352      (no matter what their names).
1353      
1354      However, I don't know how to replace the code below
1355      that depends on knowing the name of D.  */
1356   if (class_name
1357       && (sym_class = lookup_symbol (class_name,
1358                                      (struct block *)NULL,
1359                                      STRUCT_NAMESPACE,
1360                                      (int *)NULL,
1361                                      (struct symtab **)NULL)))
1362     {
1363       int method_counter;
1364       t = SYMBOL_TYPE (sym_class);
1365       for (method_counter = TYPE_NFN_FIELDS (t) - 1;
1366            method_counter >= 0;
1367            --method_counter)
1368         {
1369           int field_counter;
1370           struct fn_field *f = TYPE_FN_FIELDLIST1 (t, method_counter);
1371
1372           char *method_name = TYPE_FN_FIELDLIST_NAME (t, method_counter);
1373           if (STREQ (name, method_name))
1374             /* Find all the fields with that name.  */
1375             for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
1376                  field_counter >= 0;
1377                  --field_counter)
1378               {
1379                 char *phys_name;
1380                 if (TYPE_FN_FIELD_STUB (f, field_counter))
1381                   check_stub_method (t, method_counter, field_counter);
1382                 phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
1383                 sym_arr[i1] = lookup_symbol (phys_name,
1384                                              SYMBOL_BLOCK_VALUE (sym_class),
1385                                              VAR_NAMESPACE,
1386                                              (int *) NULL,
1387                                              (struct symtab **) NULL);
1388                 if (sym_arr[i1]) i1++;
1389                 else
1390                   {
1391                     fputs_filtered("(Cannot find method ", stdout);
1392                     fprintf_symbol_filtered (stdout, phys_name,
1393                                              language_cplus, DMGL_PARAMS);
1394                     fputs_filtered(" - possibly inlined.)\n", stdout);
1395                   }
1396               }
1397         }
1398     }
1399   /* Only search baseclasses if there is no match yet,
1400    * since names in derived classes override those in baseclasses.
1401    */
1402   if (i1)
1403     return i1;
1404   for (ibase = 0; ibase < TYPE_N_BASECLASSES (t); ibase++)
1405     i1 += find_methods(TYPE_BASECLASS(t, ibase), name,
1406                        sym_arr + i1);
1407   return i1;
1408 }
1409
1410 /* Parse a string that specifies a line number.
1411    Pass the address of a char * variable; that variable will be
1412    advanced over the characters actually parsed.
1413
1414    The string can be:
1415
1416    LINENUM -- that line number in current file.  PC returned is 0.
1417    FILE:LINENUM -- that line in that file.  PC returned is 0.
1418    FUNCTION -- line number of openbrace of that function.
1419       PC returned is the start of the function.
1420    VARIABLE -- line number of definition of that variable.
1421       PC returned is 0.
1422    FILE:FUNCTION -- likewise, but prefer functions in that file.
1423    *EXPR -- line in which address EXPR appears.
1424
1425    FUNCTION may be an undebuggable function found in minimal symbol table.
1426
1427    If the argument FUNFIRSTLINE is nonzero, we want the first line
1428    of real code inside a function when a function is specified.
1429
1430    DEFAULT_SYMTAB specifies the file to use if none is specified.
1431    It defaults to current_source_symtab.
1432    DEFAULT_LINE specifies the line number to use for relative
1433    line numbers (that start with signs).  Defaults to current_source_line.
1434
1435    Note that it is possible to return zero for the symtab
1436    if no file is validly specified.  Callers must check that.
1437    Also, the line number returned may be invalid.  */
1438
1439 struct symtabs_and_lines
1440 decode_line_1 (argptr, funfirstline, default_symtab, default_line)
1441      char **argptr;
1442      int funfirstline;
1443      struct symtab *default_symtab;
1444      int default_line;
1445 {
1446   struct symtabs_and_lines values;
1447 #ifdef HPPA_COMPILER_BUG
1448   /* FIXME: The native HP 9000/700 compiler has a bug which appears
1449      when optimizing this file with target i960-vxworks.  I haven't
1450      been able to construct a simple test case.  The problem is that
1451      in the second call to SKIP_PROLOGUE below, the compiler somehow
1452      does not realize that the statement val = find_pc_line (...) will
1453      change the values of the fields of val.  It extracts the elements
1454      into registers at the top of the block, and does not update the
1455      registers after the call to find_pc_line.  You can check this by
1456      inserting a printf at the end of find_pc_line to show what values
1457      it is returning for val.pc and val.end and another printf after
1458      the call to see what values the function actually got (remember,
1459      this is compiling with cc -O, with this patch removed).  You can
1460      also examine the assembly listing: search for the second call to
1461      skip_prologue; the LDO statement before the next call to
1462      find_pc_line loads the address of the structure which
1463      find_pc_line will return; if there is a LDW just before the LDO,
1464      which fetches an element of the structure, then the compiler
1465      still has the bug.
1466
1467      Setting val to volatile avoids the problem.  We must undef
1468      volatile, because the HPPA native compiler does not define
1469      __STDC__, although it does understand volatile, and so volatile
1470      will have been defined away in defs.h.  */
1471 #undef volatile
1472   volatile struct symtab_and_line val;
1473 #define volatile /*nothing*/
1474 #else
1475   struct symtab_and_line val;
1476 #endif
1477   register char *p, *p1;
1478   char *q, *q1;
1479   register struct symtab *s;
1480
1481   register struct symbol *sym;
1482   /* The symtab that SYM was found in.  */
1483   struct symtab *sym_symtab;
1484
1485   register CORE_ADDR pc;
1486   register struct minimal_symbol *msymbol;
1487   char *copy;
1488   struct symbol *sym_class;
1489   int i1;
1490   int is_quoted;
1491   struct symbol **sym_arr;
1492   struct type *t;
1493   char *saved_arg = *argptr;
1494   extern char *gdb_completer_quote_characters;
1495   
1496   /* Defaults have defaults.  */
1497
1498   if (default_symtab == 0)
1499     {
1500       default_symtab = current_source_symtab;
1501       default_line = current_source_line;
1502     }
1503
1504   /* See if arg is *PC */
1505
1506   if (**argptr == '*')
1507     {
1508       if (**argptr == '*')
1509         {
1510           (*argptr)++;
1511         }
1512       pc = parse_and_eval_address_1 (argptr);
1513       values.sals = (struct symtab_and_line *)
1514         xmalloc (sizeof (struct symtab_and_line));
1515       values.nelts = 1;
1516       values.sals[0] = find_pc_line (pc, 0);
1517       values.sals[0].pc = pc;
1518       return values;
1519     }
1520
1521   /* Maybe arg is FILE : LINENUM or FILE : FUNCTION */
1522
1523   s = NULL;
1524   is_quoted = (strchr (gdb_completer_quote_characters, **argptr) != NULL);
1525
1526   for (p = *argptr; *p; p++)
1527     {
1528       if (p[0] == ':' || p[0] == ' ' || p[0] == '\t')
1529         break;
1530     }
1531   while (p[0] == ' ' || p[0] == '\t') p++;
1532
1533   if ((p[0] == ':') && !is_quoted)
1534     {
1535
1536       /*  C++  */
1537       if (p[1] ==':')
1538         {
1539           /* Extract the class name.  */
1540           p1 = p;
1541           while (p != *argptr && p[-1] == ' ') --p;
1542           copy = (char *) alloca (p - *argptr + 1);
1543           memcpy (copy, *argptr, p - *argptr);
1544           copy[p - *argptr] = 0;
1545
1546           /* Discard the class name from the arg.  */
1547           p = p1 + 2;
1548           while (*p == ' ' || *p == '\t') p++;
1549           *argptr = p;
1550
1551           sym_class = lookup_symbol (copy, 0, STRUCT_NAMESPACE, 0, 
1552                                      (struct symtab **)NULL);
1553        
1554           if (sym_class &&
1555               (   TYPE_CODE (SYMBOL_TYPE (sym_class)) == TYPE_CODE_STRUCT
1556                || TYPE_CODE (SYMBOL_TYPE (sym_class)) == TYPE_CODE_UNION))
1557             {
1558               /* Arg token is not digits => try it as a function name
1559                  Find the next token (everything up to end or next whitespace). */
1560               p = *argptr;
1561               while (*p && *p != ' ' && *p != '\t' && *p != ',' && *p !=':') p++;
1562               q = operator_chars (*argptr, &q1);
1563
1564               if (q1 - q)
1565                 {
1566                   char *opname;
1567                   char *tmp = alloca (q1 - q + 1);
1568                   memcpy (tmp, q, q1 - q);
1569                   tmp[q1 - q] = '\0';
1570                   opname = cplus_mangle_opname (tmp, DMGL_ANSI);
1571                   if (opname == NULL)
1572                     {
1573                       warning ("no mangling for \"%s\"", tmp);
1574                       cplusplus_hint (saved_arg);
1575                       return_to_top_level ();
1576                     }
1577                   copy = (char*) alloca (3 + strlen(opname));
1578                   sprintf (copy, "__%s", opname);
1579                   p = q1;
1580                 }
1581               else
1582                 {
1583                   copy = (char *) alloca (p - *argptr + 1 + (q1 - q));
1584                   memcpy (copy, *argptr, p - *argptr);
1585                   copy[p - *argptr] = '\0';
1586                 }
1587
1588               /* no line number may be specified */
1589               while (*p == ' ' || *p == '\t') p++;
1590               *argptr = p;
1591
1592               sym = 0;
1593               i1 = 0;           /*  counter for the symbol array */
1594               t = SYMBOL_TYPE (sym_class);
1595               sym_arr = (struct symbol **) alloca(TYPE_NFN_FIELDS_TOTAL (t) * sizeof(struct symbol*));
1596
1597               if (destructor_name_p (copy, t))
1598                 {
1599                   /* destructors are a special case.  */
1600                   struct fn_field *f = TYPE_FN_FIELDLIST1 (t, 0);
1601                   int len = TYPE_FN_FIELDLIST_LENGTH (t, 0) - 1;
1602                   char *phys_name = TYPE_FN_FIELD_PHYSNAME (f, len);
1603                   sym_arr[i1] =
1604                     lookup_symbol (phys_name, SYMBOL_BLOCK_VALUE (sym_class),
1605                                    VAR_NAMESPACE, 0, (struct symtab **)NULL);
1606                   if (sym_arr[i1]) i1++;
1607                 }
1608               else
1609                 i1 = find_methods (t, copy, sym_arr);
1610               if (i1 == 1)
1611                 {
1612                   /* There is exactly one field with that name.  */
1613                   sym = sym_arr[0];
1614
1615                   if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK)
1616                     {
1617                       /* Arg is the name of a function */
1618                       pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) + FUNCTION_START_OFFSET;
1619                       if (funfirstline)
1620                         SKIP_PROLOGUE (pc);
1621                       values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
1622                       values.nelts = 1;
1623                       values.sals[0] = find_pc_line (pc, 0);
1624                       values.sals[0].pc = (values.sals[0].end && values.sals[0].pc != pc) ? values.sals[0].end : pc;
1625                     }
1626                   else
1627                     {
1628                       values.nelts = 0;
1629                     }
1630                   return values;
1631                 }
1632               if (i1 > 0)
1633                 {
1634                   /* There is more than one field with that name
1635                      (overloaded).  Ask the user which one to use.  */
1636                   return decode_line_2 (sym_arr, i1, funfirstline);
1637                 }
1638               else
1639                 {
1640                   char *tmp;
1641
1642                   if (OPNAME_PREFIX_P (copy))
1643                     {
1644                       tmp = (char *)alloca (strlen (copy+3) + 9);
1645                       strcpy (tmp, "operator ");
1646                       strcat (tmp, copy+3);
1647                     }
1648                   else
1649                     tmp = copy;
1650                   if (tmp[0] == '~')
1651                     warning ("the class `%s' does not have destructor defined",
1652                              SYMBOL_SOURCE_NAME(sym_class));
1653                   else
1654                     warning ("the class %s does not have any method named %s",
1655                              SYMBOL_SOURCE_NAME(sym_class), tmp);
1656                   cplusplus_hint (saved_arg);
1657                   return_to_top_level ();
1658                 }
1659             }
1660           else
1661             {
1662               /* The quotes are important if copy is empty.  */
1663               warning ("can't find class, struct, or union named \"%s\"",
1664                        copy);
1665               cplusplus_hint (saved_arg);
1666               return_to_top_level ();
1667             }
1668         }
1669       /*  end of C++  */
1670
1671
1672       /* Extract the file name.  */
1673       p1 = p;
1674       while (p != *argptr && p[-1] == ' ') --p;
1675       copy = (char *) alloca (p - *argptr + 1);
1676       memcpy (copy, *argptr, p - *argptr);
1677       copy[p - *argptr] = 0;
1678
1679       /* Find that file's data.  */
1680       s = lookup_symtab (copy);
1681       if (s == 0)
1682         {
1683           if (!have_full_symbols () && !have_partial_symbols ())
1684             error (no_symtab_msg);
1685           error ("No source file named %s.", copy);
1686         }
1687
1688       /* Discard the file name from the arg.  */
1689       p = p1 + 1;
1690       while (*p == ' ' || *p == '\t') p++;
1691       *argptr = p;
1692     }
1693
1694   /* S is specified file's symtab, or 0 if no file specified.
1695      arg no longer contains the file name.  */
1696
1697   /* Check whether arg is all digits (and sign) */
1698
1699   p = *argptr;
1700   if (*p == '-' || *p == '+') p++;
1701   while (*p >= '0' && *p <= '9')
1702     p++;
1703
1704   if (p != *argptr && (*p == 0 || *p == ' ' || *p == '\t' || *p == ','))
1705     {
1706       /* We found a token consisting of all digits -- at least one digit.  */
1707       enum sign {none, plus, minus} sign = none;
1708
1709       /* This is where we need to make sure that we have good defaults.
1710          We must guarantee that this section of code is never executed
1711          when we are called with just a function name, since
1712          select_source_symtab calls us with such an argument  */
1713
1714       if (s == 0 && default_symtab == 0)
1715         {
1716           select_source_symtab (0);
1717           default_symtab = current_source_symtab;
1718           default_line = current_source_line;
1719         }
1720
1721       if (**argptr == '+')
1722         sign = plus, (*argptr)++;
1723       else if (**argptr == '-')
1724         sign = minus, (*argptr)++;
1725       val.line = atoi (*argptr);
1726       switch (sign)
1727         {
1728         case plus:
1729           if (p == *argptr)
1730             val.line = 5;
1731           if (s == 0)
1732             val.line = default_line + val.line;
1733           break;
1734         case minus:
1735           if (p == *argptr)
1736             val.line = 15;
1737           if (s == 0)
1738             val.line = default_line - val.line;
1739           else
1740             val.line = 1;
1741           break;
1742         case none:
1743           break;        /* No need to adjust val.line.  */
1744         }
1745
1746       while (*p == ' ' || *p == '\t') p++;
1747       *argptr = p;
1748       if (s == 0)
1749         s = default_symtab;
1750       val.symtab = s;
1751       val.pc = 0;
1752       values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
1753       values.sals[0] = val;
1754       values.nelts = 1;
1755       return values;
1756     }
1757
1758   /* Arg token is not digits => try it as a variable name
1759      Find the next token (everything up to end or next whitespace).  */
1760
1761   p = skip_quoted (*argptr);
1762   copy = (char *) alloca (p - *argptr + 1);
1763   memcpy (copy, *argptr, p - *argptr);
1764   copy[p - *argptr] = '\0';
1765   if ((copy[0] == copy [p - *argptr - 1])
1766       && strchr (gdb_completer_quote_characters, copy[0]) != NULL)
1767     {
1768       char *temp;
1769       copy [p - *argptr - 1] = '\0';
1770       copy++;
1771     }
1772   while (*p == ' ' || *p == '\t') p++;
1773   *argptr = p;
1774
1775   /* Look up that token as a variable.
1776      If file specified, use that file's per-file block to start with.  */
1777
1778   sym = lookup_symbol (copy,
1779                        (s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)
1780                         : get_selected_block ()),
1781                        VAR_NAMESPACE, 0, &sym_symtab);
1782
1783   if (sym != NULL)
1784     {
1785       if (SYMBOL_CLASS (sym) == LOC_BLOCK)
1786         {
1787           /* Arg is the name of a function */
1788           pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) + FUNCTION_START_OFFSET;
1789           if (funfirstline)
1790             SKIP_PROLOGUE (pc);
1791           val = find_pc_line (pc, 0);
1792 #ifdef PROLOGUE_FIRSTLINE_OVERLAP
1793           /* Convex: no need to suppress code on first line, if any */
1794           val.pc = pc;
1795 #else
1796           /* If SKIP_PROLOGUE left us in mid-line, and the next line is still
1797              part of the same function:
1798                 advance to next line, 
1799                 recalculate its line number (might not be N+1).  */
1800           if (val.pc != pc && val.end &&
1801               lookup_minimal_symbol_by_pc (pc) == lookup_minimal_symbol_by_pc (val.end)) {
1802             pc = val.end;       /* First pc of next line */
1803             val = find_pc_line (pc, 0);
1804           }
1805           val.pc = pc;
1806 #endif
1807           values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
1808           values.sals[0] = val;
1809           values.nelts = 1;
1810           
1811           /* I think this is always the same as the line that
1812              we calculate above, but the general principle is
1813              "trust the symbols more than stuff like
1814              SKIP_PROLOGUE".  */
1815           if (SYMBOL_LINE (sym) != 0)
1816             values.sals[0].line = SYMBOL_LINE (sym);
1817           
1818           return values;
1819         }
1820       else if (SYMBOL_LINE (sym) != 0)
1821         {
1822           /* We know its line number.  */
1823           values.sals = (struct symtab_and_line *)
1824             xmalloc (sizeof (struct symtab_and_line));
1825           values.nelts = 1;
1826           memset (&values.sals[0], 0, sizeof (values.sals[0]));
1827           values.sals[0].symtab = sym_symtab;
1828           values.sals[0].line = SYMBOL_LINE (sym);
1829           return values;
1830         }
1831       else
1832         /* This can happen if it is compiled with a compiler which doesn't
1833            put out line numbers for variables.  */
1834         error ("Line number not known for symbol \"%s\"", copy);
1835     }
1836
1837   msymbol = lookup_minimal_symbol (copy, (struct objfile *) NULL);
1838   if (msymbol != NULL)
1839     {
1840       val.symtab = 0;
1841       val.line = 0;
1842       val.pc = SYMBOL_VALUE_ADDRESS (msymbol) + FUNCTION_START_OFFSET;
1843       if (funfirstline)
1844         SKIP_PROLOGUE (val.pc);
1845       values.sals = (struct symtab_and_line *)xmalloc (sizeof (struct symtab_and_line));
1846       values.sals[0] = val;
1847       values.nelts = 1;
1848       return values;
1849     }
1850
1851   if (!have_full_symbols () &&
1852       !have_partial_symbols () && !have_minimal_symbols ())
1853     error (no_symtab_msg);
1854
1855   error ("Function \"%s\" not defined.", copy);
1856   return values;        /* for lint */
1857 }
1858
1859 struct symtabs_and_lines
1860 decode_line_spec (string, funfirstline)
1861      char *string;
1862      int funfirstline;
1863 {
1864   struct symtabs_and_lines sals;
1865   if (string == 0)
1866     error ("Empty line specification.");
1867   sals = decode_line_1 (&string, funfirstline,
1868                         current_source_symtab, current_source_line);
1869   if (*string)
1870     error ("Junk at end of line specification: %s", string);
1871   return sals;
1872 }
1873
1874 /* Given a list of NELTS symbols in sym_arr, return a list of lines to
1875    operate on (ask user if necessary).  */
1876
1877 static struct symtabs_and_lines
1878 decode_line_2 (sym_arr, nelts, funfirstline)
1879      struct symbol *sym_arr[];
1880      int nelts;
1881      int funfirstline;
1882 {
1883   struct symtabs_and_lines values, return_values;
1884   register CORE_ADDR pc;
1885   char *args, *arg1;
1886   int i;
1887   char *prompt;
1888   char *symname;
1889
1890   values.sals = (struct symtab_and_line *) alloca (nelts * sizeof(struct symtab_and_line));
1891   return_values.sals = (struct symtab_and_line *) xmalloc (nelts * sizeof(struct symtab_and_line));
1892
1893   i = 0;
1894   printf("[0] cancel\n[1] all\n");
1895   while (i < nelts)
1896     {
1897       if (sym_arr[i] && SYMBOL_CLASS (sym_arr[i]) == LOC_BLOCK)
1898         {
1899           /* Arg is the name of a function */
1900           pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym_arr[i])) 
1901                + FUNCTION_START_OFFSET;
1902           if (funfirstline)
1903             SKIP_PROLOGUE (pc);
1904           values.sals[i] = find_pc_line (pc, 0);
1905           values.sals[i].pc = (values.sals[i].end && values.sals[i].pc != pc) ?
1906                                values.sals[i].end                      :  pc;
1907           printf("[%d] %s at %s:%d\n", (i+2), SYMBOL_SOURCE_NAME (sym_arr[i]),
1908                  values.sals[i].symtab->filename, values.sals[i].line);
1909         }
1910       else printf ("?HERE\n");
1911       i++;
1912     }
1913   
1914   if ((prompt = getenv ("PS2")) == NULL)
1915     {
1916       prompt = ">";
1917     }
1918   printf("%s ",prompt);
1919   fflush(stdout);
1920
1921   args = command_line_input ((char *) NULL, 0);
1922   
1923   if (args == 0)
1924     error_no_arg ("one or more choice numbers");
1925
1926   i = 0;
1927   while (*args)
1928     {
1929       int num;
1930
1931       arg1 = args;
1932       while (*arg1 >= '0' && *arg1 <= '9') arg1++;
1933       if (*arg1 && *arg1 != ' ' && *arg1 != '\t')
1934         error ("Arguments must be choice numbers.");
1935
1936       num = atoi (args);
1937
1938       if (num == 0)
1939         error ("cancelled");
1940       else if (num == 1)
1941         {
1942           memcpy (return_values.sals, values.sals,
1943                   (nelts * sizeof(struct symtab_and_line)));
1944           return_values.nelts = nelts;
1945           return return_values;
1946         }
1947
1948       if (num > nelts + 2)
1949         {
1950           printf ("No choice number %d.\n", num);
1951         }
1952       else
1953         {
1954           num -= 2;
1955           if (values.sals[num].pc)
1956             {
1957               return_values.sals[i++] = values.sals[num];
1958               values.sals[num].pc = 0;
1959             }
1960           else
1961             {
1962               printf ("duplicate request for %d ignored.\n", num);
1963             }
1964         }
1965
1966       args = arg1;
1967       while (*args == ' ' || *args == '\t') args++;
1968     }
1969   return_values.nelts = i;
1970   return return_values;
1971 }
1972
1973 \f
1974 /* Slave routine for sources_info.  Force line breaks at ,'s.
1975    NAME is the name to print and *FIRST is nonzero if this is the first
1976    name printed.  Set *FIRST to zero.  */
1977 static void
1978 output_source_filename (name, first)
1979      char *name;
1980      int *first;
1981 {
1982   /* Table of files printed so far.  Since a single source file can
1983      result in several partial symbol tables, we need to avoid printing
1984      it more than once.  Note: if some of the psymtabs are read in and
1985      some are not, it gets printed both under "Source files for which
1986      symbols have been read" and "Source files for which symbols will
1987      be read in on demand".  I consider this a reasonable way to deal
1988      with the situation.  I'm not sure whether this can also happen for
1989      symtabs; it doesn't hurt to check.  */
1990   static char **tab = NULL;
1991   /* Allocated size of tab in elements.
1992      Start with one 256-byte block (when using GNU malloc.c).
1993      24 is the malloc overhead when range checking is in effect.  */
1994   static int tab_alloc_size = (256 - 24) / sizeof (char *);
1995   /* Current size of tab in elements.  */
1996   static int tab_cur_size;
1997
1998   char **p;
1999
2000   if (*first)
2001     {
2002       if (tab == NULL)
2003         tab = (char **) xmalloc (tab_alloc_size * sizeof (*tab));
2004       tab_cur_size = 0;
2005     }
2006
2007   /* Is NAME in tab?  */
2008   for (p = tab; p < tab + tab_cur_size; p++)
2009     if (STREQ (*p, name))
2010       /* Yes; don't print it again.  */
2011       return;
2012   /* No; add it to tab.  */
2013   if (tab_cur_size == tab_alloc_size)
2014     {
2015       tab_alloc_size *= 2;
2016       tab = (char **) xrealloc ((char *) tab, tab_alloc_size * sizeof (*tab));
2017     }
2018   tab[tab_cur_size++] = name;
2019
2020   if (*first)
2021     {
2022       *first = 0;
2023     }
2024   else
2025     {
2026       printf_filtered (", ");
2027     }
2028
2029   wrap_here ("");
2030   fputs_filtered (name, stdout);
2031 }  
2032
2033 static void
2034 sources_info (ignore, from_tty)
2035      char *ignore;
2036      int from_tty;
2037 {
2038   register struct symtab *s;
2039   register struct partial_symtab *ps;
2040   register struct objfile *objfile;
2041   int first;
2042   
2043   if (!have_full_symbols () && !have_partial_symbols ())
2044     {
2045       error (no_symtab_msg);
2046     }
2047   
2048   printf_filtered ("Source files for which symbols have been read in:\n\n");
2049
2050   first = 1;
2051   ALL_SYMTABS (objfile, s)
2052     {
2053       output_source_filename (s -> filename, &first);
2054     }
2055   printf_filtered ("\n\n");
2056   
2057   printf_filtered ("Source files for which symbols will be read in on demand:\n\n");
2058
2059   first = 1;
2060   ALL_PSYMTABS (objfile, ps)
2061     {
2062       if (!ps->readin)
2063         {
2064           output_source_filename (ps -> filename, &first);
2065         }
2066     }
2067   printf_filtered ("\n");
2068 }
2069
2070 /* List all symbols (if REGEXP is NULL) or all symbols matching REGEXP.
2071    If CLASS is zero, list all symbols except functions, type names, and
2072                      constants (enums).
2073    If CLASS is 1, list only functions.
2074    If CLASS is 2, list only type names.
2075    If CLASS is 3, list only method names.
2076
2077    BPT is non-zero if we should set a breakpoint at the functions
2078    we find.  */
2079
2080 static void
2081 list_symbols (regexp, class, bpt)
2082      char *regexp;
2083      int class;
2084      int bpt;
2085 {
2086   register struct symtab *s;
2087   register struct partial_symtab *ps;
2088   register struct blockvector *bv;
2089   struct blockvector *prev_bv = 0;
2090   register struct block *b;
2091   register int i, j;
2092   register struct symbol *sym;
2093   struct partial_symbol *psym;
2094   struct objfile *objfile;
2095   struct minimal_symbol *msymbol;
2096   char *val;
2097   static char *classnames[]
2098     = {"variable", "function", "type", "method"};
2099   int found_in_file = 0;
2100   int found_misc = 0;
2101   static enum minimal_symbol_type types[]
2102     = {mst_data, mst_text, mst_abs, mst_unknown};
2103   static enum minimal_symbol_type types2[]
2104     = {mst_bss,  mst_text, mst_abs, mst_unknown};
2105   enum minimal_symbol_type ourtype = types[class];
2106   enum minimal_symbol_type ourtype2 = types2[class];
2107
2108   if (regexp != NULL)
2109     {
2110       /* Make sure spacing is right for C++ operators.
2111          This is just a courtesy to make the matching less sensitive
2112          to how many spaces the user leaves between 'operator'
2113          and <TYPENAME> or <OPERATOR>. */
2114       char *opend;
2115       char *opname = operator_chars (regexp, &opend);
2116       if (*opname)
2117         {
2118           int fix = -1; /* -1 means ok; otherwise number of spaces needed. */
2119           if (isalpha(*opname) || *opname == '_' || *opname == '$')
2120             {
2121               /* There should 1 space between 'operator' and 'TYPENAME'. */
2122               if (opname[-1] != ' ' || opname[-2] == ' ')
2123                 fix = 1;
2124             }
2125           else
2126             {
2127               /* There should 0 spaces between 'operator' and 'OPERATOR'. */
2128               if (opname[-1] == ' ')
2129                 fix = 0;
2130             }
2131           /* If wrong number of spaces, fix it. */
2132           if (fix >= 0)
2133             {
2134               char *tmp = (char*) alloca(opend-opname+10);
2135               sprintf(tmp, "operator%.*s%s", fix, " ", opname);
2136               regexp = tmp;
2137             }
2138         }
2139       
2140       if (0 != (val = re_comp (regexp)))
2141         error ("Invalid regexp (%s): %s", val, regexp);
2142     }
2143
2144   /* Search through the partial symtabs *first* for all symbols
2145      matching the regexp.  That way we don't have to reproduce all of
2146      the machinery below. */
2147
2148   ALL_PSYMTABS (objfile, ps)
2149     {
2150       struct partial_symbol *bound, *gbound, *sbound;
2151       int keep_going = 1;
2152       
2153       if (ps->readin) continue;
2154       
2155       gbound = objfile->global_psymbols.list + ps->globals_offset + ps->n_global_syms;
2156       sbound = objfile->static_psymbols.list + ps->statics_offset + ps->n_static_syms;
2157       bound = gbound;
2158       
2159       /* Go through all of the symbols stored in a partial
2160          symtab in one loop. */
2161       psym = objfile->global_psymbols.list + ps->globals_offset;
2162       while (keep_going)
2163         {
2164           if (psym >= bound)
2165             {
2166               if (bound == gbound && ps->n_static_syms != 0)
2167                 {
2168                   psym = objfile->static_psymbols.list + ps->statics_offset;
2169                   bound = sbound;
2170                 }
2171               else
2172                 keep_going = 0;
2173               continue;
2174             }
2175           else
2176             {
2177               QUIT;
2178
2179               /* If it would match (logic taken from loop below)
2180                  load the file and go on to the next one */
2181               if ((regexp == NULL || SYMBOL_MATCHES_REGEXP (psym))
2182                   && ((class == 0 && SYMBOL_CLASS (psym) != LOC_TYPEDEF
2183                        && SYMBOL_CLASS (psym) != LOC_BLOCK)
2184                       || (class == 1 && SYMBOL_CLASS (psym) == LOC_BLOCK)
2185                       || (class == 2 && SYMBOL_CLASS (psym) == LOC_TYPEDEF)
2186                       || (class == 3 && SYMBOL_CLASS (psym) == LOC_BLOCK)))
2187                 {
2188                   PSYMTAB_TO_SYMTAB(ps);
2189                   keep_going = 0;
2190                 }
2191             }
2192           psym++;
2193         }
2194     }
2195
2196   /* Here, we search through the minimal symbol tables for functions that
2197      match, and call find_pc_symtab on them to force their symbols to
2198      be read.  The symbol will then be found during the scan of symtabs
2199      below.  If find_pc_symtab fails, set found_misc so that we will
2200      rescan to print any matching symbols without debug info.  */
2201
2202   if (class == 1)
2203     {
2204       ALL_MSYMBOLS (objfile, msymbol)
2205         {
2206           if (MSYMBOL_TYPE (msymbol) == ourtype ||
2207               MSYMBOL_TYPE (msymbol) == ourtype2)
2208             {
2209               if (regexp == NULL || SYMBOL_MATCHES_REGEXP (msymbol))
2210                 {
2211                   if (0 == find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol)))
2212                     {
2213                       found_misc = 1;
2214                     }
2215                 }
2216             }
2217         }
2218     }
2219
2220   /* Printout here so as to get after the "Reading in symbols"
2221      messages which will be generated above.  */
2222   if (!bpt)
2223     printf_filtered (regexp
2224           ? "All %ss matching regular expression \"%s\":\n"
2225           : "All defined %ss:\n",
2226           classnames[class],
2227           regexp);
2228
2229   ALL_SYMTABS (objfile, s)
2230     {
2231       found_in_file = 0;
2232       bv = BLOCKVECTOR (s);
2233       /* Often many files share a blockvector.
2234          Scan each blockvector only once so that
2235          we don't get every symbol many times.
2236          It happens that the first symtab in the list
2237          for any given blockvector is the main file.  */
2238       if (bv != prev_bv)
2239         for (i = GLOBAL_BLOCK; i <= STATIC_BLOCK; i++)
2240           {
2241             b = BLOCKVECTOR_BLOCK (bv, i);
2242             /* Skip the sort if this block is always sorted.  */
2243             if (!BLOCK_SHOULD_SORT (b))
2244               sort_block_syms (b);
2245             for (j = 0; j < BLOCK_NSYMS (b); j++)
2246               {
2247                 QUIT;
2248                 sym = BLOCK_SYM (b, j);
2249                 if ((regexp == NULL || SYMBOL_MATCHES_REGEXP (sym))
2250                     && ((class == 0 && SYMBOL_CLASS (sym) != LOC_TYPEDEF
2251                          && SYMBOL_CLASS (sym) != LOC_BLOCK
2252                          && SYMBOL_CLASS (sym) != LOC_CONST)
2253                         || (class == 1 && SYMBOL_CLASS (sym) == LOC_BLOCK)
2254                         || (class == 2 && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
2255                         || (class == 3 && SYMBOL_CLASS (sym) == LOC_BLOCK)))
2256                   {
2257                     if (bpt)
2258                       {
2259                         /* Set a breakpoint here, if it's a function */
2260                         if (class == 1)
2261                           break_command (SYMBOL_NAME(sym), 0);
2262                       }
2263                     else if (!found_in_file)
2264                       {
2265                         fputs_filtered ("\nFile ", stdout);
2266                         fputs_filtered (s->filename, stdout);
2267                         fputs_filtered (":\n", stdout);
2268                       }
2269                     found_in_file = 1;
2270                     
2271                     if (class != 2 && i == STATIC_BLOCK)
2272                       printf_filtered ("static ");
2273                     
2274                     /* Typedef that is not a C++ class */
2275                     if (class == 2
2276                         && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE)
2277                       c_typedef_print (SYMBOL_TYPE(sym), sym, stdout);
2278                     /* variable, func, or typedef-that-is-c++-class */
2279                     else if (class < 2 || 
2280                              (class == 2 && 
2281                               SYMBOL_NAMESPACE(sym) == STRUCT_NAMESPACE))
2282                       {
2283                         type_print (SYMBOL_TYPE (sym),
2284                                     (SYMBOL_CLASS (sym) == LOC_TYPEDEF
2285                                      ? "" : SYMBOL_SOURCE_NAME (sym)),
2286                                     stdout, 0);
2287                         
2288                         printf_filtered (";\n");
2289                       }
2290                     else
2291                       {
2292 # if 0  /* FIXME, why is this zapped out? */
2293                         char buf[1024];
2294                         c_type_print_base (TYPE_FN_FIELD_TYPE(t, i),
2295                                            stdout, 0, 0); 
2296                         c_type_print_varspec_prefix (TYPE_FN_FIELD_TYPE(t, i),
2297                                                      stdout, 0); 
2298                         sprintf (buf, " %s::", type_name_no_tag (t));
2299                         cp_type_print_method_args (TYPE_FN_FIELD_ARGS (t, i),
2300                                                    buf, name, stdout);
2301 # endif
2302                       }
2303                   }
2304               }
2305           }
2306       prev_bv = bv;
2307     }
2308
2309   /* If there are no eyes, avoid all contact.  I mean, if there are
2310      no debug symbols, then print directly from the msymbol_vector.  */
2311
2312   if (found_misc || class != 1)
2313     {
2314       found_in_file = 0;
2315       ALL_MSYMBOLS (objfile, msymbol)
2316         {
2317           if (MSYMBOL_TYPE (msymbol) == ourtype ||
2318               MSYMBOL_TYPE (msymbol) == ourtype2)
2319             {
2320               if (regexp == NULL || SYMBOL_MATCHES_REGEXP (msymbol))
2321                 {
2322                   /* Functions:  Look up by address. */
2323                   if (class != 1 ||
2324                       (0 == find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol))))
2325                     {
2326                       /* Variables/Absolutes:  Look up by name */
2327                       if (lookup_symbol (SYMBOL_NAME (msymbol), 
2328                                          (struct block *) NULL, VAR_NAMESPACE,
2329                                          0, (struct symtab **) NULL) == NULL)
2330                         {
2331                           if (!found_in_file)
2332                             {
2333                               printf_filtered ("\nNon-debugging symbols:\n");
2334                               found_in_file = 1;
2335                             }
2336                           printf_filtered ("    %08x  %s\n",
2337                                            SYMBOL_VALUE_ADDRESS (msymbol),
2338                                            SYMBOL_SOURCE_NAME (msymbol));
2339                         }
2340                     }
2341                 }
2342             }
2343         }
2344     }
2345 }
2346
2347 static void
2348 variables_info (regexp, from_tty)
2349      char *regexp;
2350      int from_tty;
2351 {
2352   list_symbols (regexp, 0, 0);
2353 }
2354
2355 static void
2356 functions_info (regexp, from_tty)
2357      char *regexp;
2358      int from_tty;
2359 {
2360   list_symbols (regexp, 1, 0);
2361 }
2362
2363 static void
2364 types_info (regexp, from_tty)
2365      char *regexp;
2366      int from_tty;
2367 {
2368   list_symbols (regexp, 2, 0);
2369 }
2370
2371 #if 0
2372 /* Tiemann says: "info methods was never implemented."  */
2373 static void
2374 methods_info (regexp)
2375      char *regexp;
2376 {
2377   list_symbols (regexp, 3, 0);
2378 }
2379 #endif /* 0 */
2380
2381 /* Breakpoint all functions matching regular expression. */
2382 static void
2383 rbreak_command (regexp, from_tty)
2384      char *regexp;
2385      int from_tty;
2386 {
2387   list_symbols (regexp, 1, 1);
2388 }
2389 \f
2390
2391 /* Return Nonzero if block a is lexically nested within block b,
2392    or if a and b have the same pc range.
2393    Return zero otherwise. */
2394 int
2395 contained_in (a, b)
2396      struct block *a, *b;
2397 {
2398   if (!a || !b)
2399     return 0;
2400   return BLOCK_START (a) >= BLOCK_START (b)
2401       && BLOCK_END (a)   <= BLOCK_END (b);
2402 }
2403
2404 \f
2405 /* Helper routine for make_symbol_completion_list.  */
2406
2407 static int return_val_size;
2408 static int return_val_index;
2409 static char **return_val;
2410
2411 #define COMPLETION_LIST_ADD_SYMBOL(symbol, text, len) \
2412   do { \
2413     completion_list_add_name (SYMBOL_NAME (symbol), text, len); \
2414       if (SYMBOL_DEMANGLED_NAME (symbol) != NULL) \
2415       completion_list_add_name (SYMBOL_DEMANGLED_NAME (symbol), text, len); \
2416   } while (0)
2417
2418 /*  Test to see if the symbol specified by SYMNAME (which is already
2419     demangled for C++ symbols) matches TEXT in the first TEXT_LEN
2420     characters.  If so, add it to the current completion list. */
2421
2422 static void
2423 completion_list_add_name (symname, text, text_len)
2424      char *symname;
2425      char *text;
2426      int text_len;
2427 {
2428   int newsize;
2429   int i;
2430
2431   /* clip symbols that cannot match */
2432
2433   if (strncmp (symname, text, text_len) != 0)
2434     {
2435       return;
2436     }
2437
2438   /* Clip any symbol names that we've already considered.  (This is a
2439      time optimization)  */
2440
2441   for (i = 0; i < return_val_index; ++i)
2442     {
2443       if (STREQ (symname, return_val[i]))
2444         {
2445           return;
2446         }
2447     }
2448   
2449   /* We have a match for a completion, so add SYMNAME to the current list
2450      of matches. Note that the name is moved to freshly malloc'd space. */
2451
2452   symname = savestring (symname, strlen (symname));
2453   if (return_val_index + 3 > return_val_size)
2454     {
2455       newsize = (return_val_size *= 2) * sizeof (char *);
2456       return_val = (char **) xrealloc ((char *) return_val, newsize);
2457     }
2458   return_val[return_val_index++] = symname;
2459   return_val[return_val_index] = NULL;
2460 }
2461
2462 /* Return a NULL terminated array of all symbols (regardless of class) which
2463    begin by matching TEXT.  If the answer is no symbols, then the return value
2464    is an array which contains only a NULL pointer.
2465
2466    Problem: All of the symbols have to be copied because readline frees them.
2467    I'm not going to worry about this; hopefully there won't be that many.  */
2468
2469 char **
2470 make_symbol_completion_list (text)
2471   char *text;
2472 {
2473   register struct symbol *sym;
2474   register struct symtab *s;
2475   register struct partial_symtab *ps;
2476   register struct minimal_symbol *msymbol;
2477   register struct objfile *objfile;
2478   register struct block *b, *surrounding_static_block = 0;
2479   register int i, j;
2480   int text_len;
2481   struct partial_symbol *psym;
2482
2483   text_len = strlen (text);
2484   return_val_size = 100;
2485   return_val_index = 0;
2486   return_val = (char **) xmalloc ((return_val_size + 1) * sizeof (char *));
2487   return_val[0] = NULL;
2488
2489   /* Look through the partial symtabs for all symbols which begin
2490      by matching TEXT.  Add each one that you find to the list.  */
2491
2492   ALL_PSYMTABS (objfile, ps)
2493     {
2494       /* If the psymtab's been read in we'll get it when we search
2495          through the blockvector.  */
2496       if (ps->readin) continue;
2497       
2498       for (psym = objfile->global_psymbols.list + ps->globals_offset;
2499            psym < (objfile->global_psymbols.list + ps->globals_offset
2500                    + ps->n_global_syms);
2501            psym++)
2502         {
2503           /* If interrupted, then quit. */
2504           QUIT;
2505           COMPLETION_LIST_ADD_SYMBOL (psym, text, text_len);
2506         }
2507       
2508       for (psym = objfile->static_psymbols.list + ps->statics_offset;
2509            psym < (objfile->static_psymbols.list + ps->statics_offset
2510                    + ps->n_static_syms);
2511            psym++)
2512         {
2513           QUIT;
2514           COMPLETION_LIST_ADD_SYMBOL (psym, text, text_len);
2515         }
2516     }
2517
2518   /* At this point scan through the misc symbol vectors and add each
2519      symbol you find to the list.  Eventually we want to ignore
2520      anything that isn't a text symbol (everything else will be
2521      handled by the psymtab code above).  */
2522
2523   ALL_MSYMBOLS (objfile, msymbol)
2524     {
2525       QUIT;
2526       COMPLETION_LIST_ADD_SYMBOL (msymbol, text, text_len);
2527     }
2528
2529   /* Search upwards from currently selected frame (so that we can
2530      complete on local vars.  */
2531
2532   for (b = get_selected_block (); b != NULL; b = BLOCK_SUPERBLOCK (b))
2533     {
2534       if (!BLOCK_SUPERBLOCK (b))
2535         {
2536           surrounding_static_block = b;         /* For elmin of dups */
2537         }
2538       
2539       /* Also catch fields of types defined in this places which match our
2540          text string.  Only complete on types visible from current context. */
2541
2542       for (i = 0; i < BLOCK_NSYMS (b); i++)
2543         {
2544           sym = BLOCK_SYM (b, i);
2545           COMPLETION_LIST_ADD_SYMBOL (sym, text, text_len);
2546           if (SYMBOL_CLASS (sym) == LOC_TYPEDEF)
2547             {
2548               struct type *t = SYMBOL_TYPE (sym);
2549               enum type_code c = TYPE_CODE (t);
2550
2551               if (c == TYPE_CODE_UNION || c == TYPE_CODE_STRUCT)
2552                 {
2553                   for (j = TYPE_N_BASECLASSES (t); j < TYPE_NFIELDS (t); j++)
2554                     {
2555                       if (TYPE_FIELD_NAME (t, j))
2556                         {
2557                           completion_list_add_name (TYPE_FIELD_NAME (t, j),
2558                                                       text, text_len);
2559                         }
2560                     }
2561                 }
2562             }
2563         }
2564     }
2565
2566   /* Go through the symtabs and check the externs and statics for
2567      symbols which match.  */
2568
2569   ALL_SYMTABS (objfile, s)
2570     {
2571       QUIT;
2572       b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
2573       for (i = 0; i < BLOCK_NSYMS (b); i++)
2574         {
2575           sym = BLOCK_SYM (b, i);
2576           COMPLETION_LIST_ADD_SYMBOL (sym, text, text_len);
2577         }
2578     }
2579
2580   ALL_SYMTABS (objfile, s)
2581     {
2582       QUIT;
2583       b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
2584       /* Don't do this block twice.  */
2585       if (b == surrounding_static_block) continue;
2586       for (i = 0; i < BLOCK_NSYMS (b); i++)
2587         {
2588           sym = BLOCK_SYM (b, i);
2589           COMPLETION_LIST_ADD_SYMBOL (sym, text, text_len);
2590         }
2591     }
2592
2593   return (return_val);
2594 }
2595
2596 \f
2597 #if 0
2598 /* Add the type of the symbol sym to the type of the current
2599    function whose block we are in (assumed).  The type of
2600    this current function is contained in *TYPE.
2601    
2602    This basically works as follows:  When we find a function
2603    symbol (N_FUNC with a 'f' or 'F' in the symbol name), we record
2604    a pointer to its type in the global in_function_type.  Every 
2605    time we come across a parameter symbol ('p' in its name), then
2606    this procedure adds the name and type of that parameter
2607    to the function type pointed to by *TYPE.  (Which should correspond
2608    to in_function_type if it was called correctly).
2609
2610    Note that since we are modifying a type, the result of 
2611    lookup_function_type() should be memcpy()ed before calling
2612    this.  When not in strict typing mode, the expression
2613    evaluator can choose to ignore this.
2614
2615    Assumption:  All of a function's parameter symbols will
2616    appear before another function symbol is found.  The parameters 
2617    appear in the same order in the argument list as they do in the
2618    symbol table. */
2619
2620 void
2621 add_param_to_type (type,sym)
2622    struct type **type;
2623    struct symbol *sym;
2624 {
2625    int num = ++(TYPE_NFIELDS(*type));
2626
2627    if(TYPE_NFIELDS(*type)-1)
2628       TYPE_FIELDS(*type) = (struct field *)
2629           (*current_objfile->xrealloc) ((char *)(TYPE_FIELDS(*type)),
2630                                         num*sizeof(struct field));
2631    else
2632       TYPE_FIELDS(*type) = (struct field *)
2633           (*current_objfile->xmalloc) (num*sizeof(struct field));
2634    
2635    TYPE_FIELD_BITPOS(*type,num-1) = num-1;
2636    TYPE_FIELD_BITSIZE(*type,num-1) = 0;
2637    TYPE_FIELD_TYPE(*type,num-1) = SYMBOL_TYPE(sym);
2638    TYPE_FIELD_NAME(*type,num-1) = SYMBOL_NAME(sym);
2639 }
2640 #endif 
2641 \f
2642 void
2643 _initialize_symtab ()
2644 {
2645   add_info ("variables", variables_info,
2646             "All global and static variable names, or those matching REGEXP.");
2647   add_info ("functions", functions_info,
2648             "All function names, or those matching REGEXP.");
2649
2650   /* FIXME:  This command has at least the following problems:
2651      1.  It prints builtin types (in a very strange and confusing fashion).
2652      2.  It doesn't print right, e.g. with
2653          typedef struct foo *FOO
2654          type_print prints "FOO" when we want to make it (in this situation)
2655          print "struct foo *".
2656      I also think "ptype" or "whatis" is more likely to be useful (but if
2657      there is much disagreement "info types" can be fixed).  */
2658   add_info ("types", types_info,
2659             "All type names, or those matching REGEXP.");
2660
2661 #if 0
2662   add_info ("methods", methods_info,
2663             "All method names, or those matching REGEXP::REGEXP.\n\
2664 If the class qualifier is omitted, it is assumed to be the current scope.\n\
2665 If the first REGEXP is omitted, then all methods matching the second REGEXP\n\
2666 are listed.");
2667 #endif
2668   add_info ("sources", sources_info,
2669             "Source files in the program.");
2670
2671   add_com ("rbreak", no_class, rbreak_command,
2672             "Set a breakpoint for all functions matching REGEXP.");
2673
2674   /* Initialize the one built-in type that isn't language dependent... */
2675   builtin_type_error = init_type (TYPE_CODE_ERROR, 0, 0,
2676                                   "<unknown type>", (struct objfile *) NULL);
2677 }
This page took 0.170611 seconds and 4 git commands to generate.