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.
5 This file is part of GDB.
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.
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.
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. */
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
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 */
39 #if defined(USG) || defined(__CYGNUSCLIB__)
40 #include <sys/types.h>
45 #include <sys/param.h>
52 #include "breakpoint.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 */
61 #include "gdb-stabs.h"
63 #include "language.h" /* Needed inside partial-stab.h */
64 #include "complaints.h"
66 #include "stabsread.h"
68 #if !defined (SEEK_SET)
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.
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.
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. */
86 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
87 #define LDSYMCNT(p) (((struct symloc *)((p)->read_symtab_private))->ldsymnum)
94 /* Remember what we deduced to be the source language of this psymtab. */
95 static enum language psymtab_language = language_unknown;
97 /* keep partial symbol table file nested depth */
98 static int psymfile_depth = 0;
100 /* keep symbol table file nested depth */
101 static int symfile_depth = 0;
103 /* Nonzero means give verbose info on gdb action. From main.c. */
104 extern int info_verbose;
106 extern int previous_stab_code;
108 /* Name of last function encountered. Used in Solaris to approximate
109 object file boundaries. */
110 static char *last_function_name;
112 /* Complaints about the symbols we have encountered. */
113 extern struct complaint lbrac_complaint;
115 extern struct complaint unknown_symtype_complaint;
117 extern struct complaint unknown_symchar_complaint;
119 extern struct complaint lbrac_rbrac_complaint;
121 extern struct complaint repeated_header_complaint;
123 extern struct complaint repeated_header_name_complaint;
126 static struct complaint lbrac_unmatched_complaint =
127 {"unmatched Increment Block Entry before symtab pos %d", 0, 0};
129 static struct complaint lbrac_mismatch_complaint =
130 {"IBE/IDE symbol mismatch at symtab pos %d", 0, 0};
133 /* Local function prototypes */
135 os9k_read_ofile_symtab PARAMS ((struct partial_symtab *));
138 os9k_psymtab_to_symtab PARAMS ((struct partial_symtab *));
141 os9k_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
144 read_os9k_psymtab PARAMS ((struct section_offsets *, struct objfile *,
148 init_psymbol_list PARAMS ((struct objfile *));
151 fill_sym PARAMS ((FILE *, bfd *));
154 os9k_symfile_init PARAMS ((struct objfile *));
157 os9k_new_init PARAMS ((struct objfile *));
160 os9k_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
163 os9k_symfile_finish PARAMS ((struct objfile *));
166 os9k_process_one_symbol PARAMS ((int, int, CORE_ADDR, char *,
167 struct section_offsets *, struct objfile *));
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 *));
174 static struct partial_symtab *
175 os9k_end_psymtab PARAMS ((struct partial_symtab *, char **, int, int, CORE_ADDR,
176 struct partial_symtab **, int));
179 record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *,
180 struct section_offsets *));
182 #define HANDLE_RBRAC(val) \
183 if ((val) > pst->texthigh) pst->texthigh = (val);
185 #define SWAP_STBHDR(hdrp, abfd) \
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); \
192 #define SWAP_STBSYM(symp, abfd) \
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); \
206 record_minimal_symbol (name, address, type, objfile, section_offsets)
210 struct objfile *objfile;
211 struct section_offsets *section_offsets;
213 enum minimal_symbol_type ms_type;
219 address += ANOFFSET(section_offsets, SECT_OFF_TEXT);
237 ms_type = mst_unknown; break;
240 prim_record_minimal_symbol
241 (obsavestring (name, strlen(name), &objfile->symbol_obstack),
242 address, ms_type, objfile);
245 /* read and process .stb file and store in minimal symbol table */
246 typedef char mhhdr[80];
261 #define STBSYMSIZE 10
264 read_minimal_symbols(objfile, section_offsets)
265 struct objfile *objfile;
266 struct section_offsets *section_offsets;
271 struct stbsymbol sym;
273 char buf[64], buf1[128];
276 if (fp == NULL) return;
277 abfd = objfile->obfd;
278 fread(&hdr.comhdr[0], sizeof(mhhdr), 1, fp);
287 if (i%2) ch=getc(fp);
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);
297 init_minimal_symbol_collection();
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);
314 record_minimal_symbol(buf1, sym.value, sym.type&7, objfile, section_offsets);
317 install_minimal_symbols (objfile);
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.
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). */
332 os9k_symfile_read (objfile, section_offsets, mainline)
333 struct objfile *objfile;
334 struct section_offsets *section_offsets;
335 int mainline; /* FIXME comments above */
338 struct cleanup *back_to;
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);
347 back_to = make_cleanup (really_free_pendings, 0);
349 make_cleanup (discard_minimal_symbols, 0);
350 read_minimal_symbols (objfile, section_offsets);
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)));
358 if (!have_partial_symbols ()) {
360 printf_filtered ("(no debugging symbols found)...");
364 do_cleanups (back_to);
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). */
372 os9k_new_init (ignore)
373 struct objfile *ignore;
375 stabsread_new_init ();
376 buildsym_new_init ();
379 init_header_files ();
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.
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. */
394 os9k_symfile_init (objfile)
395 struct objfile *objfile;
397 bfd *sym_bfd = objfile->obfd;
398 char *name = bfd_get_filename (sym_bfd);
399 char dbgname[512], stbname[512];
404 strcpy(dbgname, name);
405 strcat(dbgname, ".dbg");
406 strcpy(stbname, name);
407 strcat(stbname, ".stb");
409 if ((symfile = fopen(dbgname, "r")) == NULL) {
410 warning("Symbol file %s not found", dbgname);
412 objfile->auxf2 = symfile;
414 if ((minfile = fopen(stbname, "r")) == NULL) {
415 warning("Symbol file %s not found", stbname);
417 objfile->auxf1 = minfile;
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;
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");
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 */
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. */
439 os9k_symfile_finish (objfile)
440 struct objfile *objfile;
442 if (objfile->sym_stab_info != NULL)
444 mfree (objfile -> md, objfile->sym_stab_info);
447 free_header_files ();
459 #define SYNC (int)0xefbefeca
461 #define SWAP_DBGHDR(hdrp, abfd) \
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); \
470 #define N_SYM_CMPLR 0
471 #define N_SYM_SLINE 1
473 #define N_SYM_LBRAC 3
474 #define N_SYM_RBRAC 4
477 struct internal_symstruct {
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;
489 #define VER_PRE_ULTRAC ((short)4)
490 #define VER_ULTRAC ((short)5)
493 fill_sym (dbg_file, abfd)
502 int nbytes = fread(&si, sizeof(si), 1, dbg_file);
506 perror_with_name ("reading .dbg file.");
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)
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;
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;
528 fread(&li, sizeof(li), 1, dbg_file);
529 symbuf->n_value = bfd_get_32(abfd, (unsigned char *)&li);
533 strbuf[si++] = (char) ii;
534 } while (ii != 0 || si % 2 != 0);
535 symbuf->n_strx = strbuf;
536 p = (char *) strchr (strbuf, ':');
538 if ((p[1] == 'F' || p[1] == 'f') && cmplrid == VER_PRE_ULTRAC)
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);
547 fread(&li, sizeof(li), 1, dbg_file);
548 symbuf->n_value = bfd_get_32(abfd, (unsigned char *)&li);
551 fread(&li, sizeof(li), 1, dbg_file);
552 symbuf->n_value = bfd_get_32(abfd, (unsigned char *)&li);
560 /* Initializes storage for all of the partial symbols that will be
561 created by read_dbx_symtab and subsidiaries. */
564 init_psymbol_list (objfile)
565 struct objfile *objfile;
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);
573 /* Current best guess is that there are approximately a twentieth
574 of the total symbols (in a debugging file) are global or static
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));
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). */
592 read_os9k_psymtab (section_offsets, objfile, text_addr, text_size)
593 struct section_offsets *section_offsets;
594 struct objfile *objfile;
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;
603 struct cleanup *back_to;
608 /* End of the text segment of the executable file. */
609 static CORE_ADDR end_of_text_addr;
611 /* Current partial symtab */
612 static struct partial_symtab *pst = 0;
614 /* List of current psymtab's include files */
615 char **psymtab_include_list;
616 int includes_allocated;
619 /* Index within current psymtab dependency list */
620 struct partial_symtab **dependency_list;
621 int dependencies_used, dependencies_allocated;
623 includes_allocated = 30;
625 psymtab_include_list = (char **) alloca (includes_allocated *
628 dependencies_allocated = 30;
629 dependencies_used = 0;
631 (struct partial_symtab **) alloca (dependencies_allocated *
632 sizeof (struct partial_symtab *));
634 last_source_file = NULL;
636 #ifdef END_OF_TEXT_DEFAULT
637 end_of_text_addr = END_OF_TEXT_DEFAULT;
639 end_of_text_addr = text_addr + section_offsets->offsets[SECT_OFF_TEXT]
640 + text_size; /* Relocate */
643 abfd = objfile->obfd;
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);
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);
668 /* Special case to speed up readin. */
669 if (bufp->n_type == (short)N_SYM_SLINE) continue;
671 #define CUR_SYMBOL_VALUE bufp->n_value
674 switch (bufp->n_type)
682 CUR_SYMBOL_VALUE += ANOFFSET(section_offsets, SECT_OFF_TEXT);
683 if (psymfile_depth == 1 && pst)
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;
690 dependencies_used = 0;
695 case N_SYM_SYM: /* Typedef or automatic variable. */
696 namestring = bufp->n_strx;
697 p = (char *) strchr (namestring, ':');
699 continue; /* Not a debugging symbol. */
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. */
713 enum language tmp_language;
717 valu = CUR_SYMBOL_VALUE;
719 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
720 past_first_source_file = 1;
722 p = strchr(namestring, ':');
723 if (p) n = p-namestring;
724 else n = strlen(namestring);
726 strncpy(str, namestring, n);
729 if (psymfile_depth == 0) {
731 pst = os9k_start_psymtab (objfile, section_offsets,
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;
745 if (pst && STREQ (str, pst->filename))
749 for (i = 0; i < includes_used; i++)
750 if (STREQ (str, psymtab_include_list[i]))
760 psymtab_include_list[includes_used++] = str;
761 if (includes_used >= includes_allocated)
763 char **orig = psymtab_include_list;
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 *));
777 ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
778 VAR_NAMESPACE, LOC_STATIC,
779 objfile->static_psymbols,
781 psymtab_language, objfile);
784 ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
785 VAR_NAMESPACE, LOC_STATIC,
786 objfile->global_psymbols,
788 psymtab_language, objfile);
792 if (p != namestring) /* a name is there, not just :T... */
794 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
795 STRUCT_NAMESPACE, LOC_TYPEDEF,
796 objfile->static_psymbols,
798 psymtab_language, objfile);
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,
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)
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,
826 if (p != namestring) /* a name is there, not just :T... */
828 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
829 VAR_NAMESPACE, LOC_TYPEDEF,
830 objfile->static_psymbols,
832 psymtab_language, objfile);
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. */
844 /* We are looking for something of the form
845 <name> ":" ("t" | "T") [<number> "="] "e" <size>
846 {<constant> ":" <value> ","} ";". */
848 /* Skip over the colon and the 't' or 'T'. */
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 == ')'
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.
865 while (*p && *p != ';' && *p != ',')
869 /* Check for and handle cretinous dbx symbol name
872 p = next_symbol_text ();
875 /* Point to the character after the name
876 of the enum constant. */
877 for (q = p; *q && *q != ':'; q++)
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. */
887 /* Skip over the value. */
888 while (*p && *p != ',')
890 /* Advance past the comma. */
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);
905 CUR_SYMBOL_VALUE += ANOFFSET(section_offsets, SECT_OFF_TEXT);
906 if (pst && pst->textlow == 0)
907 pst->textlow = CUR_SYMBOL_VALUE;
909 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
910 VAR_NAMESPACE, LOC_BLOCK,
911 objfile->static_psymbols, CUR_SYMBOL_VALUE,
912 psymtab_language, objfile);
916 CUR_SYMBOL_VALUE += ANOFFSET(section_offsets, SECT_OFF_TEXT);
917 if (pst && pst->textlow == 0)
918 pst->textlow = CUR_SYMBOL_VALUE;
920 ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
921 VAR_NAMESPACE, LOC_BLOCK,
922 objfile->global_psymbols, CUR_SYMBOL_VALUE,
923 psymtab_language, objfile);
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
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 ':'. */
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
949 complain (&unknown_symchar_complaint, p[1]);
954 CUR_SYMBOL_VALUE += ANOFFSET(section_offsets, SECT_OFF_TEXT);
956 HANDLE_RBRAC(CUR_SYMBOL_VALUE);
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));
971 DBX_SYMCOUNT (objfile) = symnum;
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? */
977 && objfile -> ei.entry_point < bufp->n_value
978 && objfile -> ei.entry_point >= last_o_file_start)
980 objfile -> ei.entry_file_lowpc = last_o_file_start;
981 objfile -> ei.entry_file_highpc = bufp->n_value;
986 os9k_end_psymtab (pst, psymtab_include_list, includes_used,
987 symnum, end_of_text_addr,
988 dependency_list, dependencies_used);
991 do_cleanups (back_to);
995 /* Allocate and partially fill a partial symtab. It will be
996 completely filled at the end of the symbol list.
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
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;
1012 struct partial_symbol *global_syms;
1013 struct partial_symbol *static_syms;
1015 struct partial_symtab *result =
1016 start_psymtab_common(objfile, section_offsets,
1017 filename, textlow, global_syms, static_syms);
1019 result->read_symtab_private = (char *)
1020 obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc));
1022 LDSYMOFF(result) = ldsymoff;
1023 LDSYMCNT(result) = ldsymcnt;
1024 result->read_symtab = os9k_psymtab_to_symtab;
1026 /* Deduce the source language from the filename for this psymtab. */
1027 psymtab_language = deduce_language_from_filename (filename);
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. */
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;
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;*/
1048 struct partial_symtab *p1;
1049 struct objfile *objfile = pst -> objfile;
1051 if (capping_symbol_cnt != -1)
1052 LDSYMCNT(pst) = capping_symbol_cnt - LDSYMCNT(pst);
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.
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.
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
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. */
1077 if (pst->texthigh == 0 && last_function_name) {
1080 struct minimal_symbol *minsym;
1082 p = strchr (last_function_name, ':');
1084 p = last_function_name;
1085 n = p - last_function_name;
1087 strncpy (p, last_function_name, n);
1090 minsym = lookup_minimal_symbol (p, objfile);
1093 pst->texthigh = SYMBOL_VALUE_ADDRESS(minsym)+(long)MSYMBOL_INFO(minsym);
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.
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. */
1114 last_function_name = NULL;
1117 /* this test will be true if the last .o file is only data */
1118 if (pst->textlow == 0)
1119 pst->textlow = pst->texthigh;
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. */
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;
1137 /* End of kludge for patching Solaris textlow and texthigh. */
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);
1144 pst->number_of_dependencies = number_dependencies;
1145 if (number_dependencies)
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 *));
1154 pst->dependencies = 0;
1156 for (i = 0; i < num_includes; i++)
1158 struct partial_symtab *subpst =
1159 allocate_psymtab (include_list[i], objfile);
1161 subpst->section_offsets = pst->section_offsets;
1162 subpst->read_symtab_private =
1163 (char *) obstack_alloc (&objfile->psymbol_obstack,
1164 sizeof (struct symloc));
1168 subpst->texthigh = 0;
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;
1178 subpst->globals_offset =
1179 subpst->n_global_syms =
1180 subpst->statics_offset =
1181 subpst->n_static_syms = 0;
1185 subpst->read_symtab = pst->read_symtab;
1188 sort_pst_symbols (pst);
1190 /* If there is already a psymtab or symtab for a file of this name,
1192 (If there is a symtab, more drastic things also happen.)
1193 This happens in VxWorks. */
1194 free_named_symtabs (pst->filename);
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;
1204 /* First, snip it out of the psymtab chain */
1206 if (pst->objfile->psymtabs == pst)
1207 pst->objfile->psymtabs = pst->next;
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;
1213 /* Next, put it on a free list for recycling */
1214 pst->next = pst->objfile->free_psymtabs;
1215 pst->objfile->free_psymtabs = pst;
1217 /* Indicate that psymtab was thrown away. */
1218 pst = (struct partial_symtab *)NULL;
1224 os9k_psymtab_to_symtab_1 (pst)
1225 struct partial_symtab *pst;
1227 struct cleanup *old_chain;
1235 fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
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)
1244 /* Inform about additional files that need to be read in. */
1247 fputs_filtered (" ", gdb_stdout);
1249 fputs_filtered ("and ", gdb_stdout);
1251 printf_filtered ("%s...", pst->dependencies[i]->filename);
1252 wrap_here (""); /* Flush output */
1253 gdb_flush (gdb_stdout);
1255 os9k_psymtab_to_symtab_1 (pst->dependencies[i]);
1258 if (LDSYMCNT(pst)) /* Otherwise it's a dummy */
1260 /* Init stuff necessary for reading in symbols */
1263 old_chain = make_cleanup (really_free_pendings, 0);
1265 /* Read in this file's symbols */
1266 os9k_read_ofile_symtab (pst);
1267 sort_symtab_syms (pst->symtab);
1268 do_cleanups (old_chain);
1274 /* Read in all of the symbols for a given psymtab for real.
1275 Be verbose about it if the user wants that. */
1278 os9k_psymtab_to_symtab (pst)
1279 struct partial_symtab *pst;
1288 fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
1293 if (LDSYMCNT(pst) || pst->number_of_dependencies)
1295 /* Print the message now, before reading the string table,
1296 to avoid disconcerting pauses. */
1299 printf_filtered ("Reading in symbols for %s...", pst->filename);
1300 gdb_flush (gdb_stdout);
1303 sym_bfd = pst->objfile->obfd;
1304 os9k_psymtab_to_symtab_1 (pst);
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);
1310 /* Finish up the debug error message. */
1312 printf_filtered ("done.\n");
1316 /* Read in a defined section of a specific object file's symbols. */
1318 os9k_read_ofile_symtab (pst)
1319 struct partial_symtab *pst;
1321 register struct internal_symstruct *bufp;
1323 unsigned max_symnum;
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;
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;
1339 current_objfile = objfile;
1340 subfile_stack = NULL;
1341 last_source_file = NULL;
1343 abfd = objfile->obfd;
1344 dbg_file = objfile->auxf2;
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)
1354 fseek (objefile->auxf2, sym_offset, SEEK_CUR);
1355 fill_sym(objfile->auxf2, abfd);
1358 processing_gcc_compilation = 0;
1359 if (bufp->n_type == N_TEXT)
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;
1367 /* Try to select a C++ demangling based on the compilation unit
1370 if (processing_gcc_compilation)
1372 if (AUTO_DEMANGLING)
1374 set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
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;
1388 fseek(dbg_file, (long)sym_offset, 0);
1390 if (bufp->n_type != (unsigned char)N_SYM_SYM)
1391 error("First symbol in segment of executable not a source symbol");
1394 for (symnum = 0; symnum < max_symnum; symnum++)
1396 QUIT; /* Allow this to be interruptable */
1397 fill_sym(dbg_file, abfd);
1399 type = bufp->n_type;
1401 os9k_process_one_symbol ((int)type, (int)bufp->n_desc,
1402 (CORE_ADDR)bufp->n_value, bufp->n_strx, section_offsets, objfile);
1404 /* We skip checking for a new .o or -l file; that should never
1405 happen in this routine. */
1407 else if (type == N_TEXT)
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. */
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;
1420 if (AUTO_DEMANGLING)
1422 set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1425 else if (type & N_EXT || type == (unsigned char)N_TEXT
1426 || type == (unsigned char)N_NBTEXT
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
1442 current_objfile = NULL;
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,
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.
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. */
1470 os9k_process_one_symbol (type, desc, valu, name, section_offsets, objfile)
1474 struct section_offsets *section_offsets;
1475 struct objfile *objfile;
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;
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)
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 (). */
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);
1505 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1506 new = pop_context();
1508 #if !defined (OS9K_VARIABLES_INSIDE_BLOCK)
1509 #define OS9K_VARIABLES_INSIDE_BLOCK(desc, gcc_p) 1
1512 if (!OS9K_VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1513 local_symbols = new->locals;
1515 if (context_stack_depth > 1)
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
1523 if (local_symbols != NULL)
1525 /* Muzzle a compiler bug that makes end < start. (which
1526 compilers? Is this ever harmful?). */
1527 if (new->start_addr > valu)
1529 complain (&lbrac_rbrac_complaint);
1530 new->start_addr = valu;
1532 /* Make a block for the local symbols within. */
1533 finish_block (0, &local_symbols, new->old_blocks,
1534 new->start_addr, valu, objfile);
1539 if (context_stack_depth == 0)
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);
1548 /* attach local_symbols to the end of new->locals */
1549 if (!new->locals) new->locals = local_symbols;
1554 while (p->next) p = p->next;
1555 p->next = local_symbols;
1560 if (OS9K_VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1561 /* Now pop locals of block just finished. */
1562 local_symbols = new->locals;
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);
1575 /* The following symbol types need to have the appropriate offset added
1576 to their value; then we process symbol definitions in the name. */
1583 char *p = strchr (name, ':');
1593 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1594 n = strrchr(name, '/');
1604 if (symfile_depth++ == 0) {
1605 if (last_source_file) {
1606 end_symtab (valu, 0, 0, objfile, SECT_OFF_TEXT);
1611 start_symtab (n, dirn, valu);
1614 start_subfile (n, dirn!=NULL ? dirn : current_subfile->dirname);
1620 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1621 function_stab_type = type;
1623 within_function = 1;
1624 new = push_context (0, valu);
1625 new->name = define_symbol (valu, name, desc, type, objfile);
1630 valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
1631 define_symbol (valu, name, desc, type, objfile);
1635 define_symbol (valu, name, desc, type, objfile);
1642 if (--symfile_depth != 0)
1643 start_subfile(pop_subfile(), current_subfile->dirname);
1647 complain (&unknown_symtype_complaint,
1648 local_hex_string((unsigned long) type));
1655 previous_stab_code = type;
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. */
1661 static struct section_offsets *
1662 os9k_symfile_offsets (objfile, addr)
1663 struct objfile *objfile;
1666 struct section_offsets *section_offsets;
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));
1675 for (i = 0; i < SECT_OFF_MAX; i++)
1676 ANOFFSET (section_offsets, i) = addr;
1678 return section_offsets;
1681 static struct sym_fns os9k_sym_fns =
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 */
1693 _initialize_os9kread ()
1695 add_symtab_fns(&os9k_sym_fns);