xref: /openbsd/gnu/usr.bin/binutils/gdb/dbxread.c (revision fc61954a)
1 /* Read dbx symbol tables and convert to internal format, for GDB.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004.
4    Free Software Foundation, Inc.
5 
6    This file is part of GDB.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22 
23 /* This module provides three functions: dbx_symfile_init,
24    which initializes to read a symbol file; dbx_new_init, which
25    discards existing cached information when all symbols are being
26    discarded; and dbx_symfile_read, which reads a symbol table
27    from a file.
28 
29    dbx_symfile_read only does the minimum work necessary for letting the
30    user "name" things symbolically; it does not read the entire symtab.
31    Instead, it reads the external and static symbols and puts them in partial
32    symbol tables.  When more extensive information is requested of a
33    file, the corresponding partial symbol table is mutated into a full
34    fledged symbol table by going back and reading the symbols
35    for real.  dbx_psymtab_to_symtab() is the function that does this */
36 
37 #include "defs.h"
38 #include "gdb_string.h"
39 
40 #if defined(__CYGNUSCLIB__)
41 #include <sys/types.h>
42 #include <fcntl.h>
43 #endif
44 
45 #include "gdb_obstack.h"
46 #include "gdb_stat.h"
47 #include "symtab.h"
48 #include "breakpoint.h"
49 #include "target.h"
50 #include "gdbcore.h"		/* for bfd stuff */
51 #include "libaout.h"		/* FIXME Secret internal BFD stuff for a.out */
52 #include "objfiles.h"
53 #include "buildsym.h"
54 #include "stabsread.h"
55 #include "gdb-stabs.h"
56 #include "demangle.h"
57 #include "complaints.h"
58 #include "cp-abi.h"
59 #include "gdb_assert.h"
60 
61 #include "aout/aout64.h"
62 #include "aout/stab_gnu.h"	/* We always use GNU stabs, not native, now */
63 
64 
65 /* We put a pointer to this structure in the read_symtab_private field
66    of the psymtab.  */
67 
68 struct symloc
69   {
70     /* Offset within the file symbol table of first local symbol for this
71        file.  */
72 
73     int ldsymoff;
74 
75     /* Length (in bytes) of the section of the symbol table devoted to
76        this file's symbols (actually, the section bracketed may contain
77        more than just this file's symbols).  If ldsymlen is 0, the only
78        reason for this thing's existence is the dependency list.  Nothing
79        else will happen when it is read in.  */
80 
81     int ldsymlen;
82 
83     /* The size of each symbol in the symbol file (in external form).  */
84 
85     int symbol_size;
86 
87     /* Further information needed to locate the symbols if they are in
88        an ELF file.  */
89 
90     int symbol_offset;
91     int string_offset;
92     int file_string_offset;
93   };
94 
95 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
96 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
97 #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
98 #define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
99 #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
100 #define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
101 #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset)
102 
103 
104 /* Remember what we deduced to be the source language of this psymtab. */
105 
106 static enum language psymtab_language = language_unknown;
107 
108 /* The BFD for this file -- implicit parameter to next_symbol_text.  */
109 
110 static bfd *symfile_bfd;
111 
112 /* The size of each symbol in the symbol file (in external form).
113    This is set by dbx_symfile_read when building psymtabs, and by
114    dbx_psymtab_to_symtab when building symtabs.  */
115 
116 static unsigned symbol_size;
117 
118 /* This is the offset of the symbol table in the executable file. */
119 
120 static unsigned symbol_table_offset;
121 
122 /* This is the offset of the string table in the executable file. */
123 
124 static unsigned string_table_offset;
125 
126 /* For elf+stab executables, the n_strx field is not a simple index
127    into the string table.  Instead, each .o file has a base offset in
128    the string table, and the associated symbols contain offsets from
129    this base.  The following two variables contain the base offset for
130    the current and next .o files. */
131 
132 static unsigned int file_string_table_offset;
133 static unsigned int next_file_string_table_offset;
134 
135 /* .o and NLM files contain unrelocated addresses which are based at
136    0.  When non-zero, this flag disables some of the special cases for
137    Solaris elf+stab text addresses at location 0. */
138 
139 static int symfile_relocatable = 0;
140 
141 /* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are
142    relative to the function start address.  */
143 
144 static int block_address_function_relative = 0;
145 
146 /* The lowest text address we have yet encountered.  This is needed
147    because in an a.out file, there is no header field which tells us
148    what address the program is actually going to be loaded at, so we
149    need to make guesses based on the symbols (which *are* relocated to
150    reflect the address it will be loaded at).  */
151 
152 static CORE_ADDR lowest_text_address;
153 
154 /* Non-zero if there is any line number info in the objfile.  Prevents
155    end_psymtab from discarding an otherwise empty psymtab.  */
156 
157 static int has_line_numbers;
158 
159 /* Complaints about the symbols we have encountered.  */
160 
161 static void
162 unknown_symtype_complaint (const char *arg1)
163 {
164   complaint (&symfile_complaints, "unknown symbol type %s", arg1);
165 }
166 
167 static void
168 lbrac_mismatch_complaint (int arg1)
169 {
170   complaint (&symfile_complaints,
171 	     "N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", arg1);
172 }
173 
174 static void
175 repeated_header_complaint (const char *arg1, int arg2)
176 {
177   complaint (&symfile_complaints,
178 	     "\"repeated\" header file %s not previously seen, at symtab pos %d",
179 	     arg1, arg2);
180 }
181 
182 /* find_text_range --- find start and end of loadable code sections
183 
184    The find_text_range function finds the shortest address range that
185    encloses all sections containing executable code, and stores it in
186    objfile's text_addr and text_size members.
187 
188    dbx_symfile_read will use this to finish off the partial symbol
189    table, in some cases.  */
190 
191 static void
192 find_text_range (bfd * sym_bfd, struct objfile *objfile)
193 {
194   asection *sec;
195   int found_any = 0;
196   CORE_ADDR start = 0;
197   CORE_ADDR end = 0;
198 
199   for (sec = sym_bfd->sections; sec; sec = sec->next)
200     if (bfd_get_section_flags (sym_bfd, sec) & SEC_CODE)
201       {
202 	CORE_ADDR sec_start = bfd_section_vma (sym_bfd, sec);
203 	CORE_ADDR sec_end = sec_start + bfd_section_size (sym_bfd, sec);
204 
205 	if (found_any)
206 	  {
207 	    if (sec_start < start)
208 	      start = sec_start;
209 	    if (sec_end > end)
210 	      end = sec_end;
211 	  }
212 	else
213 	  {
214 	    start = sec_start;
215 	    end = sec_end;
216 	  }
217 
218 	found_any = 1;
219       }
220 
221   if (!found_any)
222     error ("Can't find any code sections in symbol file");
223 
224   DBX_TEXT_ADDR (objfile) = start;
225   DBX_TEXT_SIZE (objfile) = end - start;
226 }
227 
228 
229 
230 /* During initial symbol readin, we need to have a structure to keep
231    track of which psymtabs have which bincls in them.  This structure
232    is used during readin to setup the list of dependencies within each
233    partial symbol table. */
234 
235 struct header_file_location
236 {
237   char *name;			/* Name of header file */
238   int instance;			/* See above */
239   struct partial_symtab *pst;	/* Partial symtab that has the
240 				   BINCL/EINCL defs for this file */
241 };
242 
243 /* The actual list and controling variables */
244 static struct header_file_location *bincl_list, *next_bincl;
245 static int bincls_allocated;
246 
247 /* Local function prototypes */
248 
249 extern void _initialize_dbxread (void);
250 
251 static void read_ofile_symtab (struct partial_symtab *);
252 
253 static void dbx_psymtab_to_symtab (struct partial_symtab *);
254 
255 static void dbx_psymtab_to_symtab_1 (struct partial_symtab *);
256 
257 static void read_dbx_dynamic_symtab (struct objfile *objfile);
258 
259 static void read_dbx_symtab (struct objfile *);
260 
261 static void free_bincl_list (struct objfile *);
262 
263 static struct partial_symtab *find_corresponding_bincl_psymtab (char *, int);
264 
265 static void add_bincl_to_list (struct partial_symtab *, char *, int);
266 
267 static void init_bincl_list (int, struct objfile *);
268 
269 static char *dbx_next_symbol_text (struct objfile *);
270 
271 static void fill_symbuf (bfd *);
272 
273 static void dbx_symfile_init (struct objfile *);
274 
275 static void dbx_new_init (struct objfile *);
276 
277 static void dbx_symfile_read (struct objfile *, int);
278 
279 static void dbx_symfile_finish (struct objfile *);
280 
281 static void record_minimal_symbol (char *, CORE_ADDR, int, struct objfile *);
282 
283 static void add_new_header_file (char *, int);
284 
285 static void add_old_header_file (char *, int);
286 
287 static void add_this_object_header_file (int);
288 
289 static struct partial_symtab *start_psymtab (struct objfile *, char *,
290 					     CORE_ADDR, int,
291 					     struct partial_symbol **,
292 					     struct partial_symbol **);
293 
294 /* Free up old header file tables */
295 
296 void
297 free_header_files (void)
298 {
299   if (this_object_header_files)
300     {
301       xfree (this_object_header_files);
302       this_object_header_files = NULL;
303     }
304   n_allocated_this_object_header_files = 0;
305 }
306 
307 /* Allocate new header file tables */
308 
309 void
310 init_header_files (void)
311 {
312   n_allocated_this_object_header_files = 10;
313   this_object_header_files = (int *) xmalloc (10 * sizeof (int));
314 }
315 
316 /* Add header file number I for this object file
317    at the next successive FILENUM.  */
318 
319 static void
320 add_this_object_header_file (int i)
321 {
322   if (n_this_object_header_files == n_allocated_this_object_header_files)
323     {
324       n_allocated_this_object_header_files *= 2;
325       this_object_header_files
326 	= (int *) xrealloc ((char *) this_object_header_files,
327 		       n_allocated_this_object_header_files * sizeof (int));
328     }
329 
330   this_object_header_files[n_this_object_header_files++] = i;
331 }
332 
333 /* Add to this file an "old" header file, one already seen in
334    a previous object file.  NAME is the header file's name.
335    INSTANCE is its instance code, to select among multiple
336    symbol tables for the same header file.  */
337 
338 static void
339 add_old_header_file (char *name, int instance)
340 {
341   struct header_file *p = HEADER_FILES (current_objfile);
342   int i;
343 
344   for (i = 0; i < N_HEADER_FILES (current_objfile); i++)
345     if (strcmp (p[i].name, name) == 0 && instance == p[i].instance)
346       {
347 	add_this_object_header_file (i);
348 	return;
349       }
350   repeated_header_complaint (name, symnum);
351 }
352 
353 /* Add to this file a "new" header file: definitions for its types follow.
354    NAME is the header file's name.
355    Most often this happens only once for each distinct header file,
356    but not necessarily.  If it happens more than once, INSTANCE has
357    a different value each time, and references to the header file
358    use INSTANCE values to select among them.
359 
360    dbx output contains "begin" and "end" markers for each new header file,
361    but at this level we just need to know which files there have been;
362    so we record the file when its "begin" is seen and ignore the "end".  */
363 
364 static void
365 add_new_header_file (char *name, int instance)
366 {
367   int i;
368   struct header_file *hfile;
369 
370   /* Make sure there is room for one more header file.  */
371 
372   i = N_ALLOCATED_HEADER_FILES (current_objfile);
373 
374   if (N_HEADER_FILES (current_objfile) == i)
375     {
376       if (i == 0)
377 	{
378 	  N_ALLOCATED_HEADER_FILES (current_objfile) = 10;
379 	  HEADER_FILES (current_objfile) = (struct header_file *)
380 	    xmalloc (10 * sizeof (struct header_file));
381 	}
382       else
383 	{
384 	  i *= 2;
385 	  N_ALLOCATED_HEADER_FILES (current_objfile) = i;
386 	  HEADER_FILES (current_objfile) = (struct header_file *)
387 	    xrealloc ((char *) HEADER_FILES (current_objfile),
388 		      (i * sizeof (struct header_file)));
389 	}
390     }
391 
392   /* Create an entry for this header file.  */
393 
394   i = N_HEADER_FILES (current_objfile)++;
395   hfile = HEADER_FILES (current_objfile) + i;
396   hfile->name = savestring (name, strlen (name));
397   hfile->instance = instance;
398   hfile->length = 10;
399   hfile->vector
400     = (struct type **) xmalloc (10 * sizeof (struct type *));
401   memset (hfile->vector, 0, 10 * sizeof (struct type *));
402 
403   add_this_object_header_file (i);
404 }
405 
406 #if 0
407 static struct type **
408 explicit_lookup_type (int real_filenum, int index)
409 {
410   struct header_file *f = &HEADER_FILES (current_objfile)[real_filenum];
411 
412   if (index >= f->length)
413     {
414       f->length *= 2;
415       f->vector = (struct type **)
416 	xrealloc (f->vector, f->length * sizeof (struct type *));
417       memset (&f->vector[f->length / 2],
418 	      '\0', f->length * sizeof (struct type *) / 2);
419     }
420   return &f->vector[index];
421 }
422 #endif
423 
424 static void
425 record_minimal_symbol (char *name, CORE_ADDR address, int type,
426 		       struct objfile *objfile)
427 {
428   enum minimal_symbol_type ms_type;
429   int section;
430   asection *bfd_section;
431 
432   switch (type)
433     {
434     case N_TEXT | N_EXT:
435       ms_type = mst_text;
436       section = SECT_OFF_TEXT (objfile);
437       bfd_section = DBX_TEXT_SECTION (objfile);
438       break;
439     case N_DATA | N_EXT:
440       ms_type = mst_data;
441       section = SECT_OFF_DATA (objfile);
442       bfd_section = DBX_DATA_SECTION (objfile);
443       break;
444     case N_BSS | N_EXT:
445       ms_type = mst_bss;
446       section = SECT_OFF_BSS (objfile);
447       bfd_section = DBX_BSS_SECTION (objfile);
448       break;
449     case N_ABS | N_EXT:
450       ms_type = mst_abs;
451       section = -1;
452       bfd_section = NULL;
453       break;
454 #ifdef N_SETV
455     case N_SETV | N_EXT:
456       ms_type = mst_data;
457       section = SECT_OFF_DATA (objfile);
458       bfd_section = DBX_DATA_SECTION (objfile);
459       break;
460     case N_SETV:
461       /* I don't think this type actually exists; since a N_SETV is the result
462          of going over many .o files, it doesn't make sense to have one
463          file local.  */
464       ms_type = mst_file_data;
465       section = SECT_OFF_DATA (objfile);
466       bfd_section = DBX_DATA_SECTION (objfile);
467       break;
468 #endif
469     case N_TEXT:
470     case N_NBTEXT:
471     case N_FN:
472     case N_FN_SEQ:
473       ms_type = mst_file_text;
474       section = SECT_OFF_TEXT (objfile);
475       bfd_section = DBX_TEXT_SECTION (objfile);
476       break;
477     case N_DATA:
478       ms_type = mst_file_data;
479 
480       /* Check for __DYNAMIC, which is used by Sun shared libraries.
481          Record it as global even if it's local, not global, so
482          lookup_minimal_symbol can find it.  We don't check symbol_leading_char
483          because for SunOS4 it always is '_'.  */
484       if (name[8] == 'C' && DEPRECATED_STREQ ("__DYNAMIC", name))
485 	ms_type = mst_data;
486 
487       /* Same with virtual function tables, both global and static.  */
488       {
489 	char *tempstring = name;
490 	if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
491 	  ++tempstring;
492 	if (is_vtable_name (tempstring))
493 	  ms_type = mst_data;
494       }
495       section = SECT_OFF_DATA (objfile);
496       bfd_section = DBX_DATA_SECTION (objfile);
497       break;
498     case N_BSS:
499       ms_type = mst_file_bss;
500       section = SECT_OFF_BSS (objfile);
501       bfd_section = DBX_BSS_SECTION (objfile);
502       break;
503     default:
504       ms_type = mst_unknown;
505       section = -1;
506       bfd_section = NULL;
507       break;
508     }
509 
510   if ((ms_type == mst_file_text || ms_type == mst_text)
511       && address < lowest_text_address)
512     lowest_text_address = address;
513 
514   prim_record_minimal_symbol_and_info
515     (name, address, ms_type, NULL, section, bfd_section, objfile);
516 }
517 
518 /* Scan and build partial symbols for a symbol file.
519    We have been initialized by a call to dbx_symfile_init, which
520    put all the relevant info into a "struct dbx_symfile_info",
521    hung off the objfile structure.
522 
523    MAINLINE is true if we are reading the main symbol
524    table (as opposed to a shared lib or dynamically loaded file).  */
525 
526 static void
527 dbx_symfile_read (struct objfile *objfile, int mainline)
528 {
529   bfd *sym_bfd;
530   int val;
531   struct cleanup *back_to;
532 
533   sym_bfd = objfile->obfd;
534 
535   /* .o and .nlm files are relocatables with text, data and bss segs based at
536      0.  This flag disables special (Solaris stabs-in-elf only) fixups for
537      symbols with a value of 0.  */
538 
539   symfile_relocatable = bfd_get_file_flags (sym_bfd) & HAS_RELOC;
540 
541   /* This is true for Solaris (and all other systems which put stabs
542      in sections, hopefully, since it would be silly to do things
543      differently from Solaris), and false for SunOS4 and other a.out
544      file formats.  */
545   block_address_function_relative =
546     ((0 == strncmp (bfd_get_target (sym_bfd), "elf", 3))
547      || (0 == strncmp (bfd_get_target (sym_bfd), "som", 3))
548      || (0 == strncmp (bfd_get_target (sym_bfd), "coff", 4))
549      || (0 == strncmp (bfd_get_target (sym_bfd), "pe", 2))
550      || (0 == strncmp (bfd_get_target (sym_bfd), "epoc-pe", 7))
551      || (0 == strncmp (bfd_get_target (sym_bfd), "nlm", 3)));
552 
553   val = bfd_seek (sym_bfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
554   if (val < 0)
555     perror_with_name (objfile->name);
556 
557   /* If we are reinitializing, or if we have never loaded syms yet, init */
558   if (mainline
559       || (objfile->global_psymbols.size == 0
560 	  &&  objfile->static_psymbols.size == 0))
561     init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
562 
563   symbol_size = DBX_SYMBOL_SIZE (objfile);
564   symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
565 
566   free_pending_blocks ();
567   back_to = make_cleanup (really_free_pendings, 0);
568 
569   init_minimal_symbol_collection ();
570   make_cleanup_discard_minimal_symbols ();
571 
572   /* Read stabs data from executable file and define symbols. */
573 
574   read_dbx_symtab (objfile);
575 
576   /* Add the dynamic symbols.  */
577 
578   read_dbx_dynamic_symtab (objfile);
579 
580   /* Install any minimal symbols that have been collected as the current
581      minimal symbols for this objfile. */
582 
583   install_minimal_symbols (objfile);
584 
585   do_cleanups (back_to);
586 }
587 
588 /* Initialize anything that needs initializing when a completely new
589    symbol file is specified (not just adding some symbols from another
590    file, e.g. a shared library).  */
591 
592 static void
593 dbx_new_init (struct objfile *ignore)
594 {
595   stabsread_new_init ();
596   buildsym_new_init ();
597   init_header_files ();
598 }
599 
600 
601 /* dbx_symfile_init ()
602    is the dbx-specific initialization routine for reading symbols.
603    It is passed a struct objfile which contains, among other things,
604    the BFD for the file whose symbols are being read, and a slot for a pointer
605    to "private data" which we fill with goodies.
606 
607    We read the string table into malloc'd space and stash a pointer to it.
608 
609    Since BFD doesn't know how to read debug symbols in a format-independent
610    way (and may never do so...), we have to do it ourselves.  We will never
611    be called unless this is an a.out (or very similar) file.
612    FIXME, there should be a cleaner peephole into the BFD environment here.  */
613 
614 #define DBX_STRINGTAB_SIZE_SIZE sizeof(long)	/* FIXME */
615 
616 static void
617 dbx_symfile_init (struct objfile *objfile)
618 {
619   int val;
620   bfd *sym_bfd = objfile->obfd;
621   char *name = bfd_get_filename (sym_bfd);
622   asection *text_sect;
623   unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
624 
625   /* Allocate struct to keep track of the symfile */
626   objfile->sym_stab_info = (struct dbx_symfile_info *)
627     xmalloc (sizeof (struct dbx_symfile_info));
628   memset (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
629 
630   DBX_TEXT_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
631   DBX_DATA_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".data");
632   DBX_BSS_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".bss");
633 
634   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
635 #define	STRING_TABLE_OFFSET	(sym_bfd->origin + obj_str_filepos (sym_bfd))
636 #define	SYMBOL_TABLE_OFFSET	(sym_bfd->origin + obj_sym_filepos (sym_bfd))
637 
638   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
639 
640   DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
641 
642   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
643   if (!text_sect)
644     error ("Can't find .text section in symbol file");
645   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
646   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
647 
648   DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
649   DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
650   DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
651 
652   /* Read the string table and stash it away in the objfile_obstack.
653      When we blow away the objfile the string table goes away as well.
654      Note that gdb used to use the results of attempting to malloc the
655      string table, based on the size it read, as a form of sanity check
656      for botched byte swapping, on the theory that a byte swapped string
657      table size would be so totally bogus that the malloc would fail.  Now
658      that we put in on the objfile_obstack, we can't do this since gdb gets
659      a fatal error (out of virtual memory) if the size is bogus.  We can
660      however at least check to see if the size is less than the size of
661      the size field itself, or larger than the size of the entire file.
662      Note that all valid string tables have a size greater than zero, since
663      the bytes used to hold the size are included in the count. */
664 
665   if (STRING_TABLE_OFFSET == 0)
666     {
667       /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
668          will never be zero, even when there is no string table.  This
669          would appear to be a bug in bfd. */
670       DBX_STRINGTAB_SIZE (objfile) = 0;
671       DBX_STRINGTAB (objfile) = NULL;
672     }
673   else
674     {
675       val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
676       if (val < 0)
677 	perror_with_name (name);
678 
679       memset (size_temp, 0, sizeof (size_temp));
680       val = bfd_bread (size_temp, sizeof (size_temp), sym_bfd);
681       if (val < 0)
682 	{
683 	  perror_with_name (name);
684 	}
685       else if (val == 0)
686 	{
687 	  /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
688 	     EOF if there is no string table, and attempting to read the size
689 	     from EOF will read zero bytes. */
690 	  DBX_STRINGTAB_SIZE (objfile) = 0;
691 	  DBX_STRINGTAB (objfile) = NULL;
692 	}
693       else
694 	{
695 	  /* Read some data that would appear to be the string table size.
696 	     If there really is a string table, then it is probably the right
697 	     size.  Byteswap if necessary and validate the size.  Note that
698 	     the minimum is DBX_STRINGTAB_SIZE_SIZE.  If we just read some
699 	     random data that happened to be at STRING_TABLE_OFFSET, because
700 	     bfd can't tell us there is no string table, the sanity checks may
701 	     or may not catch this. */
702 	  DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
703 
704 	  if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
705 	      || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
706 	    error ("ridiculous string table size (%d bytes).",
707 		   DBX_STRINGTAB_SIZE (objfile));
708 
709 	  DBX_STRINGTAB (objfile) =
710 	    (char *) obstack_alloc (&objfile->objfile_obstack,
711 				    DBX_STRINGTAB_SIZE (objfile));
712 	  OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile));
713 
714 	  /* Now read in the string table in one big gulp.  */
715 
716 	  val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
717 	  if (val < 0)
718 	    perror_with_name (name);
719 	  val = bfd_bread (DBX_STRINGTAB (objfile),
720 			   DBX_STRINGTAB_SIZE (objfile),
721 			   sym_bfd);
722 	  if (val != DBX_STRINGTAB_SIZE (objfile))
723 	    perror_with_name (name);
724 	}
725     }
726 }
727 
728 /* Perform any local cleanups required when we are done with a particular
729    objfile.  I.E, we are in the process of discarding all symbol information
730    for an objfile, freeing up all memory held for it, and unlinking the
731    objfile struct from the global list of known objfiles. */
732 
733 static void
734 dbx_symfile_finish (struct objfile *objfile)
735 {
736   if (objfile->sym_stab_info != NULL)
737     {
738       if (HEADER_FILES (objfile) != NULL)
739 	{
740 	  int i = N_HEADER_FILES (objfile);
741 	  struct header_file *hfiles = HEADER_FILES (objfile);
742 
743 	  while (--i >= 0)
744 	    {
745 	      xfree (hfiles[i].name);
746 	      xfree (hfiles[i].vector);
747 	    }
748 	  xfree (hfiles);
749 	}
750       xfree (objfile->sym_stab_info);
751     }
752   free_header_files ();
753 }
754 
755 
756 /* Buffer for reading the symbol table entries.  */
757 static struct external_nlist symbuf[4096];
758 static int symbuf_idx;
759 static int symbuf_end;
760 
761 /* Name of last function encountered.  Used in Solaris to approximate
762    object file boundaries.  */
763 static char *last_function_name;
764 
765 /* The address in memory of the string table of the object file we are
766    reading (which might not be the "main" object file, but might be a
767    shared library or some other dynamically loaded thing).  This is
768    set by read_dbx_symtab when building psymtabs, and by
769    read_ofile_symtab when building symtabs, and is used only by
770    next_symbol_text.  FIXME: If that is true, we don't need it when
771    building psymtabs, right?  */
772 static char *stringtab_global;
773 
774 /* These variables are used to control fill_symbuf when the stabs
775    symbols are not contiguous (as may be the case when a COFF file is
776    linked using --split-by-reloc).  */
777 static struct stab_section_list *symbuf_sections;
778 static unsigned int symbuf_left;
779 static unsigned int symbuf_read;
780 
781 /* This variable stores a global stabs buffer, if we read stabs into
782    memory in one chunk in order to process relocations.  */
783 static bfd_byte *stabs_data;
784 
785 /* Refill the symbol table input buffer
786    and set the variables that control fetching entries from it.
787    Reports an error if no data available.
788    This function can read past the end of the symbol table
789    (into the string table) but this does no harm.  */
790 
791 static void
792 fill_symbuf (bfd *sym_bfd)
793 {
794   unsigned int count;
795   int nbytes;
796 
797   if (stabs_data)
798     {
799       nbytes = sizeof (symbuf);
800       if (nbytes > symbuf_left)
801         nbytes = symbuf_left;
802       memcpy (symbuf, stabs_data + symbuf_read, nbytes);
803     }
804   else if (symbuf_sections == NULL)
805     {
806       count = sizeof (symbuf);
807       nbytes = bfd_bread (symbuf, count, sym_bfd);
808     }
809   else
810     {
811       if (symbuf_left <= 0)
812 	{
813 	  file_ptr filepos = symbuf_sections->section->filepos;
814 	  if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0)
815 	    perror_with_name (bfd_get_filename (sym_bfd));
816 	  symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section);
817 	  symbol_table_offset = filepos - symbuf_read;
818 	  symbuf_sections = symbuf_sections->next;
819 	}
820 
821       count = symbuf_left;
822       if (count > sizeof (symbuf))
823 	count = sizeof (symbuf);
824       nbytes = bfd_bread (symbuf, count, sym_bfd);
825     }
826 
827   if (nbytes < 0)
828     perror_with_name (bfd_get_filename (sym_bfd));
829   else if (nbytes == 0)
830     error ("Premature end of file reading symbol table");
831   symbuf_end = nbytes / symbol_size;
832   symbuf_idx = 0;
833   symbuf_left -= nbytes;
834   symbuf_read += nbytes;
835 }
836 
837 static void
838 stabs_seek (int sym_offset)
839 {
840   if (stabs_data)
841     {
842       symbuf_read += sym_offset;
843       symbuf_left -= sym_offset;
844     }
845   else
846     bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
847 }
848 
849 #define INTERNALIZE_SYMBOL(intern, extern, abfd)			\
850   {									\
851     (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);		\
852     (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);		\
853     (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);  		\
854     if (bfd_get_sign_extend_vma (abfd))					\
855       (intern).n_value = bfd_h_get_signed_32 (abfd, (extern)->e_value);	\
856     else								\
857       (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);	\
858   }
859 
860 /* Invariant: The symbol pointed to by symbuf_idx is the first one
861    that hasn't been swapped.  Swap the symbol at the same time
862    that symbuf_idx is incremented.  */
863 
864 /* dbx allows the text of a symbol name to be continued into the
865    next symbol name!  When such a continuation is encountered
866    (a \ at the end of the text of a name)
867    call this function to get the continuation.  */
868 
869 static char *
870 dbx_next_symbol_text (struct objfile *objfile)
871 {
872   struct internal_nlist nlist;
873 
874   if (symbuf_idx == symbuf_end)
875     fill_symbuf (symfile_bfd);
876 
877   symnum++;
878   INTERNALIZE_SYMBOL (nlist, &symbuf[symbuf_idx], symfile_bfd);
879   OBJSTAT (objfile, n_stabs++);
880 
881   symbuf_idx++;
882 
883   return nlist.n_strx + stringtab_global + file_string_table_offset;
884 }
885 
886 /* Initialize the list of bincls to contain none and have some
887    allocated.  */
888 
889 static void
890 init_bincl_list (int number, struct objfile *objfile)
891 {
892   bincls_allocated = number;
893   next_bincl = bincl_list = (struct header_file_location *)
894     xmalloc (bincls_allocated * sizeof (struct header_file_location));
895 }
896 
897 /* Add a bincl to the list.  */
898 
899 static void
900 add_bincl_to_list (struct partial_symtab *pst, char *name, int instance)
901 {
902   if (next_bincl >= bincl_list + bincls_allocated)
903     {
904       int offset = next_bincl - bincl_list;
905       bincls_allocated *= 2;
906       bincl_list = (struct header_file_location *)
907 	xrealloc ((char *) bincl_list,
908 		  bincls_allocated * sizeof (struct header_file_location));
909       next_bincl = bincl_list + offset;
910     }
911   next_bincl->pst = pst;
912   next_bincl->instance = instance;
913   next_bincl++->name = name;
914 }
915 
916 /* Given a name, value pair, find the corresponding
917    bincl in the list.  Return the partial symtab associated
918    with that header_file_location.  */
919 
920 static struct partial_symtab *
921 find_corresponding_bincl_psymtab (char *name, int instance)
922 {
923   struct header_file_location *bincl;
924 
925   for (bincl = bincl_list; bincl < next_bincl; bincl++)
926     if (bincl->instance == instance
927 	&& strcmp (name, bincl->name) == 0)
928       return bincl->pst;
929 
930   repeated_header_complaint (name, symnum);
931   return (struct partial_symtab *) 0;
932 }
933 
934 /* Free the storage allocated for the bincl list.  */
935 
936 static void
937 free_bincl_list (struct objfile *objfile)
938 {
939   xfree (bincl_list);
940   bincls_allocated = 0;
941 }
942 
943 static void
944 do_free_bincl_list_cleanup (void *objfile)
945 {
946   free_bincl_list (objfile);
947 }
948 
949 static struct cleanup *
950 make_cleanup_free_bincl_list (struct objfile *objfile)
951 {
952   return make_cleanup (do_free_bincl_list_cleanup, objfile);
953 }
954 
955 /* Set namestring based on nlist.  If the string table index is invalid,
956    give a fake name, and print a single error message per symbol file read,
957    rather than abort the symbol reading or flood the user with messages.  */
958 
959 static char *
960 set_namestring (struct objfile *objfile, struct internal_nlist nlist)
961 {
962   char *namestring;
963 
964   if (((unsigned) nlist.n_strx + file_string_table_offset) >=
965       DBX_STRINGTAB_SIZE (objfile))
966     {
967       complaint (&symfile_complaints, "bad string table offset in symbol %d",
968 		 symnum);
969       namestring = "<bad string table offset>";
970     }
971   else
972     namestring = nlist.n_strx + file_string_table_offset +
973       DBX_STRINGTAB (objfile);
974   return namestring;
975 }
976 
977 /* Scan a SunOs dynamic symbol table for symbols of interest and
978    add them to the minimal symbol table.  */
979 
980 static void
981 read_dbx_dynamic_symtab (struct objfile *objfile)
982 {
983   bfd *abfd = objfile->obfd;
984   struct cleanup *back_to;
985   int counter;
986   long dynsym_size;
987   long dynsym_count;
988   asymbol **dynsyms;
989   asymbol **symptr;
990   arelent **relptr;
991   long dynrel_size;
992   long dynrel_count;
993   arelent **dynrels;
994   CORE_ADDR sym_value;
995   char *name;
996 
997   /* Check that the symbol file has dynamic symbols that we know about.
998      bfd_arch_unknown can happen if we are reading a sun3 symbol file
999      on a sun4 host (and vice versa) and bfd is not configured
1000      --with-target=all.  This would trigger an assertion in bfd/sunos.c,
1001      so we ignore the dynamic symbols in this case.  */
1002   if (bfd_get_flavour (abfd) != bfd_target_aout_flavour
1003       || (bfd_get_file_flags (abfd) & DYNAMIC) == 0
1004       || bfd_get_arch (abfd) == bfd_arch_unknown)
1005     return;
1006 
1007   dynsym_size = bfd_get_dynamic_symtab_upper_bound (abfd);
1008   if (dynsym_size < 0)
1009     return;
1010 
1011   dynsyms = (asymbol **) xmalloc (dynsym_size);
1012   back_to = make_cleanup (xfree, dynsyms);
1013 
1014   dynsym_count = bfd_canonicalize_dynamic_symtab (abfd, dynsyms);
1015   if (dynsym_count < 0)
1016     {
1017       do_cleanups (back_to);
1018       return;
1019     }
1020 
1021   /* Enter dynamic symbols into the minimal symbol table
1022      if this is a stripped executable.  */
1023   if (bfd_get_symcount (abfd) <= 0)
1024     {
1025       symptr = dynsyms;
1026       for (counter = 0; counter < dynsym_count; counter++, symptr++)
1027 	{
1028 	  asymbol *sym = *symptr;
1029 	  asection *sec;
1030 	  int type;
1031 
1032 	  sec = bfd_get_section (sym);
1033 
1034 	  /* BFD symbols are section relative.  */
1035 	  sym_value = sym->value + sec->vma;
1036 
1037 	  if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
1038 	    {
1039 	      sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1040 	      type = N_TEXT;
1041 	    }
1042 	  else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
1043 	    {
1044 	      sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1045 	      type = N_DATA;
1046 	    }
1047 	  else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
1048 	    {
1049 	      sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
1050 	      type = N_BSS;
1051 	    }
1052 	  else
1053 	    continue;
1054 
1055 	  if (sym->flags & BSF_GLOBAL)
1056 	    type |= N_EXT;
1057 
1058 	  record_minimal_symbol ((char *) bfd_asymbol_name (sym), sym_value,
1059 				 type, objfile);
1060 	}
1061     }
1062 
1063   /* Symbols from shared libraries have a dynamic relocation entry
1064      that points to the associated slot in the procedure linkage table.
1065      We make a mininal symbol table entry with type mst_solib_trampoline
1066      at the address in the procedure linkage table.  */
1067   dynrel_size = bfd_get_dynamic_reloc_upper_bound (abfd);
1068   if (dynrel_size < 0)
1069     {
1070       do_cleanups (back_to);
1071       return;
1072     }
1073 
1074   dynrels = (arelent **) xmalloc (dynrel_size);
1075   make_cleanup (xfree, dynrels);
1076 
1077   dynrel_count = bfd_canonicalize_dynamic_reloc (abfd, dynrels, dynsyms);
1078   if (dynrel_count < 0)
1079     {
1080       do_cleanups (back_to);
1081       return;
1082     }
1083 
1084   for (counter = 0, relptr = dynrels;
1085        counter < dynrel_count;
1086        counter++, relptr++)
1087     {
1088       arelent *rel = *relptr;
1089       CORE_ADDR address =
1090       rel->address + ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1091 
1092       switch (bfd_get_arch (abfd))
1093 	{
1094 	case bfd_arch_sparc:
1095 	  if (rel->howto->type != RELOC_JMP_SLOT)
1096 	    continue;
1097 	  break;
1098 	case bfd_arch_m68k:
1099 	  /* `16' is the type BFD produces for a jump table relocation.  */
1100 	  if (rel->howto->type != 16)
1101 	    continue;
1102 
1103 	  /* Adjust address in the jump table to point to
1104 	     the start of the bsr instruction.  */
1105 	  address -= 2;
1106 	  break;
1107 	default:
1108 	  continue;
1109 	}
1110 
1111       name = (char *) bfd_asymbol_name (*rel->sym_ptr_ptr);
1112       prim_record_minimal_symbol (name, address, mst_solib_trampoline,
1113 				  objfile);
1114     }
1115 
1116   do_cleanups (back_to);
1117 }
1118 
1119 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1120 static CORE_ADDR
1121 find_stab_function_addr (char *namestring, char *filename,
1122 			 struct objfile *objfile)
1123 {
1124   struct minimal_symbol *msym;
1125   char *p;
1126   int n;
1127 
1128   p = strchr (namestring, ':');
1129   if (p == NULL)
1130     p = namestring;
1131   n = p - namestring;
1132   p = alloca (n + 2);
1133   strncpy (p, namestring, n);
1134   p[n] = 0;
1135 
1136   msym = lookup_minimal_symbol (p, filename, objfile);
1137   if (msym == NULL)
1138     {
1139       /* Sun Fortran appends an underscore to the minimal symbol name,
1140          try again with an appended underscore if the minimal symbol
1141          was not found.  */
1142       p[n] = '_';
1143       p[n + 1] = 0;
1144       msym = lookup_minimal_symbol (p, filename, objfile);
1145     }
1146 
1147   if (msym == NULL && filename != NULL)
1148     {
1149       /* Try again without the filename. */
1150       p[n] = 0;
1151       msym = lookup_minimal_symbol (p, NULL, objfile);
1152     }
1153   if (msym == NULL && filename != NULL)
1154     {
1155       /* And try again for Sun Fortran, but without the filename. */
1156       p[n] = '_';
1157       p[n + 1] = 0;
1158       msym = lookup_minimal_symbol (p, NULL, objfile);
1159     }
1160 
1161   return msym == NULL ? 0 : SYMBOL_VALUE_ADDRESS (msym);
1162 }
1163 #endif /* SOFUN_ADDRESS_MAYBE_MISSING */
1164 
1165 static void
1166 function_outside_compilation_unit_complaint (const char *arg1)
1167 {
1168   complaint (&symfile_complaints,
1169 	     "function `%s' appears to be defined outside of all compilation units",
1170 	     arg1);
1171 }
1172 
1173 /* Setup partial_symtab's describing each source file for which
1174    debugging information is available. */
1175 
1176 static void
1177 read_dbx_symtab (struct objfile *objfile)
1178 {
1179   struct external_nlist *bufp = 0;	/* =0 avoids gcc -Wall glitch */
1180   struct internal_nlist nlist;
1181   CORE_ADDR text_addr;
1182   int text_size;
1183 
1184   char *namestring;
1185   int nsl;
1186   int past_first_source_file = 0;
1187   CORE_ADDR last_o_file_start = 0;
1188   CORE_ADDR last_function_start = 0;
1189   struct cleanup *back_to;
1190   bfd *abfd;
1191   int textlow_not_set;
1192   int data_sect_index;
1193 
1194   /* Current partial symtab */
1195   struct partial_symtab *pst;
1196 
1197   /* List of current psymtab's include files */
1198   char **psymtab_include_list;
1199   int includes_allocated;
1200   int includes_used;
1201 
1202   /* Index within current psymtab dependency list */
1203   struct partial_symtab **dependency_list;
1204   int dependencies_used, dependencies_allocated;
1205 
1206   text_addr = DBX_TEXT_ADDR (objfile);
1207   text_size = DBX_TEXT_SIZE (objfile);
1208 
1209   /* FIXME.  We probably want to change stringtab_global rather than add this
1210      while processing every symbol entry.  FIXME.  */
1211   file_string_table_offset = 0;
1212   next_file_string_table_offset = 0;
1213 
1214   stringtab_global = DBX_STRINGTAB (objfile);
1215 
1216   pst = (struct partial_symtab *) 0;
1217 
1218   includes_allocated = 30;
1219   includes_used = 0;
1220   psymtab_include_list = (char **) alloca (includes_allocated *
1221 					   sizeof (char *));
1222 
1223   dependencies_allocated = 30;
1224   dependencies_used = 0;
1225   dependency_list =
1226     (struct partial_symtab **) alloca (dependencies_allocated *
1227 				       sizeof (struct partial_symtab *));
1228 
1229   /* Init bincl list */
1230   init_bincl_list (20, objfile);
1231   back_to = make_cleanup_free_bincl_list (objfile);
1232 
1233   last_source_file = NULL;
1234 
1235   lowest_text_address = (CORE_ADDR) -1;
1236 
1237   symfile_bfd = objfile->obfd;	/* For next_text_symbol */
1238   abfd = objfile->obfd;
1239   symbuf_end = symbuf_idx = 0;
1240   next_symbol_text_func = dbx_next_symbol_text;
1241   textlow_not_set = 1;
1242   has_line_numbers = 0;
1243 
1244   /* FIXME: jimb/2003-09-12: We don't apply the right section's offset
1245      to global and static variables.  The stab for a global or static
1246      variable doesn't give us any indication of which section it's in,
1247      so we can't tell immediately which offset in
1248      objfile->section_offsets we should apply to the variable's
1249      address.
1250 
1251      We could certainly find out which section contains the variable
1252      by looking up the variable's unrelocated address with
1253      find_pc_section, but that would be expensive; this is the
1254      function that constructs the partial symbol tables by examining
1255      every symbol in the entire executable, and it's
1256      performance-critical.  So that expense would not be welcome.  I'm
1257      not sure what to do about this at the moment.
1258 
1259      What we have done for years is to simply assume that the .data
1260      section's offset is appropriate for all global and static
1261      variables.  Recently, this was expanded to fall back to the .bss
1262      section's offset if there is no .data section, and then to the
1263      .rodata section's offset.  */
1264   data_sect_index = objfile->sect_index_data;
1265   if (data_sect_index == -1)
1266     data_sect_index = SECT_OFF_BSS (objfile);
1267   if (data_sect_index == -1)
1268     data_sect_index = SECT_OFF_RODATA (objfile);
1269 
1270   /* If data_sect_index is still -1, that's okay.  It's perfectly fine
1271      for the file to have no .data, no .bss, and no .text at all, if
1272      it also has no global or static variables.  If it does, we will
1273      get an internal error from an ANOFFSET macro below when we try to
1274      use data_sect_index.  */
1275 
1276   for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
1277     {
1278       /* Get the symbol for this run and pull out some info */
1279       QUIT;			/* allow this to be interruptable */
1280       if (symbuf_idx == symbuf_end)
1281 	fill_symbuf (abfd);
1282       bufp = &symbuf[symbuf_idx++];
1283 
1284       /*
1285        * Special case to speed up readin.
1286        */
1287       if (bfd_h_get_8 (abfd, bufp->e_type) == N_SLINE)
1288 	{
1289 	  has_line_numbers = 1;
1290 	  continue;
1291 	}
1292 
1293       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1294       OBJSTAT (objfile, n_stabs++);
1295 
1296       /* Ok.  There is a lot of code duplicated in the rest of this
1297          switch statement (for efficiency reasons).  Since I don't
1298          like duplicating code, I will do my penance here, and
1299          describe the code which is duplicated:
1300 
1301          *) The assignment to namestring.
1302          *) The call to strchr.
1303          *) The addition of a partial symbol the the two partial
1304          symbol lists.  This last is a large section of code, so
1305          I've imbedded it in the following macro.
1306       */
1307 
1308       switch (nlist.n_type)
1309 	{
1310 	  char *p;
1311 	  /*
1312 	   * Standard, external, non-debugger, symbols
1313 	   */
1314 
1315 	  case N_TEXT | N_EXT:
1316 	  case N_NBTEXT | N_EXT:
1317 	  nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1318 	  goto record_it;
1319 
1320 	  case N_DATA | N_EXT:
1321 	  case N_NBDATA | N_EXT:
1322 	  nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1323 	  goto record_it;
1324 
1325 	  case N_BSS:
1326 	  case N_BSS | N_EXT:
1327 	  case N_NBBSS | N_EXT:
1328 	  case N_SETV | N_EXT:		/* FIXME, is this in BSS? */
1329 	  nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
1330 	  goto record_it;
1331 
1332 	  case N_ABS | N_EXT:
1333 	  record_it:
1334 	  namestring = set_namestring (objfile, nlist);
1335 
1336 	  bss_ext_symbol:
1337 	  record_minimal_symbol (namestring, nlist.n_value,
1338 				 nlist.n_type, objfile);	/* Always */
1339 	  continue;
1340 
1341 	  /* Standard, local, non-debugger, symbols */
1342 
1343 	  case N_NBTEXT:
1344 
1345 	  /* We need to be able to deal with both N_FN or N_TEXT,
1346 	     because we have no way of knowing whether the sys-supplied ld
1347 	     or GNU ld was used to make the executable.  Sequents throw
1348 	     in another wrinkle -- they renumbered N_FN.  */
1349 
1350 	  case N_FN:
1351 	  case N_FN_SEQ:
1352 	  case N_TEXT:
1353 	  nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1354 	  namestring = set_namestring (objfile, nlist);
1355 
1356 	  if ((namestring[0] == '-' && namestring[1] == 'l')
1357 	      || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
1358 		  && namestring[nsl - 2] == '.'))
1359 	  {
1360 	    if (past_first_source_file && pst
1361 		/* The gould NP1 uses low values for .o and -l symbols
1362 		   which are not the address.  */
1363 		&& nlist.n_value >= pst->textlow)
1364 	      {
1365 		end_psymtab (pst, psymtab_include_list, includes_used,
1366 			     symnum * symbol_size,
1367 			     nlist.n_value > pst->texthigh
1368 			     ? nlist.n_value : pst->texthigh,
1369 			     dependency_list, dependencies_used, textlow_not_set);
1370 		pst = (struct partial_symtab *) 0;
1371 		includes_used = 0;
1372 		dependencies_used = 0;
1373 	      }
1374 	    else
1375 	      past_first_source_file = 1;
1376 	    last_o_file_start = nlist.n_value;
1377 	  }
1378 	  else
1379 	  goto record_it;
1380 	  continue;
1381 
1382 	  case N_DATA:
1383 	  nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1384 	  goto record_it;
1385 
1386 	  case N_UNDF | N_EXT:
1387 	  if (nlist.n_value != 0)
1388 	  {
1389 	    /* This is a "Fortran COMMON" symbol.  See if the target
1390 	       environment knows where it has been relocated to.  */
1391 
1392 	    CORE_ADDR reladdr;
1393 
1394 	    namestring = set_namestring (objfile, nlist);
1395 	    if (target_lookup_symbol (namestring, &reladdr))
1396 	      {
1397 		continue;		/* Error in lookup; ignore symbol for now.  */
1398 	      }
1399 	    nlist.n_type ^= (N_BSS ^ N_UNDF);	/* Define it as a bss-symbol */
1400 	    nlist.n_value = reladdr;
1401 	    goto bss_ext_symbol;
1402 	  }
1403 	  continue;			/* Just undefined, not COMMON */
1404 
1405 	  case N_UNDF:
1406 	  if (processing_acc_compilation && nlist.n_strx == 1)
1407 	  {
1408 	    /* Deal with relative offsets in the string table
1409 	       used in ELF+STAB under Solaris.  If we want to use the
1410 	       n_strx field, which contains the name of the file,
1411 	       we must adjust file_string_table_offset *before* calling
1412 	       set_namestring().  */
1413 	    past_first_source_file = 1;
1414 	    file_string_table_offset = next_file_string_table_offset;
1415 	    next_file_string_table_offset =
1416 	      file_string_table_offset + nlist.n_value;
1417 	    if (next_file_string_table_offset < file_string_table_offset)
1418 	      error ("string table offset backs up at %d", symnum);
1419 	    /* FIXME -- replace error() with complaint.  */
1420 	    continue;
1421 	  }
1422 	  continue;
1423 
1424 	  /* Lots of symbol types we can just ignore.  */
1425 
1426 	  case N_ABS:
1427 	  case N_NBDATA:
1428 	  case N_NBBSS:
1429 	  continue;
1430 
1431 	  /* Keep going . . . */
1432 
1433 	  /*
1434 	   * Special symbol types for GNU
1435 	   */
1436 	  case N_INDR:
1437 	  case N_INDR | N_EXT:
1438 	  case N_SETA:
1439 	  case N_SETA | N_EXT:
1440 	  case N_SETT:
1441 	  case N_SETT | N_EXT:
1442 	  case N_SETD:
1443 	  case N_SETD | N_EXT:
1444 	  case N_SETB:
1445 	  case N_SETB | N_EXT:
1446 	  case N_SETV:
1447 	  continue;
1448 
1449 	  /*
1450 	   * Debugger symbols
1451 	   */
1452 
1453 	  case N_SO:
1454 	  {
1455 	    CORE_ADDR valu;
1456 	    static int prev_so_symnum = -10;
1457 	    static int first_so_symnum;
1458 	    char *p;
1459 	    static char *dirname_nso;
1460 	    int prev_textlow_not_set;
1461 
1462 	    valu = nlist.n_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1463 
1464 	    prev_textlow_not_set = textlow_not_set;
1465 
1466 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1467 	    /* A zero value is probably an indication for the SunPRO 3.0
1468 	       compiler. end_psymtab explicitly tests for zero, so
1469 	       don't relocate it.  */
1470 
1471 	    if (nlist.n_value == 0)
1472 	      {
1473 		textlow_not_set = 1;
1474 		valu = 0;
1475 	      }
1476 	    else
1477 	      textlow_not_set = 0;
1478 #else
1479 	    textlow_not_set = 0;
1480 #endif
1481 	    past_first_source_file = 1;
1482 
1483 	    if (prev_so_symnum != symnum - 1)
1484 	      {			/* Here if prev stab wasn't N_SO */
1485 		first_so_symnum = symnum;
1486 
1487 		if (pst)
1488 		  {
1489 		    end_psymtab (pst, psymtab_include_list, includes_used,
1490 				 symnum * symbol_size,
1491 				 valu > pst->texthigh ? valu : pst->texthigh,
1492 				 dependency_list, dependencies_used,
1493 				 prev_textlow_not_set);
1494 		    pst = (struct partial_symtab *) 0;
1495 		    includes_used = 0;
1496 		    dependencies_used = 0;
1497 		  }
1498 	      }
1499 
1500 	    prev_so_symnum = symnum;
1501 
1502 	    /* End the current partial symtab and start a new one */
1503 
1504 	    namestring = set_namestring (objfile, nlist);
1505 
1506 	    /* Null name means end of .o file.  Don't start a new one. */
1507 	    if (*namestring == '\000')
1508 	      continue;
1509 
1510 	    /* Some compilers (including gcc) emit a pair of initial N_SOs.
1511 	       The first one is a directory name; the second the file name.
1512 	       If pst exists, is empty, and has a filename ending in '/',
1513 	       we assume the previous N_SO was a directory name. */
1514 
1515 	    p = strrchr (namestring, '/');
1516 	    if (p && *(p + 1) == '\000')
1517 	      {
1518 		/* Save the directory name SOs locally, then save it into
1519 		   the psymtab when it's created below. */
1520 	        dirname_nso = namestring;
1521 	        continue;
1522 	      }
1523 
1524 	    /* Some other compilers (C++ ones in particular) emit useless
1525 	       SOs for non-existant .c files.  We ignore all subsequent SOs that
1526 	       immediately follow the first.  */
1527 
1528 	    if (!pst)
1529 	      {
1530 	      pst = start_psymtab (objfile,
1531 				   namestring, valu,
1532 				   first_so_symnum * symbol_size,
1533 				   objfile->global_psymbols.next,
1534 				   objfile->static_psymbols.next);
1535 		pst->dirname = dirname_nso;
1536 		dirname_nso = NULL;
1537 	      }
1538 	    continue;
1539 	  }
1540 
1541 	  case N_BINCL:
1542 	  {
1543 	    enum language tmp_language;
1544 	    /* Add this bincl to the bincl_list for future EXCLs.  No
1545 	       need to save the string; it'll be around until
1546 	       read_dbx_symtab function returns */
1547 
1548 	    namestring = set_namestring (objfile, nlist);
1549 	    tmp_language = deduce_language_from_filename (namestring);
1550 
1551 	    /* Only change the psymtab's language if we've learned
1552 	       something useful (eg. tmp_language is not language_unknown).
1553 	       In addition, to match what start_subfile does, never change
1554 	       from C++ to C.  */
1555 	    if (tmp_language != language_unknown
1556 		&& (tmp_language != language_c
1557 		    || psymtab_language != language_cplus))
1558 	    psymtab_language = tmp_language;
1559 
1560 	    if (pst == NULL)
1561 	    {
1562 	      /* FIXME: we should not get here without a PST to work on.
1563 		 Attempt to recover.  */
1564 	      complaint (&symfile_complaints,
1565 			 "N_BINCL %s not in entries for any file, at symtab pos %d",
1566 			 namestring, symnum);
1567 	      continue;
1568 	    }
1569 	    add_bincl_to_list (pst, namestring, nlist.n_value);
1570 
1571 	    /* Mark down an include file in the current psymtab */
1572 
1573 	    goto record_include_file;
1574 	  }
1575 
1576 	  case N_SOL:
1577 	  {
1578 	    enum language tmp_language;
1579 	    /* Mark down an include file in the current psymtab */
1580 
1581 	    namestring = set_namestring (objfile, nlist);
1582 	    tmp_language = deduce_language_from_filename (namestring);
1583 
1584 	    /* Only change the psymtab's language if we've learned
1585 	       something useful (eg. tmp_language is not language_unknown).
1586 	       In addition, to match what start_subfile does, never change
1587 	       from C++ to C.  */
1588 	    if (tmp_language != language_unknown
1589 		&& (tmp_language != language_c
1590 		    || psymtab_language != language_cplus))
1591 	    psymtab_language = tmp_language;
1592 
1593 	    /* In C++, one may expect the same filename to come round many
1594 	       times, when code is coming alternately from the main file
1595 	       and from inline functions in other files. So I check to see
1596 	       if this is a file we've seen before -- either the main
1597 	       source file, or a previously included file.
1598 
1599 	       This seems to be a lot of time to be spending on N_SOL, but
1600 	       things like "break c-exp.y:435" need to work (I
1601 	       suppose the psymtab_include_list could be hashed or put
1602 	       in a binary tree, if profiling shows this is a major hog).  */
1603 	    if (pst && strcmp (namestring, pst->filename) == 0)
1604 	    continue;
1605 	    {
1606 	      int i;
1607 	      for (i = 0; i < includes_used; i++)
1608 		if (strcmp (namestring, psymtab_include_list[i]) == 0)
1609 		  {
1610 		    i = -1;
1611 		    break;
1612 		  }
1613 	      if (i == -1)
1614 		continue;
1615 	    }
1616 
1617 	    record_include_file:
1618 
1619 	    psymtab_include_list[includes_used++] = namestring;
1620 	    if (includes_used >= includes_allocated)
1621 	    {
1622 	      char **orig = psymtab_include_list;
1623 
1624 	      psymtab_include_list = (char **)
1625 		alloca ((includes_allocated *= 2) *
1626 			sizeof (char *));
1627 	      memcpy (psymtab_include_list, orig,
1628 		      includes_used * sizeof (char *));
1629 	    }
1630 	    continue;
1631 	  }
1632 	  case N_LSYM:			/* Typedef or automatic variable. */
1633 	  case N_STSYM:		/* Data seg var -- static  */
1634 	  case N_LCSYM:		/* BSS      "  */
1635 	  case N_ROSYM:		/* Read-only data seg var -- static.  */
1636 	  case N_NBSTS:		/* Gould nobase.  */
1637 	  case N_NBLCS:		/* symbols.  */
1638 	  case N_FUN:
1639 	  case N_GSYM:			/* Global (extern) variable; can be
1640 					   data or bss (sigh FIXME).  */
1641 
1642 	  /* Following may probably be ignored; I'll leave them here
1643 	     for now (until I do Pascal and Modula 2 extensions).  */
1644 
1645 	  case N_PC:			/* I may or may not need this; I
1646 					   suspect not.  */
1647 	  case N_M2C:			/* I suspect that I can ignore this here. */
1648 	  case N_SCOPE:		/* Same.   */
1649 
1650 	  namestring = set_namestring (objfile, nlist);
1651 
1652 	  /* See if this is an end of function stab.  */
1653 	  if (pst && nlist.n_type == N_FUN && *namestring == '\000')
1654 	  {
1655 	    CORE_ADDR valu;
1656 
1657 	    /* It's value is the size (in bytes) of the function for
1658 	       function relative stabs, or the address of the function's
1659 	       end for old style stabs.  */
1660 	    valu = nlist.n_value + last_function_start;
1661 	    if (pst->texthigh == 0 || valu > pst->texthigh)
1662 	      pst->texthigh = valu;
1663 	    break;
1664 	  }
1665 
1666 	  p = (char *) strchr (namestring, ':');
1667 	  if (!p)
1668 	  continue;			/* Not a debugging symbol.   */
1669 
1670 
1671 
1672 	  /* Main processing section for debugging symbols which
1673 	     the initial read through the symbol tables needs to worry
1674 	     about.  If we reach this point, the symbol which we are
1675 	     considering is definitely one we are interested in.
1676 	     p must also contain the (valid) index into the namestring
1677 	     which indicates the debugging type symbol.  */
1678 
1679 	  switch (p[1])
1680 	  {
1681 	  case 'S':
1682 	    nlist.n_value += ANOFFSET (objfile->section_offsets, data_sect_index);
1683 #ifdef STATIC_TRANSFORM_NAME
1684 	    namestring = STATIC_TRANSFORM_NAME (namestring);
1685 #endif
1686 	    add_psymbol_to_list (namestring, p - namestring,
1687 				 VAR_DOMAIN, LOC_STATIC,
1688 				 &objfile->static_psymbols,
1689 				 0, nlist.n_value,
1690 				 psymtab_language, objfile);
1691 	    continue;
1692 	  case 'G':
1693 	    nlist.n_value += ANOFFSET (objfile->section_offsets, data_sect_index);
1694 	    /* The addresses in these entries are reported to be
1695 	       wrong.  See the code that reads 'G's for symtabs. */
1696 	    add_psymbol_to_list (namestring, p - namestring,
1697 				 VAR_DOMAIN, LOC_STATIC,
1698 				 &objfile->global_psymbols,
1699 				 0, nlist.n_value,
1700 				 psymtab_language, objfile);
1701 	    continue;
1702 
1703 	  case 'T':
1704 	    /* When a 'T' entry is defining an anonymous enum, it
1705 	       may have a name which is the empty string, or a
1706 	       single space.  Since they're not really defining a
1707 	       symbol, those shouldn't go in the partial symbol
1708 	       table.  We do pick up the elements of such enums at
1709 	       'check_enum:', below.  */
1710 	    if (p >= namestring + 2
1711 		|| (p == namestring + 1
1712 		    && namestring[0] != ' '))
1713 	      {
1714 		add_psymbol_to_list (namestring, p - namestring,
1715 				     STRUCT_DOMAIN, LOC_TYPEDEF,
1716 				     &objfile->static_psymbols,
1717 				     nlist.n_value, 0,
1718 				     psymtab_language, objfile);
1719 		if (p[2] == 't')
1720 		  {
1721 		    /* Also a typedef with the same name.  */
1722 		    add_psymbol_to_list (namestring, p - namestring,
1723 					 VAR_DOMAIN, LOC_TYPEDEF,
1724 					 &objfile->static_psymbols,
1725 					 nlist.n_value, 0,
1726 					 psymtab_language, objfile);
1727 		    p += 1;
1728 		  }
1729 	      }
1730 	    goto check_enum;
1731 	  case 't':
1732 	    if (p != namestring)	/* a name is there, not just :T... */
1733 	      {
1734 		add_psymbol_to_list (namestring, p - namestring,
1735 				     VAR_DOMAIN, LOC_TYPEDEF,
1736 				     &objfile->static_psymbols,
1737 				     nlist.n_value, 0,
1738 				     psymtab_language, objfile);
1739 	      }
1740 	  check_enum:
1741 	    /* If this is an enumerated type, we need to
1742 	       add all the enum constants to the partial symbol
1743 	       table.  This does not cover enums without names, e.g.
1744 	       "enum {a, b} c;" in C, but fortunately those are
1745 	       rare.  There is no way for GDB to find those from the
1746 	       enum type without spending too much time on it.  Thus
1747 	       to solve this problem, the compiler needs to put out the
1748 	       enum in a nameless type.  GCC2 does this.  */
1749 
1750 	    /* We are looking for something of the form
1751 	       <name> ":" ("t" | "T") [<number> "="] "e"
1752 	       {<constant> ":" <value> ","} ";".  */
1753 
1754 	    /* Skip over the colon and the 't' or 'T'.  */
1755 	    p += 2;
1756 	    /* This type may be given a number.  Also, numbers can come
1757 	       in pairs like (0,26).  Skip over it.  */
1758 	    while ((*p >= '0' && *p <= '9')
1759 		   || *p == '(' || *p == ',' || *p == ')'
1760 		   || *p == '=')
1761 	      p++;
1762 
1763 	    if (*p++ == 'e')
1764 	      {
1765 		/* The aix4 compiler emits extra crud before the members.  */
1766 		if (*p == '-')
1767 		  {
1768 		    /* Skip over the type (?).  */
1769 		    while (*p != ':')
1770 		      p++;
1771 
1772 		    /* Skip over the colon.  */
1773 		    p++;
1774 		  }
1775 
1776 		/* We have found an enumerated type.  */
1777 		/* According to comments in read_enum_type
1778 		   a comma could end it instead of a semicolon.
1779 		   I don't know where that happens.
1780 		   Accept either.  */
1781 		while (*p && *p != ';' && *p != ',')
1782 		  {
1783 		    char *q;
1784 
1785 		    /* Check for and handle cretinous dbx symbol name
1786 		       continuation!  */
1787 		    if (*p == '\\' || (*p == '?' && p[1] == '\0'))
1788 		      p = next_symbol_text (objfile);
1789 
1790 		    /* Point to the character after the name
1791 		       of the enum constant.  */
1792 		    for (q = p; *q && *q != ':'; q++)
1793 		      ;
1794 		    /* Note that the value doesn't matter for
1795 		       enum constants in psymtabs, just in symtabs.  */
1796 		    add_psymbol_to_list (p, q - p,
1797 					 VAR_DOMAIN, LOC_CONST,
1798 					 &objfile->static_psymbols, 0,
1799 					 0, psymtab_language, objfile);
1800 		    /* Point past the name.  */
1801 		    p = q;
1802 		    /* Skip over the value.  */
1803 		    while (*p && *p != ',')
1804 		      p++;
1805 		    /* Advance past the comma.  */
1806 		    if (*p)
1807 		      p++;
1808 		  }
1809 	      }
1810 	    continue;
1811 	  case 'c':
1812 	    /* Constant, e.g. from "const" in Pascal.  */
1813 	    add_psymbol_to_list (namestring, p - namestring,
1814 				 VAR_DOMAIN, LOC_CONST,
1815 				 &objfile->static_psymbols, nlist.n_value,
1816 				 0, psymtab_language, objfile);
1817 	    continue;
1818 
1819 	  case 'f':
1820 	    if (! pst)
1821 	      {
1822 		int name_len = p - namestring;
1823 		char *name = xmalloc (name_len + 1);
1824 		memcpy (name, namestring, name_len);
1825 		name[name_len] = '\0';
1826 		function_outside_compilation_unit_complaint (name);
1827 		xfree (name);
1828 	      }
1829 	    nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1830 	    /* Kludges for ELF/STABS with Sun ACC */
1831 	    last_function_name = namestring;
1832 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1833 	    /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
1834 	       value for the bottom of the text seg in those cases. */
1835 	    if (nlist.n_value == ANOFFSET (objfile->section_offsets,
1836 					   SECT_OFF_TEXT (objfile)))
1837 	      {
1838 		CORE_ADDR minsym_valu =
1839 		  find_stab_function_addr (namestring, pst->filename, objfile);
1840 		/* find_stab_function_addr will return 0 if the minimal
1841 		   symbol wasn't found.  (Unfortunately, this might also
1842 		   be a valid address.)  Anyway, if it *does* return 0,
1843 		   it is likely that the value was set correctly to begin
1844 		   with... */
1845 		if (minsym_valu != 0)
1846 		  nlist.n_value = minsym_valu;
1847 	      }
1848 	    if (pst && textlow_not_set)
1849 	      {
1850 		pst->textlow = nlist.n_value;
1851 		textlow_not_set = 0;
1852 	      }
1853 #endif
1854 	    /* End kludge.  */
1855 
1856 	    /* Keep track of the start of the last function so we
1857 	       can handle end of function symbols.  */
1858 	    last_function_start = nlist.n_value;
1859 
1860 	    /* In reordered executables this function may lie outside
1861 	       the bounds created by N_SO symbols.  If that's the case
1862 	       use the address of this function as the low bound for
1863 	       the partial symbol table.  */
1864 	    if (pst
1865 		&& (textlow_not_set
1866 		    || (nlist.n_value < pst->textlow
1867 			&& (nlist.n_value
1868 			    != ANOFFSET (objfile->section_offsets,
1869 					 SECT_OFF_TEXT (objfile))))))
1870 	      {
1871 		pst->textlow = nlist.n_value;
1872 		textlow_not_set = 0;
1873 	      }
1874 	    add_psymbol_to_list (namestring, p - namestring,
1875 				 VAR_DOMAIN, LOC_BLOCK,
1876 				 &objfile->static_psymbols,
1877 				 0, nlist.n_value,
1878 				 psymtab_language, objfile);
1879 	    continue;
1880 
1881 	    /* Global functions were ignored here, but now they
1882 	       are put into the global psymtab like one would expect.
1883 	       They're also in the minimal symbol table.  */
1884 	  case 'F':
1885 	    if (! pst)
1886 	      {
1887 		int name_len = p - namestring;
1888 		char *name = xmalloc (name_len + 1);
1889 		memcpy (name, namestring, name_len);
1890 		name[name_len] = '\0';
1891 		function_outside_compilation_unit_complaint (name);
1892 		xfree (name);
1893 	      }
1894 	    nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1895 	    /* Kludges for ELF/STABS with Sun ACC */
1896 	    last_function_name = namestring;
1897 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1898 	    /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
1899 	       value for the bottom of the text seg in those cases. */
1900 	    if (nlist.n_value == ANOFFSET (objfile->section_offsets,
1901 					   SECT_OFF_TEXT (objfile)))
1902 	      {
1903 		CORE_ADDR minsym_valu =
1904 		  find_stab_function_addr (namestring, pst->filename, objfile);
1905 		/* find_stab_function_addr will return 0 if the minimal
1906 		   symbol wasn't found.  (Unfortunately, this might also
1907 		   be a valid address.)  Anyway, if it *does* return 0,
1908 		   it is likely that the value was set correctly to begin
1909 		   with... */
1910 		if (minsym_valu != 0)
1911 		  nlist.n_value = minsym_valu;
1912 	      }
1913 	    if (pst && textlow_not_set)
1914 	      {
1915 		pst->textlow = nlist.n_value;
1916 		textlow_not_set = 0;
1917 	      }
1918 #endif
1919 	    /* End kludge.  */
1920 
1921 	    /* Keep track of the start of the last function so we
1922 	       can handle end of function symbols.  */
1923 	    last_function_start = nlist.n_value;
1924 
1925 	    /* In reordered executables this function may lie outside
1926 	       the bounds created by N_SO symbols.  If that's the case
1927 	       use the address of this function as the low bound for
1928 	       the partial symbol table.  */
1929 	    if (pst
1930 		&& (textlow_not_set
1931 		    || (nlist.n_value < pst->textlow
1932 			&& (nlist.n_value
1933 			    != ANOFFSET (objfile->section_offsets,
1934 					 SECT_OFF_TEXT (objfile))))))
1935 	      {
1936 		pst->textlow = nlist.n_value;
1937 		textlow_not_set = 0;
1938 	      }
1939 	    add_psymbol_to_list (namestring, p - namestring,
1940 				 VAR_DOMAIN, LOC_BLOCK,
1941 				 &objfile->global_psymbols,
1942 				 0, nlist.n_value,
1943 				 psymtab_language, objfile);
1944 	    continue;
1945 
1946 	    /* Two things show up here (hopefully); static symbols of
1947 	       local scope (static used inside braces) or extensions
1948 	       of structure symbols.  We can ignore both.  */
1949 	  case 'V':
1950 	  case '(':
1951 	  case '0':
1952 	  case '1':
1953 	  case '2':
1954 	  case '3':
1955 	  case '4':
1956 	  case '5':
1957 	  case '6':
1958 	  case '7':
1959 	  case '8':
1960 	  case '9':
1961 	  case '-':
1962 	  case '#':		/* for symbol identification (used in live ranges) */
1963 	    continue;
1964 
1965 	  case ':':
1966 	    /* It is a C++ nested symbol.  We don't need to record it
1967 	       (I don't think); if we try to look up foo::bar::baz,
1968 	       then symbols for the symtab containing foo should get
1969 	       read in, I think.  */
1970 	    /* Someone says sun cc puts out symbols like
1971 	       /foo/baz/maclib::/usr/local/bin/maclib,
1972 	       which would get here with a symbol type of ':'.  */
1973 	    continue;
1974 
1975 	  default:
1976 	    /* Unexpected symbol descriptor.  The second and subsequent stabs
1977 	       of a continued stab can show up here.  The question is
1978 	       whether they ever can mimic a normal stab--it would be
1979 	       nice if not, since we certainly don't want to spend the
1980 	       time searching to the end of every string looking for
1981 	       a backslash.  */
1982 
1983 	    complaint (&symfile_complaints, "unknown symbol descriptor `%c'",
1984 		       p[1]);
1985 
1986 	    /* Ignore it; perhaps it is an extension that we don't
1987 	       know about.  */
1988 	    continue;
1989 	  }
1990 
1991 	  case N_EXCL:
1992 
1993 	  namestring = set_namestring (objfile, nlist);
1994 
1995 	  /* Find the corresponding bincl and mark that psymtab on the
1996 	     psymtab dependency list */
1997 	  {
1998 	    struct partial_symtab *needed_pst =
1999 	      find_corresponding_bincl_psymtab (namestring, nlist.n_value);
2000 
2001 	    /* If this include file was defined earlier in this file,
2002 	       leave it alone.  */
2003 	    if (needed_pst == pst)
2004 	      continue;
2005 
2006 	    if (needed_pst)
2007 	      {
2008 		int i;
2009 		int found = 0;
2010 
2011 		for (i = 0; i < dependencies_used; i++)
2012 		  if (dependency_list[i] == needed_pst)
2013 		    {
2014 		      found = 1;
2015 		      break;
2016 		    }
2017 
2018 		/* If it's already in the list, skip the rest.  */
2019 		if (found)
2020 		  continue;
2021 
2022 		dependency_list[dependencies_used++] = needed_pst;
2023 		if (dependencies_used >= dependencies_allocated)
2024 		  {
2025 		    struct partial_symtab **orig = dependency_list;
2026 		    dependency_list =
2027 		      (struct partial_symtab **)
2028 		      alloca ((dependencies_allocated *= 2)
2029 			      * sizeof (struct partial_symtab *));
2030 		    memcpy (dependency_list, orig,
2031 			    (dependencies_used
2032 			     * sizeof (struct partial_symtab *)));
2033 #ifdef DEBUG_INFO
2034 		    fprintf_unfiltered (gdb_stderr, "Had to reallocate dependency list.\n");
2035 		    fprintf_unfiltered (gdb_stderr, "New dependencies allocated: %d\n",
2036 					dependencies_allocated);
2037 #endif
2038 		  }
2039 	      }
2040 	  }
2041 	  continue;
2042 
2043 	  case N_ENDM:
2044 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
2045 	  /* Solaris 2 end of module, finish current partial symbol table.
2046 	     end_psymtab will set pst->texthigh to the proper value, which
2047 	     is necessary if a module compiled without debugging info
2048 	     follows this module.  */
2049 	  if (pst)
2050 	  {
2051 	    end_psymtab (pst, psymtab_include_list, includes_used,
2052 			 symnum * symbol_size,
2053 			 (CORE_ADDR) 0,
2054 			 dependency_list, dependencies_used, textlow_not_set);
2055 	    pst = (struct partial_symtab *) 0;
2056 	    includes_used = 0;
2057 	    dependencies_used = 0;
2058 	  }
2059 #endif
2060 	  continue;
2061 
2062 	  case N_RBRAC:
2063 #ifdef HANDLE_RBRAC
2064 	  HANDLE_RBRAC (nlist.n_value);
2065 	  continue;
2066 #endif
2067 	  case N_EINCL:
2068 	  case N_DSLINE:
2069 	  case N_BSLINE:
2070 	  case N_SSYM:			/* Claim: Structure or union element.
2071 					   Hopefully, I can ignore this.  */
2072 	  case N_ENTRY:		/* Alternate entry point; can ignore. */
2073 	  case N_MAIN:			/* Can definitely ignore this.   */
2074 	  case N_CATCH:		/* These are GNU C++ extensions */
2075 	  case N_EHDECL:		/* that can safely be ignored here. */
2076 	  case N_LENG:
2077 	  case N_BCOMM:
2078 	  case N_ECOMM:
2079 	  case N_ECOML:
2080 	  case N_FNAME:
2081 	  case N_SLINE:
2082 	  case N_RSYM:
2083 	  case N_PSYM:
2084 	  case N_LBRAC:
2085 	  case N_NSYMS:		/* Ultrix 4.0: symbol count */
2086 	  case N_DEFD:			/* GNU Modula-2 */
2087 	  case N_ALIAS:		/* SunPro F77: alias name, ignore for now.  */
2088 
2089 	  case N_OBJ:			/* useless types from Solaris */
2090 	  case N_OPT:
2091 	  case N_PATCH:
2092 	  /* These symbols aren't interesting; don't worry about them */
2093 
2094 	  continue;
2095 
2096 	  default:
2097 	  /* If we haven't found it yet, ignore it.  It's probably some
2098 	     new type we don't know about yet.  */
2099 	  unknown_symtype_complaint (hex_string (nlist.n_type));
2100 	  continue;
2101 	}
2102     }
2103 
2104   /* If there's stuff to be cleaned up, clean it up.  */
2105   if (pst)
2106     {
2107       /* Don't set pst->texthigh lower than it already is.  */
2108       CORE_ADDR text_end =
2109 	(lowest_text_address == (CORE_ADDR) -1
2110 	 ? (text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))
2111 	 : lowest_text_address)
2112 	+ text_size;
2113 
2114       end_psymtab (pst, psymtab_include_list, includes_used,
2115 		   symnum * symbol_size,
2116 		   text_end > pst->texthigh ? text_end : pst->texthigh,
2117 		   dependency_list, dependencies_used, textlow_not_set);
2118     }
2119 
2120   do_cleanups (back_to);
2121 }
2122 
2123 /* Allocate and partially fill a partial symtab.  It will be
2124    completely filled at the end of the symbol list.
2125 
2126    SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
2127    is the address relative to which its symbols are (incremental) or 0
2128    (normal). */
2129 
2130 
2131 static struct partial_symtab *
2132 start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
2133 	       int ldsymoff, struct partial_symbol **global_syms,
2134 	       struct partial_symbol **static_syms)
2135 {
2136   struct partial_symtab *result =
2137   start_psymtab_common (objfile, objfile->section_offsets,
2138 			filename, textlow, global_syms, static_syms);
2139 
2140   result->read_symtab_private = (char *)
2141     obstack_alloc (&objfile->objfile_obstack, sizeof (struct symloc));
2142   LDSYMOFF (result) = ldsymoff;
2143   result->read_symtab = dbx_psymtab_to_symtab;
2144   SYMBOL_SIZE (result) = symbol_size;
2145   SYMBOL_OFFSET (result) = symbol_table_offset;
2146   STRING_OFFSET (result) = string_table_offset;
2147   FILE_STRING_OFFSET (result) = file_string_table_offset;
2148 
2149   /* If we're handling an ELF file, drag some section-relocation info
2150      for this source file out of the ELF symbol table, to compensate for
2151      Sun brain death.  This replaces the section_offsets in this psymtab,
2152      if successful.  */
2153   elfstab_offset_sections (objfile, result);
2154 
2155   /* Deduce the source language from the filename for this psymtab. */
2156   psymtab_language = deduce_language_from_filename (filename);
2157 
2158   return result;
2159 }
2160 
2161 /* Close off the current usage of PST.
2162    Returns PST or NULL if the partial symtab was empty and thrown away.
2163 
2164    FIXME:  List variables and peculiarities of same.  */
2165 
2166 struct partial_symtab *
2167 end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
2168 	     int capping_symbol_offset, CORE_ADDR capping_text,
2169 	     struct partial_symtab **dependency_list, int number_dependencies,
2170 	     int textlow_not_set)
2171 {
2172   int i;
2173   struct objfile *objfile = pst->objfile;
2174 
2175   if (capping_symbol_offset != -1)
2176     LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
2177   pst->texthigh = capping_text;
2178 
2179 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
2180   /* Under Solaris, the N_SO symbols always have a value of 0,
2181      instead of the usual address of the .o file.  Therefore,
2182      we have to do some tricks to fill in texthigh and textlow.
2183      The first trick is: if we see a static
2184      or global function, and the textlow for the current pst
2185      is not set (ie: textlow_not_set), then we use that function's
2186      address for the textlow of the pst.  */
2187 
2188   /* Now, to fill in texthigh, we remember the last function seen
2189      in the .o file.  Also, there's a hack in
2190      bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
2191      to here via the misc_info field.  Therefore, we can fill in
2192      a reliable texthigh by taking the address plus size of the
2193      last function in the file.  */
2194 
2195   if (pst->texthigh == 0 && last_function_name)
2196     {
2197       char *p;
2198       int n;
2199       struct minimal_symbol *minsym;
2200 
2201       p = strchr (last_function_name, ':');
2202       if (p == NULL)
2203 	p = last_function_name;
2204       n = p - last_function_name;
2205       p = alloca (n + 2);
2206       strncpy (p, last_function_name, n);
2207       p[n] = 0;
2208 
2209       minsym = lookup_minimal_symbol (p, pst->filename, objfile);
2210       if (minsym == NULL)
2211 	{
2212 	  /* Sun Fortran appends an underscore to the minimal symbol name,
2213 	     try again with an appended underscore if the minimal symbol
2214 	     was not found.  */
2215 	  p[n] = '_';
2216 	  p[n + 1] = 0;
2217 	  minsym = lookup_minimal_symbol (p, pst->filename, objfile);
2218 	}
2219 
2220       if (minsym)
2221 	pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
2222 
2223       last_function_name = NULL;
2224     }
2225 
2226   /* this test will be true if the last .o file is only data */
2227   if (textlow_not_set)
2228     pst->textlow = pst->texthigh;
2229   else
2230     {
2231       struct partial_symtab *p1;
2232 
2233       /* If we know our own starting text address, then walk through all other
2234          psymtabs for this objfile, and if any didn't know their ending text
2235          address, set it to our starting address.  Take care to not set our
2236          own ending address to our starting address, nor to set addresses on
2237          `dependency' files that have both textlow and texthigh zero.  */
2238 
2239       ALL_OBJFILE_PSYMTABS (objfile, p1)
2240       {
2241 	if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
2242 	  {
2243 	    p1->texthigh = pst->textlow;
2244 	    /* if this file has only data, then make textlow match texthigh */
2245 	    if (p1->textlow == 0)
2246 	      p1->textlow = p1->texthigh;
2247 	  }
2248       }
2249     }
2250 
2251   /* End of kludge for patching Solaris textlow and texthigh.  */
2252 #endif /* SOFUN_ADDRESS_MAYBE_MISSING.  */
2253 
2254   pst->n_global_syms =
2255     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
2256   pst->n_static_syms =
2257     objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
2258 
2259   pst->number_of_dependencies = number_dependencies;
2260   if (number_dependencies)
2261     {
2262       pst->dependencies = (struct partial_symtab **)
2263 	obstack_alloc (&objfile->objfile_obstack,
2264 		    number_dependencies * sizeof (struct partial_symtab *));
2265       memcpy (pst->dependencies, dependency_list,
2266 	      number_dependencies * sizeof (struct partial_symtab *));
2267     }
2268   else
2269     pst->dependencies = 0;
2270 
2271   for (i = 0; i < num_includes; i++)
2272     {
2273       struct partial_symtab *subpst =
2274       allocate_psymtab (include_list[i], objfile);
2275 
2276       /* Copy the sesction_offsets array from the main psymtab. */
2277       subpst->section_offsets = pst->section_offsets;
2278       subpst->read_symtab_private =
2279 	(char *) obstack_alloc (&objfile->objfile_obstack,
2280 				sizeof (struct symloc));
2281       LDSYMOFF (subpst) =
2282 	LDSYMLEN (subpst) =
2283 	subpst->textlow =
2284 	subpst->texthigh = 0;
2285 
2286       /* We could save slight bits of space by only making one of these,
2287          shared by the entire set of include files.  FIXME-someday.  */
2288       subpst->dependencies = (struct partial_symtab **)
2289 	obstack_alloc (&objfile->objfile_obstack,
2290 		       sizeof (struct partial_symtab *));
2291       subpst->dependencies[0] = pst;
2292       subpst->number_of_dependencies = 1;
2293 
2294       subpst->globals_offset =
2295 	subpst->n_global_syms =
2296 	subpst->statics_offset =
2297 	subpst->n_static_syms = 0;
2298 
2299       subpst->readin = 0;
2300       subpst->symtab = 0;
2301       subpst->read_symtab = pst->read_symtab;
2302     }
2303 
2304   sort_pst_symbols (pst);
2305 
2306   /* If there is already a psymtab or symtab for a file of this name, remove it.
2307      (If there is a symtab, more drastic things also happen.)
2308      This happens in VxWorks.  */
2309   free_named_symtabs (pst->filename);
2310 
2311   if (num_includes == 0
2312       && number_dependencies == 0
2313       && pst->n_global_syms == 0
2314       && pst->n_static_syms == 0
2315       && has_line_numbers == 0)
2316     {
2317       /* Throw away this psymtab, it's empty.  We can't deallocate it, since
2318          it is on the obstack, but we can forget to chain it on the list.  */
2319       /* Empty psymtabs happen as a result of header files which don't have
2320          any symbols in them.  There can be a lot of them.  But this check
2321          is wrong, in that a psymtab with N_SLINE entries but nothing else
2322          is not empty, but we don't realize that.  Fixing that without slowing
2323          things down might be tricky.  */
2324 
2325       discard_psymtab (pst);
2326 
2327       /* Indicate that psymtab was thrown away.  */
2328       pst = (struct partial_symtab *) NULL;
2329     }
2330   return pst;
2331 }
2332 
2333 static void
2334 dbx_psymtab_to_symtab_1 (struct partial_symtab *pst)
2335 {
2336   struct cleanup *old_chain;
2337   int i;
2338 
2339   if (!pst)
2340     return;
2341 
2342   if (pst->readin)
2343     {
2344       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
2345 			  pst->filename);
2346       return;
2347     }
2348 
2349   /* Read in all partial symtabs on which this one is dependent */
2350   for (i = 0; i < pst->number_of_dependencies; i++)
2351     if (!pst->dependencies[i]->readin)
2352       {
2353 	/* Inform about additional files that need to be read in.  */
2354 	if (info_verbose)
2355 	  {
2356 	    fputs_filtered (" ", gdb_stdout);
2357 	    wrap_here ("");
2358 	    fputs_filtered ("and ", gdb_stdout);
2359 	    wrap_here ("");
2360 	    printf_filtered ("%s...", pst->dependencies[i]->filename);
2361 	    wrap_here ("");	/* Flush output */
2362 	    gdb_flush (gdb_stdout);
2363 	  }
2364 	dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
2365       }
2366 
2367   if (LDSYMLEN (pst))		/* Otherwise it's a dummy */
2368     {
2369       /* Init stuff necessary for reading in symbols */
2370       stabsread_init ();
2371       buildsym_init ();
2372       old_chain = make_cleanup (really_free_pendings, 0);
2373       file_string_table_offset = FILE_STRING_OFFSET (pst);
2374       symbol_size = SYMBOL_SIZE (pst);
2375 
2376       /* Read in this file's symbols */
2377       bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
2378       read_ofile_symtab (pst);
2379 
2380       do_cleanups (old_chain);
2381     }
2382 
2383   pst->readin = 1;
2384 }
2385 
2386 /* Read in all of the symbols for a given psymtab for real.
2387    Be verbose about it if the user wants that.  */
2388 
2389 static void
2390 dbx_psymtab_to_symtab (struct partial_symtab *pst)
2391 {
2392   bfd *sym_bfd;
2393   struct cleanup *back_to = NULL;
2394 
2395   if (!pst)
2396     return;
2397 
2398   if (pst->readin)
2399     {
2400       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
2401 			  pst->filename);
2402       return;
2403     }
2404 
2405   if (LDSYMLEN (pst) || pst->number_of_dependencies)
2406     {
2407       /* Print the message now, before reading the string table,
2408          to avoid disconcerting pauses.  */
2409       if (info_verbose)
2410 	{
2411 	  printf_filtered ("Reading in symbols for %s...", pst->filename);
2412 	  gdb_flush (gdb_stdout);
2413 	}
2414 
2415       sym_bfd = pst->objfile->obfd;
2416 
2417       next_symbol_text_func = dbx_next_symbol_text;
2418 
2419       if (DBX_STAB_SECTION (pst->objfile))
2420 	{
2421 	  stabs_data
2422 	    = symfile_relocate_debug_section (pst->objfile->obfd,
2423 					      DBX_STAB_SECTION (pst->objfile),
2424 					      NULL);
2425 	  if (stabs_data)
2426 	    back_to = make_cleanup (free_current_contents, (void *) &stabs_data);
2427 	}
2428 
2429       dbx_psymtab_to_symtab_1 (pst);
2430 
2431       if (back_to)
2432 	do_cleanups (back_to);
2433 
2434       /* Match with global symbols.  This only needs to be done once,
2435          after all of the symtabs and dependencies have been read in.   */
2436       scan_file_globals (pst->objfile);
2437 
2438       /* Finish up the debug error message.  */
2439       if (info_verbose)
2440 	printf_filtered ("done.\n");
2441     }
2442 }
2443 
2444 /* Read in a defined section of a specific object file's symbols. */
2445 
2446 static void
2447 read_ofile_symtab (struct partial_symtab *pst)
2448 {
2449   char *namestring;
2450   struct external_nlist *bufp;
2451   struct internal_nlist nlist;
2452   unsigned char type;
2453   unsigned max_symnum;
2454   bfd *abfd;
2455   struct objfile *objfile;
2456   int sym_offset;		/* Offset to start of symbols to read */
2457   int sym_size;			/* Size of symbols to read */
2458   CORE_ADDR text_offset;	/* Start of text segment for symbols */
2459   int text_size;		/* Size of text segment for symbols */
2460   struct section_offsets *section_offsets;
2461 
2462   objfile = pst->objfile;
2463   sym_offset = LDSYMOFF (pst);
2464   sym_size = LDSYMLEN (pst);
2465   text_offset = pst->textlow;
2466   text_size = pst->texthigh - pst->textlow;
2467   /* This cannot be simply objfile->section_offsets because of
2468      elfstab_offset_sections() which initializes the psymtab section
2469      offsets information in a special way, and that is different from
2470      objfile->section_offsets. */
2471   section_offsets = pst->section_offsets;
2472 
2473   current_objfile = objfile;
2474   subfile_stack = NULL;
2475 
2476   stringtab_global = DBX_STRINGTAB (objfile);
2477   last_source_file = NULL;
2478 
2479   abfd = objfile->obfd;
2480   symfile_bfd = objfile->obfd;	/* Implicit param to next_text_symbol */
2481   symbuf_end = symbuf_idx = 0;
2482   symbuf_read = 0;
2483   symbuf_left = sym_offset + sym_size;
2484 
2485   /* It is necessary to actually read one symbol *before* the start
2486      of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
2487      occurs before the N_SO symbol.
2488 
2489      Detecting this in read_dbx_symtab
2490      would slow down initial readin, so we look for it here instead.  */
2491   if (!processing_acc_compilation && sym_offset >= (int) symbol_size)
2492     {
2493       stabs_seek (sym_offset - symbol_size);
2494       fill_symbuf (abfd);
2495       bufp = &symbuf[symbuf_idx++];
2496       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
2497       OBJSTAT (objfile, n_stabs++);
2498 
2499       namestring = set_namestring (objfile, nlist);
2500 
2501       processing_gcc_compilation = 0;
2502       if (nlist.n_type == N_TEXT)
2503 	{
2504 	  const char *tempstring = namestring;
2505 
2506 	  if (DEPRECATED_STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
2507 	    processing_gcc_compilation = 1;
2508 	  else if (DEPRECATED_STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
2509 	    processing_gcc_compilation = 2;
2510 	  if (tempstring[0] == bfd_get_symbol_leading_char (symfile_bfd))
2511 	    ++tempstring;
2512 	  if (DEPRECATED_STREQN (tempstring, "__gnu_compiled", 14))
2513 	    processing_gcc_compilation = 2;
2514 	}
2515 
2516       /* Try to select a C++ demangling based on the compilation unit
2517          producer. */
2518 
2519 #if 0
2520       /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
2521 	 know whether it will use the old style or v3 mangling.  */
2522       if (processing_gcc_compilation)
2523 	{
2524 	  if (AUTO_DEMANGLING)
2525 	    {
2526 	      set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
2527 	    }
2528 	}
2529 #endif
2530     }
2531   else
2532     {
2533       /* The N_SO starting this symtab is the first symbol, so we
2534          better not check the symbol before it.  I'm not this can
2535          happen, but it doesn't hurt to check for it.  */
2536       stabs_seek (sym_offset);
2537       processing_gcc_compilation = 0;
2538     }
2539 
2540   if (symbuf_idx == symbuf_end)
2541     fill_symbuf (abfd);
2542   bufp = &symbuf[symbuf_idx];
2543   if (bfd_h_get_8 (abfd, bufp->e_type) != N_SO)
2544     error ("First symbol in segment of executable not a source symbol");
2545 
2546   max_symnum = sym_size / symbol_size;
2547 
2548   for (symnum = 0;
2549        symnum < max_symnum;
2550        symnum++)
2551     {
2552       QUIT;			/* Allow this to be interruptable */
2553       if (symbuf_idx == symbuf_end)
2554 	fill_symbuf (abfd);
2555       bufp = &symbuf[symbuf_idx++];
2556       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
2557       OBJSTAT (objfile, n_stabs++);
2558 
2559       type = bfd_h_get_8 (abfd, bufp->e_type);
2560 
2561       namestring = set_namestring (objfile, nlist);
2562 
2563       if (type & N_STAB)
2564 	{
2565 	  process_one_symbol (type, nlist.n_desc, nlist.n_value,
2566 			      namestring, section_offsets, objfile);
2567 	}
2568       /* We skip checking for a new .o or -l file; that should never
2569          happen in this routine. */
2570       else if (type == N_TEXT)
2571 	{
2572 	  /* I don't think this code will ever be executed, because
2573 	     the GCC_COMPILED_FLAG_SYMBOL usually is right before
2574 	     the N_SO symbol which starts this source file.
2575 	     However, there is no reason not to accept
2576 	     the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
2577 
2578 	  if (DEPRECATED_STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
2579 	    processing_gcc_compilation = 1;
2580 	  else if (DEPRECATED_STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
2581 	    processing_gcc_compilation = 2;
2582 
2583 #if 0
2584 	  /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
2585 	     know whether it will use the old style or v3 mangling.  */
2586 	  if (AUTO_DEMANGLING)
2587 	    {
2588 	      set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
2589 	    }
2590 #endif
2591 	}
2592       else if (type & N_EXT || type == (unsigned char) N_TEXT
2593 	       || type == (unsigned char) N_NBTEXT
2594 	)
2595 	{
2596 	  /* Global symbol: see if we came across a dbx defintion for
2597 	     a corresponding symbol.  If so, store the value.  Remove
2598 	     syms from the chain when their values are stored, but
2599 	     search the whole chain, as there may be several syms from
2600 	     different files with the same name. */
2601 	  /* This is probably not true.  Since the files will be read
2602 	     in one at a time, each reference to a global symbol will
2603 	     be satisfied in each file as it appears. So we skip this
2604 	     section. */
2605 	  ;
2606 	}
2607     }
2608 
2609   current_objfile = NULL;
2610 
2611   /* In a Solaris elf file, this variable, which comes from the
2612      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
2613      which comes from pst->textlow is correct. */
2614   if (last_source_start_addr == 0)
2615     last_source_start_addr = text_offset;
2616 
2617   /* In reordered executables last_source_start_addr may not be the
2618      lower bound for this symtab, instead use text_offset which comes
2619      from pst->textlow which is correct.  */
2620   if (last_source_start_addr > text_offset)
2621     last_source_start_addr = text_offset;
2622 
2623   pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
2624 
2625   end_stabs ();
2626 }
2627 
2628 
2629 /* This handles a single symbol from the symbol-file, building symbols
2630    into a GDB symtab.  It takes these arguments and an implicit argument.
2631 
2632    TYPE is the type field of the ".stab" symbol entry.
2633    DESC is the desc field of the ".stab" entry.
2634    VALU is the value field of the ".stab" entry.
2635    NAME is the symbol name, in our address space.
2636    SECTION_OFFSETS is a set of amounts by which the sections of this object
2637    file were relocated when it was loaded into memory.
2638    Note that these section_offsets are not the
2639    objfile->section_offsets but the pst->section_offsets.
2640    All symbols that refer
2641    to memory locations need to be offset by these amounts.
2642    OBJFILE is the object file from which we are reading symbols.
2643    It is used in end_symtab.  */
2644 
2645 void
2646 process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
2647 		    struct section_offsets *section_offsets,
2648 		    struct objfile *objfile)
2649 {
2650   struct context_stack *new;
2651   /* This remembers the address of the start of a function.  It is used
2652      because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
2653      relative to the current function's start address.  On systems
2654      other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
2655      used to relocate these symbol types rather than SECTION_OFFSETS.  */
2656   static CORE_ADDR function_start_offset;
2657 
2658   /* This holds the address of the start of a function, without the system
2659      peculiarities of function_start_offset.  */
2660   static CORE_ADDR last_function_start;
2661 
2662   /* If this is nonzero, we've seen an N_SLINE since the start of the
2663      current function.  We use this to tell us to move the first sline
2664      to the beginning of the function regardless of what its given
2665      value is. */
2666   static int sline_found_in_function = 1;
2667 
2668   /* If this is nonzero, we've seen a non-gcc N_OPT symbol for this source
2669      file.  Used to detect the SunPRO solaris compiler.  */
2670   static int n_opt_found;
2671 
2672   /* The stab type used for the definition of the last function.
2673      N_STSYM or N_GSYM for SunOS4 acc; N_FUN for other compilers.  */
2674   static int function_stab_type = 0;
2675 
2676   if (!block_address_function_relative)
2677     /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
2678        function start address, so just use the text offset.  */
2679     function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2680 
2681   /* Something is wrong if we see real data before
2682      seeing a source file name.  */
2683 
2684   if (last_source_file == NULL && type != (unsigned char) N_SO)
2685     {
2686       /* Ignore any symbols which appear before an N_SO symbol.
2687          Currently no one puts symbols there, but we should deal
2688          gracefully with the case.  A complain()t might be in order,
2689          but this should not be an error ().  */
2690       return;
2691     }
2692 
2693   switch (type)
2694     {
2695     case N_FUN:
2696     case N_FNAME:
2697 
2698       if (*name == '\000')
2699 	{
2700 	  /* This N_FUN marks the end of a function.  This closes off the
2701 	     current block.  */
2702 
2703  	  if (context_stack_depth <= 0)
2704  	    {
2705 	      lbrac_mismatch_complaint (symnum);
2706  	      break;
2707  	    }
2708 
2709 	  /* The following check is added before recording line 0 at
2710 	     end of function so as to handle hand-generated stabs
2711 	     which may have an N_FUN stabs at the end of the function, but
2712 	     no N_SLINE stabs.  */
2713 	  if (sline_found_in_function)
2714 	    record_line (current_subfile, 0, last_function_start + valu);
2715 
2716 	  within_function = 0;
2717 	  new = pop_context ();
2718 
2719 	  /* Make a block for the local symbols within.  */
2720 	  finish_block (new->name, &local_symbols, new->old_blocks,
2721 			new->start_addr, new->start_addr + valu,
2722 			objfile);
2723 
2724 	  /* May be switching to an assembler file which may not be using
2725 	     block relative stabs, so reset the offset.  */
2726 	  if (block_address_function_relative)
2727 	    function_start_offset = 0;
2728 
2729 	  break;
2730 	}
2731 
2732       sline_found_in_function = 0;
2733 
2734       /* Relocate for dynamic loading */
2735       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2736       valu = SMASH_TEXT_ADDRESS (valu);
2737       last_function_start = valu;
2738 
2739       goto define_a_symbol;
2740 
2741     case N_LBRAC:
2742       /* This "symbol" just indicates the start of an inner lexical
2743          context within a function.  */
2744 
2745       /* Ignore extra outermost context from SunPRO cc and acc.  */
2746       if (n_opt_found && desc == 1)
2747 	break;
2748 
2749       if (block_address_function_relative)
2750 	/* Relocate for Sun ELF acc fn-relative syms.  */
2751 	valu += function_start_offset;
2752       else
2753 	/* On most machines, the block addresses are relative to the
2754 	   N_SO, the linker did not relocate them (sigh).  */
2755 	valu += last_source_start_addr;
2756 
2757       new = push_context (desc, valu);
2758       break;
2759 
2760     case N_RBRAC:
2761       /* This "symbol" just indicates the end of an inner lexical
2762          context that was started with N_LBRAC.  */
2763 
2764       /* Ignore extra outermost context from SunPRO cc and acc.  */
2765       if (n_opt_found && desc == 1)
2766 	break;
2767 
2768       if (block_address_function_relative)
2769 	/* Relocate for Sun ELF acc fn-relative syms.  */
2770 	valu += function_start_offset;
2771       else
2772 	/* On most machines, the block addresses are relative to the
2773 	   N_SO, the linker did not relocate them (sigh).  */
2774 	valu += last_source_start_addr;
2775 
2776       if (context_stack_depth <= 0)
2777 	{
2778 	  lbrac_mismatch_complaint (symnum);
2779 	  break;
2780 	}
2781 
2782       new = pop_context ();
2783       if (desc != new->depth)
2784 	lbrac_mismatch_complaint (symnum);
2785 
2786       /* Some compilers put the variable decls inside of an
2787          LBRAC/RBRAC block.  This macro should be nonzero if this
2788          is true.  DESC is N_DESC from the N_RBRAC symbol.
2789          GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
2790          or the GCC2_COMPILED_SYMBOL.  */
2791 #if !defined (VARIABLES_INSIDE_BLOCK)
2792 #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
2793 #endif
2794 
2795       /* Can only use new->locals as local symbols here if we're in
2796          gcc or on a machine that puts them before the lbrack.  */
2797       if (!VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2798 	{
2799 	  if (local_symbols != NULL)
2800 	    {
2801 	      /* GCC development snapshots from March to December of
2802 		 2000 would output N_LSYM entries after N_LBRAC
2803 		 entries.  As a consequence, these symbols are simply
2804 		 discarded.  Complain if this is the case.  Note that
2805 		 there are some compilers which legitimately put local
2806 		 symbols within an LBRAC/RBRAC block; this complaint
2807 		 might also help sort out problems in which
2808 		 VARIABLES_INSIDE_BLOCK is incorrectly defined.  */
2809 	      complaint (&symfile_complaints,
2810 			 "misplaced N_LBRAC entry; discarding local symbols which have no enclosing block");
2811 	    }
2812 	  local_symbols = new->locals;
2813 	}
2814 
2815       if (context_stack_depth
2816 	  > !VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2817 	{
2818 	  /* This is not the outermost LBRAC...RBRAC pair in the function,
2819 	     its local symbols preceded it, and are the ones just recovered
2820 	     from the context stack.  Define the block for them (but don't
2821 	     bother if the block contains no symbols.  Should we complain
2822 	     on blocks without symbols?  I can't think of any useful purpose
2823 	     for them).  */
2824 	  if (local_symbols != NULL)
2825 	    {
2826 	      /* Muzzle a compiler bug that makes end < start.  (which
2827 	         compilers?  Is this ever harmful?).  */
2828 	      if (new->start_addr > valu)
2829 		{
2830 		  complaint (&symfile_complaints,
2831 			     "block start larger than block end");
2832 		  new->start_addr = valu;
2833 		}
2834 	      /* Make a block for the local symbols within.  */
2835 	      finish_block (0, &local_symbols, new->old_blocks,
2836 			    new->start_addr, valu, objfile);
2837 	    }
2838 	}
2839       else
2840 	{
2841 	  /* This is the outermost LBRAC...RBRAC pair.  There is no
2842 	     need to do anything; leave the symbols that preceded it
2843 	     to be attached to the function's own block.  We need to
2844 	     indicate that we just moved outside of the function.  */
2845 	  within_function = 0;
2846 	}
2847 
2848       if (VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2849 	/* Now pop locals of block just finished.  */
2850 	local_symbols = new->locals;
2851       break;
2852 
2853     case N_FN:
2854     case N_FN_SEQ:
2855       /* This kind of symbol indicates the start of an object file.  */
2856       /* Relocate for dynamic loading */
2857       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2858       break;
2859 
2860     case N_SO:
2861       /* This type of symbol indicates the start of data
2862          for one source file.
2863          Finish the symbol table of the previous source file
2864          (if any) and start accumulating a new symbol table.  */
2865       /* Relocate for dynamic loading */
2866       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2867 
2868       n_opt_found = 0;
2869 
2870       if (last_source_file)
2871 	{
2872 	  /* Check if previous symbol was also an N_SO (with some
2873 	     sanity checks).  If so, that one was actually the directory
2874 	     name, and the current one is the real file name.
2875 	     Patch things up. */
2876 	  if (previous_stab_code == (unsigned char) N_SO)
2877 	    {
2878 	      patch_subfile_names (current_subfile, name);
2879 	      break;		/* Ignore repeated SOs */
2880 	    }
2881 	  end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
2882 	  end_stabs ();
2883 	}
2884 
2885       /* Null name means this just marks the end of text for this .o file.
2886          Don't start a new symtab in this case.  */
2887       if (*name == '\000')
2888 	break;
2889 
2890       if (block_address_function_relative)
2891 	function_start_offset = 0;
2892 
2893       start_stabs ();
2894       start_symtab (name, NULL, valu);
2895       record_debugformat ("stabs");
2896       break;
2897 
2898     case N_SOL:
2899       /* This type of symbol indicates the start of data for
2900          a sub-source-file, one whose contents were copied or
2901          included in the compilation of the main source file
2902          (whose name was given in the N_SO symbol.)  */
2903       /* Relocate for dynamic loading */
2904       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2905       start_subfile (name, current_subfile->dirname);
2906       break;
2907 
2908     case N_BINCL:
2909       push_subfile ();
2910       add_new_header_file (name, valu);
2911       start_subfile (name, current_subfile->dirname);
2912       break;
2913 
2914     case N_EINCL:
2915       start_subfile (pop_subfile (), current_subfile->dirname);
2916       break;
2917 
2918     case N_EXCL:
2919       add_old_header_file (name, valu);
2920       break;
2921 
2922     case N_SLINE:
2923       /* This type of "symbol" really just records
2924          one line-number -- core-address correspondence.
2925          Enter it in the line list for this symbol table.  */
2926 
2927       /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
2928       valu += function_start_offset;
2929 
2930       /* If this is the first SLINE note in the function, record it at
2931 	 the start of the function instead of at the listed location.  */
2932       if (within_function && sline_found_in_function == 0)
2933 	{
2934 	  record_line (current_subfile, desc, last_function_start);
2935 	  sline_found_in_function = 1;
2936 	}
2937       else
2938 	record_line (current_subfile, desc, valu);
2939       break;
2940 
2941     case N_BCOMM:
2942       common_block_start (name, objfile);
2943       break;
2944 
2945     case N_ECOMM:
2946       common_block_end (objfile);
2947       break;
2948 
2949       /* The following symbol types need to have the appropriate offset added
2950          to their value; then we process symbol definitions in the name.  */
2951 
2952     case N_STSYM:		/* Static symbol in data seg */
2953     case N_LCSYM:		/* Static symbol in BSS seg */
2954     case N_ROSYM:		/* Static symbol in Read-only data seg */
2955       /* HORRID HACK DEPT.  However, it's Sun's furgin' fault.
2956          Solaris2's stabs-in-elf makes *most* symbols relative
2957          but leaves a few absolute (at least for Solaris 2.1 and version
2958          2.0.1 of the SunPRO compiler).  N_STSYM and friends sit on the fence.
2959          .stab "foo:S...",N_STSYM        is absolute (ld relocates it)
2960          .stab "foo:V...",N_STSYM        is relative (section base subtracted).
2961          This leaves us no choice but to search for the 'S' or 'V'...
2962          (or pass the whole section_offsets stuff down ONE MORE function
2963          call level, which we really don't want to do).  */
2964       {
2965 	char *p;
2966 
2967 	/* .o files and NLMs have non-zero text seg offsets, but don't need
2968 	   their static syms offset in this fashion.  XXX - This is really a
2969 	   crock that should be fixed in the solib handling code so that I
2970 	   don't have to work around it here. */
2971 
2972 	if (!symfile_relocatable)
2973 	  {
2974 	    p = strchr (name, ':');
2975 	    if (p != 0 && p[1] == 'S')
2976 	      {
2977 		/* The linker relocated it.  We don't want to add an
2978 		   elfstab_offset_sections-type offset, but we *do* want
2979 		   to add whatever solib.c passed to symbol_file_add as
2980 		   addr (this is known to affect SunOS4, and I suspect ELF
2981 		   too).  Since elfstab_offset_sections currently does not
2982 		   muck with the text offset (there is no Ttext.text
2983 		   symbol), we can get addr from the text offset.  If
2984 		   elfstab_offset_sections ever starts dealing with the
2985 		   text offset, and we still need to do this, we need to
2986 		   invent a SECT_OFF_ADDR_KLUDGE or something.  */
2987 		valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2988 		goto define_a_symbol;
2989 	      }
2990 	  }
2991 	/* Since it's not the kludge case, re-dispatch to the right handler. */
2992 	switch (type)
2993 	  {
2994 	  case N_STSYM:
2995 	    goto case_N_STSYM;
2996 	  case N_LCSYM:
2997 	    goto case_N_LCSYM;
2998 	  case N_ROSYM:
2999 	    goto case_N_ROSYM;
3000 	  default:
3001 	    internal_error (__FILE__, __LINE__, "failed internal consistency check");
3002 	  }
3003       }
3004 
3005     case_N_STSYM:		/* Static symbol in data seg */
3006     case N_DSLINE:		/* Source line number, data seg */
3007       valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
3008       goto define_a_symbol;
3009 
3010     case_N_LCSYM:		/* Static symbol in BSS seg */
3011     case N_BSLINE:		/* Source line number, bss seg */
3012       /*   N_BROWS:       overlaps with N_BSLINE */
3013       valu += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
3014       goto define_a_symbol;
3015 
3016     case_N_ROSYM:		/* Static symbol in Read-only data seg */
3017       valu += ANOFFSET (section_offsets, SECT_OFF_RODATA (objfile));
3018       goto define_a_symbol;
3019 
3020     case N_ENTRY:		/* Alternate entry point */
3021       /* Relocate for dynamic loading */
3022       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
3023       goto define_a_symbol;
3024 
3025       /* The following symbol types we don't know how to process.  Handle
3026          them in a "default" way, but complain to people who care.  */
3027     default:
3028     case N_CATCH:		/* Exception handler catcher */
3029     case N_EHDECL:		/* Exception handler name */
3030     case N_PC:			/* Global symbol in Pascal */
3031     case N_M2C:		/* Modula-2 compilation unit */
3032       /*   N_MOD2:        overlaps with N_EHDECL */
3033     case N_SCOPE:		/* Modula-2 scope information */
3034     case N_ECOML:		/* End common (local name) */
3035     case N_NBTEXT:		/* Gould Non-Base-Register symbols??? */
3036     case N_NBDATA:
3037     case N_NBBSS:
3038     case N_NBSTS:
3039     case N_NBLCS:
3040       unknown_symtype_complaint (hex_string (type));
3041       /* FALLTHROUGH */
3042 
3043       /* The following symbol types don't need the address field relocated,
3044          since it is either unused, or is absolute.  */
3045     define_a_symbol:
3046     case N_GSYM:		/* Global variable */
3047     case N_NSYMS:		/* Number of symbols (ultrix) */
3048     case N_NOMAP:		/* No map?  (ultrix) */
3049     case N_RSYM:		/* Register variable */
3050     case N_DEFD:		/* Modula-2 GNU module dependency */
3051     case N_SSYM:		/* Struct or union element */
3052     case N_LSYM:		/* Local symbol in stack */
3053     case N_PSYM:		/* Parameter variable */
3054     case N_LENG:		/* Length of preceding symbol type */
3055       if (name)
3056 	{
3057 	  int deftype;
3058 	  char *colon_pos = strchr (name, ':');
3059 	  if (colon_pos == NULL)
3060 	    deftype = '\0';
3061 	  else
3062 	    deftype = colon_pos[1];
3063 
3064 	  switch (deftype)
3065 	    {
3066 	    case 'f':
3067 	    case 'F':
3068 	      function_stab_type = type;
3069 
3070 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
3071 	      /* Deal with the SunPRO 3.0 compiler which omits the address
3072 	         from N_FUN symbols.  */
3073 	      if (type == N_FUN
3074 		  && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile)))
3075 		{
3076 		  CORE_ADDR minsym_valu =
3077 		    find_stab_function_addr (name, last_source_file, objfile);
3078 
3079 		  /* find_stab_function_addr will return 0 if the minimal
3080 		     symbol wasn't found.  (Unfortunately, this might also
3081 		     be a valid address.)  Anyway, if it *does* return 0,
3082 		     it is likely that the value was set correctly to begin
3083 		     with... */
3084 		  if (minsym_valu != 0)
3085 		    valu = minsym_valu;
3086 		}
3087 #endif
3088 
3089 	      if (block_address_function_relative)
3090 		/* For Solaris 2.0 compilers, the block addresses and
3091 		   N_SLINE's are relative to the start of the
3092 		   function.  On normal systems, and when using gcc on
3093 		   Solaris 2.0, these addresses are just absolute, or
3094 		   relative to the N_SO, depending on
3095 		   BLOCK_ADDRESS_ABSOLUTE.  */
3096 		function_start_offset = valu;
3097 
3098 	      within_function = 1;
3099 
3100 	      if (context_stack_depth > 1)
3101 		{
3102 		  complaint (&symfile_complaints,
3103 			     "unmatched N_LBRAC before symtab pos %d", symnum);
3104 		  break;
3105 		}
3106 
3107 	      if (context_stack_depth > 0)
3108 		{
3109 		  new = pop_context ();
3110 		  /* Make a block for the local symbols within.  */
3111 		  finish_block (new->name, &local_symbols, new->old_blocks,
3112 				new->start_addr, valu, objfile);
3113 		}
3114 
3115 	      new = push_context (0, valu);
3116 	      new->name = define_symbol (valu, name, desc, type, objfile);
3117 	      break;
3118 
3119 	    default:
3120 	      define_symbol (valu, name, desc, type, objfile);
3121 	      break;
3122 	    }
3123 	}
3124       break;
3125 
3126       /* We use N_OPT to carry the gcc2_compiled flag.  Sun uses it
3127          for a bunch of other flags, too.  Someday we may parse their
3128          flags; for now we ignore theirs and hope they'll ignore ours.  */
3129     case N_OPT:		/* Solaris 2:  Compiler options */
3130       if (name)
3131 	{
3132 	  if (strcmp (name, GCC2_COMPILED_FLAG_SYMBOL) == 0)
3133 	    {
3134 	      processing_gcc_compilation = 2;
3135 #if 0				/* Works, but is experimental.  -fnf */
3136 	      /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
3137 		 know whether it will use the old style or v3 mangling.  */
3138 	      if (AUTO_DEMANGLING)
3139 		{
3140 		  set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
3141 		}
3142 #endif
3143 	    }
3144 	  else
3145 	    n_opt_found = 1;
3146 	}
3147       break;
3148 
3149     case N_MAIN:		/* Name of main routine.  */
3150       /* FIXME: If one has a symbol file with N_MAIN and then replaces
3151 	 it with a symbol file with "main" and without N_MAIN.  I'm
3152 	 not sure exactly what rule to follow but probably something
3153 	 like: N_MAIN takes precedence over "main" no matter what
3154 	 objfile it is in; If there is more than one N_MAIN, choose
3155 	 the one in the symfile_objfile; If there is more than one
3156 	 N_MAIN within a given objfile, complain() and choose
3157 	 arbitrarily. (kingdon) */
3158       if (name != NULL)
3159 	set_main_name (name);
3160       break;
3161 
3162       /* The following symbol types can be ignored.  */
3163     case N_OBJ:		/* Solaris 2:  Object file dir and name */
3164     case N_PATCH:	/* Solaris2: Patch Run Time Checker.  */
3165       /*   N_UNDF:                   Solaris 2:  file separator mark */
3166       /*   N_UNDF: -- we will never encounter it, since we only process one
3167          file's symbols at once.  */
3168     case N_ENDM:		/* Solaris 2:  End of module */
3169     case N_ALIAS:		/* SunPro F77: alias name, ignore for now.  */
3170       break;
3171     }
3172 
3173   /* '#' is a GNU C extension to allow one symbol to refer to another
3174      related symbol.
3175 
3176      Generally this is used so that an alias can refer to its main
3177      symbol.  */
3178   if (name[0] == '#')
3179     {
3180       /* Initialize symbol reference names and determine if this is
3181          a definition.  If symbol reference is being defined, go
3182          ahead and add it.  Otherwise, just return sym. */
3183 
3184       char *s = name;
3185       int refnum;
3186 
3187       /* If this stab defines a new reference ID that is not on the
3188          reference list, then put it on the reference list.
3189 
3190          We go ahead and advance NAME past the reference, even though
3191          it is not strictly necessary at this time.  */
3192       refnum = symbol_reference_defined (&s);
3193       if (refnum >= 0)
3194 	if (!ref_search (refnum))
3195 	  ref_add (refnum, 0, name, valu);
3196       name = s;
3197     }
3198 
3199 
3200   previous_stab_code = type;
3201 }
3202 
3203 /* FIXME: The only difference between this and elfstab_build_psymtabs
3204    is the call to install_minimal_symbols for elf, and the support for
3205    split sections.  If the differences are really that small, the code
3206    should be shared.  */
3207 
3208 /* Scan and build partial symbols for an coff symbol file.
3209    The coff file has already been processed to get its minimal symbols.
3210 
3211    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
3212    rolled into one.
3213 
3214    OBJFILE is the object file we are reading symbols from.
3215    ADDR is the address relative to which the symbols are (e.g.
3216    the base address of the text segment).
3217    MAINLINE is true if we are reading the main symbol
3218    table (as opposed to a shared lib or dynamically loaded file).
3219    TEXTADDR is the address of the text section.
3220    TEXTSIZE is the size of the text section.
3221    STABSECTS is the list of .stab sections in OBJFILE.
3222    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
3223    .stabstr section exists.
3224 
3225    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
3226    adjusted for coff details. */
3227 
3228 void
3229 coffstab_build_psymtabs (struct objfile *objfile, int mainline,
3230 			 CORE_ADDR textaddr, unsigned int textsize,
3231 			 struct stab_section_list *stabsects,
3232 			 file_ptr stabstroffset, unsigned int stabstrsize)
3233 {
3234   int val;
3235   bfd *sym_bfd = objfile->obfd;
3236   char *name = bfd_get_filename (sym_bfd);
3237   struct dbx_symfile_info *info;
3238   unsigned int stabsize;
3239 
3240   /* There is already a dbx_symfile_info allocated by our caller.
3241      It might even contain some info from the coff symtab to help us.  */
3242   info = objfile->sym_stab_info;
3243 
3244   DBX_TEXT_ADDR (objfile) = textaddr;
3245   DBX_TEXT_SIZE (objfile) = textsize;
3246 
3247 #define	COFF_STABS_SYMBOL_SIZE	12	/* XXX FIXME XXX */
3248   DBX_SYMBOL_SIZE (objfile) = COFF_STABS_SYMBOL_SIZE;
3249   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
3250 
3251   if (stabstrsize > bfd_get_size (sym_bfd))
3252     error ("ridiculous string table size: %d bytes", stabstrsize);
3253   DBX_STRINGTAB (objfile) = (char *)
3254     obstack_alloc (&objfile->objfile_obstack, stabstrsize + 1);
3255   OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
3256 
3257   /* Now read in the string table in one big gulp.  */
3258 
3259   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
3260   if (val < 0)
3261     perror_with_name (name);
3262   val = bfd_bread (DBX_STRINGTAB (objfile), stabstrsize, sym_bfd);
3263   if (val != stabstrsize)
3264     perror_with_name (name);
3265 
3266   stabsread_new_init ();
3267   buildsym_new_init ();
3268   free_header_files ();
3269   init_header_files ();
3270 
3271   processing_acc_compilation = 1;
3272 
3273   /* In a coff file, we've already installed the minimal symbols that came
3274      from the coff (non-stab) symbol table, so always act like an
3275      incremental load here. */
3276   if (stabsects->next == NULL)
3277     {
3278       stabsize = bfd_section_size (sym_bfd, stabsects->section);
3279       DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
3280       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
3281     }
3282   else
3283     {
3284       struct stab_section_list *stabsect;
3285 
3286       DBX_SYMCOUNT (objfile) = 0;
3287       for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next)
3288 	{
3289 	  stabsize = bfd_section_size (sym_bfd, stabsect->section);
3290 	  DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile);
3291 	}
3292 
3293       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
3294 
3295       symbuf_sections = stabsects->next;
3296       symbuf_left = bfd_section_size (sym_bfd, stabsects->section);
3297       symbuf_read = 0;
3298     }
3299 
3300   dbx_symfile_read (objfile, 0);
3301 }
3302 
3303 /* Scan and build partial symbols for an ELF symbol file.
3304    This ELF file has already been processed to get its minimal symbols.
3305 
3306    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
3307    rolled into one.
3308 
3309    OBJFILE is the object file we are reading symbols from.
3310    ADDR is the address relative to which the symbols are (e.g.
3311    the base address of the text segment).
3312    MAINLINE is true if we are reading the main symbol
3313    table (as opposed to a shared lib or dynamically loaded file).
3314    STABSECT is the BFD section information for the .stab section.
3315    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
3316    .stabstr section exists.
3317 
3318    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
3319    adjusted for elf details. */
3320 
3321 void
3322 elfstab_build_psymtabs (struct objfile *objfile, int mainline,
3323 			asection *stabsect,
3324 			file_ptr stabstroffset, unsigned int stabstrsize)
3325 {
3326   int val;
3327   bfd *sym_bfd = objfile->obfd;
3328   char *name = bfd_get_filename (sym_bfd);
3329   struct dbx_symfile_info *info;
3330   struct cleanup *back_to = NULL;
3331 
3332   /* There is already a dbx_symfile_info allocated by our caller.
3333      It might even contain some info from the ELF symtab to help us.  */
3334   info = objfile->sym_stab_info;
3335 
3336   /* Find the first and last text address.  dbx_symfile_read seems to
3337      want this.  */
3338   find_text_range (sym_bfd, objfile);
3339 
3340 #define	ELF_STABS_SYMBOL_SIZE	12	/* XXX FIXME XXX */
3341   DBX_SYMBOL_SIZE (objfile) = ELF_STABS_SYMBOL_SIZE;
3342   DBX_SYMCOUNT (objfile)
3343     = bfd_section_size (objfile->obfd, stabsect) / DBX_SYMBOL_SIZE (objfile);
3344   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
3345   DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos;
3346   DBX_STAB_SECTION (objfile) = stabsect;
3347 
3348   if (stabstrsize > bfd_get_size (sym_bfd))
3349     error ("ridiculous string table size: %d bytes", stabstrsize);
3350   DBX_STRINGTAB (objfile) = (char *)
3351     obstack_alloc (&objfile->objfile_obstack, stabstrsize + 1);
3352   OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
3353 
3354   /* Now read in the string table in one big gulp.  */
3355 
3356   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
3357   if (val < 0)
3358     perror_with_name (name);
3359   val = bfd_bread (DBX_STRINGTAB (objfile), stabstrsize, sym_bfd);
3360   if (val != stabstrsize)
3361     perror_with_name (name);
3362 
3363   stabsread_new_init ();
3364   buildsym_new_init ();
3365   free_header_files ();
3366   init_header_files ();
3367 
3368   processing_acc_compilation = 1;
3369 
3370   symbuf_read = 0;
3371   symbuf_left = bfd_section_size (objfile->obfd, stabsect);
3372   stabs_data = symfile_relocate_debug_section (objfile->obfd, stabsect, NULL);
3373   if (stabs_data)
3374     back_to = make_cleanup (free_current_contents, (void *) &stabs_data);
3375 
3376   /* In an elf file, we've already installed the minimal symbols that came
3377      from the elf (non-stab) symbol table, so always act like an
3378      incremental load here.  dbx_symfile_read should not generate any new
3379      minimal symbols, since we will have already read the ELF dynamic symbol
3380      table and normal symbol entries won't be in the ".stab" section; but in
3381      case it does, it will install them itself.  */
3382   dbx_symfile_read (objfile, 0);
3383 
3384   if (back_to)
3385     do_cleanups (back_to);
3386 }
3387 
3388 /* Scan and build partial symbols for a file with special sections for stabs
3389    and stabstrings.  The file has already been processed to get its minimal
3390    symbols, and any other symbols that might be necessary to resolve GSYMs.
3391 
3392    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
3393    rolled into one.
3394 
3395    OBJFILE is the object file we are reading symbols from.
3396    ADDR is the address relative to which the symbols are (e.g. the base address
3397    of the text segment).
3398    MAINLINE is true if we are reading the main symbol table (as opposed to a
3399    shared lib or dynamically loaded file).
3400    STAB_NAME is the name of the section that contains the stabs.
3401    STABSTR_NAME is the name of the section that contains the stab strings.
3402 
3403    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
3404 
3405 void
3406 stabsect_build_psymtabs (struct objfile *objfile, int mainline, char *stab_name,
3407 			 char *stabstr_name, char *text_name)
3408 {
3409   int val;
3410   bfd *sym_bfd = objfile->obfd;
3411   char *name = bfd_get_filename (sym_bfd);
3412   asection *stabsect;
3413   asection *stabstrsect;
3414   asection *text_sect;
3415 
3416   stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
3417   stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
3418 
3419   if (!stabsect)
3420     return;
3421 
3422   if (!stabstrsect)
3423     error ("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)",
3424 	   stab_name, stabstr_name);
3425 
3426   objfile->sym_stab_info = (struct dbx_symfile_info *)
3427     xmalloc (sizeof (struct dbx_symfile_info));
3428   memset (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
3429 
3430   text_sect = bfd_get_section_by_name (sym_bfd, text_name);
3431   if (!text_sect)
3432     error ("Can't find %s section in symbol file", text_name);
3433   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
3434   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
3435 
3436   DBX_SYMBOL_SIZE (objfile) = sizeof (struct external_nlist);
3437   DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
3438     / DBX_SYMBOL_SIZE (objfile);
3439   DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect);
3440   DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos;	/* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
3441 
3442   if (DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
3443     error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
3444   DBX_STRINGTAB (objfile) = (char *)
3445     obstack_alloc (&objfile->objfile_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
3446   OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile) + 1);
3447 
3448   /* Now read in the string table in one big gulp.  */
3449 
3450   val = bfd_get_section_contents (sym_bfd,	/* bfd */
3451 				  stabstrsect,	/* bfd section */
3452 				  DBX_STRINGTAB (objfile),	/* input buffer */
3453 				  0,	/* offset into section */
3454 				  DBX_STRINGTAB_SIZE (objfile));	/* amount to read */
3455 
3456   if (!val)
3457     perror_with_name (name);
3458 
3459   stabsread_new_init ();
3460   buildsym_new_init ();
3461   free_header_files ();
3462   init_header_files ();
3463 
3464   /* Now, do an incremental load */
3465 
3466   processing_acc_compilation = 1;
3467   dbx_symfile_read (objfile, 0);
3468 }
3469 
3470 static struct sym_fns aout_sym_fns =
3471 {
3472   bfd_target_aout_flavour,
3473   dbx_new_init,			/* sym_new_init: init anything gbl to entire symtab */
3474   dbx_symfile_init,		/* sym_init: read initial info, setup for sym_read() */
3475   dbx_symfile_read,		/* sym_read: read a symbol file into symtab */
3476   dbx_symfile_finish,		/* sym_finish: finished with file, cleanup */
3477   default_symfile_offsets,	/* sym_offsets: parse user's offsets to internal form */
3478   NULL				/* next: pointer to next struct sym_fns */
3479 };
3480 
3481 void
3482 _initialize_dbxread (void)
3483 {
3484   add_symtab_fns (&aout_sym_fns);
3485 }
3486