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
68struct 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
106static enum language psymtab_language = language_unknown;
107
108/* The BFD for this file -- implicit parameter to next_symbol_text.  */
109
110static 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
116static unsigned symbol_size;
117
118/* This is the offset of the symbol table in the executable file. */
119
120static unsigned symbol_table_offset;
121
122/* This is the offset of the string table in the executable file. */
123
124static 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
132static unsigned int file_string_table_offset;
133static 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
139static 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
144static 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
152static 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
157static int has_line_numbers;
158
159/* Complaints about the symbols we have encountered.  */
160
161static void
162unknown_symtype_complaint (const char *arg1)
163{
164  complaint (&symfile_complaints, "unknown symbol type %s", arg1);
165}
166
167static void
168lbrac_mismatch_complaint (int arg1)
169{
170  complaint (&symfile_complaints,
171	     "N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", arg1);
172}
173
174static void
175repeated_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
191static void
192find_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
235struct 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 */
244static struct header_file_location *bincl_list, *next_bincl;
245static int bincls_allocated;
246
247/* Local function prototypes */
248
249extern void _initialize_dbxread (void);
250
251static void read_ofile_symtab (struct partial_symtab *);
252
253static void dbx_psymtab_to_symtab (struct partial_symtab *);
254
255static void dbx_psymtab_to_symtab_1 (struct partial_symtab *);
256
257static void read_dbx_dynamic_symtab (struct objfile *objfile);
258
259static void read_dbx_symtab (struct objfile *);
260
261static void free_bincl_list (struct objfile *);
262
263static struct partial_symtab *find_corresponding_bincl_psymtab (char *, int);
264
265static void add_bincl_to_list (struct partial_symtab *, char *, int);
266
267static void init_bincl_list (int, struct objfile *);
268
269static char *dbx_next_symbol_text (struct objfile *);
270
271static void fill_symbuf (bfd *);
272
273static void dbx_symfile_init (struct objfile *);
274
275static void dbx_new_init (struct objfile *);
276
277static void dbx_symfile_read (struct objfile *, int);
278
279static void dbx_symfile_finish (struct objfile *);
280
281static void record_minimal_symbol (char *, CORE_ADDR, int, struct objfile *);
282
283static void add_new_header_file (char *, int);
284
285static void add_old_header_file (char *, int);
286
287static void add_this_object_header_file (int);
288
289static 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
296void
297free_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
309void
310init_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
319static void
320add_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
338static void
339add_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
364static void
365add_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
407static struct type **
408explicit_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
424static void
425record_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
526static void
527dbx_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
592static void
593dbx_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
616static void
617dbx_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
733static void
734dbx_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.  */
757static struct external_nlist symbuf[4096];
758static int symbuf_idx;
759static int symbuf_end;
760
761/* Name of last function encountered.  Used in Solaris to approximate
762   object file boundaries.  */
763static 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?  */
772static 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).  */
777static struct stab_section_list *symbuf_sections;
778static unsigned int symbuf_left;
779static 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.  */
783static 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
791static void
792fill_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
837static void
838stabs_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
869static char *
870dbx_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
889static void
890init_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
899static void
900add_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
920static struct partial_symtab *
921find_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
936static void
937free_bincl_list (struct objfile *objfile)
938{
939  xfree (bincl_list);
940  bincls_allocated = 0;
941}
942
943static void
944do_free_bincl_list_cleanup (void *objfile)
945{
946  free_bincl_list (objfile);
947}
948
949static struct cleanup *
950make_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
959static char *
960set_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
980static void
981read_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
1120static CORE_ADDR
1121find_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
1165static void
1166function_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
1176static void
1177read_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
2131static struct partial_symtab *
2132start_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
2166struct partial_symtab *
2167end_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
2333static void
2334dbx_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
2389static void
2390dbx_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
2446static void
2447read_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
2645void
2646process_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
3228void
3229coffstab_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
3321void
3322elfstab_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
3405void
3406stabsect_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
3470static 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
3481void
3482_initialize_dbxread (void)
3483{
3484  add_symtab_fns (&aout_sym_fns);
3485}
3486