daily update
[deliverable/binutils-gdb.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 xmfree (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.065168 seconds and 4 git commands to generate.