xref: /openbsd-src/gnu/usr.bin/binutils/gdb/dbxread.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /* Read dbx symbol tables and convert to internal format, for GDB.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
3    Free Software Foundation, Inc.
4 
5 This file is part of GDB.
6 
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11 
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20 
21 /* This module provides three functions: dbx_symfile_init,
22    which initializes to read a symbol file; dbx_new_init, which
23    discards existing cached information when all symbols are being
24    discarded; and dbx_symfile_read, which reads a symbol table
25    from a file.
26 
27    dbx_symfile_read only does the minimum work necessary for letting the
28    user "name" things symbolically; it does not read the entire symtab.
29    Instead, it reads the external and static symbols and puts them in partial
30    symbol tables.  When more extensive information is requested of a
31    file, the corresponding partial symbol table is mutated into a full
32    fledged symbol table by going back and reading the symbols
33    for real.  dbx_psymtab_to_symtab() is the function that does this */
34 
35 #include "defs.h"
36 #include "gdb_string.h"
37 
38 #if defined(USG) || defined(__CYGNUSCLIB__)
39 #include <sys/types.h>
40 #include <fcntl.h>
41 #endif
42 
43 #include "obstack.h"
44 #include "gdb_stat.h"
45 #include <ctype.h>
46 #include "symtab.h"
47 #include "breakpoint.h"
48 #include "command.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 "symfile.h"
53 #include "objfiles.h"
54 #include "buildsym.h"
55 #include "stabsread.h"
56 #include "gdb-stabs.h"
57 #include "demangle.h"
58 #include "language.h"		/* Needed inside partial-stab.h */
59 #include "complaints.h"
60 
61 #include "aout/aout64.h"
62 #include "aout/stab_gnu.h"	/* We always use GNU stabs, not native, now */
63 
64 
65 /* We put a pointer to this structure in the read_symtab_private field
66    of the psymtab.  */
67 
68 struct symloc {
69 
70   /* Offset within the file symbol table of first local symbol for this
71      file.  */
72 
73   int ldsymoff;
74 
75   /* Length (in bytes) of the section of the symbol table devoted to
76      this file's symbols (actually, the section bracketed may contain
77      more than just this file's symbols).  If ldsymlen is 0, the only
78      reason for this thing's existence is the dependency list.  Nothing
79      else will happen when it is read in.  */
80 
81   int ldsymlen;
82 
83   /* The size of each symbol in the symbol file (in external form).  */
84 
85   int symbol_size;
86 
87   /* Further information needed to locate the symbols if they are in
88      an ELF file.  */
89 
90   int symbol_offset;
91   int string_offset;
92   int file_string_offset;
93 };
94 
95 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
96 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
97 #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
98 #define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
99 #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
100 #define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
101 #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset)
102 
103 
104 /* Macro to determine which symbols to ignore when reading the first symbol
105    of a file.  Some machines override this definition. */
106 #ifndef IGNORE_SYMBOL
107 /* This code is used on Ultrix systems.  Ignore it */
108 #define IGNORE_SYMBOL(type)  (type == (int)N_NSYMS)
109 #endif
110 
111 /* Remember what we deduced to be the source language of this psymtab. */
112 
113 static enum language psymtab_language = language_unknown;
114 
115 /* Nonzero means give verbose info on gdb action.  From main.c.  */
116 extern int info_verbose;
117 
118 /* The BFD for this file -- implicit parameter to next_symbol_text.  */
119 
120 static bfd *symfile_bfd;
121 
122 /* The size of each symbol in the symbol file (in external form).
123    This is set by dbx_symfile_read when building psymtabs, and by
124    dbx_psymtab_to_symtab when building symtabs.  */
125 
126 static unsigned symbol_size;
127 
128 /* This is the offset of the symbol table in the executable file */
129 static unsigned symbol_table_offset;
130 
131 /* This is the offset of the string table in the executable file */
132 static unsigned string_table_offset;
133 
134 /* For elf+stab executables, the n_strx field is not a simple index
135    into the string table.  Instead, each .o file has a base offset
136    in the string table, and the associated symbols contain offsets
137    from this base.  The following two variables contain the base
138    offset for the current and next .o files. */
139 static unsigned int file_string_table_offset;
140 static unsigned int next_file_string_table_offset;
141 
142 /* .o and NLM files contain unrelocated addresses which are based at 0.  When
143    non-zero, this flag disables some of the special cases for Solaris elf+stab
144    text addresses at location 0. */
145 
146 static int symfile_relocatable = 0;
147 
148   /* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are relative
149      to the function start address.  */
150 
151 static int block_address_function_relative = 0;
152 
153 /* The lowest text address we have yet encountered.  This is needed
154    because in an a.out file, there is no header field which tells us
155    what address the program is actually going to be loaded at, so we
156    need to make guesses based on the symbols (which *are* relocated to
157    reflect the address it will be loaded at).  */
158 static CORE_ADDR lowest_text_address;
159 
160 /* Complaints about the symbols we have encountered.  */
161 
162 struct complaint lbrac_complaint =
163   {"bad block start address patched", 0, 0};
164 
165 struct complaint string_table_offset_complaint =
166   {"bad string table offset in symbol %d", 0, 0};
167 
168 struct complaint unknown_symtype_complaint =
169   {"unknown symbol type %s", 0, 0};
170 
171 struct complaint unknown_symchar_complaint =
172   {"unknown symbol descriptor `%c'", 0, 0};
173 
174 struct complaint lbrac_rbrac_complaint =
175   {"block start larger than block end", 0, 0};
176 
177 struct complaint lbrac_unmatched_complaint =
178   {"unmatched N_LBRAC before symtab pos %d", 0, 0};
179 
180 struct complaint lbrac_mismatch_complaint =
181   {"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
182 
183 struct complaint repeated_header_complaint =
184   {"\"repeated\" header file %s not previously seen, at symtab pos %d", 0, 0};
185 
186 /* During initial symbol readin, we need to have a structure to keep
187    track of which psymtabs have which bincls in them.  This structure
188    is used during readin to setup the list of dependencies within each
189    partial symbol table. */
190 
191 struct header_file_location
192 {
193   char *name;			/* Name of header file */
194   int instance;			/* See above */
195   struct partial_symtab *pst;	/* Partial symtab that has the
196 				   BINCL/EINCL defs for this file */
197 };
198 
199 /* The actual list and controling variables */
200 static struct header_file_location *bincl_list, *next_bincl;
201 static int bincls_allocated;
202 
203 /* Local function prototypes */
204 
205 static void
206 process_now PARAMS ((struct objfile *));
207 
208 static void
209 free_header_files PARAMS ((void));
210 
211 static void
212 init_header_files PARAMS ((void));
213 
214 static void
215 read_ofile_symtab PARAMS ((struct partial_symtab *));
216 
217 static void
218 dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *));
219 
220 static void
221 dbx_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
222 
223 static void
224 read_dbx_dynamic_symtab PARAMS ((struct section_offsets *,
225 				 struct objfile *objfile));
226 
227 static void
228 read_dbx_symtab PARAMS ((struct section_offsets *, struct objfile *,
229 			 CORE_ADDR, int));
230 
231 static void
232 free_bincl_list PARAMS ((struct objfile *));
233 
234 static struct partial_symtab *
235 find_corresponding_bincl_psymtab PARAMS ((char *, int));
236 
237 static void
238 add_bincl_to_list PARAMS ((struct partial_symtab *, char *, int));
239 
240 static void
241 init_bincl_list PARAMS ((int, struct objfile *));
242 
243 static char *
244 dbx_next_symbol_text PARAMS ((struct objfile *));
245 
246 static void
247 fill_symbuf PARAMS ((bfd *));
248 
249 static void
250 dbx_symfile_init PARAMS ((struct objfile *));
251 
252 static void
253 dbx_new_init PARAMS ((struct objfile *));
254 
255 static void
256 dbx_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
257 
258 static void
259 dbx_symfile_finish PARAMS ((struct objfile *));
260 
261 static void
262 record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *));
263 
264 static void
265 add_new_header_file PARAMS ((char *, int));
266 
267 static void
268 add_old_header_file PARAMS ((char *, int));
269 
270 static void
271 add_this_object_header_file PARAMS ((int));
272 
273 /* Free up old header file tables */
274 
275 static void
276 free_header_files ()
277 {
278   if (this_object_header_files)
279     {
280       free ((PTR)this_object_header_files);
281       this_object_header_files = NULL;
282     }
283   n_allocated_this_object_header_files = 0;
284 }
285 
286 /* Allocate new header file tables */
287 
288 static void
289 init_header_files ()
290 {
291   n_allocated_this_object_header_files = 10;
292   this_object_header_files = (int *) xmalloc (10 * sizeof (int));
293 }
294 
295 /* Add header file number I for this object file
296    at the next successive FILENUM.  */
297 
298 static void
299 add_this_object_header_file (i)
300      int i;
301 {
302   if (n_this_object_header_files == n_allocated_this_object_header_files)
303     {
304       n_allocated_this_object_header_files *= 2;
305       this_object_header_files
306 	= (int *) xrealloc ((char *) this_object_header_files,
307 			    n_allocated_this_object_header_files * sizeof (int));
308     }
309 
310   this_object_header_files[n_this_object_header_files++] = i;
311 }
312 
313 /* Add to this file an "old" header file, one already seen in
314    a previous object file.  NAME is the header file's name.
315    INSTANCE is its instance code, to select among multiple
316    symbol tables for the same header file.  */
317 
318 static void
319 add_old_header_file (name, instance)
320      char *name;
321      int instance;
322 {
323   register struct header_file *p = HEADER_FILES (current_objfile);
324   register int i;
325 
326   for (i = 0; i < N_HEADER_FILES (current_objfile); i++)
327     if (STREQ (p[i].name, name) && instance == p[i].instance)
328       {
329 	add_this_object_header_file (i);
330 	return;
331       }
332   complain (&repeated_header_complaint, name, symnum);
333 }
334 
335 /* Add to this file a "new" header file: definitions for its types follow.
336    NAME is the header file's name.
337    Most often this happens only once for each distinct header file,
338    but not necessarily.  If it happens more than once, INSTANCE has
339    a different value each time, and references to the header file
340    use INSTANCE values to select among them.
341 
342    dbx output contains "begin" and "end" markers for each new header file,
343    but at this level we just need to know which files there have been;
344    so we record the file when its "begin" is seen and ignore the "end".  */
345 
346 static void
347 add_new_header_file (name, instance)
348      char *name;
349      int instance;
350 {
351   register int i;
352   register struct header_file *hfile;
353 
354   /* Make sure there is room for one more header file.  */
355 
356   i = N_ALLOCATED_HEADER_FILES (current_objfile);
357 
358   if (N_HEADER_FILES (current_objfile) == i)
359     {
360       if (i == 0)
361 	{
362 	  N_ALLOCATED_HEADER_FILES (current_objfile) = 10;
363 	  HEADER_FILES (current_objfile) = (struct header_file *)
364 	    xmalloc (10 * sizeof (struct header_file));
365 	}
366       else
367 	{
368 	  i *= 2;
369 	  N_ALLOCATED_HEADER_FILES (current_objfile) = i;
370 	  HEADER_FILES (current_objfile) = (struct header_file *)
371 	    xrealloc ((char *) HEADER_FILES (current_objfile),
372 		      (i * sizeof (struct header_file)));
373 	}
374     }
375 
376   /* Create an entry for this header file.  */
377 
378   i = N_HEADER_FILES (current_objfile)++;
379   hfile = HEADER_FILES (current_objfile) + i;
380   hfile->name = savestring (name, strlen(name));
381   hfile->instance = instance;
382   hfile->length = 10;
383   hfile->vector
384     = (struct type **) xmalloc (10 * sizeof (struct type *));
385   memset (hfile->vector, 0, 10 * sizeof (struct type *));
386 
387   add_this_object_header_file (i);
388 }
389 
390 #if 0
391 static struct type **
392 explicit_lookup_type (real_filenum, index)
393      int real_filenum, index;
394 {
395   register struct header_file *f = &HEADER_FILES (current_objfile)[real_filenum];
396 
397   if (index >= f->length)
398     {
399       f->length *= 2;
400       f->vector = (struct type **)
401 	xrealloc (f->vector, f->length * sizeof (struct type *));
402       memset (&f->vector[f->length / 2],
403 	     '\0', f->length * sizeof (struct type *) / 2);
404     }
405   return &f->vector[index];
406 }
407 #endif
408 
409 static void
410 record_minimal_symbol (name, address, type, objfile)
411      char *name;
412      CORE_ADDR address;
413      int type;
414      struct objfile *objfile;
415 {
416   enum minimal_symbol_type ms_type;
417   int section;
418 
419   switch (type)
420     {
421     case N_TEXT | N_EXT:
422       ms_type = mst_text;
423       section = SECT_OFF_TEXT;
424       break;
425     case N_DATA | N_EXT:
426       ms_type = mst_data;
427       section = SECT_OFF_DATA;
428       break;
429     case N_BSS | N_EXT:
430       ms_type = mst_bss;
431       section = SECT_OFF_BSS;
432       break;
433     case N_ABS | N_EXT:
434       ms_type = mst_abs;
435       section = -1;
436       break;
437 #ifdef N_SETV
438     case N_SETV | N_EXT:
439       ms_type = mst_data;
440       section = SECT_OFF_DATA;
441       break;
442     case N_SETV:
443       /* I don't think this type actually exists; since a N_SETV is the result
444 	 of going over many .o files, it doesn't make sense to have one
445 	 file local.  */
446       ms_type = mst_file_data;
447       section = SECT_OFF_DATA;
448       break;
449 #endif
450     case N_TEXT:
451     case N_NBTEXT:
452     case N_FN:
453     case N_FN_SEQ:
454       ms_type = mst_file_text;
455       section = SECT_OFF_TEXT;
456       break;
457     case N_DATA:
458       ms_type = mst_file_data;
459 
460       /* Check for __DYNAMIC, which is used by Sun shared libraries.
461 	 Record it as global even if it's local, not global, so
462 	 lookup_minimal_symbol can find it.  We don't check symbol_leading_char
463 	 because for SunOS4 it always is '_'.  */
464       if (name[8] == 'C' && STREQ ("__DYNAMIC", name))
465 	ms_type = mst_data;
466 
467       /* Same with virtual function tables, both global and static.  */
468       {
469 	char *tempstring = name;
470 	if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
471 	  ++tempstring;
472 	if (VTBL_PREFIX_P ((tempstring)))
473 	  ms_type = mst_data;
474       }
475       section = SECT_OFF_DATA;
476       break;
477     case N_BSS:
478       ms_type = mst_file_bss;
479       section = SECT_OFF_BSS;
480       break;
481     default:
482       ms_type = mst_unknown;
483       section = -1;
484       break;
485   }
486 
487   if ((ms_type == mst_file_text || ms_type == mst_text)
488       && address < lowest_text_address)
489     lowest_text_address = address;
490 
491   prim_record_minimal_symbol_and_info
492     (name, address, ms_type, NULL, section, objfile);
493 }
494 
495 /* Scan and build partial symbols for a symbol file.
496    We have been initialized by a call to dbx_symfile_init, which
497    put all the relevant info into a "struct dbx_symfile_info",
498    hung off the objfile structure.
499 
500    SECTION_OFFSETS contains offsets relative to which the symbols in the
501    various sections are (depending where the sections were actually loaded).
502    MAINLINE is true if we are reading the main symbol
503    table (as opposed to a shared lib or dynamically loaded file).  */
504 
505 static void
506 dbx_symfile_read (objfile, section_offsets, mainline)
507      struct objfile *objfile;
508      struct section_offsets *section_offsets;
509      int mainline;	/* FIXME comments above */
510 {
511   bfd *sym_bfd;
512   int val;
513   struct cleanup *back_to;
514 
515   val = strlen (objfile->name);
516 
517   sym_bfd = objfile->obfd;
518 
519   /* .o and .nlm files are relocatables with text, data and bss segs based at
520      0.  This flag disables special (Solaris stabs-in-elf only) fixups for
521      symbols with a value of 0.  */
522 
523   symfile_relocatable = bfd_get_file_flags (sym_bfd) & HAS_RELOC;
524 
525   /* This is true for Solaris (and all other systems which put stabs
526      in sections, hopefully, since it would be silly to do things
527      differently from Solaris), and false for SunOS4 and other a.out
528      file formats.  */
529   block_address_function_relative =
530     ((0 == strncmp (bfd_get_target (sym_bfd), "elf", 3))
531      || (0 == strncmp (bfd_get_target (sym_bfd), "som", 3))
532      || (0 == strncmp (bfd_get_target (sym_bfd), "coff", 4))
533      || (0 == strncmp (bfd_get_target (sym_bfd), "pe", 2))
534      || (0 == strncmp (bfd_get_target (sym_bfd), "nlm", 3)));
535 
536   val = bfd_seek (sym_bfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
537   if (val < 0)
538     perror_with_name (objfile->name);
539 
540   /* If we are reinitializing, or if we have never loaded syms yet, init */
541   if (mainline
542       || objfile->global_psymbols.size == 0
543       || objfile->static_psymbols.size == 0)
544     init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
545 
546   symbol_size = DBX_SYMBOL_SIZE (objfile);
547   symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
548 
549   free_pending_blocks ();
550   back_to = make_cleanup (really_free_pendings, 0);
551 
552   init_minimal_symbol_collection ();
553   make_cleanup (discard_minimal_symbols, 0);
554 
555   /* Now that the symbol table data of the executable file are all in core,
556      process them and define symbols accordingly.  */
557 
558   read_dbx_symtab (section_offsets, objfile,
559 		   DBX_TEXT_ADDR (objfile),
560 		   DBX_TEXT_SIZE (objfile));
561 
562   /* Add the dynamic symbols.  */
563 
564   read_dbx_dynamic_symtab (section_offsets, objfile);
565 
566   /* Install any minimal symbols that have been collected as the current
567      minimal symbols for this objfile. */
568 
569   install_minimal_symbols (objfile);
570 
571   do_cleanups (back_to);
572 }
573 
574 /* Initialize anything that needs initializing when a completely new
575    symbol file is specified (not just adding some symbols from another
576    file, e.g. a shared library).  */
577 
578 static void
579 dbx_new_init (ignore)
580      struct objfile *ignore;
581 {
582   stabsread_new_init ();
583   buildsym_new_init ();
584   init_header_files ();
585 }
586 
587 
588 /* dbx_symfile_init ()
589    is the dbx-specific initialization routine for reading symbols.
590    It is passed a struct objfile which contains, among other things,
591    the BFD for the file whose symbols are being read, and a slot for a pointer
592    to "private data" which we fill with goodies.
593 
594    We read the string table into malloc'd space and stash a pointer to it.
595 
596    Since BFD doesn't know how to read debug symbols in a format-independent
597    way (and may never do so...), we have to do it ourselves.  We will never
598    be called unless this is an a.out (or very similar) file.
599    FIXME, there should be a cleaner peephole into the BFD environment here.  */
600 
601 #define DBX_STRINGTAB_SIZE_SIZE sizeof(long)   /* FIXME */
602 
603 static void
604 dbx_symfile_init (objfile)
605      struct objfile *objfile;
606 {
607   int val;
608   bfd *sym_bfd = objfile->obfd;
609   char *name = bfd_get_filename (sym_bfd);
610   asection *text_sect;
611   unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
612 
613   /* Allocate struct to keep track of the symfile */
614   objfile->sym_stab_info = (PTR)
615     xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
616   memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
617 
618   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
619 #define	STRING_TABLE_OFFSET	(sym_bfd->origin + obj_str_filepos (sym_bfd))
620 #define	SYMBOL_TABLE_OFFSET	(sym_bfd->origin + obj_sym_filepos (sym_bfd))
621 
622   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
623 
624   DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
625 
626   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
627   if (!text_sect)
628     error ("Can't find .text section in symbol file");
629   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
630   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
631 
632   DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
633   DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
634   DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
635 
636   /* Read the string table and stash it away in the psymbol_obstack.  It is
637      only needed as long as we need to expand psymbols into full symbols,
638      so when we blow away the psymbol the string table goes away as well.
639      Note that gdb used to use the results of attempting to malloc the
640      string table, based on the size it read, as a form of sanity check
641      for botched byte swapping, on the theory that a byte swapped string
642      table size would be so totally bogus that the malloc would fail.  Now
643      that we put in on the psymbol_obstack, we can't do this since gdb gets
644      a fatal error (out of virtual memory) if the size is bogus.  We can
645      however at least check to see if the size is less than the size of
646      the size field itself, or larger than the size of the entire file.
647      Note that all valid string tables have a size greater than zero, since
648      the bytes used to hold the size are included in the count. */
649 
650   if (STRING_TABLE_OFFSET == 0)
651     {
652       /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
653 	 will never be zero, even when there is no string table.  This
654 	 would appear to be a bug in bfd. */
655       DBX_STRINGTAB_SIZE (objfile) = 0;
656       DBX_STRINGTAB (objfile) = NULL;
657     }
658   else
659     {
660       val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
661       if (val < 0)
662 	perror_with_name (name);
663 
664       memset ((PTR) size_temp, 0, sizeof (size_temp));
665       val = bfd_read ((PTR) size_temp, sizeof (size_temp), 1, sym_bfd);
666       if (val < 0)
667 	{
668 	  perror_with_name (name);
669 	}
670       else if (val == 0)
671 	{
672 	  /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
673 	     EOF if there is no string table, and attempting to read the size
674 	     from EOF will read zero bytes. */
675 	  DBX_STRINGTAB_SIZE (objfile) = 0;
676 	  DBX_STRINGTAB (objfile) = NULL;
677 	}
678       else
679 	{
680 	  /* Read some data that would appear to be the string table size.
681 	     If there really is a string table, then it is probably the right
682 	     size.  Byteswap if necessary and validate the size.  Note that
683 	     the minimum is DBX_STRINGTAB_SIZE_SIZE.  If we just read some
684 	     random data that happened to be at STRING_TABLE_OFFSET, because
685 	     bfd can't tell us there is no string table, the sanity checks may
686 	     or may not catch this. */
687 	  DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
688 
689 	  if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
690 	      || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
691 	    error ("ridiculous string table size (%d bytes).",
692 		   DBX_STRINGTAB_SIZE (objfile));
693 
694 	  DBX_STRINGTAB (objfile) =
695 	    (char *) obstack_alloc (&objfile -> psymbol_obstack,
696 				    DBX_STRINGTAB_SIZE (objfile));
697 	  OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile));
698 
699 	  /* Now read in the string table in one big gulp.  */
700 
701 	  val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
702 	  if (val < 0)
703 	    perror_with_name (name);
704 	  val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
705 			  sym_bfd);
706 	  if (val != DBX_STRINGTAB_SIZE (objfile))
707 	    perror_with_name (name);
708 	}
709     }
710 }
711 
712 /* Perform any local cleanups required when we are done with a particular
713    objfile.  I.E, we are in the process of discarding all symbol information
714    for an objfile, freeing up all memory held for it, and unlinking the
715    objfile struct from the global list of known objfiles. */
716 
717 static void
718 dbx_symfile_finish (objfile)
719      struct objfile *objfile;
720 {
721   if (objfile->sym_stab_info != NULL)
722     {
723       if (HEADER_FILES (objfile) != NULL)
724 	{
725 	  register int i = N_HEADER_FILES (objfile);
726 	  register struct header_file *hfiles = HEADER_FILES (objfile);
727 
728 	  while (--i >= 0)
729 	    {
730 	      free (hfiles [i].name);
731 	      free (hfiles [i].vector);
732 	    }
733 	  free ((PTR) hfiles);
734 	}
735       mfree (objfile -> md, objfile->sym_stab_info);
736     }
737   free_header_files ();
738 }
739 
740 
741 /* Buffer for reading the symbol table entries.  */
742 static struct external_nlist symbuf[4096];
743 static int symbuf_idx;
744 static int symbuf_end;
745 
746 /* cont_elem is used for continuing information in cfront.
747    It saves information about which types need to be fixed up and
748    completed after all the stabs are read.  */
749 struct cont_elem
750   {
751     /* sym and stabsstring for continuing information in cfront */
752     struct symbol * sym;
753     char * stabs;
754     /* state dependancies (statics that must be preserved) */
755     int sym_idx;
756     int sym_end;
757     int symnum;
758     /* other state dependancies include:
759        (assumption is that these will not change since process_now FIXME!!)
760         stringtab_global
761         n_stabs
762         objfile
763         symfile_bfd */
764 };
765 static struct cont_elem cont_list[100];
766 static int cont_count = 0;
767 
768 void
769 process_later(sym,p)
770   struct symbol * sym;
771   char * p;
772 {
773   /* save state so we can process these stabs later */
774   cont_list[cont_count].sym_idx = symbuf_idx;
775   cont_list[cont_count].sym_end = symbuf_end;
776   cont_list[cont_count].symnum = symnum;
777   cont_list[cont_count].sym = sym;
778   cont_list[cont_count].stabs = p;
779   cont_count++;
780 }
781 
782 static void
783 process_now(objfile)
784   struct objfile * objfile;
785 {
786   int i;
787   /* save original state */
788   int save_symbuf_idx = symbuf_idx;
789   int save_symbuf_end = symbuf_end;
790   int save_symnum = symnum;
791   for (i=0; i<cont_count; i++)
792     {
793       /* set state as if we were parsing stabs strings
794          for this symbol */
795       symbuf_idx = cont_list[i].sym_idx;   /* statics used by gdb */
796       symbuf_end = cont_list[i].sym_end;
797       symnum = cont_list[i].symnum;
798       resolve_cfront_continuation(objfile,cont_list[i].sym,cont_list[i].stabs);
799     }
800   /* restore original state */
801   symbuf_idx = save_symbuf_idx;
802   symbuf_end = save_symbuf_end;
803   symnum = save_symnum;
804   cont_count=0;  /* reset for next run */
805 }
806 
807 
808 /* Name of last function encountered.  Used in Solaris to approximate
809    object file boundaries.  */
810 static char *last_function_name;
811 
812 /* The address in memory of the string table of the object file we are
813    reading (which might not be the "main" object file, but might be a
814    shared library or some other dynamically loaded thing).  This is
815    set by read_dbx_symtab when building psymtabs, and by
816    read_ofile_symtab when building symtabs, and is used only by
817    next_symbol_text.  FIXME: If that is true, we don't need it when
818    building psymtabs, right?  */
819 static char *stringtab_global;
820 
821 /* These variables are used to control fill_symbuf when the stabs
822    symbols are not contiguous (as may be the case when a COFF file is
823    linked using --split-by-reloc).  */
824 static struct stab_section_list *symbuf_sections;
825 static unsigned int symbuf_left;
826 static unsigned int symbuf_read;
827 
828 /* Refill the symbol table input buffer
829    and set the variables that control fetching entries from it.
830    Reports an error if no data available.
831    This function can read past the end of the symbol table
832    (into the string table) but this does no harm.  */
833 
834 static void
835 fill_symbuf (sym_bfd)
836      bfd *sym_bfd;
837 {
838   unsigned int count;
839   int nbytes;
840 
841   if (symbuf_sections == NULL)
842     count = sizeof (symbuf);
843   else
844     {
845       if (symbuf_left <= 0)
846 	{
847 	  file_ptr filepos = symbuf_sections->section->filepos;
848 	  if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0)
849 	    perror_with_name (bfd_get_filename (sym_bfd));
850 	  symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section);
851 	  symbol_table_offset = filepos - symbuf_read;
852 	  symbuf_sections = symbuf_sections->next;
853 	}
854 
855       count = symbuf_left;
856       if (count > sizeof (symbuf))
857 	count = sizeof (symbuf);
858     }
859 
860   nbytes = bfd_read ((PTR)symbuf, count, 1, sym_bfd);
861   if (nbytes < 0)
862     perror_with_name (bfd_get_filename (sym_bfd));
863   else if (nbytes == 0)
864     error ("Premature end of file reading symbol table");
865   symbuf_end = nbytes / symbol_size;
866   symbuf_idx = 0;
867   symbuf_left -= nbytes;
868   symbuf_read += nbytes;
869 }
870 
871 #define SWAP_SYMBOL(symp, abfd) \
872   { \
873     (symp)->n_strx = bfd_h_get_32(abfd,			\
874 				(unsigned char *)&(symp)->n_strx);	\
875     (symp)->n_desc = bfd_h_get_16 (abfd,			\
876 				(unsigned char *)&(symp)->n_desc);  	\
877     (symp)->n_value = bfd_h_get_32 (abfd,			\
878 				(unsigned char *)&(symp)->n_value); 	\
879   }
880 
881 #define INTERNALIZE_SYMBOL(intern, extern, abfd)			\
882   {									\
883     (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);		\
884     (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);		\
885     (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);  		\
886     (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);		\
887   }
888 
889 /* Invariant: The symbol pointed to by symbuf_idx is the first one
890    that hasn't been swapped.  Swap the symbol at the same time
891    that symbuf_idx is incremented.  */
892 
893 /* dbx allows the text of a symbol name to be continued into the
894    next symbol name!  When such a continuation is encountered
895    (a \ at the end of the text of a name)
896    call this function to get the continuation.  */
897 
898 static char *
899 dbx_next_symbol_text (objfile)
900      struct objfile *objfile;
901 {
902   struct internal_nlist nlist;
903 
904   if (symbuf_idx == symbuf_end)
905     fill_symbuf (symfile_bfd);
906 
907   symnum++;
908   INTERNALIZE_SYMBOL(nlist, &symbuf[symbuf_idx], symfile_bfd);
909   OBJSTAT (objfile, n_stabs++);
910 
911   symbuf_idx++;
912 
913   return nlist.n_strx + stringtab_global + file_string_table_offset;
914 }
915 
916 /* Initialize the list of bincls to contain none and have some
917    allocated.  */
918 
919 static void
920 init_bincl_list (number, objfile)
921      int number;
922      struct objfile *objfile;
923 {
924   bincls_allocated = number;
925   next_bincl = bincl_list = (struct header_file_location *)
926     xmmalloc (objfile -> md, bincls_allocated * sizeof(struct header_file_location));
927 }
928 
929 /* Add a bincl to the list.  */
930 
931 static void
932 add_bincl_to_list (pst, name, instance)
933      struct partial_symtab *pst;
934      char *name;
935      int instance;
936 {
937   if (next_bincl >= bincl_list + bincls_allocated)
938     {
939       int offset = next_bincl - bincl_list;
940       bincls_allocated *= 2;
941       bincl_list = (struct header_file_location *)
942 	xmrealloc (pst->objfile->md, (char *)bincl_list,
943 		  bincls_allocated * sizeof (struct header_file_location));
944       next_bincl = bincl_list + offset;
945     }
946   next_bincl->pst = pst;
947   next_bincl->instance = instance;
948   next_bincl++->name = name;
949 }
950 
951 /* Given a name, value pair, find the corresponding
952    bincl in the list.  Return the partial symtab associated
953    with that header_file_location.  */
954 
955 static struct partial_symtab *
956 find_corresponding_bincl_psymtab (name, instance)
957      char *name;
958      int instance;
959 {
960   struct header_file_location *bincl;
961 
962   for (bincl = bincl_list; bincl < next_bincl; bincl++)
963     if (bincl->instance == instance
964 	&& STREQ (name, bincl->name))
965       return bincl->pst;
966 
967   complain (&repeated_header_complaint, name, symnum);
968   return (struct partial_symtab *) 0;
969 }
970 
971 /* Free the storage allocated for the bincl list.  */
972 
973 static void
974 free_bincl_list (objfile)
975      struct objfile *objfile;
976 {
977   mfree (objfile -> md, (PTR)bincl_list);
978   bincls_allocated = 0;
979 }
980 
981 /* Scan a SunOs dynamic symbol table for symbols of interest and
982    add them to the minimal symbol table.  */
983 
984 static void
985 read_dbx_dynamic_symtab (section_offsets, objfile)
986      struct section_offsets *section_offsets;
987      struct objfile *objfile;
988 {
989   bfd *abfd = objfile->obfd;
990   struct cleanup *back_to;
991   int counter;
992   long dynsym_size;
993   long dynsym_count;
994   asymbol **dynsyms;
995   asymbol **symptr;
996   arelent **relptr;
997   long dynrel_size;
998   long dynrel_count;
999   arelent **dynrels;
1000   CORE_ADDR sym_value;
1001   char *name;
1002 
1003   /* Check that the symbol file has dynamic symbols that we know about.
1004      bfd_arch_unknown can happen if we are reading a sun3 symbol file
1005      on a sun4 host (and vice versa) and bfd is not configured
1006      --with-target=all.  This would trigger an assertion in bfd/sunos.c,
1007      so we ignore the dynamic symbols in this case.  */
1008   if (bfd_get_flavour (abfd) != bfd_target_aout_flavour
1009       || (bfd_get_file_flags (abfd) & DYNAMIC) == 0
1010       || bfd_get_arch (abfd) == bfd_arch_unknown)
1011     return;
1012 
1013   dynsym_size = bfd_get_dynamic_symtab_upper_bound (abfd);
1014   if (dynsym_size < 0)
1015     return;
1016 
1017   dynsyms = (asymbol **) xmalloc (dynsym_size);
1018   back_to = make_cleanup (free, dynsyms);
1019 
1020   dynsym_count = bfd_canonicalize_dynamic_symtab (abfd, dynsyms);
1021   if (dynsym_count < 0)
1022     {
1023       do_cleanups (back_to);
1024       return;
1025     }
1026 
1027   /* Enter dynamic symbols into the minimal symbol table
1028      if this is a stripped executable.  */
1029   if (bfd_get_symcount (abfd) <= 0)
1030     {
1031       symptr = dynsyms;
1032       for (counter = 0; counter < dynsym_count; counter++, symptr++)
1033 	{
1034 	  asymbol *sym = *symptr;
1035 	  asection *sec;
1036 	  int type;
1037 
1038 	  sec = bfd_get_section (sym);
1039 
1040 	  /* BFD symbols are section relative.  */
1041 	  sym_value = sym->value + sec->vma;
1042 
1043 	  if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
1044 	    {
1045 	      sym_value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1046 	      type = N_TEXT;
1047 	    }
1048 	  else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
1049 	    {
1050 	      sym_value += ANOFFSET (section_offsets, SECT_OFF_DATA);
1051 	      type = N_DATA;
1052 	    }
1053 	  else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
1054 	    {
1055 	      sym_value += ANOFFSET (section_offsets, SECT_OFF_BSS);
1056 	      type = N_BSS;
1057 	    }
1058 	  else
1059 	    continue;
1060 
1061 	  if (sym->flags & BSF_GLOBAL)
1062 	    type |= N_EXT;
1063 
1064 	  record_minimal_symbol ((char *) bfd_asymbol_name (sym), sym_value,
1065 				 type, objfile);
1066 	}
1067     }
1068 
1069   /* Symbols from shared libraries have a dynamic relocation entry
1070      that points to the associated slot in the procedure linkage table.
1071      We make a mininal symbol table entry with type mst_solib_trampoline
1072      at the address in the procedure linkage table.  */
1073   dynrel_size = bfd_get_dynamic_reloc_upper_bound (abfd);
1074   if (dynrel_size < 0)
1075     {
1076       do_cleanups (back_to);
1077       return;
1078     }
1079 
1080   dynrels = (arelent **) xmalloc (dynrel_size);
1081   make_cleanup (free, dynrels);
1082 
1083   dynrel_count = bfd_canonicalize_dynamic_reloc (abfd, dynrels, dynsyms);
1084   if (dynrel_count < 0)
1085     {
1086       do_cleanups (back_to);
1087       return;
1088     }
1089 
1090   for (counter = 0, relptr = dynrels;
1091        counter < dynrel_count;
1092        counter++, relptr++)
1093     {
1094       arelent *rel = *relptr;
1095       CORE_ADDR address =
1096 	rel->address + ANOFFSET (section_offsets, SECT_OFF_DATA);
1097 
1098       switch (bfd_get_arch (abfd))
1099 	{
1100 	case bfd_arch_sparc:
1101 	  if (rel->howto->type != RELOC_JMP_SLOT)
1102 	    continue;
1103 	  break;
1104 	case bfd_arch_m68k:
1105 	  /* `16' is the type BFD produces for a jump table relocation.  */
1106 	  if (rel->howto->type != 16)
1107 	    continue;
1108 
1109 	  /* Adjust address in the jump table to point to
1110 	     the start of the bsr instruction.  */
1111 	  address -= 2;
1112 	  break;
1113 	default:
1114 	  continue;
1115 	}
1116 
1117       name = (char *) bfd_asymbol_name (*rel->sym_ptr_ptr);
1118       prim_record_minimal_symbol (name, address, mst_solib_trampoline,
1119 				  objfile);
1120     }
1121 
1122   do_cleanups (back_to);
1123 }
1124 
1125 /* Given pointers to an a.out symbol table in core containing dbx
1126    style data, setup partial_symtab's describing each source file for
1127    which debugging information is available.
1128    SYMFILE_NAME is the name of the file we are reading from
1129    and SECTION_OFFSETS is the set of offsets for the various sections
1130    of the file (a set of zeros if the mainline program).  */
1131 
1132 static void
1133 read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
1134      struct section_offsets *section_offsets;
1135      struct objfile *objfile;
1136      CORE_ADDR text_addr;
1137      int text_size;
1138 {
1139   register struct external_nlist *bufp = 0;	/* =0 avoids gcc -Wall glitch */
1140   struct internal_nlist nlist;
1141 
1142   register char *namestring;
1143   int nsl;
1144   int past_first_source_file = 0;
1145   CORE_ADDR last_o_file_start = 0;
1146   CORE_ADDR last_function_start = 0;
1147   struct cleanup *back_to;
1148   bfd *abfd;
1149   int textlow_not_set;
1150 
1151   /* Current partial symtab */
1152   struct partial_symtab *pst;
1153 
1154   /* List of current psymtab's include files */
1155   char **psymtab_include_list;
1156   int includes_allocated;
1157   int includes_used;
1158 
1159   /* Index within current psymtab dependency list */
1160   struct partial_symtab **dependency_list;
1161   int dependencies_used, dependencies_allocated;
1162 
1163   /* FIXME.  We probably want to change stringtab_global rather than add this
1164      while processing every symbol entry.  FIXME.  */
1165   file_string_table_offset = 0;
1166   next_file_string_table_offset = 0;
1167 
1168   stringtab_global = DBX_STRINGTAB (objfile);
1169 
1170   pst = (struct partial_symtab *) 0;
1171 
1172   includes_allocated = 30;
1173   includes_used = 0;
1174   psymtab_include_list = (char **) alloca (includes_allocated *
1175 					   sizeof (char *));
1176 
1177   dependencies_allocated = 30;
1178   dependencies_used = 0;
1179   dependency_list =
1180     (struct partial_symtab **) alloca (dependencies_allocated *
1181 				       sizeof (struct partial_symtab *));
1182 
1183   /* Init bincl list */
1184   init_bincl_list (20, objfile);
1185   back_to = make_cleanup (free_bincl_list, objfile);
1186 
1187   last_source_file = NULL;
1188 
1189   lowest_text_address = (CORE_ADDR)-1;
1190 
1191   symfile_bfd = objfile->obfd;	/* For next_text_symbol */
1192   abfd = objfile->obfd;
1193   symbuf_end = symbuf_idx = 0;
1194   next_symbol_text_func = dbx_next_symbol_text;
1195   textlow_not_set = 1;
1196 
1197   for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
1198     {
1199       /* Get the symbol for this run and pull out some info */
1200       QUIT;	/* allow this to be interruptable */
1201       if (symbuf_idx == symbuf_end)
1202 	fill_symbuf (abfd);
1203       bufp = &symbuf[symbuf_idx++];
1204 
1205       /*
1206        * Special case to speed up readin.
1207        */
1208       if (bfd_h_get_8 (abfd, bufp->e_type) == N_SLINE)
1209 	continue;
1210 
1211       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1212       OBJSTAT (objfile, n_stabs++);
1213 
1214       /* Ok.  There is a lot of code duplicated in the rest of this
1215          switch statement (for efficiency reasons).  Since I don't
1216          like duplicating code, I will do my penance here, and
1217          describe the code which is duplicated:
1218 
1219 	 *) The assignment to namestring.
1220 	 *) The call to strchr.
1221 	 *) The addition of a partial symbol the the two partial
1222 	    symbol lists.  This last is a large section of code, so
1223 	    I've imbedded it in the following macro.
1224 	 */
1225 
1226 /* Set namestring based on nlist.  If the string table index is invalid,
1227    give a fake name, and print a single error message per symbol file read,
1228    rather than abort the symbol reading or flood the user with messages.  */
1229 
1230 /*FIXME: Too many adds and indirections in here for the inner loop.  */
1231 #define SET_NAMESTRING()\
1232   if (((unsigned)CUR_SYMBOL_STRX + file_string_table_offset) >=		\
1233       DBX_STRINGTAB_SIZE (objfile)) {					\
1234     complain (&string_table_offset_complaint, symnum);			\
1235     namestring = "<bad string table offset>";				\
1236   } else								\
1237     namestring = CUR_SYMBOL_STRX + file_string_table_offset +		\
1238 		 DBX_STRINGTAB (objfile)
1239 
1240 #define CUR_SYMBOL_TYPE nlist.n_type
1241 #define CUR_SYMBOL_VALUE nlist.n_value
1242 #define CUR_SYMBOL_STRX nlist.n_strx
1243 #define DBXREAD_ONLY
1244 #define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms)\
1245   start_psymtab(ofile, secoff, fname, low, symoff, global_syms, static_syms)
1246 #define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)\
1247   end_psymtab(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)
1248 
1249 #include "partial-stab.h"
1250     }
1251 
1252   /* If there's stuff to be cleaned up, clean it up.  */
1253   if (DBX_SYMCOUNT (objfile) > 0			/* We have some syms */
1254 /*FIXME, does this have a bug at start address 0? */
1255       && last_o_file_start
1256       && objfile -> ei.entry_point < nlist.n_value
1257       && objfile -> ei.entry_point >= last_o_file_start)
1258     {
1259       objfile -> ei.entry_file_lowpc = last_o_file_start;
1260       objfile -> ei.entry_file_highpc = nlist.n_value;
1261     }
1262 
1263   if (pst)
1264     {
1265       end_psymtab (pst, psymtab_include_list, includes_used,
1266 		   symnum * symbol_size,
1267 		   (lowest_text_address == (CORE_ADDR)-1
1268 		    ? (text_addr + section_offsets->offsets[SECT_OFF_TEXT])
1269 		    : lowest_text_address)
1270 		   + text_size,
1271 		   dependency_list, dependencies_used, textlow_not_set);
1272     }
1273 
1274   do_cleanups (back_to);
1275 }
1276 
1277 /* Allocate and partially fill a partial symtab.  It will be
1278    completely filled at the end of the symbol list.
1279 
1280    SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
1281    is the address relative to which its symbols are (incremental) or 0
1282    (normal). */
1283 
1284 
1285 struct partial_symtab *
1286 start_psymtab (objfile, section_offsets,
1287 	       filename, textlow, ldsymoff, global_syms, static_syms)
1288      struct objfile *objfile;
1289      struct section_offsets *section_offsets;
1290      char *filename;
1291      CORE_ADDR textlow;
1292      int ldsymoff;
1293      struct partial_symbol **global_syms;
1294      struct partial_symbol **static_syms;
1295 {
1296   struct partial_symtab *result =
1297       start_psymtab_common(objfile, section_offsets,
1298 			   filename, textlow, global_syms, static_syms);
1299 
1300   result->read_symtab_private = (char *)
1301     obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc));
1302   LDSYMOFF(result) = ldsymoff;
1303   result->read_symtab = dbx_psymtab_to_symtab;
1304   SYMBOL_SIZE(result) = symbol_size;
1305   SYMBOL_OFFSET(result) = symbol_table_offset;
1306   STRING_OFFSET(result) = string_table_offset;
1307   FILE_STRING_OFFSET(result) = file_string_table_offset;
1308 
1309   /* If we're handling an ELF file, drag some section-relocation info
1310      for this source file out of the ELF symbol table, to compensate for
1311      Sun brain death.  This replaces the section_offsets in this psymtab,
1312      if successful.  */
1313   elfstab_offset_sections (objfile, result);
1314 
1315   /* Deduce the source language from the filename for this psymtab. */
1316   psymtab_language = deduce_language_from_filename (filename);
1317 
1318   return result;
1319 }
1320 
1321 /* Close off the current usage of PST.
1322    Returns PST or NULL if the partial symtab was empty and thrown away.
1323 
1324    FIXME:  List variables and peculiarities of same.  */
1325 
1326 struct partial_symtab *
1327 end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
1328 	     capping_text, dependency_list, number_dependencies, textlow_not_set)
1329      struct partial_symtab *pst;
1330      char **include_list;
1331      int num_includes;
1332      int capping_symbol_offset;
1333      CORE_ADDR capping_text;
1334      struct partial_symtab **dependency_list;
1335      int number_dependencies;
1336      int textlow_not_set;
1337 {
1338   int i;
1339   struct objfile *objfile = pst -> objfile;
1340 
1341   if (capping_symbol_offset != -1)
1342     LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
1343   pst->texthigh = capping_text;
1344 
1345 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1346   /* Under Solaris, the N_SO symbols always have a value of 0,
1347      instead of the usual address of the .o file.  Therefore,
1348      we have to do some tricks to fill in texthigh and textlow.
1349      The first trick is in partial-stab.h: if we see a static
1350      or global function, and the textlow for the current pst
1351      is not set (ie: textlow_not_set), then we use that function's
1352      address for the textlow of the pst.  */
1353 
1354   /* Now, to fill in texthigh, we remember the last function seen
1355      in the .o file (also in partial-stab.h).  Also, there's a hack in
1356      bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
1357      to here via the misc_info field.  Therefore, we can fill in
1358      a reliable texthigh by taking the address plus size of the
1359      last function in the file.  */
1360 
1361   if (pst->texthigh == 0 && last_function_name)
1362     {
1363       char *p;
1364       int n;
1365       struct minimal_symbol *minsym;
1366 
1367       p = strchr (last_function_name, ':');
1368       if (p == NULL)
1369 	p = last_function_name;
1370       n = p - last_function_name;
1371       p = alloca (n + 1);
1372       strncpy (p, last_function_name, n);
1373       p[n] = 0;
1374 
1375       minsym = lookup_minimal_symbol (p, pst->filename, objfile);
1376 
1377       if (minsym)
1378 	pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym)
1379 	  + (long) MSYMBOL_INFO (minsym);
1380 
1381       last_function_name = NULL;
1382     }
1383 
1384   /* this test will be true if the last .o file is only data */
1385   if (textlow_not_set)
1386     pst->textlow = pst->texthigh;
1387   else
1388     {
1389       struct partial_symtab *p1;
1390 
1391       /* If we know our own starting text address, then walk through all other
1392 	 psymtabs for this objfile, and if any didn't know their ending text
1393 	 address, set it to our starting address.  Take care to not set our
1394 	 own ending address to our starting address, nor to set addresses on
1395 	 `dependency' files that have both textlow and texthigh zero.  */
1396 
1397       ALL_OBJFILE_PSYMTABS (objfile, p1)
1398 	{
1399 	  if (p1->texthigh == 0  && p1->textlow != 0 && p1 != pst)
1400 	    {
1401 	      p1->texthigh = pst->textlow;
1402 	      /* if this file has only data, then make textlow match texthigh */
1403 	      if (p1->textlow == 0)
1404 		p1->textlow = p1->texthigh;
1405 	    }
1406 	}
1407     }
1408 
1409   /* End of kludge for patching Solaris textlow and texthigh.  */
1410 #endif /* SOFUN_ADDRESS_MAYBE_MISSING.  */
1411 
1412   pst->n_global_syms =
1413     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1414   pst->n_static_syms =
1415     objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1416 
1417   pst->number_of_dependencies = number_dependencies;
1418   if (number_dependencies)
1419     {
1420       pst->dependencies = (struct partial_symtab **)
1421 	obstack_alloc (&objfile->psymbol_obstack,
1422 		       number_dependencies * sizeof (struct partial_symtab *));
1423       memcpy (pst->dependencies, dependency_list,
1424 	     number_dependencies * sizeof (struct partial_symtab *));
1425     }
1426   else
1427     pst->dependencies = 0;
1428 
1429   for (i = 0; i < num_includes; i++)
1430     {
1431       struct partial_symtab *subpst =
1432 	allocate_psymtab (include_list[i], objfile);
1433 
1434       subpst->section_offsets = pst->section_offsets;
1435       subpst->read_symtab_private =
1436 	  (char *) obstack_alloc (&objfile->psymbol_obstack,
1437 				  sizeof (struct symloc));
1438       LDSYMOFF(subpst) =
1439 	LDSYMLEN(subpst) =
1440 	  subpst->textlow =
1441 	    subpst->texthigh = 0;
1442 
1443       /* We could save slight bits of space by only making one of these,
1444 	 shared by the entire set of include files.  FIXME-someday.  */
1445       subpst->dependencies = (struct partial_symtab **)
1446 	obstack_alloc (&objfile->psymbol_obstack,
1447 		       sizeof (struct partial_symtab *));
1448       subpst->dependencies[0] = pst;
1449       subpst->number_of_dependencies = 1;
1450 
1451       subpst->globals_offset =
1452 	subpst->n_global_syms =
1453 	  subpst->statics_offset =
1454 	    subpst->n_static_syms = 0;
1455 
1456       subpst->readin = 0;
1457       subpst->symtab = 0;
1458       subpst->read_symtab = pst->read_symtab;
1459     }
1460 
1461   sort_pst_symbols (pst);
1462 
1463   /* If there is already a psymtab or symtab for a file of this name, remove it.
1464      (If there is a symtab, more drastic things also happen.)
1465      This happens in VxWorks.  */
1466   free_named_symtabs (pst->filename);
1467 
1468   if (num_includes == 0
1469       && number_dependencies == 0
1470       && pst->n_global_syms == 0
1471       && pst->n_static_syms == 0)
1472     {
1473       /* Throw away this psymtab, it's empty.  We can't deallocate it, since
1474 	 it is on the obstack, but we can forget to chain it on the list.  */
1475       /* Empty psymtabs happen as a result of header files which don't have
1476 	 any symbols in them.  There can be a lot of them.  But this check
1477 	 is wrong, in that a psymtab with N_SLINE entries but nothing else
1478 	 is not empty, but we don't realize that.  Fixing that without slowing
1479 	 things down might be tricky.  */
1480       struct partial_symtab *prev_pst;
1481 
1482       /* First, snip it out of the psymtab chain */
1483 
1484       if (pst->objfile->psymtabs == pst)
1485 	pst->objfile->psymtabs = pst->next;
1486       else
1487 	for (prev_pst = pst->objfile->psymtabs; prev_pst; prev_pst = pst->next)
1488 	  if (prev_pst->next == pst)
1489 	    prev_pst->next = pst->next;
1490 
1491       /* Next, put it on a free list for recycling */
1492 
1493       pst->next = pst->objfile->free_psymtabs;
1494       pst->objfile->free_psymtabs = pst;
1495 
1496       /* Indicate that psymtab was thrown away.  */
1497       pst = (struct partial_symtab *)NULL;
1498     }
1499   return pst;
1500 }
1501 
1502 static void
1503 dbx_psymtab_to_symtab_1 (pst)
1504      struct partial_symtab *pst;
1505 {
1506   struct cleanup *old_chain;
1507   int i;
1508 
1509   if (!pst)
1510     return;
1511 
1512   if (pst->readin)
1513     {
1514       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1515 	       pst->filename);
1516       return;
1517     }
1518 
1519   /* Read in all partial symtabs on which this one is dependent */
1520   for (i = 0; i < pst->number_of_dependencies; i++)
1521     if (!pst->dependencies[i]->readin)
1522       {
1523 	/* Inform about additional files that need to be read in.  */
1524 	if (info_verbose)
1525 	  {
1526 	    fputs_filtered (" ", gdb_stdout);
1527 	    wrap_here ("");
1528 	    fputs_filtered ("and ", gdb_stdout);
1529 	    wrap_here ("");
1530 	    printf_filtered ("%s...", pst->dependencies[i]->filename);
1531 	    wrap_here ("");		/* Flush output */
1532 	    gdb_flush (gdb_stdout);
1533 	  }
1534 	dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
1535       }
1536 
1537   if (LDSYMLEN(pst))		/* Otherwise it's a dummy */
1538     {
1539       /* Init stuff necessary for reading in symbols */
1540       stabsread_init ();
1541       buildsym_init ();
1542       old_chain = make_cleanup (really_free_pendings, 0);
1543       file_string_table_offset = FILE_STRING_OFFSET (pst);
1544       symbol_size = SYMBOL_SIZE (pst);
1545 
1546       /* Read in this file's symbols */
1547       bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
1548       read_ofile_symtab (pst);
1549       sort_symtab_syms (pst->symtab);
1550 
1551       do_cleanups (old_chain);
1552     }
1553 
1554   pst->readin = 1;
1555 }
1556 
1557 /* Read in all of the symbols for a given psymtab for real.
1558    Be verbose about it if the user wants that.  */
1559 
1560 static void
1561 dbx_psymtab_to_symtab (pst)
1562      struct partial_symtab *pst;
1563 {
1564   bfd *sym_bfd;
1565 
1566   if (!pst)
1567     return;
1568 
1569   if (pst->readin)
1570     {
1571       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1572 	       pst->filename);
1573       return;
1574     }
1575 
1576   if (LDSYMLEN(pst) || pst->number_of_dependencies)
1577     {
1578       /* Print the message now, before reading the string table,
1579 	 to avoid disconcerting pauses.  */
1580       if (info_verbose)
1581 	{
1582 	  printf_filtered ("Reading in symbols for %s...", pst->filename);
1583 	  gdb_flush (gdb_stdout);
1584 	}
1585 
1586       sym_bfd = pst->objfile->obfd;
1587 
1588       next_symbol_text_func = dbx_next_symbol_text;
1589 
1590       dbx_psymtab_to_symtab_1 (pst);
1591 
1592       /* Match with global symbols.  This only needs to be done once,
1593          after all of the symtabs and dependencies have been read in.   */
1594       scan_file_globals (pst->objfile);
1595 
1596       /* Finish up the debug error message.  */
1597       if (info_verbose)
1598 	printf_filtered ("done.\n");
1599     }
1600 }
1601 
1602 /* Read in a defined section of a specific object file's symbols. */
1603 
1604 static void
1605 read_ofile_symtab (pst)
1606      struct partial_symtab *pst;
1607 {
1608   register char *namestring;
1609   register struct external_nlist *bufp;
1610   struct internal_nlist nlist;
1611   unsigned char type;
1612   unsigned max_symnum;
1613   register bfd *abfd;
1614   struct objfile *objfile;
1615   int sym_offset;		/* Offset to start of symbols to read */
1616   int sym_size;			/* Size of symbols to read */
1617   CORE_ADDR text_offset;	/* Start of text segment for symbols */
1618   int text_size;		/* Size of text segment for symbols */
1619   struct section_offsets *section_offsets;
1620 
1621   objfile = pst->objfile;
1622   sym_offset = LDSYMOFF(pst);
1623   sym_size = LDSYMLEN(pst);
1624   text_offset = pst->textlow;
1625   text_size = pst->texthigh - pst->textlow;
1626   section_offsets = pst->section_offsets;
1627 
1628   current_objfile = objfile;
1629   subfile_stack = NULL;
1630 
1631   stringtab_global = DBX_STRINGTAB (objfile);
1632   last_source_file = NULL;
1633 
1634   abfd = objfile->obfd;
1635   symfile_bfd = objfile->obfd;	/* Implicit param to next_text_symbol */
1636   symbuf_end = symbuf_idx = 0;
1637 
1638   /* It is necessary to actually read one symbol *before* the start
1639      of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
1640      occurs before the N_SO symbol.
1641 
1642      Detecting this in read_dbx_symtab
1643      would slow down initial readin, so we look for it here instead.  */
1644   if (!processing_acc_compilation && sym_offset >= (int)symbol_size)
1645     {
1646       bfd_seek (symfile_bfd, sym_offset - symbol_size, SEEK_CUR);
1647       fill_symbuf (abfd);
1648       bufp = &symbuf[symbuf_idx++];
1649       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1650       OBJSTAT (objfile, n_stabs++);
1651 
1652       SET_NAMESTRING ();
1653 
1654       processing_gcc_compilation = 0;
1655       if (nlist.n_type == N_TEXT)
1656 	{
1657 	  const char *tempstring = namestring;
1658 
1659 	  if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1660 	    processing_gcc_compilation = 1;
1661 	  else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1662 	    processing_gcc_compilation = 2;
1663 	  if (tempstring[0] == bfd_get_symbol_leading_char (symfile_bfd))
1664 	    ++tempstring;
1665 	  if (STREQN (tempstring, "__gnu_compiled", 14))
1666 	    processing_gcc_compilation = 2;
1667 	}
1668 
1669       /* Try to select a C++ demangling based on the compilation unit
1670 	 producer. */
1671 
1672       if (processing_gcc_compilation)
1673 	{
1674 	  if (AUTO_DEMANGLING)
1675 	    {
1676 	      set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1677 	    }
1678 	}
1679     }
1680   else
1681     {
1682       /* The N_SO starting this symtab is the first symbol, so we
1683 	 better not check the symbol before it.  I'm not this can
1684 	 happen, but it doesn't hurt to check for it.  */
1685       bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
1686       processing_gcc_compilation = 0;
1687     }
1688 
1689   if (symbuf_idx == symbuf_end)
1690     fill_symbuf (abfd);
1691   bufp = &symbuf[symbuf_idx];
1692   if (bfd_h_get_8 (abfd, bufp->e_type) != N_SO)
1693     error("First symbol in segment of executable not a source symbol");
1694 
1695   max_symnum = sym_size / symbol_size;
1696 
1697   for (symnum = 0;
1698        symnum < max_symnum;
1699        symnum++)
1700     {
1701       QUIT;			/* Allow this to be interruptable */
1702       if (symbuf_idx == symbuf_end)
1703 	fill_symbuf(abfd);
1704       bufp = &symbuf[symbuf_idx++];
1705       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1706       OBJSTAT (objfile, n_stabs++);
1707 
1708       type = bfd_h_get_8 (abfd, bufp->e_type);
1709 
1710       SET_NAMESTRING ();
1711 
1712       if (type & N_STAB) {
1713 	  process_one_symbol (type, nlist.n_desc, nlist.n_value,
1714 			      namestring, section_offsets, objfile);
1715       }
1716       /* We skip checking for a new .o or -l file; that should never
1717          happen in this routine. */
1718       else if (type == N_TEXT)
1719 	{
1720 	  /* I don't think this code will ever be executed, because
1721 	     the GCC_COMPILED_FLAG_SYMBOL usually is right before
1722 	     the N_SO symbol which starts this source file.
1723 	     However, there is no reason not to accept
1724 	     the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
1725 
1726 	  if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1727 	    processing_gcc_compilation = 1;
1728 	  else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1729 	    processing_gcc_compilation = 2;
1730 
1731 	  if (AUTO_DEMANGLING)
1732 	    {
1733 	      set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1734 	    }
1735 	}
1736       else if (type & N_EXT || type == (unsigned char)N_TEXT
1737 	       || type == (unsigned char)N_NBTEXT
1738 	       ) {
1739 	  /* Global symbol: see if we came across a dbx defintion for
1740 	     a corresponding symbol.  If so, store the value.  Remove
1741 	     syms from the chain when their values are stored, but
1742 	     search the whole chain, as there may be several syms from
1743 	     different files with the same name. */
1744 	  /* This is probably not true.  Since the files will be read
1745 	     in one at a time, each reference to a global symbol will
1746 	     be satisfied in each file as it appears. So we skip this
1747 	     section. */
1748 	  ;
1749         }
1750     }
1751 
1752   current_objfile = NULL;
1753 
1754   /* In a Solaris elf file, this variable, which comes from the
1755      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
1756      which comes from pst->textlow is correct. */
1757   if (last_source_start_addr == 0)
1758     last_source_start_addr = text_offset;
1759 
1760   /* In reordered executables last_source_start_addr may not be the
1761      lower bound for this symtab, instead use text_offset which comes
1762      from pst->textlow which is correct.  */
1763   if (last_source_start_addr > text_offset)
1764     last_source_start_addr = text_offset;
1765 
1766   pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT);
1767 
1768   if (ARM_DEMANGLING)	/* process incomplete C++ types now */
1769     process_now(objfile);
1770 
1771   end_stabs ();
1772 }
1773 
1774 
1775 /* This handles a single symbol from the symbol-file, building symbols
1776    into a GDB symtab.  It takes these arguments and an implicit argument.
1777 
1778    TYPE is the type field of the ".stab" symbol entry.
1779    DESC is the desc field of the ".stab" entry.
1780    VALU is the value field of the ".stab" entry.
1781    NAME is the symbol name, in our address space.
1782    SECTION_OFFSETS is a set of amounts by which the sections of this object
1783           file were relocated when it was loaded into memory.
1784           All symbols that refer
1785 	  to memory locations need to be offset by these amounts.
1786    OBJFILE is the object file from which we are reading symbols.
1787  	       It is used in end_symtab.  */
1788 
1789 void
1790 process_one_symbol (type, desc, valu, name, section_offsets, objfile)
1791      int type, desc;
1792      CORE_ADDR valu;
1793      char *name;
1794      struct section_offsets *section_offsets;
1795      struct objfile *objfile;
1796 {
1797 #ifdef SUN_FIXED_LBRAC_BUG
1798   /* If SUN_FIXED_LBRAC_BUG is defined, then it tells us whether we need
1799      to correct the address of N_LBRAC's.  If it is not defined, then
1800      we never need to correct the addresses.  */
1801 
1802   /* This records the last pc address we've seen.  We depend on there being
1803      an SLINE or FUN or SO before the first LBRAC, since the variable does
1804      not get reset in between reads of different symbol files.  */
1805   static CORE_ADDR last_pc_address;
1806 #endif
1807 
1808   register struct context_stack *new;
1809   /* This remembers the address of the start of a function.  It is used
1810      because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
1811      relative to the current function's start address.  On systems
1812      other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
1813      used to relocate these symbol types rather than SECTION_OFFSETS.  */
1814   static CORE_ADDR function_start_offset;
1815 
1816   /* If this is nonzero, we've seen a non-gcc N_OPT symbol for this source
1817      file.  Used to detect the SunPRO solaris compiler.  */
1818   static int n_opt_found;
1819 
1820   /* The stab type used for the definition of the last function.
1821      N_STSYM or N_GSYM for SunOS4 acc; N_FUN for other compilers.  */
1822   static int function_stab_type = 0;
1823 
1824   if (!block_address_function_relative)
1825     /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
1826        function start address, so just use the text offset.  */
1827     function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
1828 
1829   /* Something is wrong if we see real data before
1830      seeing a source file name.  */
1831 
1832   if (last_source_file == NULL && type != (unsigned char)N_SO)
1833     {
1834       /* Ignore any symbols which appear before an N_SO symbol.  Currently
1835 	 no one puts symbols there, but we should deal gracefully with the
1836 	 case.  A complain()t might be in order (if !IGNORE_SYMBOL (type)),
1837 	 but this should not be an error ().  */
1838       return;
1839     }
1840 
1841   switch (type)
1842     {
1843     case N_FUN:
1844     case N_FNAME:
1845 
1846       if (*name == '\000')
1847 	{
1848 	  /* This N_FUN marks the end of a function.  This closes off the
1849 	     current block.  */
1850 	  within_function = 0;
1851 	  new = pop_context ();
1852 
1853 	  /* Make a block for the local symbols within.  */
1854 	  finish_block (new->name, &local_symbols, new->old_blocks,
1855 			new->start_addr, new->start_addr + valu,
1856 			objfile);
1857 	  break;
1858 	}
1859 
1860       /* Relocate for dynamic loading */
1861       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1862       goto define_a_symbol;
1863 
1864     case N_LBRAC:
1865       /* This "symbol" just indicates the start of an inner lexical
1866 	 context within a function.  */
1867 
1868       /* Ignore extra outermost context from SunPRO cc and acc.  */
1869       if (n_opt_found && desc == 1)
1870 	break;
1871 
1872 #if defined(BLOCK_ADDRESS_ABSOLUTE)
1873       /* Relocate for dynamic loading (?).  */
1874       valu += function_start_offset;
1875 #else
1876       if (block_address_function_relative)
1877 	/* Relocate for Sun ELF acc fn-relative syms.  */
1878 	valu += function_start_offset;
1879       else
1880 	/* On most machines, the block addresses are relative to the
1881 	   N_SO, the linker did not relocate them (sigh).  */
1882 	valu += last_source_start_addr;
1883 #endif
1884 
1885 #ifdef SUN_FIXED_LBRAC_BUG
1886       if (!SUN_FIXED_LBRAC_BUG && valu < last_pc_address) {
1887 	/* Patch current LBRAC pc value to match last handy pc value */
1888  	complain (&lbrac_complaint);
1889 	valu = last_pc_address;
1890       }
1891 #endif
1892       new = push_context (desc, valu);
1893       break;
1894 
1895     case N_RBRAC:
1896       /* This "symbol" just indicates the end of an inner lexical
1897 	 context that was started with N_LBRAC.  */
1898 
1899       /* Ignore extra outermost context from SunPRO cc and acc.  */
1900       if (n_opt_found && desc == 1)
1901 	break;
1902 
1903 #if defined(BLOCK_ADDRESS_ABSOLUTE)
1904       /* Relocate for dynamic loading (?).  */
1905       valu += function_start_offset;
1906 #else
1907       if (block_address_function_relative)
1908 	/* Relocate for Sun ELF acc fn-relative syms.  */
1909 	valu += function_start_offset;
1910       else
1911 	/* On most machines, the block addresses are relative to the
1912 	   N_SO, the linker did not relocate them (sigh).  */
1913 	valu += last_source_start_addr;
1914 #endif
1915 
1916       new = pop_context();
1917       if (desc != new->depth)
1918 	complain (&lbrac_mismatch_complaint, symnum);
1919 
1920       /* Some compilers put the variable decls inside of an
1921          LBRAC/RBRAC block.  This macro should be nonzero if this
1922 	 is true.  DESC is N_DESC from the N_RBRAC symbol.
1923 	 GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
1924 	 or the GCC2_COMPILED_SYMBOL.  */
1925 #if !defined (VARIABLES_INSIDE_BLOCK)
1926 #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
1927 #endif
1928 
1929       /* Can only use new->locals as local symbols here if we're in
1930          gcc or on a machine that puts them before the lbrack.  */
1931       if (!VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1932 	local_symbols = new->locals;
1933 
1934       if (context_stack_depth
1935 	  > !VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1936 	{
1937 	  /* This is not the outermost LBRAC...RBRAC pair in the function,
1938 	     its local symbols preceded it, and are the ones just recovered
1939 	     from the context stack.  Define the block for them (but don't
1940 	     bother if the block contains no symbols.  Should we complain
1941 	     on blocks without symbols?  I can't think of any useful purpose
1942 	     for them).  */
1943 	  if (local_symbols != NULL)
1944 	    {
1945 	      /* Muzzle a compiler bug that makes end < start.  (which
1946 		 compilers?  Is this ever harmful?).  */
1947 	      if (new->start_addr > valu)
1948 		{
1949 		  complain (&lbrac_rbrac_complaint);
1950 		  new->start_addr = valu;
1951 		}
1952 	      /* Make a block for the local symbols within.  */
1953 	      finish_block (0, &local_symbols, new->old_blocks,
1954 			    new->start_addr, valu, objfile);
1955 	    }
1956 	}
1957       else
1958 	{
1959 	  /* This is the outermost LBRAC...RBRAC pair.  There is no
1960 	     need to do anything; leave the symbols that preceded it
1961 	     to be attached to the function's own block.  We need to
1962 	     indicate that we just moved outside of the function.  */
1963 	  within_function = 0;
1964 	}
1965 
1966       if (VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1967 	/* Now pop locals of block just finished.  */
1968 	local_symbols = new->locals;
1969       break;
1970 
1971     case N_FN:
1972     case N_FN_SEQ:
1973       /* This kind of symbol indicates the start of an object file.  */
1974       /* Relocate for dynamic loading */
1975       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1976       break;
1977 
1978     case N_SO:
1979       /* This type of symbol indicates the start of data
1980 	 for one source file.
1981 	 Finish the symbol table of the previous source file
1982 	 (if any) and start accumulating a new symbol table.  */
1983       /* Relocate for dynamic loading */
1984       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1985 
1986       n_opt_found = 0;
1987 
1988 #ifdef SUN_FIXED_LBRAC_BUG
1989       last_pc_address = valu;	/* Save for SunOS bug circumcision */
1990 #endif
1991 
1992 #ifdef PCC_SOL_BROKEN
1993       /* pcc bug, occasionally puts out SO for SOL.  */
1994       if (context_stack_depth > 0)
1995 	{
1996 	  start_subfile (name, NULL);
1997 	  break;
1998 	}
1999 #endif
2000       if (last_source_file)
2001 	{
2002 	  /* Check if previous symbol was also an N_SO (with some
2003 	     sanity checks).  If so, that one was actually the directory
2004 	     name, and the current one is the real file name.
2005 	     Patch things up. */
2006 	  if (previous_stab_code == (unsigned char) N_SO)
2007 	    {
2008 	      patch_subfile_names (current_subfile, name);
2009 	      break;		/* Ignore repeated SOs */
2010 	    }
2011 	  end_symtab (valu, objfile, SECT_OFF_TEXT);
2012 	  end_stabs ();
2013 	}
2014 
2015       /* Null name means this just marks the end of text for this .o file.
2016 	 Don't start a new symtab in this case.  */
2017       if (*name == '\000')
2018 	break;
2019 
2020       start_stabs ();
2021       start_symtab (name, NULL, valu);
2022       break;
2023 
2024     case N_SOL:
2025       /* This type of symbol indicates the start of data for
2026 	 a sub-source-file, one whose contents were copied or
2027 	 included in the compilation of the main source file
2028 	 (whose name was given in the N_SO symbol.)  */
2029       /* Relocate for dynamic loading */
2030       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
2031       start_subfile (name, current_subfile->dirname);
2032       break;
2033 
2034     case N_BINCL:
2035       push_subfile ();
2036       add_new_header_file (name, valu);
2037       start_subfile (name, current_subfile->dirname);
2038       break;
2039 
2040     case N_EINCL:
2041       start_subfile (pop_subfile (), current_subfile->dirname);
2042       break;
2043 
2044     case N_EXCL:
2045       add_old_header_file (name, valu);
2046       break;
2047 
2048     case N_SLINE:
2049       /* This type of "symbol" really just records
2050 	 one line-number -- core-address correspondence.
2051 	 Enter it in the line list for this symbol table.  */
2052       /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
2053       valu += function_start_offset;
2054 #ifdef SUN_FIXED_LBRAC_BUG
2055       last_pc_address = valu;	/* Save for SunOS bug circumcision */
2056 #endif
2057       record_line (current_subfile, desc, valu);
2058       break;
2059 
2060     case N_BCOMM:
2061       common_block_start (name, objfile);
2062       break;
2063 
2064     case N_ECOMM:
2065       common_block_end (objfile);
2066       break;
2067 
2068     /* The following symbol types need to have the appropriate offset added
2069        to their value; then we process symbol definitions in the name.  */
2070 
2071     case N_STSYM:		/* Static symbol in data seg */
2072     case N_LCSYM:		/* Static symbol in BSS seg */
2073     case N_ROSYM:		/* Static symbol in Read-only data seg */
2074      /* HORRID HACK DEPT.  However, it's Sun's furgin' fault.
2075 	Solaris2's stabs-in-elf makes *most* symbols relative
2076 	but leaves a few absolute (at least for Solaris 2.1 and version
2077 	2.0.1 of the SunPRO compiler).  N_STSYM and friends sit on the fence.
2078 	.stab "foo:S...",N_STSYM 	is absolute (ld relocates it)
2079 	.stab "foo:V...",N_STSYM	is relative (section base subtracted).
2080 	This leaves us no choice but to search for the 'S' or 'V'...
2081 	(or pass the whole section_offsets stuff down ONE MORE function
2082 	call level, which we really don't want to do).  */
2083       {
2084 	char *p;
2085 
2086 	/* .o files and NLMs have non-zero text seg offsets, but don't need
2087 	   their static syms offset in this fashion.  XXX - This is really a
2088 	   crock that should be fixed in the solib handling code so that I
2089 	   don't have to work around it here. */
2090 
2091 	if (!symfile_relocatable)
2092 	  {
2093 	    p = strchr (name, ':');
2094 	    if (p != 0 && p[1] == 'S')
2095 	      {
2096 		/* The linker relocated it.  We don't want to add an
2097 		   elfstab_offset_sections-type offset, but we *do* want
2098 		   to add whatever solib.c passed to symbol_file_add as
2099 		   addr (this is known to affect SunOS4, and I suspect ELF
2100 		   too).  Since elfstab_offset_sections currently does not
2101 		   muck with the text offset (there is no Ttext.text
2102 		   symbol), we can get addr from the text offset.  If
2103 		   elfstab_offset_sections ever starts dealing with the
2104 		   text offset, and we still need to do this, we need to
2105 		   invent a SECT_OFF_ADDR_KLUDGE or something.  */
2106 		valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
2107 		goto define_a_symbol;
2108 	      }
2109 	  }
2110 	/* Since it's not the kludge case, re-dispatch to the right handler. */
2111 	switch (type) {
2112 	case N_STSYM: 	goto case_N_STSYM;
2113 	case N_LCSYM:	goto case_N_LCSYM;
2114 	case N_ROSYM:	goto case_N_ROSYM;
2115 	default:	abort();
2116 	}
2117       }
2118 
2119     case_N_STSYM:		/* Static symbol in data seg */
2120     case N_DSLINE:		/* Source line number, data seg */
2121       valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
2122       goto define_a_symbol;
2123 
2124     case_N_LCSYM:		/* Static symbol in BSS seg */
2125     case N_BSLINE:		/* Source line number, bss seg */
2126     /*   N_BROWS:	overlaps with N_BSLINE */
2127       valu += ANOFFSET (section_offsets, SECT_OFF_BSS);
2128       goto define_a_symbol;
2129 
2130     case_N_ROSYM:		/* Static symbol in Read-only data seg */
2131       valu += ANOFFSET (section_offsets, SECT_OFF_RODATA);
2132       goto define_a_symbol;
2133 
2134     case N_ENTRY:		/* Alternate entry point */
2135       /* Relocate for dynamic loading */
2136       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
2137       goto define_a_symbol;
2138 
2139     /* The following symbol types we don't know how to process.  Handle
2140        them in a "default" way, but complain to people who care.  */
2141     default:
2142     case N_CATCH:		/* Exception handler catcher */
2143     case N_EHDECL:		/* Exception handler name */
2144     case N_PC:			/* Global symbol in Pascal */
2145     case N_M2C:			/* Modula-2 compilation unit */
2146     /*   N_MOD2:	overlaps with N_EHDECL */
2147     case N_SCOPE:		/* Modula-2 scope information */
2148     case N_ECOML:		/* End common (local name) */
2149     case N_NBTEXT:		/* Gould Non-Base-Register symbols??? */
2150     case N_NBDATA:
2151     case N_NBBSS:
2152     case N_NBSTS:
2153     case N_NBLCS:
2154       complain (&unknown_symtype_complaint, local_hex_string (type));
2155       /* FALLTHROUGH */
2156 
2157     /* The following symbol types don't need the address field relocated,
2158        since it is either unused, or is absolute.  */
2159     define_a_symbol:
2160     case N_GSYM:		/* Global variable */
2161     case N_NSYMS:		/* Number of symbols (ultrix) */
2162     case N_NOMAP:		/* No map?  (ultrix) */
2163     case N_RSYM:		/* Register variable */
2164     case N_DEFD:		/* Modula-2 GNU module dependency */
2165     case N_SSYM:		/* Struct or union element */
2166     case N_LSYM:		/* Local symbol in stack */
2167     case N_PSYM:		/* Parameter variable */
2168     case N_LENG:		/* Length of preceding symbol type */
2169       if (name)
2170 	{
2171 	  int deftype;
2172 	  char *colon_pos = strchr (name, ':');
2173 	  if (colon_pos == NULL)
2174 	    deftype = '\0';
2175 	  else
2176 	    deftype = colon_pos[1];
2177 
2178 	  switch (deftype)
2179 	    {
2180 	    case 'f':
2181 	    case 'F':
2182 	      function_stab_type = type;
2183 
2184 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
2185 	      /* Deal with the SunPRO 3.0 compiler which omits the address
2186                  from N_FUN symbols.  */
2187 	      if (type == N_FUN
2188 		  && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT))
2189 		{
2190 		  struct minimal_symbol *msym;
2191 		  char *p;
2192 		  int n;
2193 
2194 		  p = strchr (name, ':');
2195 		  if (p == NULL)
2196 		    p = name;
2197 		  n = p - name;
2198 		  p = alloca (n + 1);
2199 		  strncpy (p, name, n);
2200 		  p[n] = 0;
2201 
2202 		  msym = lookup_minimal_symbol (p, last_source_file,
2203 						objfile);
2204 		  if (msym)
2205 		    valu = SYMBOL_VALUE_ADDRESS (msym);
2206 		}
2207 #endif
2208 
2209 #ifdef SUN_FIXED_LBRAC_BUG
2210 	      /* The Sun acc compiler, under SunOS4, puts out
2211 		 functions with N_GSYM or N_STSYM.  The problem is
2212 		 that the address of the symbol is no good (for N_GSYM
2213 		 it doesn't even attept an address; for N_STSYM it
2214 		 puts out an address but then it gets relocated
2215 		 relative to the data segment, not the text segment).
2216 		 Currently we can't fix this up later as we do for
2217 		 some types of symbol in scan_file_globals.
2218 		 Fortunately we do have a way of finding the address -
2219 		 we know that the value in last_pc_address is either
2220 		 the one we want (if we're dealing with the first
2221 		 function in an object file), or somewhere in the
2222 		 previous function. This means that we can use the
2223 		 minimal symbol table to get the address.  */
2224 
2225 	      /* Starting with release 3.0, the Sun acc compiler,
2226 		 under SunOS4, puts out functions with N_FUN and a value
2227 		 of zero. This gets relocated to the start of the text
2228 		 segment of the module, which is no good either.
2229 		 Under SunOS4 we can deal with this as N_SLINE and N_SO
2230 		 entries contain valid absolute addresses.
2231 		 Release 3.0 acc also puts out N_OPT entries, which makes
2232 		 it possible to discern acc from cc or gcc.  */
2233 
2234 	      if (type == N_GSYM || type == N_STSYM
2235 		  || (type == N_FUN
2236 		      && n_opt_found && !block_address_function_relative))
2237 		{
2238 		  struct minimal_symbol *m;
2239 		  int l = colon_pos - name;
2240 
2241 		  m = lookup_minimal_symbol_by_pc (last_pc_address);
2242 		  if (m && STREQN (SYMBOL_NAME (m), name, l)
2243 		      && SYMBOL_NAME (m) [l] == '\0')
2244 		    /* last_pc_address was in this function */
2245 		    valu = SYMBOL_VALUE (m);
2246 		  else if (m && SYMBOL_NAME (m+1)
2247 			   && STREQN (SYMBOL_NAME (m+1), name, l)
2248 			   && SYMBOL_NAME (m+1) [l] == '\0')
2249 		    /* last_pc_address was in last function */
2250 		    valu = SYMBOL_VALUE (m+1);
2251 		  else
2252 		    /* Not found - use last_pc_address (for finish_block) */
2253 		    valu = last_pc_address;
2254 		}
2255 
2256 	      last_pc_address = valu;	/* Save for SunOS bug circumcision */
2257 #endif
2258 
2259 	      if (block_address_function_relative)
2260 		/* For Solaris 2.0 compilers, the block addresses and
2261 		   N_SLINE's are relative to the start of the
2262 		   function.  On normal systems, and when using gcc on
2263 		   Solaris 2.0, these addresses are just absolute, or
2264 		   relative to the N_SO, depending on
2265 		   BLOCK_ADDRESS_ABSOLUTE.  */
2266 		function_start_offset = valu;
2267 
2268 	      within_function = 1;
2269 	      if (context_stack_depth > 0)
2270 		{
2271 		  new = pop_context ();
2272 		  /* Make a block for the local symbols within.  */
2273 		  finish_block (new->name, &local_symbols, new->old_blocks,
2274 				new->start_addr, valu, objfile);
2275 		}
2276 	      /* Stack must be empty now.  */
2277 	      if (context_stack_depth != 0)
2278 		complain (&lbrac_unmatched_complaint, symnum);
2279 
2280 	      new = push_context (0, valu);
2281 	      new->name = define_symbol (valu, name, desc, type, objfile);
2282 	      break;
2283 
2284 	    default:
2285 	      define_symbol (valu, name, desc, type, objfile);
2286 	      break;
2287 	    }
2288 	}
2289       break;
2290 
2291     /* We use N_OPT to carry the gcc2_compiled flag.  Sun uses it
2292        for a bunch of other flags, too.  Someday we may parse their
2293        flags; for now we ignore theirs and hope they'll ignore ours.  */
2294     case N_OPT:			/* Solaris 2:  Compiler options */
2295       if (name)
2296 	{
2297 	  if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
2298 	    {
2299 	      processing_gcc_compilation = 2;
2300 #if 1	      /* Works, but is experimental.  -fnf */
2301 	      if (AUTO_DEMANGLING)
2302 		{
2303 		  set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
2304 		}
2305 #endif
2306 	    }
2307 	  else
2308 	    n_opt_found = 1;
2309 	}
2310       break;
2311 
2312     /* The following symbol types can be ignored.  */
2313     case N_OBJ:			/* Solaris 2:  Object file dir and name */
2314     /*   N_UNDF: 		   Solaris 2:  file separator mark */
2315     /*   N_UNDF: -- we will never encounter it, since we only process one
2316 		    file's symbols at once.  */
2317     case N_ENDM:		/* Solaris 2:  End of module */
2318     case N_MAIN:		/* Name of main routine.  */
2319       break;
2320     }
2321 
2322   previous_stab_code = type;
2323 }
2324 
2325 /* FIXME: The only difference between this and elfstab_build_psymtabs
2326    is the call to install_minimal_symbols for elf, and the support for
2327    split sections.  If the differences are really that small, the code
2328    should be shared.  */
2329 
2330 /* Scan and build partial symbols for an coff symbol file.
2331    The coff file has already been processed to get its minimal symbols.
2332 
2333    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2334    rolled into one.
2335 
2336    OBJFILE is the object file we are reading symbols from.
2337    ADDR is the address relative to which the symbols are (e.g.
2338    the base address of the text segment).
2339    MAINLINE is true if we are reading the main symbol
2340    table (as opposed to a shared lib or dynamically loaded file).
2341    TEXTADDR is the address of the text section.
2342    TEXTSIZE is the size of the text section.
2343    STABSECTS is the list of .stab sections in OBJFILE.
2344    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2345    .stabstr section exists.
2346 
2347    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2348    adjusted for coff details. */
2349 
2350 void
2351 coffstab_build_psymtabs (objfile, section_offsets, mainline,
2352 			       textaddr, textsize, stabsects,
2353 			       stabstroffset, stabstrsize)
2354       struct objfile *objfile;
2355       struct section_offsets *section_offsets;
2356       int mainline;
2357       CORE_ADDR textaddr;
2358       unsigned int textsize;
2359       struct stab_section_list *stabsects;
2360       file_ptr stabstroffset;
2361       unsigned int stabstrsize;
2362 {
2363   int val;
2364   bfd *sym_bfd = objfile->obfd;
2365   char *name = bfd_get_filename (sym_bfd);
2366   struct dbx_symfile_info *info;
2367   unsigned int stabsize;
2368 
2369   /* There is already a dbx_symfile_info allocated by our caller.
2370      It might even contain some info from the coff symtab to help us.  */
2371   info = (struct dbx_symfile_info *) objfile->sym_stab_info;
2372 
2373   DBX_TEXT_ADDR (objfile) = textaddr;
2374   DBX_TEXT_SIZE (objfile) = textsize;
2375 
2376 #define	COFF_STABS_SYMBOL_SIZE	12	/* XXX FIXME XXX */
2377   DBX_SYMBOL_SIZE    (objfile) = COFF_STABS_SYMBOL_SIZE;
2378   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2379 
2380   if (stabstrsize > bfd_get_size (sym_bfd))
2381     error ("ridiculous string table size: %d bytes", stabstrsize);
2382   DBX_STRINGTAB (objfile) = (char *)
2383     obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
2384   OBJSTAT (objfile, sz_strtab += stabstrsize+1);
2385 
2386   /* Now read in the string table in one big gulp.  */
2387 
2388   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
2389   if (val < 0)
2390     perror_with_name (name);
2391   val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2392   if (val != stabstrsize)
2393     perror_with_name (name);
2394 
2395   stabsread_new_init ();
2396   buildsym_new_init ();
2397   free_header_files ();
2398   init_header_files ();
2399 
2400   processing_acc_compilation = 1;
2401 
2402   /* In a coff file, we've already installed the minimal symbols that came
2403      from the coff (non-stab) symbol table, so always act like an
2404      incremental load here. */
2405   if (stabsects->next == NULL)
2406     {
2407       stabsize = bfd_section_size (sym_bfd, stabsects->section);
2408       DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2409       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
2410     }
2411   else
2412     {
2413       struct stab_section_list *stabsect;
2414 
2415       DBX_SYMCOUNT (objfile) = 0;
2416       for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next)
2417 	{
2418 	  stabsize = bfd_section_size (sym_bfd, stabsect->section);
2419 	  DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile);
2420 	}
2421 
2422       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
2423 
2424       symbuf_sections = stabsects->next;
2425       symbuf_left = bfd_section_size (sym_bfd, stabsects->section);
2426       symbuf_read = 0;
2427     }
2428 
2429   dbx_symfile_read (objfile, section_offsets, 0);
2430 }
2431 
2432 /* Scan and build partial symbols for an ELF symbol file.
2433    This ELF file has already been processed to get its minimal symbols,
2434    and any DWARF symbols that were in it.
2435 
2436    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2437    rolled into one.
2438 
2439    OBJFILE is the object file we are reading symbols from.
2440    ADDR is the address relative to which the symbols are (e.g.
2441    the base address of the text segment).
2442    MAINLINE is true if we are reading the main symbol
2443    table (as opposed to a shared lib or dynamically loaded file).
2444    STABOFFSET and STABSIZE define the location in OBJFILE where the .stab
2445    section exists.
2446    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2447    .stabstr section exists.
2448 
2449    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2450    adjusted for elf details. */
2451 
2452 void
2453 elfstab_build_psymtabs (objfile, section_offsets, mainline,
2454 			       staboffset, stabsize,
2455 			       stabstroffset, stabstrsize)
2456       struct objfile *objfile;
2457       struct section_offsets *section_offsets;
2458       int mainline;
2459       file_ptr staboffset;
2460       unsigned int stabsize;
2461       file_ptr stabstroffset;
2462       unsigned int stabstrsize;
2463 {
2464   int val;
2465   bfd *sym_bfd = objfile->obfd;
2466   char *name = bfd_get_filename (sym_bfd);
2467   struct dbx_symfile_info *info;
2468   asection *text_sect;
2469 
2470   /* There is already a dbx_symfile_info allocated by our caller.
2471      It might even contain some info from the ELF symtab to help us.  */
2472   info = (struct dbx_symfile_info *) objfile->sym_stab_info;
2473 
2474   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
2475   if (!text_sect)
2476     error ("Can't find .text section in symbol file");
2477   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
2478   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
2479 
2480 #define	ELF_STABS_SYMBOL_SIZE	12	/* XXX FIXME XXX */
2481   DBX_SYMBOL_SIZE    (objfile) = ELF_STABS_SYMBOL_SIZE;
2482   DBX_SYMCOUNT       (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2483   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2484   DBX_SYMTAB_OFFSET  (objfile) = staboffset;
2485 
2486   if (stabstrsize > bfd_get_size (sym_bfd))
2487     error ("ridiculous string table size: %d bytes", stabstrsize);
2488   DBX_STRINGTAB (objfile) = (char *)
2489     obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
2490   OBJSTAT (objfile, sz_strtab += stabstrsize+1);
2491 
2492   /* Now read in the string table in one big gulp.  */
2493 
2494   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
2495   if (val < 0)
2496     perror_with_name (name);
2497   val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2498   if (val != stabstrsize)
2499     perror_with_name (name);
2500 
2501   stabsread_new_init ();
2502   buildsym_new_init ();
2503   free_header_files ();
2504   init_header_files ();
2505   install_minimal_symbols (objfile);
2506 
2507   processing_acc_compilation = 1;
2508 
2509   /* In an elf file, we've already installed the minimal symbols that came
2510      from the elf (non-stab) symbol table, so always act like an
2511      incremental load here. */
2512   dbx_symfile_read (objfile, section_offsets, 0);
2513 }
2514 
2515 /* Scan and build partial symbols for a file with special sections for stabs
2516    and stabstrings.  The file has already been processed to get its minimal
2517    symbols, and any other symbols that might be necessary to resolve GSYMs.
2518 
2519    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2520    rolled into one.
2521 
2522    OBJFILE is the object file we are reading symbols from.
2523    ADDR is the address relative to which the symbols are (e.g. the base address
2524 	of the text segment).
2525    MAINLINE is true if we are reading the main symbol table (as opposed to a
2526 	    shared lib or dynamically loaded file).
2527    STAB_NAME is the name of the section that contains the stabs.
2528    STABSTR_NAME is the name of the section that contains the stab strings.
2529 
2530    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
2531 
2532 void
2533 stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
2534 			 stabstr_name, text_name)
2535      struct objfile *objfile;
2536      struct section_offsets *section_offsets;
2537      int mainline;
2538      char *stab_name;
2539      char *stabstr_name;
2540      char *text_name;
2541 {
2542   int val;
2543   bfd *sym_bfd = objfile->obfd;
2544   char *name = bfd_get_filename (sym_bfd);
2545   asection *stabsect;
2546   asection *stabstrsect;
2547   asection *text_sect;
2548 
2549   stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
2550   stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
2551 
2552   if (!stabsect)
2553     return;
2554 
2555   if (!stabstrsect)
2556     error ("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)",
2557 	   stab_name, stabstr_name);
2558 
2559   objfile->sym_stab_info = (PTR) xmalloc (sizeof (struct dbx_symfile_info));
2560   memset (DBX_SYMFILE_INFO (objfile), 0, sizeof (struct dbx_symfile_info));
2561 
2562   text_sect = bfd_get_section_by_name (sym_bfd, text_name);
2563   if (!text_sect)
2564     error ("Can't find %s section in symbol file", text_name);
2565   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
2566   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
2567 
2568   DBX_SYMBOL_SIZE    (objfile) = sizeof (struct external_nlist);
2569   DBX_SYMCOUNT       (objfile) = bfd_section_size (sym_bfd, stabsect)
2570     / DBX_SYMBOL_SIZE (objfile);
2571   DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect);
2572   DBX_SYMTAB_OFFSET  (objfile) = stabsect->filepos; /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
2573 
2574   if (DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
2575     error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
2576   DBX_STRINGTAB (objfile) = (char *)
2577     obstack_alloc (&objfile->psymbol_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
2578   OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile) + 1);
2579 
2580   /* Now read in the string table in one big gulp.  */
2581 
2582   val = bfd_get_section_contents (sym_bfd, /* bfd */
2583 				  stabstrsect, /* bfd section */
2584 				  DBX_STRINGTAB (objfile), /* input buffer */
2585 				  0, /* offset into section */
2586 				  DBX_STRINGTAB_SIZE (objfile)); /* amount to read */
2587 
2588   if (!val)
2589     perror_with_name (name);
2590 
2591   stabsread_new_init ();
2592   buildsym_new_init ();
2593   free_header_files ();
2594   init_header_files ();
2595   install_minimal_symbols (objfile);
2596 
2597   /* Now, do an incremental load */
2598 
2599   processing_acc_compilation = 1;
2600   dbx_symfile_read (objfile, section_offsets, 0);
2601 }
2602 
2603 static struct sym_fns aout_sym_fns =
2604 {
2605   bfd_target_aout_flavour,
2606   dbx_new_init,		/* sym_new_init: init anything gbl to entire symtab */
2607   dbx_symfile_init,	/* sym_init: read initial info, setup for sym_read() */
2608   dbx_symfile_read,	/* sym_read: read a symbol file into symtab */
2609   dbx_symfile_finish,	/* sym_finish: finished with file, cleanup */
2610   default_symfile_offsets,
2611 			/* sym_offsets: parse user's offsets to internal form */
2612   NULL			/* next: pointer to next struct sym_fns */
2613 };
2614 
2615 void
2616 _initialize_dbxread ()
2617 {
2618   add_symtab_fns(&aout_sym_fns);
2619 }
2620