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