]> Git Repo - binutils.git/blob - gdb/os9kread.c
Zap files in gdb/gdbserver/
[binutils.git] / gdb / os9kread.c
1 /* Read os9/os9k symbol tables and convert to internal format, for GDB.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3    1996, 1997, 1998, 1999, 2000, 2001
4    Free Software Foundation, Inc.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22
23 /* This module provides three functions: os9k_symfile_init,
24    which initializes to read a symbol file; os9k_new_init, which 
25    discards existing cached information when all symbols are being
26    discarded; and os9k_symfile_read, which reads a symbol table
27    from a file.
28
29    os9k_symfile_read only does the minimum work necessary for letting the
30    user "name" things symbolically; it does not read the entire symtab.
31    Instead, it reads the external and static symbols and puts them in partial
32    symbol tables.  When more extensive information is requested of a
33    file, the corresponding partial symbol table is mutated into a full
34    fledged symbol table by going back and reading the symbols
35    for real.  os9k_psymtab_to_symtab() is the function that does this */
36
37 #include "defs.h"
38 #include "gdb_string.h"
39 #include "gdb_assert.h"
40 #include <stdio.h>
41
42 #if defined(USG) || defined(__CYGNUSCLIB__)
43 #include <sys/types.h>
44 #include <fcntl.h>
45 #endif
46
47 #include "obstack.h"
48 #include "gdb_stat.h"
49 #include "symtab.h"
50 #include "breakpoint.h"
51 #include "command.h"
52 #include "target.h"
53 #include "gdbcore.h"            /* for bfd stuff */
54 #include "libaout.h"            /* FIXME Secret internal BFD stuff for a.out */
55 #include "symfile.h"
56 #include "objfiles.h"
57 #include "buildsym.h"
58 #include "gdb-stabs.h"
59 #include "demangle.h"
60 #include "language.h"           /* Needed inside partial-stab.h */
61 #include "complaints.h"
62 #include "os9k.h"
63 #include "stabsread.h"
64
65 extern void _initialize_os9kread (void);
66
67 /* Each partial symbol table entry contains a pointer to private data for the
68    read_symtab() function to use when expanding a partial symbol table entry
69    to a full symbol table entry.
70
71    For dbxread this structure contains the offset within the file symbol table
72    of first local symbol for this file, and count of the section
73    of the symbol table devoted to this file's symbols (actually, the section
74    bracketed may contain more than just this file's symbols).  It also contains
75    further information needed to locate the symbols if they are in an ELF file.
76
77    If ldsymcnt is 0, the only reason for this thing's existence is the
78    dependency list.  Nothing else will happen when it is read in.  */
79
80 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
81 #define LDSYMCNT(p) (((struct symloc *)((p)->read_symtab_private))->ldsymnum)
82
83 struct symloc
84   {
85     int ldsymoff;
86     int ldsymnum;
87   };
88
89 /* Remember what we deduced to be the source language of this psymtab. */
90 static enum language psymtab_language = language_unknown;
91
92 /* keep partial symbol table file nested depth */
93 static int psymfile_depth = 0;
94
95 /* keep symbol table file nested depth */
96 static int symfile_depth = 0;
97
98 extern int previous_stab_code;
99
100 /* Name of last function encountered.  Used in Solaris to approximate
101    object file boundaries.  */
102 static char *last_function_name;
103
104 /* Complaints about the symbols we have encountered.  */
105 extern struct complaint lbrac_complaint;
106
107 extern struct complaint unknown_symtype_complaint;
108
109 extern struct complaint unknown_symchar_complaint;
110
111 extern struct complaint lbrac_rbrac_complaint;
112
113 extern struct complaint repeated_header_complaint;
114
115 extern struct complaint repeated_header_name_complaint;
116
117 #if 0
118 static struct complaint lbrac_unmatched_complaint =
119 {"unmatched Increment Block Entry before symtab pos %d", 0, 0};
120
121 static struct complaint lbrac_mismatch_complaint =
122 {"IBE/IDE symbol mismatch at symtab pos %d", 0, 0};
123 #endif
124 \f
125 /* Local function prototypes */
126
127 static void read_minimal_symbols (struct objfile *);
128
129 static void os9k_read_ofile_symtab (struct partial_symtab *);
130
131 static void os9k_psymtab_to_symtab (struct partial_symtab *);
132
133 static void os9k_psymtab_to_symtab_1 (struct partial_symtab *);
134
135 static void read_os9k_psymtab (struct objfile *, CORE_ADDR, int);
136
137 static int fill_sym (FILE *, bfd *);
138
139 static void os9k_symfile_init (struct objfile *);
140
141 static void os9k_new_init (struct objfile *);
142
143 static void os9k_symfile_read (struct objfile *, int);
144
145 static void os9k_symfile_finish (struct objfile *);
146
147 static void
148 os9k_process_one_symbol (int, int, CORE_ADDR, char *,
149                          struct section_offsets *, struct objfile *);
150
151 static struct partial_symtab *os9k_start_psymtab (struct objfile *, char *,
152                                                   CORE_ADDR, int, int,
153                                                   struct partial_symbol **,
154                                                   struct partial_symbol **);
155
156 static struct partial_symtab *os9k_end_psymtab (struct partial_symtab *,
157                                                 char **, int, int, CORE_ADDR,
158                                                 struct partial_symtab **,
159                                                 int);
160
161 static void record_minimal_symbol (char *, CORE_ADDR, int, struct objfile *);
162 \f
163 #define HANDLE_RBRAC(val) \
164   if ((val) > pst->texthigh) pst->texthigh = (val);
165
166 #define SWAP_STBHDR(hdrp, abfd) \
167   { \
168     (hdrp)->fmtno = bfd_get_16(abfd, (unsigned char *)&(hdrp)->fmtno); \
169     (hdrp)->crc = bfd_get_32(abfd, (unsigned char *)&(hdrp)->crc); \
170     (hdrp)->offset = bfd_get_32(abfd, (unsigned char *)&(hdrp)->offset); \
171     (hdrp)->nsym = bfd_get_32(abfd, (unsigned char *)&(hdrp)->nsym); \
172   }
173 #define SWAP_STBSYM(symp, abfd) \
174   { \
175     (symp)->value = bfd_get_32(abfd, (unsigned char *)&(symp)->value); \
176     (symp)->type = bfd_get_16(abfd, (unsigned char *)&(symp)->type); \
177     (symp)->stroff = bfd_get_32(abfd, (unsigned char *)&(symp)->stroff); \
178   }
179 #define N_DATA 0
180 #define N_BSS 1
181 #define N_RDATA 2
182 #define N_IDATA 3
183 #define N_TEXT 4
184 #define N_ABS 6
185
186 static void
187 record_minimal_symbol (char *name, CORE_ADDR address, int type,
188                        struct objfile *objfile)
189 {
190   enum minimal_symbol_type ms_type;
191
192   switch (type)
193     {
194     case N_TEXT:
195       ms_type = mst_text;
196       address += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
197       break;
198     case N_DATA:
199       ms_type = mst_data;
200       break;
201     case N_BSS:
202       ms_type = mst_bss;
203       break;
204     case N_RDATA:
205       ms_type = mst_bss;
206       break;
207     case N_IDATA:
208       ms_type = mst_data;
209       break;
210     case N_ABS:
211       ms_type = mst_abs;
212       break;
213     default:
214       ms_type = mst_unknown;
215       break;
216     }
217
218   prim_record_minimal_symbol (name, address, ms_type, objfile);
219 }
220
221 /* read and process .stb file and store in minimal symbol table */
222 typedef char mhhdr[80];
223 struct stbhdr
224   {
225     mhhdr comhdr;
226     char *name;
227     short fmtno;
228     int crc;
229     int offset;
230     int nsym;
231     char *pad;
232   };
233 struct stbsymbol
234   {
235     int value;
236     short type;
237     int stroff;
238   };
239 #define STBSYMSIZE 10
240
241 static void
242 read_minimal_symbols (struct objfile *objfile)
243 {
244   FILE *fp;
245   bfd *abfd;
246   struct stbhdr hdr;
247   struct stbsymbol sym;
248   int ch, i, j, off;
249   char buf[64], buf1[128];
250
251   fp = objfile->auxf1;
252   if (fp == NULL)
253     return;
254   abfd = objfile->obfd;
255   fread (&hdr.comhdr[0], sizeof (mhhdr), 1, fp);
256   i = 0;
257   ch = getc (fp);
258   while (ch != -1)
259     {
260       buf[i] = (char) ch;
261       i++;
262       if (ch == 0)
263         break;
264       ch = getc (fp);
265     };
266   if (i % 2)
267     ch = getc (fp);
268   hdr.name = &buf[0];
269
270   fread (&hdr.fmtno, sizeof (hdr.fmtno), 1, fp);
271   fread (&hdr.crc, sizeof (hdr.crc), 1, fp);
272   fread (&hdr.offset, sizeof (hdr.offset), 1, fp);
273   fread (&hdr.nsym, sizeof (hdr.nsym), 1, fp);
274   SWAP_STBHDR (&hdr, abfd);
275
276   /* read symbols */
277   init_minimal_symbol_collection ();
278   off = hdr.offset;
279   for (i = hdr.nsym; i > 0; i--)
280     {
281       fseek (fp, (long) off, 0);
282       fread (&sym.value, sizeof (sym.value), 1, fp);
283       fread (&sym.type, sizeof (sym.type), 1, fp);
284       fread (&sym.stroff, sizeof (sym.stroff), 1, fp);
285       SWAP_STBSYM (&sym, abfd);
286       fseek (fp, (long) sym.stroff, 0);
287       j = 0;
288       ch = getc (fp);
289       while (ch != -1)
290         {
291           buf1[j] = (char) ch;
292           j++;
293           if (ch == 0)
294             break;
295           ch = getc (fp);
296         };
297       record_minimal_symbol (buf1, sym.value, sym.type & 7, objfile);
298       off += STBSYMSIZE;
299     };
300   install_minimal_symbols (objfile);
301   return;
302 }
303 \f
304 /* Scan and build partial symbols for a symbol file.
305    We have been initialized by a call to os9k_symfile_init, which 
306    put all the relevant info into a "struct os9k_symfile_info",
307    hung off the objfile structure.
308
309    MAINLINE is true if we are reading the main symbol
310    table (as opposed to a shared lib or dynamically loaded file).  */
311
312 static void
313 os9k_symfile_read (struct objfile *objfile, int mainline)
314 {
315   bfd *sym_bfd;
316   struct cleanup *back_to;
317
318   sym_bfd = objfile->obfd;
319   /* If we are reinitializing, or if we have never loaded syms yet, init */
320   if (mainline
321       || (objfile->global_psymbols.size == 0
322           && objfile->static_psymbols.size == 0))
323     init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
324
325   free_pending_blocks ();
326   back_to = make_cleanup (really_free_pendings, 0);
327
328   make_cleanup_discard_minimal_symbols ();
329   read_minimal_symbols (objfile);
330
331   /* Now that the symbol table data of the executable file are all in core,
332      process them and define symbols accordingly.  */
333   read_os9k_psymtab (objfile,
334                      DBX_TEXT_ADDR (objfile),
335                      DBX_TEXT_SIZE (objfile));
336
337   do_cleanups (back_to);
338 }
339
340 /* Initialize anything that needs initializing when a completely new
341    symbol file is specified (not just adding some symbols from another
342    file, e.g. a shared library).  */
343
344 static void
345 os9k_new_init (struct objfile *ignore)
346 {
347   stabsread_new_init ();
348   buildsym_new_init ();
349   psymfile_depth = 0;
350 /*
351    init_header_files ();
352  */
353 }
354
355 /* os9k_symfile_init ()
356    It is passed a struct objfile which contains, among other things,
357    the BFD for the file whose symbols are being read, and a slot for a pointer
358    to "private data" which we fill with goodies.
359
360    Since BFD doesn't know how to read debug symbols in a format-independent
361    way (and may never do so...), we have to do it ourselves.  We will never
362    be called unless this is an a.out (or very similar) file. 
363    FIXME, there should be a cleaner peephole into the BFD environment here.  */
364
365 static void
366 os9k_symfile_init (struct objfile *objfile)
367 {
368   bfd *sym_bfd = objfile->obfd;
369   char *name = bfd_get_filename (sym_bfd);
370   char dbgname[512], stbname[512];
371   FILE *symfile = 0;
372   FILE *minfile = 0;
373   asection *text_sect;
374
375   strcpy (dbgname, name);
376   strcat (dbgname, ".dbg");
377   strcpy (stbname, name);
378   strcat (stbname, ".stb");
379
380   if ((symfile = fopen (dbgname, "r")) == NULL)
381     {
382       warning ("Symbol file %s not found", dbgname);
383     }
384   objfile->auxf2 = symfile;
385
386   if ((minfile = fopen (stbname, "r")) == NULL)
387     {
388       warning ("Symbol file %s not found", stbname);
389     }
390   objfile->auxf1 = minfile;
391
392   /* Allocate struct to keep track of the symfile */
393   objfile->sym_stab_info = (struct dbx_symfile_info *)
394     xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
395   DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
396
397   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
398   if (!text_sect)
399     error ("Can't find .text section in file");
400   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
401   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
402
403   DBX_SYMBOL_SIZE (objfile) = 0;        /* variable size symbol */
404   DBX_SYMCOUNT (objfile) = 0;   /* used to be bfd_get_symcount(sym_bfd) */
405   DBX_SYMTAB_OFFSET (objfile) = 0;      /* used to be SYMBOL_TABLE_OFFSET */
406 }
407
408 /* Perform any local cleanups required when we are done with a particular
409    objfile.  I.E, we are in the process of discarding all symbol information
410    for an objfile, freeing up all memory held for it, and unlinking the
411    objfile struct from the global list of known objfiles. */
412
413 static void
414 os9k_symfile_finish (struct objfile *objfile)
415 {
416   if (objfile->sym_stab_info != NULL)
417     {
418       mfree (objfile->md, objfile->sym_stab_info);
419     }
420 /*
421    free_header_files ();
422  */
423 }
424 \f
425
426 struct st_dbghdr
427 {
428   int sync;
429   short rev;
430   int crc;
431   short os;
432   short cpu;
433 };
434 #define SYNC            (int)0xefbefeca
435
436 #define SWAP_DBGHDR(hdrp, abfd) \
437   { \
438     (hdrp)->sync = bfd_get_32(abfd, (unsigned char *)&(hdrp)->sync); \
439     (hdrp)->rev = bfd_get_16(abfd, (unsigned char *)&(hdrp)->rev); \
440     (hdrp)->crc = bfd_get_32(abfd, (unsigned char *)&(hdrp)->crc); \
441     (hdrp)->os = bfd_get_16(abfd, (unsigned char *)&(hdrp)->os); \
442     (hdrp)->cpu = bfd_get_16(abfd, (unsigned char *)&(hdrp)->cpu); \
443   }
444
445 #define N_SYM_CMPLR     0
446 #define N_SYM_SLINE     1
447 #define N_SYM_SYM       2
448 #define N_SYM_LBRAC     3
449 #define N_SYM_RBRAC     4
450 #define N_SYM_SE        5
451
452 struct internal_symstruct
453   {
454     short n_type;
455     short n_desc;
456     long n_value;
457     char *n_strx;
458   };
459 static struct internal_symstruct symbol;
460 static struct internal_symstruct *symbuf = &symbol;
461 static char strbuf[4096];
462 static struct st_dbghdr dbghdr;
463 static short cmplrid;
464
465 #define VER_PRE_ULTRAC  ((short)4)
466 #define VER_ULTRAC      ((short)5)
467
468 static int
469 fill_sym (FILE *dbg_file, bfd *abfd)
470 {
471   short si, nmask;
472   long li;
473   int ii;
474   char *p;
475
476   int nbytes = fread (&si, sizeof (si), 1, dbg_file);
477   if (nbytes == 0)
478     return 0;
479   if (nbytes < 0)
480     perror_with_name ("reading .dbg file.");
481   symbuf->n_desc = 0;
482   symbuf->n_value = 0;
483   symbuf->n_strx = NULL;
484   symbuf->n_type = bfd_get_16 (abfd, (unsigned char *) &si);
485   symbuf->n_type = 0xf & symbuf->n_type;
486   switch (symbuf->n_type)
487     {
488     case N_SYM_CMPLR:
489       fread (&si, sizeof (si), 1, dbg_file);
490       symbuf->n_desc = bfd_get_16 (abfd, (unsigned char *) &si);
491       cmplrid = symbuf->n_desc & 0xff;
492       break;
493     case N_SYM_SLINE:
494       fread (&li, sizeof (li), 1, dbg_file);
495       symbuf->n_value = bfd_get_32 (abfd, (unsigned char *) &li);
496       fread (&li, sizeof (li), 1, dbg_file);
497       li = bfd_get_32 (abfd, (unsigned char *) &li);
498       symbuf->n_strx = (char *) (li >> 12);
499       symbuf->n_desc = li & 0xfff;
500       break;
501     case N_SYM_SYM:
502       fread (&li, sizeof (li), 1, dbg_file);
503       symbuf->n_value = bfd_get_32 (abfd, (unsigned char *) &li);
504       si = 0;
505       do
506         {
507           ii = getc (dbg_file);
508           strbuf[si++] = (char) ii;
509         }
510       while (ii != 0 || si % 2 != 0);
511       symbuf->n_strx = strbuf;
512       p = (char *) strchr (strbuf, ':');
513       if (!p)
514         break;
515       if ((p[1] == 'F' || p[1] == 'f') && cmplrid == VER_PRE_ULTRAC)
516         {
517           fread (&si, sizeof (si), 1, dbg_file);
518           nmask = bfd_get_16 (abfd, (unsigned char *) &si);
519           for (ii = 0; ii < nmask; ii++)
520             fread (&si, sizeof (si), 1, dbg_file);
521         }
522       break;
523     case N_SYM_LBRAC:
524       fread (&li, sizeof (li), 1, dbg_file);
525       symbuf->n_value = bfd_get_32 (abfd, (unsigned char *) &li);
526       break;
527     case N_SYM_RBRAC:
528       fread (&li, sizeof (li), 1, dbg_file);
529       symbuf->n_value = bfd_get_32 (abfd, (unsigned char *) &li);
530       break;
531     case N_SYM_SE:
532       break;
533     }
534   return 1;
535 }
536 \f
537 /* Given pointers to an a.out symbol table in core containing dbx
538    style data, setup partial_symtab's describing each source file for
539    which debugging information is available.
540    SYMFILE_NAME is the name of the file we are reading from. */
541
542 static void
543 read_os9k_psymtab (struct objfile *objfile, CORE_ADDR text_addr, int text_size)
544 {
545   register struct internal_symstruct *bufp = 0;         /* =0 avoids gcc -Wall glitch */
546   register char *namestring;
547   int past_first_source_file = 0;
548   CORE_ADDR last_o_file_start = 0;
549 #if 0
550   struct cleanup *back_to;
551 #endif
552   bfd *abfd;
553   FILE *fp;
554
555   /* End of the text segment of the executable file.  */
556   static CORE_ADDR end_of_text_addr;
557
558   /* Current partial symtab */
559   static struct partial_symtab *pst = 0;
560
561   /* List of current psymtab's include files */
562   char **psymtab_include_list;
563   int includes_allocated;
564   int includes_used;
565
566   /* Index within current psymtab dependency list */
567   struct partial_symtab **dependency_list;
568   int dependencies_used, dependencies_allocated;
569
570   includes_allocated = 30;
571   includes_used = 0;
572   psymtab_include_list = (char **) alloca (includes_allocated *
573                                            sizeof (char *));
574
575   dependencies_allocated = 30;
576   dependencies_used = 0;
577   dependency_list =
578     (struct partial_symtab **) alloca (dependencies_allocated *
579                                        sizeof (struct partial_symtab *));
580
581   last_source_file = NULL;
582
583 #ifdef END_OF_TEXT_DEFAULT
584   end_of_text_addr = END_OF_TEXT_DEFAULT;
585 #else
586   end_of_text_addr = text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))
587     + text_size;                /* Relocate */
588 #endif
589
590   abfd = objfile->obfd;
591   fp = objfile->auxf2;
592   if (!fp)
593     return;
594
595   fread (&dbghdr.sync, sizeof (dbghdr.sync), 1, fp);
596   fread (&dbghdr.rev, sizeof (dbghdr.rev), 1, fp);
597   fread (&dbghdr.crc, sizeof (dbghdr.crc), 1, fp);
598   fread (&dbghdr.os, sizeof (dbghdr.os), 1, fp);
599   fread (&dbghdr.cpu, sizeof (dbghdr.cpu), 1, fp);
600   SWAP_DBGHDR (&dbghdr, abfd);
601
602   symnum = 0;
603   while (1)
604     {
605       int ret;
606       long cursymoffset;
607
608       /* Get the symbol for this run and pull out some info */
609       QUIT;                     /* allow this to be interruptable */
610       cursymoffset = ftell (objfile->auxf2);
611       ret = fill_sym (objfile->auxf2, abfd);
612       if (ret <= 0)
613         break;
614       else
615         symnum++;
616       bufp = symbuf;
617
618       /* Special case to speed up readin. */
619       if (bufp->n_type == (short) N_SYM_SLINE)
620         continue;
621
622 #define CUR_SYMBOL_VALUE bufp->n_value
623       /* partial-stab.h */
624
625       switch (bufp->n_type)
626         {
627           char *p;
628
629         case N_SYM_CMPLR:
630           continue;
631
632         case N_SYM_SE:
633           CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
634           if (psymfile_depth == 1 && pst)
635             {
636               os9k_end_psymtab (pst, psymtab_include_list, includes_used,
637                                 symnum, CUR_SYMBOL_VALUE,
638                                 dependency_list, dependencies_used);
639               pst = (struct partial_symtab *) 0;
640               includes_used = 0;
641               dependencies_used = 0;
642             }
643           psymfile_depth--;
644           continue;
645
646         case N_SYM_SYM: /* Typedef or automatic variable. */
647           namestring = bufp->n_strx;
648           p = (char *) strchr (namestring, ':');
649           if (!p)
650             continue;           /* Not a debugging symbol.   */
651
652           /* Main processing section for debugging symbols which
653              the initial read through the symbol tables needs to worry
654              about.  If we reach this point, the symbol which we are
655              considering is definitely one we are interested in.
656              p must also contain the (valid) index into the namestring
657              which indicates the debugging type symbol.  */
658
659           switch (p[1])
660             {
661             case 'S':
662               {
663                 unsigned long valu;
664                 enum language tmp_language;
665                 char *str, *p;
666                 int n;
667
668                 valu = CUR_SYMBOL_VALUE;
669                 if (valu)
670                   valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
671                 past_first_source_file = 1;
672
673                 p = strchr (namestring, ':');
674                 if (p)
675                   n = p - namestring;
676                 else
677                   n = strlen (namestring);
678                 str = alloca (n + 1);
679                 strncpy (str, namestring, n);
680                 str[n] = '\0';
681
682                 if (psymfile_depth == 0)
683                   {
684                     if (!pst)
685                       pst = os9k_start_psymtab (objfile,
686                                                 str, valu,
687                                                 cursymoffset,
688                                                 symnum - 1,
689                                               objfile->global_psymbols.next,
690                                              objfile->static_psymbols.next);
691                   }
692                 else
693                   {             /* this is a include file */
694                     tmp_language = deduce_language_from_filename (str);
695                     if (tmp_language != language_unknown
696                         && (tmp_language != language_c
697                             || psymtab_language != language_cplus))
698                       psymtab_language = tmp_language;
699
700 /*
701    if (pst && STREQ (str, pst->filename))
702    continue;
703    {
704    register int i;
705    for (i = 0; i < includes_used; i++)
706    if (STREQ (str, psymtab_include_list[i]))
707    {
708    i = -1; 
709    break;
710    }
711    if (i == -1)
712    continue;
713    }
714  */
715
716                     psymtab_include_list[includes_used++] = str;
717                     if (includes_used >= includes_allocated)
718                       {
719                         char **orig = psymtab_include_list;
720
721                         psymtab_include_list = (char **)
722                           alloca ((includes_allocated *= 2) * sizeof (char *));
723                         memcpy ((PTR) psymtab_include_list, (PTR) orig,
724                                 includes_used * sizeof (char *));
725                       }
726
727                   }
728                 psymfile_depth++;
729                 continue;
730               }
731
732             case 'v':
733               add_psymbol_to_list (namestring, p - namestring,
734                                    VAR_NAMESPACE, LOC_STATIC,
735                                    &objfile->static_psymbols,
736                                    0, CUR_SYMBOL_VALUE,
737                                    psymtab_language, objfile);
738               continue;
739             case 'V':
740               add_psymbol_to_list (namestring, p - namestring,
741                                    VAR_NAMESPACE, LOC_STATIC,
742                                    &objfile->global_psymbols,
743                                    0, CUR_SYMBOL_VALUE,
744                                    psymtab_language, objfile);
745               continue;
746
747             case 'T':
748               if (p != namestring)      /* a name is there, not just :T... */
749                 {
750                   add_psymbol_to_list (namestring, p - namestring,
751                                        STRUCT_NAMESPACE, LOC_TYPEDEF,
752                                        &objfile->static_psymbols,
753                                        CUR_SYMBOL_VALUE, 0,
754                                        psymtab_language, objfile);
755                   if (p[2] == 't')
756                     {
757                       /* Also a typedef with the same name.  */
758                       add_psymbol_to_list (namestring, p - namestring,
759                                            VAR_NAMESPACE, LOC_TYPEDEF,
760                                            &objfile->static_psymbols,
761                                       CUR_SYMBOL_VALUE, 0, psymtab_language,
762                                            objfile);
763                       p += 1;
764                     }
765                   /* The semantics of C++ state that "struct foo { ... }"
766                      also defines a typedef for "foo".  Unfortuantely, cfront
767                      never makes the typedef when translating from C++ to C.
768                      We make the typedef here so that "ptype foo" works as
769                      expected for cfront translated code.  */
770                   else if (psymtab_language == language_cplus)
771                     {
772                       /* Also a typedef with the same name.  */
773                       add_psymbol_to_list (namestring, p - namestring,
774                                            VAR_NAMESPACE, LOC_TYPEDEF,
775                                            &objfile->static_psymbols,
776                                       CUR_SYMBOL_VALUE, 0, psymtab_language,
777                                            objfile);
778                     }
779                 }
780               goto check_enum;
781             case 't':
782               if (p != namestring)      /* a name is there, not just :T... */
783                 {
784                   add_psymbol_to_list (namestring, p - namestring,
785                                        VAR_NAMESPACE, LOC_TYPEDEF,
786                                        &objfile->static_psymbols,
787                                        CUR_SYMBOL_VALUE, 0,
788                                        psymtab_language, objfile);
789                 }
790             check_enum:
791               /* If this is an enumerated type, we need to
792                  add all the enum constants to the partial symbol
793                  table.  This does not cover enums without names, e.g.
794                  "enum {a, b} c;" in C, but fortunately those are
795                  rare.  There is no way for GDB to find those from the
796                  enum type without spending too much time on it.  Thus
797                  to solve this problem, the compiler needs to put out the
798                  enum in a nameless type.  GCC2 does this.  */
799
800               /* We are looking for something of the form
801                  <name> ":" ("t" | "T") [<number> "="] "e" <size>
802                  {<constant> ":" <value> ","} ";".  */
803
804               /* Skip over the colon and the 't' or 'T'.  */
805               p += 2;
806               /* This type may be given a number.  Also, numbers can come
807                  in pairs like (0,26).  Skip over it.  */
808               while ((*p >= '0' && *p <= '9')
809                      || *p == '(' || *p == ',' || *p == ')'
810                      || *p == '=')
811                 p++;
812
813               if (*p++ == 'e')
814                 {
815                   /* We have found an enumerated type. skip size */
816                   while (*p >= '0' && *p <= '9')
817                     p++;
818                   /* According to comments in read_enum_type
819                      a comma could end it instead of a semicolon.
820                      I don't know where that happens.
821                      Accept either.  */
822                   while (*p && *p != ';' && *p != ',')
823                     {
824                       char *q;
825
826                       /* Check for and handle cretinous dbx symbol name
827                          continuation! 
828                          if (*p == '\\')
829                          p = next_symbol_text (objfile);
830                        */
831
832                       /* Point to the character after the name
833                          of the enum constant.  */
834                       for (q = p; *q && *q != ':'; q++)
835                         ;
836                       /* Note that the value doesn't matter for
837                          enum constants in psymtabs, just in symtabs.  */
838                       add_psymbol_to_list (p, q - p,
839                                            VAR_NAMESPACE, LOC_CONST,
840                                            &objfile->static_psymbols, 0,
841                                            0, psymtab_language, objfile);
842                       /* Point past the name.  */
843                       p = q;
844                       /* Skip over the value.  */
845                       while (*p && *p != ',')
846                         p++;
847                       /* Advance past the comma.  */
848                       if (*p)
849                         p++;
850                     }
851                 }
852               continue;
853             case 'c':
854               /* Constant, e.g. from "const" in Pascal.  */
855               add_psymbol_to_list (namestring, p - namestring,
856                                    VAR_NAMESPACE, LOC_CONST,
857                                 &objfile->static_psymbols, CUR_SYMBOL_VALUE,
858                                    0, psymtab_language, objfile);
859               continue;
860
861             case 'f':
862               CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
863               if (pst && pst->textlow == 0)
864                 pst->textlow = CUR_SYMBOL_VALUE;
865
866               add_psymbol_to_list (namestring, p - namestring,
867                                    VAR_NAMESPACE, LOC_BLOCK,
868                                 &objfile->static_psymbols, CUR_SYMBOL_VALUE,
869                                    0, psymtab_language, objfile);
870               continue;
871
872             case 'F':
873               CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
874               if (pst && pst->textlow == 0)
875                 pst->textlow = CUR_SYMBOL_VALUE;
876
877               add_psymbol_to_list (namestring, p - namestring,
878                                    VAR_NAMESPACE, LOC_BLOCK,
879                                 &objfile->global_psymbols, CUR_SYMBOL_VALUE,
880                                    0, psymtab_language, objfile);
881               continue;
882
883             case 'p':
884             case 'l':
885             case 's':
886               continue;
887
888             case ':':
889               /* It is a C++ nested symbol.  We don't need to record it
890                  (I don't think); if we try to look up foo::bar::baz,
891                  then symbols for the symtab containing foo should get
892                  read in, I think.  */
893               /* Someone says sun cc puts out symbols like
894                  /foo/baz/maclib::/usr/local/bin/maclib,
895                  which would get here with a symbol type of ':'.  */
896               continue;
897
898             default:
899               /* Unexpected symbol descriptor.  The second and subsequent stabs
900                  of a continued stab can show up here.  The question is
901                  whether they ever can mimic a normal stab--it would be
902                  nice if not, since we certainly don't want to spend the
903                  time searching to the end of every string looking for
904                  a backslash.  */
905
906               complain (&unknown_symchar_complaint, p[1]);
907               continue;
908             }
909
910         case N_SYM_RBRAC:
911           CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
912 #ifdef HANDLE_RBRAC
913           HANDLE_RBRAC (CUR_SYMBOL_VALUE);
914           continue;
915 #endif
916         case N_SYM_LBRAC:
917           continue;
918
919         default:
920           /* If we haven't found it yet, ignore it.  It's probably some
921              new type we don't know about yet.  */
922           complain (&unknown_symtype_complaint,
923                     local_hex_string ((unsigned long) bufp->n_type));
924           continue;
925         }
926     }
927
928   DBX_SYMCOUNT (objfile) = symnum;
929
930   /* If there's stuff to be cleaned up, clean it up.  */
931   if (DBX_SYMCOUNT (objfile) > 0
932 /*FIXME, does this have a bug at start address 0? */
933       && last_o_file_start
934       && objfile->ei.entry_point < bufp->n_value
935       && objfile->ei.entry_point >= last_o_file_start)
936     {
937       objfile->ei.entry_file_lowpc = last_o_file_start;
938       objfile->ei.entry_file_highpc = bufp->n_value;
939     }
940
941   if (pst)
942     {
943       os9k_end_psymtab (pst, psymtab_include_list, includes_used,
944                         symnum, end_of_text_addr,
945                         dependency_list, dependencies_used);
946     }
947 /*
948    do_cleanups (back_to);
949  */
950 }
951
952 /* Allocate and partially fill a partial symtab.  It will be
953    completely filled at the end of the symbol list.
954
955    SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
956    is the address relative to which its symbols are (incremental) or 0
957    (normal). */
958
959
960 static struct partial_symtab *
961 os9k_start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
962                     int ldsymoff, int ldsymcnt,
963                     struct partial_symbol **global_syms,
964                     struct partial_symbol **static_syms)
965 {
966   struct partial_symtab *result =
967   start_psymtab_common (objfile, objfile->section_offsets,
968                         filename, textlow, global_syms, static_syms);
969
970   result->read_symtab_private = (char *)
971     obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
972
973   LDSYMOFF (result) = ldsymoff;
974   LDSYMCNT (result) = ldsymcnt;
975   result->read_symtab = os9k_psymtab_to_symtab;
976
977   /* Deduce the source language from the filename for this psymtab. */
978   psymtab_language = deduce_language_from_filename (filename);
979   return result;
980 }
981
982 /* Close off the current usage of PST.  
983    Returns PST or NULL if the partial symtab was empty and thrown away.
984    FIXME:  List variables and peculiarities of same.  */
985
986 static struct partial_symtab *
987 os9k_end_psymtab (struct partial_symtab *pst, char **include_list,
988                   int num_includes, int capping_symbol_cnt,
989                   CORE_ADDR capping_text,
990                   struct partial_symtab **dependency_list,
991                   int number_dependencies)
992 {
993   int i;
994   struct partial_symtab *p1;
995   struct objfile *objfile = pst->objfile;
996
997   if (capping_symbol_cnt != -1)
998     LDSYMCNT (pst) = capping_symbol_cnt - LDSYMCNT (pst);
999
1000   /* Under Solaris, the N_SO symbols always have a value of 0,
1001      instead of the usual address of the .o file.  Therefore,
1002      we have to do some tricks to fill in texthigh and textlow.
1003      The first trick is in partial-stab.h: if we see a static
1004      or global function, and the textlow for the current pst
1005      is still 0, then we use that function's address for 
1006      the textlow of the pst.
1007
1008      Now, to fill in texthigh, we remember the last function seen
1009      in the .o file (also in partial-stab.h).  Also, there's a hack in
1010      bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
1011      to here via the misc_info field.  Therefore, we can fill in
1012      a reliable texthigh by taking the address plus size of the
1013      last function in the file.
1014
1015      Unfortunately, that does not cover the case where the last function
1016      in the file is static.  See the paragraph below for more comments
1017      on this situation.
1018
1019      Finally, if we have a valid textlow for the current file, we run
1020      down the partial_symtab_list filling in previous texthighs that
1021      are still unknown.  */
1022
1023   if (pst->texthigh == 0 && last_function_name)
1024     {
1025       char *p;
1026       int n;
1027       struct minimal_symbol *minsym;
1028
1029       p = strchr (last_function_name, ':');
1030       if (p == NULL)
1031         p = last_function_name;
1032       n = p - last_function_name;
1033       p = alloca (n + 1);
1034       strncpy (p, last_function_name, n);
1035       p[n] = 0;
1036
1037       minsym = lookup_minimal_symbol (p, NULL, objfile);
1038
1039       if (minsym)
1040         {
1041           pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) + (long) MSYMBOL_INFO (minsym);
1042         }
1043       else
1044         {
1045           /* This file ends with a static function, and it's
1046              difficult to imagine how hard it would be to track down
1047              the elf symbol.  Luckily, most of the time no one will notice,
1048              since the next file will likely be compiled with -g, so
1049              the code below will copy the first fuction's start address 
1050              back to our texthigh variable.  (Also, if this file is the
1051              last one in a dynamically linked program, texthigh already
1052              has the right value.)  If the next file isn't compiled
1053              with -g, then the last function in this file winds up owning
1054              all of the text space up to the next -g file, or the end (minus
1055              shared libraries).  This only matters for single stepping,
1056              and even then it will still work, except that it will single
1057              step through all of the covered functions, instead of setting
1058              breakpoints around them as it usualy does.  This makes it
1059              pretty slow, but at least it doesn't fail.
1060
1061              We can fix this with a fairly big change to bfd, but we need
1062              to coordinate better with Cygnus if we want to do that.  FIXME.  */
1063         }
1064       last_function_name = NULL;
1065     }
1066
1067   /* this test will be true if the last .o file is only data */
1068   if (pst->textlow == 0)
1069     pst->textlow = pst->texthigh;
1070
1071   /* If we know our own starting text address, then walk through all other
1072      psymtabs for this objfile, and if any didn't know their ending text
1073      address, set it to our starting address.  Take care to not set our
1074      own ending address to our starting address, nor to set addresses on
1075      `dependency' files that have both textlow and texthigh zero.  */
1076   if (pst->textlow)
1077     {
1078       ALL_OBJFILE_PSYMTABS (objfile, p1)
1079       {
1080         if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
1081           {
1082             p1->texthigh = pst->textlow;
1083             /* if this file has only data, then make textlow match texthigh */
1084             if (p1->textlow == 0)
1085               p1->textlow = p1->texthigh;
1086           }
1087       }
1088     }
1089
1090   /* End of kludge for patching Solaris textlow and texthigh.  */
1091
1092   pst->n_global_syms =
1093     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1094   pst->n_static_syms =
1095     objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1096
1097   pst->number_of_dependencies = number_dependencies;
1098   if (number_dependencies)
1099     {
1100       pst->dependencies = (struct partial_symtab **)
1101         obstack_alloc (&objfile->psymbol_obstack,
1102                     number_dependencies * sizeof (struct partial_symtab *));
1103       memcpy (pst->dependencies, dependency_list,
1104               number_dependencies * sizeof (struct partial_symtab *));
1105     }
1106   else
1107     pst->dependencies = 0;
1108
1109   for (i = 0; i < num_includes; i++)
1110     {
1111       struct partial_symtab *subpst =
1112       allocate_psymtab (include_list[i], objfile);
1113
1114       subpst->section_offsets = pst->section_offsets;
1115       subpst->read_symtab_private =
1116         (char *) obstack_alloc (&objfile->psymbol_obstack,
1117                                 sizeof (struct symloc));
1118       LDSYMOFF (subpst) =
1119         LDSYMCNT (subpst) =
1120         subpst->textlow =
1121         subpst->texthigh = 0;
1122
1123       /* We could save slight bits of space by only making one of these,
1124          shared by the entire set of include files.  FIXME-someday.  */
1125       subpst->dependencies = (struct partial_symtab **)
1126         obstack_alloc (&objfile->psymbol_obstack,
1127                        sizeof (struct partial_symtab *));
1128       subpst->dependencies[0] = pst;
1129       subpst->number_of_dependencies = 1;
1130
1131       subpst->globals_offset =
1132         subpst->n_global_syms =
1133         subpst->statics_offset =
1134         subpst->n_static_syms = 0;
1135
1136       subpst->readin = 0;
1137       subpst->symtab = 0;
1138       subpst->read_symtab = pst->read_symtab;
1139     }
1140
1141   sort_pst_symbols (pst);
1142
1143   /* If there is already a psymtab or symtab for a file of this name, 
1144      remove it.
1145      (If there is a symtab, more drastic things also happen.)
1146      This happens in VxWorks.  */
1147   free_named_symtabs (pst->filename);
1148
1149   if (num_includes == 0
1150       && number_dependencies == 0
1151       && pst->n_global_syms == 0
1152       && pst->n_static_syms == 0)
1153     {
1154       /* Throw away this psymtab, it's empty.  We can't deallocate it, since
1155          it is on the obstack, but we can forget to chain it on the list.  */
1156       /* Indicate that psymtab was thrown away.  */
1157
1158       discard_psymtab (pst);
1159
1160       pst = (struct partial_symtab *) NULL;
1161     }
1162   return pst;
1163 }
1164 \f
1165 static void
1166 os9k_psymtab_to_symtab_1 (struct partial_symtab *pst)
1167 {
1168   struct cleanup *old_chain;
1169   int i;
1170
1171   if (!pst)
1172     return;
1173
1174   if (pst->readin)
1175     {
1176       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1177                           pst->filename);
1178       return;
1179     }
1180
1181   /* Read in all partial symtabs on which this one is dependent */
1182   for (i = 0; i < pst->number_of_dependencies; i++)
1183     if (!pst->dependencies[i]->readin)
1184       {
1185         /* Inform about additional files that need to be read in.  */
1186         if (info_verbose)
1187           {
1188             fputs_filtered (" ", gdb_stdout);
1189             wrap_here ("");
1190             fputs_filtered ("and ", gdb_stdout);
1191             wrap_here ("");
1192             printf_filtered ("%s...", pst->dependencies[i]->filename);
1193             wrap_here ("");     /* Flush output */
1194             gdb_flush (gdb_stdout);
1195           }
1196         os9k_psymtab_to_symtab_1 (pst->dependencies[i]);
1197       }
1198
1199   if (LDSYMCNT (pst))           /* Otherwise it's a dummy */
1200     {
1201       /* Init stuff necessary for reading in symbols */
1202       stabsread_init ();
1203       buildsym_init ();
1204       old_chain = make_cleanup (really_free_pendings, 0);
1205
1206       /* Read in this file's symbols */
1207       os9k_read_ofile_symtab (pst);
1208       sort_symtab_syms (pst->symtab);
1209       do_cleanups (old_chain);
1210     }
1211
1212   pst->readin = 1;
1213 }
1214
1215 /* Read in all of the symbols for a given psymtab for real.
1216    Be verbose about it if the user wants that.  */
1217
1218 static void
1219 os9k_psymtab_to_symtab (struct partial_symtab *pst)
1220 {
1221   bfd *sym_bfd;
1222
1223   if (!pst)
1224     return;
1225
1226   if (pst->readin)
1227     {
1228       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1229                           pst->filename);
1230       return;
1231     }
1232
1233   if (LDSYMCNT (pst) || pst->number_of_dependencies)
1234     {
1235       /* Print the message now, before reading the string table,
1236          to avoid disconcerting pauses.  */
1237       if (info_verbose)
1238         {
1239           printf_filtered ("Reading in symbols for %s...", pst->filename);
1240           gdb_flush (gdb_stdout);
1241         }
1242
1243       sym_bfd = pst->objfile->obfd;
1244       os9k_psymtab_to_symtab_1 (pst);
1245
1246       /* Match with global symbols.  This only needs to be done once,
1247          after all of the symtabs and dependencies have been read in.   */
1248       scan_file_globals (pst->objfile);
1249
1250       /* Finish up the debug error message.  */
1251       if (info_verbose)
1252         printf_filtered ("done.\n");
1253     }
1254 }
1255
1256 /* Read in a defined section of a specific object file's symbols. */
1257 static void
1258 os9k_read_ofile_symtab (struct partial_symtab *pst)
1259 {
1260   register struct internal_symstruct *bufp;
1261   unsigned char type;
1262   unsigned max_symnum;
1263   register bfd *abfd;
1264   struct objfile *objfile;
1265   int sym_offset;               /* Offset to start of symbols to read */
1266   CORE_ADDR text_offset;        /* Start of text segment for symbols */
1267   int text_size;                /* Size of text segment for symbols */
1268   FILE *dbg_file;
1269
1270   objfile = pst->objfile;
1271   sym_offset = LDSYMOFF (pst);
1272   max_symnum = LDSYMCNT (pst);
1273   text_offset = pst->textlow;
1274   text_size = pst->texthigh - pst->textlow;
1275
1276   current_objfile = objfile;
1277   subfile_stack = NULL;
1278   last_source_file = NULL;
1279
1280   abfd = objfile->obfd;
1281   dbg_file = objfile->auxf2;
1282
1283 #if 0
1284   /* It is necessary to actually read one symbol *before* the start
1285      of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
1286      occurs before the N_SO symbol.
1287      Detecting this in read_dbx_symtab
1288      would slow down initial readin, so we look for it here instead. */
1289   if (!processing_acc_compilation && sym_offset >= (int) symbol_size)
1290     {
1291       fseek (objefile->auxf2, sym_offset, SEEK_CUR);
1292       fill_sym (objfile->auxf2, abfd);
1293       bufp = symbuf;
1294
1295       processing_gcc_compilation = 0;
1296       if (bufp->n_type == N_TEXT)
1297         {
1298           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1299             processing_gcc_compilation = 1;
1300           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1301             processing_gcc_compilation = 2;
1302         }
1303
1304       /* Try to select a C++ demangling based on the compilation unit
1305          producer. */
1306
1307       if (processing_gcc_compilation)
1308         {
1309           if (AUTO_DEMANGLING)
1310             {
1311               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1312             }
1313         }
1314     }
1315   else
1316     {
1317       /* The N_SO starting this symtab is the first symbol, so we
1318          better not check the symbol before it.  I'm not this can
1319          happen, but it doesn't hurt to check for it.  */
1320       bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
1321       processing_gcc_compilation = 0;
1322     }
1323 #endif /* 0 */
1324
1325   fseek (dbg_file, (long) sym_offset, 0);
1326 /*
1327    if (bufp->n_type != (unsigned char)N_SYM_SYM)
1328    error("First symbol in segment of executable not a source symbol");
1329  */
1330
1331   for (symnum = 0; symnum < max_symnum; symnum++)
1332     {
1333       QUIT;                     /* Allow this to be interruptable */
1334       fill_sym (dbg_file, abfd);
1335       bufp = symbuf;
1336       type = bufp->n_type;
1337
1338       os9k_process_one_symbol ((int) type, (int) bufp->n_desc,
1339          (CORE_ADDR) bufp->n_value, bufp->n_strx, pst->section_offsets, objfile);
1340
1341       /* We skip checking for a new .o or -l file; that should never
1342          happen in this routine. */
1343 #if 0
1344       else
1345       if (type == N_TEXT)
1346         {
1347           /* I don't think this code will ever be executed, because
1348              the GCC_COMPILED_FLAG_SYMBOL usually is right before
1349              the N_SO symbol which starts this source file.
1350              However, there is no reason not to accept
1351              the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
1352
1353           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1354             processing_gcc_compilation = 1;
1355           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1356             processing_gcc_compilation = 2;
1357
1358           if (AUTO_DEMANGLING)
1359             {
1360               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1361             }
1362         }
1363       else if (type & N_EXT || type == (unsigned char) N_TEXT
1364                || type == (unsigned char) N_NBTEXT
1365         )
1366         {
1367           /* Global symbol: see if we came across a dbx defintion for
1368              a corresponding symbol.  If so, store the value.  Remove
1369              syms from the chain when their values are stored, but
1370              search the whole chain, as there may be several syms from
1371              different files with the same name. */
1372           /* This is probably not true.  Since the files will be read
1373              in one at a time, each reference to a global symbol will
1374              be satisfied in each file as it appears. So we skip this
1375              section. */
1376           ;
1377         }
1378 #endif /* 0 */
1379     }
1380
1381   current_objfile = NULL;
1382
1383   /* In a Solaris elf file, this variable, which comes from the
1384      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
1385      which comes from pst->textlow is correct. */
1386   if (last_source_start_addr == 0)
1387     last_source_start_addr = text_offset;
1388   pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
1389   end_stabs ();
1390 }
1391 \f
1392
1393 /* This handles a single symbol from the symbol-file, building symbols
1394    into a GDB symtab.  It takes these arguments and an implicit argument.
1395
1396    TYPE is the type field of the ".stab" symbol entry.
1397    DESC is the desc field of the ".stab" entry.
1398    VALU is the value field of the ".stab" entry.
1399    NAME is the symbol name, in our address space.
1400    SECTION_OFFSETS is a set of amounts by which the sections of this object
1401    file were relocated when it was loaded into memory.
1402    All symbols that refer
1403    to memory locations need to be offset by these amounts.
1404    OBJFILE is the object file from which we are reading symbols.
1405    It is used in end_symtab.  */
1406
1407 static void
1408 os9k_process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
1409                          struct section_offsets *section_offsets,
1410                          struct objfile *objfile)
1411 {
1412   register struct context_stack *new;
1413   /* The stab type used for the definition of the last function.
1414      N_STSYM or N_GSYM for SunOS4 acc; N_FUN for other compilers.  */
1415   static int function_stab_type = 0;
1416
1417 #if 0
1418   /* Something is wrong if we see real data before
1419      seeing a source file name.  */
1420   if (last_source_file == NULL && type != (unsigned char) N_SO)
1421     {
1422       /* Ignore any symbols which appear before an N_SO symbol.
1423          Currently no one puts symbols there, but we should deal
1424          gracefully with the case.  A complain()t might be in order,
1425          but this should not be an error ().  */
1426       return;
1427     }
1428 #endif /* 0 */
1429
1430   switch (type)
1431     {
1432     case N_SYM_LBRAC:
1433       /* On most machines, the block addresses are relative to the
1434          N_SO, the linker did not relocate them (sigh).  */
1435       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1436       new = push_context (desc, valu);
1437       break;
1438
1439     case N_SYM_RBRAC:
1440       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1441       new = pop_context ();
1442
1443 #if !defined (OS9K_VARIABLES_INSIDE_BLOCK)
1444 #define OS9K_VARIABLES_INSIDE_BLOCK(desc, gcc_p) 1
1445 #endif
1446
1447       if (!OS9K_VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
1448         local_symbols = new->locals;
1449
1450       if (context_stack_depth > 1)
1451         {
1452           /* This is not the outermost LBRAC...RBRAC pair in the function,
1453              its local symbols preceded it, and are the ones just recovered
1454              from the context stack.  Define the block for them (but don't
1455              bother if the block contains no symbols.  Should we complain
1456              on blocks without symbols?  I can't think of any useful purpose
1457              for them).  */
1458           if (local_symbols != NULL)
1459             {
1460               /* Muzzle a compiler bug that makes end < start.  (which
1461                  compilers?  Is this ever harmful?).  */
1462               if (new->start_addr > valu)
1463                 {
1464                   complain (&lbrac_rbrac_complaint);
1465                   new->start_addr = valu;
1466                 }
1467               /* Make a block for the local symbols within.  */
1468               finish_block (0, &local_symbols, new->old_blocks,
1469                             new->start_addr, valu, objfile);
1470             }
1471         }
1472       else
1473         {
1474           if (context_stack_depth == 0)
1475             {
1476               within_function = 0;
1477               /* Make a block for the local symbols within.  */
1478               finish_block (new->name, &local_symbols, new->old_blocks,
1479                             new->start_addr, valu, objfile);
1480             }
1481           else
1482             {
1483               /* attach local_symbols to the end of new->locals */
1484               if (!new->locals)
1485                 new->locals = local_symbols;
1486               else
1487                 {
1488                   struct pending *p;
1489
1490                   p = new->locals;
1491                   while (p->next)
1492                     p = p->next;
1493                   p->next = local_symbols;
1494                 }
1495             }
1496         }
1497
1498       if (OS9K_VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
1499         /* Now pop locals of block just finished.  */
1500         local_symbols = new->locals;
1501       break;
1502
1503
1504     case N_SYM_SLINE:
1505       /* This type of "symbol" really just records
1506          one line-number -- core-address correspondence.
1507          Enter it in the line list for this symbol table. */
1508       /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
1509       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1510       /* FIXME: loses if sizeof (char *) > sizeof (int) */
1511       gdb_assert (sizeof (name) <= sizeof (int));
1512       record_line (current_subfile, (int) name, valu);
1513       break;
1514
1515       /* The following symbol types need to have the appropriate offset added
1516          to their value; then we process symbol definitions in the name.  */
1517     case N_SYM_SYM:
1518
1519       if (name)
1520         {
1521           char deftype;
1522           char *dirn, *n;
1523           char *p = strchr (name, ':');
1524           if (p == NULL)
1525             deftype = '\0';
1526           else
1527             deftype = p[1];
1528
1529
1530           switch (deftype)
1531             {
1532             case 'S':
1533               valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1534               n = strrchr (name, '/');
1535               if (n != NULL)
1536                 {
1537                   *n = '\0';
1538                   n++;
1539                   dirn = name;
1540                 }
1541               else
1542                 {
1543                   n = name;
1544                   dirn = NULL;
1545                 }
1546               *p = '\0';
1547               if (symfile_depth++ == 0)
1548                 {
1549                   if (last_source_file)
1550                     {
1551                       end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
1552                       end_stabs ();
1553                     }
1554                   start_stabs ();
1555                   os9k_stabs = 1;
1556                   start_symtab (n, dirn, valu);
1557                   record_debugformat ("OS9");
1558                 }
1559               else
1560                 {
1561                   push_subfile ();
1562                   start_subfile (n, dirn != NULL ? dirn : current_subfile->dirname);
1563                 }
1564               break;
1565
1566             case 'f':
1567             case 'F':
1568               valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1569               function_stab_type = type;
1570
1571               within_function = 1;
1572               new = push_context (0, valu);
1573               new->name = define_symbol (valu, name, desc, type, objfile);
1574               break;
1575
1576             case 'V':
1577             case 'v':
1578               valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
1579               define_symbol (valu, name, desc, type, objfile);
1580               break;
1581
1582             default:
1583               define_symbol (valu, name, desc, type, objfile);
1584               break;
1585             }
1586         }
1587       break;
1588
1589     case N_SYM_SE:
1590       if (--symfile_depth != 0)
1591         start_subfile (pop_subfile (), current_subfile->dirname);
1592       break;
1593
1594     default:
1595       complain (&unknown_symtype_complaint,
1596                 local_hex_string ((unsigned long) type));
1597       /* FALLTHROUGH */
1598       break;
1599
1600     case N_SYM_CMPLR:
1601       break;
1602     }
1603   previous_stab_code = type;
1604 }
1605
1606 static struct sym_fns os9k_sym_fns =
1607 {
1608   bfd_target_os9k_flavour,
1609   os9k_new_init,                /* sym_new_init: init anything gbl to entire symtab */
1610   os9k_symfile_init,            /* sym_init: read initial info, setup for sym_read() */
1611   os9k_symfile_read,            /* sym_read: read a symbol file into symtab */
1612   os9k_symfile_finish,          /* sym_finish: finished with file, cleanup */
1613   default_symfile_offsets,      /* sym_offsets: parse user's offsets to internal form */
1614   NULL                          /* next: pointer to next struct sym_fns */
1615 };
1616
1617 void
1618 _initialize_os9kread (void)
1619 {
1620   add_symtab_fns (&os9k_sym_fns);
1621 }
This page took 0.118961 seconds and 4 git commands to generate.