X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fmdebugread.c;h=04678168113d29665c0335c2ad07df7a02484a59;hb=8464be768129e057bc92e27de51317b99717da8f;hp=97794dc0a7685375102a07bc0ce21256297ee45a;hpb=cb137aa50156c9b105cf393b867c7dbe206ef9c9;p=binutils-gdb.git diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 97794dc0a76..04678168113 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -1,7 +1,9 @@ /* Read a symbol table in ECOFF format (Third-Eye). - Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, - 1997, 1998, 1999, 2000, 2001, 2002, 2003 + + Copyright (C) 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, + 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Original version contributed by Alessandro Forin (af@cs.cmu.edu) at CMU. Major work by Per Bothner, John Gilmore and Ian Lance Taylor at Cygnus Support. @@ -10,7 +12,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -19,9 +21,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ /* This module provides the function mdebug_build_psymtabs. It reads ECOFF debugging information into partial symbol tables. The @@ -45,7 +45,6 @@ #include "symtab.h" #include "gdbtypes.h" #include "gdbcore.h" -#include "symfile.h" #include "objfiles.h" #include "gdb_obstack.h" #include "buildsym.h" @@ -55,32 +54,10 @@ #include "gdb_assert.h" #include "block.h" #include "dictionary.h" - -/* These are needed if the tm.h file does not contain the necessary - mips specific definitions. */ - -#ifndef MIPS_EFI_SYMBOL_NAME -#define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__" -extern void ecoff_relocate_efi (struct symbol *, CORE_ADDR); -#include "coff/sym.h" -#include "coff/symconst.h" -typedef struct mips_extra_func_info - { - long numargs; - PDR pdr; - } - *mips_extra_func_info_t; -#ifndef RA_REGNUM -#define RA_REGNUM 0 -#endif -#endif - -#ifdef USG -#include -#endif - +#include "mdebugread.h" #include "gdb_stat.h" #include "gdb_string.h" +#include "psympriv.h" #include "bfd.h" @@ -91,7 +68,6 @@ typedef struct mips_extra_func_info #include "aout/stab_gnu.h" /* STABS information */ #include "expression.h" -#include "language.h" /* For local_hex_string() */ extern void _initialize_mdebugread (void); @@ -147,39 +123,39 @@ struct symloc static void index_complaint (const char *arg1) { - complaint (&symfile_complaints, "bad aux index at symbol %s", arg1); + complaint (&symfile_complaints, _("bad aux index at symbol %s"), arg1); } static void unknown_ext_complaint (const char *arg1) { - complaint (&symfile_complaints, "unknown external symbol %s", arg1); + complaint (&symfile_complaints, _("unknown external symbol %s"), arg1); } static void basic_type_complaint (int arg1, const char *arg2) { - complaint (&symfile_complaints, "cannot map ECOFF basic type 0x%x for %s", + complaint (&symfile_complaints, _("cannot map ECOFF basic type 0x%x for %s"), arg1, arg2); } static void bad_tag_guess_complaint (const char *arg1) { - complaint (&symfile_complaints, "guessed tag type of %s incorrectly", arg1); + complaint (&symfile_complaints, _("guessed tag type of %s incorrectly"), arg1); } static void bad_rfd_entry_complaint (const char *arg1, int arg2, int arg3) { - complaint (&symfile_complaints, "bad rfd entry for %s: file %d, index %d", + complaint (&symfile_complaints, _("bad rfd entry for %s: file %d, index %d"), arg1, arg2, arg3); } static void unexpected_type_code_complaint (const char *arg1) { - complaint (&symfile_complaints, "unexpected type code for %s", arg1); + complaint (&symfile_complaints, _("unexpected type code for %s"), arg1); } /* Macros and extra defs */ @@ -232,39 +208,6 @@ static int n_undef_symbols, n_undef_labels, n_undef_vars, n_undef_procs; static char stabs_symbol[] = STABS_SYMBOL; -/* Types corresponding to mdebug format bt* basic types. */ - -static struct type *mdebug_type_void; -static struct type *mdebug_type_char; -static struct type *mdebug_type_short; -static struct type *mdebug_type_int_32; -#define mdebug_type_int mdebug_type_int_32 -static struct type *mdebug_type_int_64; -static struct type *mdebug_type_long_32; -static struct type *mdebug_type_long_64; -static struct type *mdebug_type_long_long_64; -static struct type *mdebug_type_unsigned_char; -static struct type *mdebug_type_unsigned_short; -static struct type *mdebug_type_unsigned_int_32; -static struct type *mdebug_type_unsigned_int_64; -static struct type *mdebug_type_unsigned_long_32; -static struct type *mdebug_type_unsigned_long_64; -static struct type *mdebug_type_unsigned_long_long_64; -static struct type *mdebug_type_adr_32; -static struct type *mdebug_type_adr_64; -static struct type *mdebug_type_float; -static struct type *mdebug_type_double; -static struct type *mdebug_type_complex; -static struct type *mdebug_type_double_complex; -static struct type *mdebug_type_fixed_dec; -static struct type *mdebug_type_float_dec; -static struct type *mdebug_type_string; - -/* Types for symbols from files compiled without debugging info. */ - -static struct type *nodebug_func_symbol_type; -static struct type *nodebug_var_symbol_type; - /* Nonzero if we have seen ecoff debugging info for a file. */ static int found_ecoff_debugging_info; @@ -309,7 +252,7 @@ static void psymtab_to_symtab_1 (struct partial_symtab *, char *); static void add_block (struct block *, struct symtab *); -static void add_symbol (struct symbol *, struct block *); +static void add_symbol (struct symbol *, struct symtab *, struct block *); static int add_line (struct linetable *, int, CORE_ADDR, int); @@ -320,21 +263,6 @@ static void handle_psymbol_enumerators (struct objfile *, FDR *, int, static char *mdebug_next_symbol_text (struct objfile *); -/* Address bounds for the signal trampoline in inferior, if any */ - -CORE_ADDR sigtramp_address, sigtramp_end; - -/* Allocate zeroed memory */ - -static void * -xzalloc (unsigned int size) -{ - void *p = xmalloc (size); - - memset (p, 0, size); - return p; -} - /* Exported procedure: Builds a symtab from the PST partial one. Restores the environment in effect when PST was created, delegates most of the work to an ancillary procedure, and sorts @@ -343,13 +271,12 @@ xzalloc (unsigned int size) static void mdebug_psymtab_to_symtab (struct partial_symtab *pst) { - if (!pst) return; if (info_verbose) { - printf_filtered ("Reading in symbols for %s...", pst->filename); + printf_filtered (_("Reading in symbols for %s..."), pst->filename); gdb_flush (gdb_stdout); } @@ -362,7 +289,7 @@ mdebug_psymtab_to_symtab (struct partial_symtab *pst) scan_file_globals (pst->objfile); if (info_verbose) - printf_filtered ("done.\n"); + printf_filtered (_("done.\n")); } /* File-level interface functions */ @@ -426,7 +353,7 @@ mdebug_build_psymtabs (struct objfile *objfile, char *fdr_end; FDR *fdr_ptr; - info->fdr = (FDR *) obstack_alloc (&objfile->psymbol_obstack, + info->fdr = (FDR *) obstack_alloc (&objfile->objfile_obstack, (info->symbolic_header.ifdMax * sizeof (FDR))); fdr_src = info->external_fdr; @@ -445,9 +372,9 @@ mdebug_build_psymtabs (struct objfile *objfile, if (compare_glevel (max_glevel, GLEVEL_2) < 0) { if (max_gdbinfo == 0) - printf_unfiltered ("\n%s not compiled with -g, debugging support is limited.\n", + printf_unfiltered (_("\n%s not compiled with -g, debugging support is limited.\n"), objfile->name); - printf_unfiltered ("You should compile with -g2 or -g3 for best debugging support.\n"); + printf_unfiltered (_("You should compile with -g2 or -g3 for best debugging support.\n")); gdb_flush (gdb_stdout); } #endif @@ -544,9 +471,9 @@ struct mdebug_pending /* The pending information is kept for an entire object file, and used - to be in the sym_private field. I took it out when I split - mdebugread from mipsread, because this might not be the only type - of symbols read from an object file. Instead, we allocate the + to be in the deprecated_sym_private field. I took it out when I + split mdebugread from mipsread, because this might not be the only + type of symbols read from an object file. Instead, we allocate the pending information table when we create the partial symbols, and we store a pointer to the single table in each psymtab. */ @@ -579,7 +506,7 @@ add_pending (FDR *fh, char *sh, struct type *t) if (!p) { p = ((struct mdebug_pending *) - obstack_alloc (¤t_objfile->psymbol_obstack, + obstack_alloc (¤t_objfile->objfile_obstack, sizeof (struct mdebug_pending))); p->s = sh; p->t = t; @@ -600,10 +527,21 @@ add_pending (FDR *fh, char *sh, struct type *t) aux symbols are big-endian or little-endian. Return count of SYMR's handled (normally one). */ +static int +mdebug_reg_to_regnum (struct symbol *sym, struct gdbarch *gdbarch) +{ + return gdbarch_ecoff_reg_to_regnum (gdbarch, SYMBOL_VALUE (sym)); +} + +static const struct symbol_register_ops mdebug_register_funcs = { + mdebug_reg_to_regnum +}; + static int parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, struct section_offsets *section_offsets, struct objfile *objfile) { + struct gdbarch *gdbarch = get_objfile_arch (objfile); const bfd_size_type external_sym_size = debug_swap->external_sym_size; void (*const swap_sym_in) (bfd *, void *, SYMR *) = debug_swap->swap_sym_in; char *name; @@ -670,7 +608,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, /* It is a FORTRAN common block. At least for SGI Fortran the address is not in the symbol; we need to fix it later in scan_file_globals. */ - int bucket = hashname (DEPRECATED_SYMBOL_NAME (s)); + int bucket = hashname (SYMBOL_LINKAGE_NAME (s)); SYMBOL_VALUE_CHAIN (s) = global_sym_chain[bucket]; global_sym_chain[bucket] = s; } @@ -679,26 +617,26 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, goto data; case stLocal: /* local variable, goes into current block */ + b = top_stack->cur_block; + s = new_symbol (name); + SYMBOL_VALUE (s) = svalue; if (sh->sc == scRegister) { class = LOC_REGISTER; - svalue = ECOFF_REG_TO_REGNUM (svalue); + SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs; } else class = LOC_LOCAL; - b = top_stack->cur_block; - s = new_symbol (name); - SYMBOL_VALUE (s) = svalue; data: /* Common code for symbols describing data */ SYMBOL_DOMAIN (s) = VAR_DOMAIN; SYMBOL_CLASS (s) = class; - add_symbol (s, b); + add_symbol (s, top_stack->cur_st, b); /* Type could be missing if file is compiled without debugging info. */ if (SC_IS_UNDEF (sh->sc) || sh->sc == scNil || sh->index == indexNil) - SYMBOL_TYPE (s) = nodebug_var_symbol_type; + SYMBOL_TYPE (s) = objfile_type (objfile)->nodebug_data_symbol; else SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name); /* Value of a data symbol is its memory address */ @@ -715,12 +653,13 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, s = new_symbol (name); SYMBOL_DOMAIN (s) = VAR_DOMAIN; + SYMBOL_IS_ARGUMENT (s) = 1; switch (sh->sc) { case scRegister: /* Pass by value in register. */ - SYMBOL_CLASS (s) = LOC_REGPARM; - svalue = ECOFF_REG_TO_REGNUM (svalue); + SYMBOL_CLASS (s) = LOC_REGISTER; + SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs; break; case scVar: /* Pass by reference on stack. */ @@ -729,7 +668,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, case scVarRegister: /* Pass by reference in register. */ SYMBOL_CLASS (s) = LOC_REGPARM_ADDR; - svalue = ECOFF_REG_TO_REGNUM (svalue); + SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs; break; default: /* Pass by value on stack. */ @@ -738,7 +677,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, } SYMBOL_VALUE (s) = svalue; SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name); - add_symbol (s, top_stack->cur_block); + add_symbol (s, top_stack->cur_st, top_stack->cur_block); break; case stLabel: /* label, goes into current block */ @@ -746,8 +685,8 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, SYMBOL_DOMAIN (s) = VAR_DOMAIN; /* so that it can be used */ SYMBOL_CLASS (s) = LOC_LABEL; /* but not misused */ SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value; - SYMBOL_TYPE (s) = mdebug_type_int; - add_symbol (s, top_stack->cur_block); + SYMBOL_TYPE (s) = objfile_type (objfile)->builtin_int; + add_symbol (s, top_stack->cur_st, top_stack->cur_block); break; case stProc: /* Procedure, usually goes into global block */ @@ -778,7 +717,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, break; default: complaint (&symfile_complaints, - "unknown symbol type 0x%x", sh->st); + _("unknown symbol type 0x%x"), sh->st); break; } } @@ -789,11 +728,12 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, SYMBOL_CLASS (s) = LOC_BLOCK; /* Type of the return value */ if (SC_IS_UNDEF (sh->sc) || sh->sc == scNil) - t = mdebug_type_int; + t = objfile_type (objfile)->builtin_int; else { t = parse_type (cur_fd, ax, sh->index + 1, 0, bigend, name); - if (DEPRECATED_STREQ (name, "malloc") && TYPE_CODE (t) == TYPE_CODE_VOID) + if (strcmp (name, "malloc") == 0 + && TYPE_CODE (t) == TYPE_CODE_VOID) { /* I don't know why, but, at least under Alpha GNU/Linux, when linking against a malloc without debugging @@ -812,9 +752,10 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, if (sh->st == stProc) { struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st); + /* The next test should normally be true, but provides a hook for nested functions (which we don't want to make - global). */ + global). */ if (b == BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); /* Irix 5 sometimes has duplicate names for the same @@ -823,7 +764,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, else if (sh->value == top_stack->procadr) b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); } - add_symbol (s, b); + add_symbol (s, top_stack->cur_st, b); /* Make a type for the procedure itself */ SYMBOL_TYPE (s) = lookup_function_type (t); @@ -831,7 +772,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, /* All functions in C++ have prototypes. For C we don't have enough information in the debug info. */ if (SYMBOL_LANGUAGE (s) == language_cplus) - TYPE_FLAGS (SYMBOL_TYPE (s)) |= TYPE_FLAG_PROTOTYPED; + TYPE_PROTOTYPED (SYMBOL_TYPE (s)) = 1; /* Create and enter a new lexical context */ b = new_block (FUNCTION_BLOCK); @@ -994,7 +935,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, default: complaint (&symfile_complaints, - "declaration block contains unhandled symbol type %d", + _("declaration block contains unhandled symbol type %d"), tsym.st); } } @@ -1057,8 +998,8 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, if (sh->iss == 0 || name[0] == '.' || name[0] == '\0') TYPE_TAG_NAME (t) = NULL; else - TYPE_TAG_NAME (t) = obconcat (¤t_objfile->symbol_obstack, - "", "", name); + TYPE_TAG_NAME (t) = obconcat (¤t_objfile->objfile_obstack, name, + (char *) NULL); TYPE_CODE (t) = type_code; TYPE_LENGTH (t) = sh->value; @@ -1083,7 +1024,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, that too. */ if (TYPE_LENGTH (t) == TYPE_NFIELDS (t) || TYPE_LENGTH (t) == 0) - TYPE_LENGTH (t) = TARGET_INT_BIT / HOST_CHAR_BIT; + TYPE_LENGTH (t) = gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT; for (ext_tsym = ext_sh + external_sym_size; ; ext_tsym += external_sym_size) @@ -1096,33 +1037,32 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, if (tsym.st != stMember) break; - FIELD_BITPOS (*f) = tsym.value; + SET_FIELD_BITPOS (*f, tsym.value); FIELD_TYPE (*f) = t; FIELD_NAME (*f) = debug_info->ss + cur_fdr->issBase + tsym.iss; FIELD_BITSIZE (*f) = 0; - FIELD_STATIC_KIND (*f) = 0; enum_sym = ((struct symbol *) - obstack_alloc (¤t_objfile->symbol_obstack, + obstack_alloc (¤t_objfile->objfile_obstack, sizeof (struct symbol))); memset (enum_sym, 0, sizeof (struct symbol)); - DEPRECATED_SYMBOL_NAME (enum_sym) = - obsavestring (f->name, strlen (f->name), - ¤t_objfile->symbol_obstack); + SYMBOL_SET_LINKAGE_NAME + (enum_sym, obsavestring (f->name, strlen (f->name), + ¤t_objfile->objfile_obstack)); SYMBOL_CLASS (enum_sym) = LOC_CONST; SYMBOL_TYPE (enum_sym) = t; SYMBOL_DOMAIN (enum_sym) = VAR_DOMAIN; SYMBOL_VALUE (enum_sym) = tsym.value; if (SYMBOL_VALUE (enum_sym) < 0) unsigned_enum = 0; - add_symbol (enum_sym, top_stack->cur_block); + add_symbol (enum_sym, top_stack->cur_st, top_stack->cur_block); /* Skip the stMembers that we've handled. */ count++; f++; } if (unsigned_enum) - TYPE_FLAGS (t) |= TYPE_FLAG_UNSIGNED; + TYPE_UNSIGNED (t) = 1; } /* make this the current type */ top_stack->cur_type = t; @@ -1136,7 +1076,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, do not create a symbol for it either. */ if (TYPE_NFIELDS (t) == 0) { - TYPE_FLAGS (t) |= TYPE_FLAG_STUB; + TYPE_STUB (t) = 1; break; } @@ -1145,7 +1085,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, SYMBOL_CLASS (s) = LOC_TYPEDEF; SYMBOL_VALUE (s) = 0; SYMBOL_TYPE (s) = t; - add_symbol (s, top_stack->cur_block); + add_symbol (s, top_stack->cur_st, top_stack->cur_block); break; /* End of local variables shared by struct, union, enum, and @@ -1188,7 +1128,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, { /* Finished with procedure */ struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st); - struct mips_extra_func_info *e; + struct mdebug_extra_func_info *e; struct block *b = top_stack->cur_block; struct type *ftype = top_stack->cur_type; int i; @@ -1196,24 +1136,25 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, BLOCK_END (top_stack->cur_block) += sh->value; /* size */ /* Make up special symbol to contain procedure specific info */ - s = new_symbol (MIPS_EFI_SYMBOL_NAME); + s = new_symbol (MDEBUG_EFI_SYMBOL_NAME); SYMBOL_DOMAIN (s) = LABEL_DOMAIN; SYMBOL_CLASS (s) = LOC_CONST; - SYMBOL_TYPE (s) = mdebug_type_void; - e = ((struct mips_extra_func_info *) - obstack_alloc (¤t_objfile->symbol_obstack, - sizeof (struct mips_extra_func_info))); - memset (e, 0, sizeof (struct mips_extra_func_info)); - SYMBOL_VALUE (s) = (long) e; + SYMBOL_TYPE (s) = objfile_type (current_objfile)->builtin_void; + e = ((struct mdebug_extra_func_info *) + obstack_alloc (¤t_objfile->objfile_obstack, + sizeof (struct mdebug_extra_func_info))); + memset (e, 0, sizeof (struct mdebug_extra_func_info)); + SYMBOL_VALUE_BYTES (s) = (gdb_byte *) e; e->numargs = top_stack->numargs; e->pdr.framereg = -1; - add_symbol (s, top_stack->cur_block); + add_symbol (s, top_stack->cur_st, top_stack->cur_block); /* f77 emits proc-level with address bounds==[0,0], So look for such child blocks, and patch them. */ for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++) { struct block *b_bad = BLOCKVECTOR_BLOCK (bv, i); + if (BLOCK_SUPERBLOCK (b_bad) == b && BLOCK_START (b_bad) == top_stack->procadr && BLOCK_END (b_bad) == top_stack->procadr) @@ -1234,6 +1175,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, if (nparams > 0) { struct dict_iterator iter; + TYPE_NFIELDS (ftype) = nparams; TYPE_FIELDS (ftype) = (struct field *) TYPE_ALLOC (ftype, nparams * sizeof (struct field)); @@ -1244,18 +1186,11 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, if (iparams == nparams) break; - switch (SYMBOL_CLASS (sym)) + if (SYMBOL_IS_ARGUMENT (sym)) { - case LOC_ARG: - case LOC_REF_ARG: - case LOC_REGPARM: - case LOC_REGPARM_ADDR: TYPE_FIELD_TYPE (ftype, iparams) = SYMBOL_TYPE (sym); TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0; iparams++; - break; - default: - break; } } } @@ -1282,7 +1217,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, } else complaint (&symfile_complaints, - "stEnd with storage class %d not handled", sh->sc); + _("stEnd with storage class %d not handled"), sh->sc); pop_parse_stack (); /* restore previous lexical context */ break; @@ -1290,11 +1225,10 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, case stMember: /* member of struct or union */ f = &TYPE_FIELDS (top_stack->cur_type)[top_stack->cur_field++]; FIELD_NAME (*f) = name; - FIELD_BITPOS (*f) = sh->value; + SET_FIELD_BITPOS (*f, sh->value); bitsize = 0; FIELD_TYPE (*f) = parse_type (cur_fd, ax, sh->index, &bitsize, bigend, name); FIELD_BITSIZE (*f) = bitsize; - FIELD_STATIC_KIND (*f) = 0; break; case stIndirect: /* forward declaration on Irix5 */ @@ -1346,7 +1280,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, SYMBOL_CLASS (s) = LOC_TYPEDEF; SYMBOL_BLOCK_VALUE (s) = top_stack->cur_block; SYMBOL_TYPE (s) = t; - add_symbol (s, top_stack->cur_block); + add_symbol (s, top_stack->cur_st, top_stack->cur_block); /* Incomplete definitions of structs should not get a name. */ if (TYPE_NAME (SYMBOL_TYPE (s)) == NULL @@ -1377,7 +1311,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, for anything except pointers or functions. */ } else - TYPE_NAME (SYMBOL_TYPE (s)) = DEPRECATED_SYMBOL_NAME (s); + TYPE_NAME (SYMBOL_TYPE (s)) = SYMBOL_LINKAGE_NAME (s); } break; @@ -1394,13 +1328,186 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, case stConstant: break; /* constant */ default: - complaint (&symfile_complaints, "unknown symbol type 0x%x", sh->st); + complaint (&symfile_complaints, _("unknown symbol type 0x%x"), sh->st); break; } return count; } +/* Basic types. */ + +static const struct objfile_data *basic_type_data; + +static struct type * +basic_type (int bt, struct objfile *objfile) +{ + struct gdbarch *gdbarch = get_objfile_arch (objfile); + struct type **map_bt = objfile_data (objfile, basic_type_data); + struct type *tp; + + if (bt >= btMax) + return NULL; + + if (!map_bt) + { + map_bt = OBSTACK_CALLOC (&objfile->objfile_obstack, + btMax, struct type *); + set_objfile_data (objfile, basic_type_data, map_bt); + } + + if (map_bt[bt]) + return map_bt[bt]; + + switch (bt) + { + case btNil: + tp = objfile_type (objfile)->builtin_void; + break; + + case btAdr: + tp = init_type (TYPE_CODE_PTR, 4, TYPE_FLAG_UNSIGNED, + "adr_32", objfile); + TYPE_TARGET_TYPE (tp) = objfile_type (objfile)->builtin_void; + break; + + case btChar: + tp = init_type (TYPE_CODE_INT, 1, 0, + "char", objfile); + break; + + case btUChar: + tp = init_type (TYPE_CODE_INT, 1, TYPE_FLAG_UNSIGNED, + "unsigned char", objfile); + break; + + case btShort: + tp = init_type (TYPE_CODE_INT, 2, 0, + "short", objfile); + break; + + case btUShort: + tp = init_type (TYPE_CODE_INT, 2, TYPE_FLAG_UNSIGNED, + "unsigned short", objfile); + break; + + case btInt: + tp = init_type (TYPE_CODE_INT, 4, 0, + "int", objfile); + break; + + case btUInt: + tp = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED, + "unsigned int", objfile); + break; + + case btLong: + tp = init_type (TYPE_CODE_INT, 4, 0, + "long", objfile); + break; + + case btULong: + tp = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED, + "unsigned long", objfile); + break; + + case btFloat: + tp = init_type (TYPE_CODE_FLT, + gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT, 0, + "float", objfile); + break; + + case btDouble: + tp = init_type (TYPE_CODE_FLT, + gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT, 0, + "double", objfile); + break; + + case btComplex: + tp = init_type (TYPE_CODE_COMPLEX, + 2 * gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT, 0, + "complex", objfile); + TYPE_TARGET_TYPE (tp) = basic_type (btFloat, objfile); + break; + + case btDComplex: + tp = init_type (TYPE_CODE_COMPLEX, + 2 * gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT, 0, + "double complex", objfile); + TYPE_TARGET_TYPE (tp) = basic_type (btDouble, objfile); + break; + + case btFixedDec: + /* We use TYPE_CODE_INT to print these as integers. Does this do any + good? Would we be better off with TYPE_CODE_ERROR? Should + TYPE_CODE_ERROR print things in hex if it knows the size? */ + tp = init_type (TYPE_CODE_INT, + gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT, 0, + "fixed decimal", objfile); + break; + + case btFloatDec: + tp = init_type (TYPE_CODE_ERROR, + gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT, 0, + "floating decimal", objfile); + break; + + case btString: + /* Is a "string" the way btString means it the same as TYPE_CODE_STRING? + FIXME. */ + tp = init_type (TYPE_CODE_STRING, 1, 0, + "string", objfile); + break; + + case btVoid: + tp = objfile_type (objfile)->builtin_void; + break; + + case btLong64: + tp = init_type (TYPE_CODE_INT, 8, 0, + "long", objfile); + break; + + case btULong64: + tp = init_type (TYPE_CODE_INT, 8, TYPE_FLAG_UNSIGNED, + "unsigned long", objfile); + break; + + case btLongLong64: + tp = init_type (TYPE_CODE_INT, 8, 0, + "long long", objfile); + break; + + case btULongLong64: + tp = init_type (TYPE_CODE_INT, 8, TYPE_FLAG_UNSIGNED, + "unsigned long long", objfile); + break; + + case btAdr64: + tp = init_type (TYPE_CODE_PTR, 8, TYPE_FLAG_UNSIGNED, + "adr_64", objfile); + TYPE_TARGET_TYPE (tp) = objfile_type (objfile)->builtin_void; + break; + + case btInt64: + tp = init_type (TYPE_CODE_INT, 8, 0, + "int", objfile); + break; + + case btUInt64: + tp = init_type (TYPE_CODE_INT, 8, TYPE_FLAG_UNSIGNED, + "unsigned int", objfile); + break; + + default: + tp = NULL; + break; + } + + map_bt[bt] = tp; + return tp; +} + /* Parse the type information provided in the raw AX entries for the symbol SH. Return the bitfield size in BS, in case. We must byte-swap the AX entries before we use them; BIGEND says whether @@ -1410,78 +1517,27 @@ static struct type * parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, int bigend, char *sym_name) { - /* Null entries in this map are treated specially */ - static struct type **map_bt[] = - { - &mdebug_type_void, /* btNil */ - &mdebug_type_adr_32, /* btAdr */ - &mdebug_type_char, /* btChar */ - &mdebug_type_unsigned_char, /* btUChar */ - &mdebug_type_short, /* btShort */ - &mdebug_type_unsigned_short, /* btUShort */ - &mdebug_type_int_32, /* btInt */ - &mdebug_type_unsigned_int_32, /* btUInt */ - &mdebug_type_long_32, /* btLong */ - &mdebug_type_unsigned_long_32, /* btULong */ - &mdebug_type_float, /* btFloat */ - &mdebug_type_double, /* btDouble */ - 0, /* btStruct */ - 0, /* btUnion */ - 0, /* btEnum */ - 0, /* btTypedef */ - 0, /* btRange */ - 0, /* btSet */ - &mdebug_type_complex, /* btComplex */ - &mdebug_type_double_complex, /* btDComplex */ - 0, /* btIndirect */ - &mdebug_type_fixed_dec, /* btFixedDec */ - &mdebug_type_float_dec, /* btFloatDec */ - &mdebug_type_string, /* btString */ - 0, /* btBit */ - 0, /* btPicture */ - &mdebug_type_void, /* btVoid */ - 0, /* DEC C++: Pointer to member */ - 0, /* DEC C++: Virtual function table */ - 0, /* DEC C++: Class (Record) */ - &mdebug_type_long_64, /* btLong64 */ - &mdebug_type_unsigned_long_64, /* btULong64 */ - &mdebug_type_long_long_64, /* btLongLong64 */ - &mdebug_type_unsigned_long_long_64, /* btULongLong64 */ - &mdebug_type_adr_64, /* btAdr64 */ - &mdebug_type_int_64, /* btInt64 */ - &mdebug_type_unsigned_int_64, /* btUInt64 */ - }; - TIR t[1]; struct type *tp = 0; enum type_code type_code = TYPE_CODE_UNDEF; /* Handle undefined types, they have indexNil. */ if (aux_index == indexNil) - return mdebug_type_int; + return basic_type (btInt, current_objfile); /* Handle corrupt aux indices. */ if (aux_index >= (debug_info->fdr + fd)->caux) { index_complaint (sym_name); - return mdebug_type_int; + return basic_type (btInt, current_objfile); } ax += aux_index; /* Use aux as a type information record, map its basic type. */ (*debug_swap->swap_tir_in) (bigend, &ax->a_ti, t); - if (t->bt >= (sizeof (map_bt) / sizeof (*map_bt))) + tp = basic_type (t->bt, current_objfile); + if (tp == NULL) { - basic_type_complaint (t->bt, sym_name); - return mdebug_type_int; - } - if (map_bt[t->bt]) - { - tp = *map_bt[t->bt]; - } - else - { - tp = NULL; /* Cannot use builtin types -- build our own */ switch (t->bt) { @@ -1512,7 +1568,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, break; default: basic_type_complaint (t->bt, sym_name); - return mdebug_type_int; + return basic_type (btInt, current_objfile); } } @@ -1522,6 +1578,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, if (t->fBitfield) { int width = AUX_GET_WIDTH (bigend, ax); + /* Inhibit core dumps if TIR is corrupted. */ if (bs == (int *) NULL) { @@ -1529,13 +1586,13 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, as short and unsigned short types with a field width of 8. Enum types also have a field width which we ignore for now. */ if (t->bt == btShort && width == 8) - tp = mdebug_type_char; + tp = basic_type (btChar, current_objfile); else if (t->bt == btUShort && width == 8) - tp = mdebug_type_unsigned_char; + tp = basic_type (btUChar, current_objfile); else if (t->bt == btEnum) ; else - complaint (&symfile_complaints, "can't handle TIR fBitfield for %s", + complaint (&symfile_complaints, _("can't handle TIR fBitfield for %s"), sym_name); } else @@ -1565,8 +1622,8 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, if (rf == -1) { complaint (&symfile_complaints, - "unable to cross ref btIndirect for %s", sym_name); - return mdebug_type_int; + _("unable to cross ref btIndirect for %s"), sym_name); + return basic_type (btInt, current_objfile); } xref_fh = get_rfd (fd, rf); xref_fd = xref_fh - debug_info->fdr; @@ -1609,7 +1666,6 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, } else { - /* Usually, TYPE_CODE(tp) is already type_code. The main exception is if we guessed wrong re struct/union/enum. But for struct vs. union a wrong guess is harmless, so @@ -1634,7 +1690,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, else if (TYPE_TAG_NAME (tp) == NULL || strcmp (TYPE_TAG_NAME (tp), name) != 0) TYPE_TAG_NAME (tp) = obsavestring (name, strlen (name), - ¤t_objfile->type_obstack); + ¤t_objfile->objfile_obstack); } } @@ -1667,9 +1723,10 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, bad_tag_guess_complaint (sym_name); TYPE_CODE (tp) = type_code; } - if (TYPE_NAME (tp) == NULL || !DEPRECATED_STREQ (TYPE_NAME (tp), name)) + if (TYPE_NAME (tp) == NULL + || strcmp (TYPE_NAME (tp), name) != 0) TYPE_NAME (tp) = obsavestring (name, strlen (name), - ¤t_objfile->type_obstack); + ¤t_objfile->objfile_obstack); } } if (t->bt == btTypedef) @@ -1681,24 +1738,20 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, if (tp == (struct type *) NULL) { complaint (&symfile_complaints, - "unable to cross ref btTypedef for %s", sym_name); - tp = mdebug_type_int; + _("unable to cross ref btTypedef for %s"), sym_name); + tp = basic_type (btInt, current_objfile); } } /* Deal with range types */ if (t->bt == btRange) { - TYPE_NFIELDS (tp) = 2; - TYPE_FIELDS (tp) = ((struct field *) - TYPE_ALLOC (tp, 2 * sizeof (struct field))); - TYPE_FIELD_NAME (tp, 0) = obsavestring ("Low", strlen ("Low"), - ¤t_objfile->type_obstack); - TYPE_FIELD_BITPOS (tp, 0) = AUX_GET_DNLOW (bigend, ax); + TYPE_NFIELDS (tp) = 0; + TYPE_RANGE_DATA (tp) = ((struct range_bounds *) + TYPE_ZALLOC (tp, sizeof (struct range_bounds))); + TYPE_LOW_BOUND (tp) = AUX_GET_DNLOW (bigend, ax); ax++; - TYPE_FIELD_NAME (tp, 1) = obsavestring ("High", strlen ("High"), - ¤t_objfile->type_obstack); - TYPE_FIELD_BITPOS (tp, 1) = AUX_GET_DNHIGH (bigend, ax); + TYPE_HIGH_BOUND (tp) = AUX_GET_DNHIGH (bigend, ax); ax++; } @@ -1731,7 +1784,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, /* Complain for illegal continuations due to corrupt aux entries. */ if (t->continued) - complaint (&symfile_complaints, "illegal TIR continued for %s", sym_name); + complaint (&symfile_complaints, _("illegal TIR continued for %s"), sym_name); return tp; } @@ -1794,8 +1847,8 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend, if (TYPE_CODE (indx) != TYPE_CODE_INT) { complaint (&symfile_complaints, - "illegal array index type for %s, assuming int", sym_name); - indx = mdebug_type_int; + _("illegal array index type for %s, assuming int"), sym_name); + indx = objfile_type (current_objfile)->builtin_int; } /* Get the bounds, and create the array type. */ @@ -1825,12 +1878,9 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend, ignore the erroneous bitsize from the auxiliary entry safely. dbx seems to ignore it too. */ - /* TYPE_FLAG_TARGET_STUB now takes care of the zero TYPE_LENGTH - problem. */ + /* TYPE_TARGET_STUB now takes care of the zero TYPE_LENGTH problem. */ if (TYPE_LENGTH (*tpp) == 0) - { - TYPE_FLAGS (t) |= TYPE_FLAG_TARGET_STUB; - } + TYPE_TARGET_STUB (t) = 1; *tpp = t; return 4 + off; @@ -1844,7 +1894,7 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend, return 0; default: - complaint (&symfile_complaints, "unknown type qualifier 0x%x", tq); + complaint (&symfile_complaints, _("unknown type qualifier 0x%x"), tq); return 0; } } @@ -1852,13 +1902,13 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend, /* Parse a procedure descriptor record PR. Note that the procedure is parsed _after_ the local symbols, now we just insert the extra - information we need into a MIPS_EFI_SYMBOL_NAME symbol that has + information we need into a MDEBUG_EFI_SYMBOL_NAME symbol that has already been placed in the procedure's main block. Note also that images that have been partially stripped (ld -x) have been deprived of local symbols, and we have to cope with them here. FIRST_OFF is the offset of the first procedure for this FDR; we adjust the address by this amount, but I don't know why. SEARCH_SYMTAB is the symtab - to look for the function which contains the MIPS_EFI_SYMBOL_NAME symbol + to look for the function which contains the MDEBUG_EFI_SYMBOL_NAME symbol in question, or NULL to use top_stack->cur_block. */ static void parse_procedure (PDR *, struct symtab *, struct partial_symtab *); @@ -1869,7 +1919,6 @@ parse_procedure (PDR *pr, struct symtab *search_symtab, { struct symbol *s, *i; struct block *b; - struct mips_extra_func_info *e; char *sh_name; /* Simple rule to find files linked "-x" */ @@ -1880,7 +1929,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab, /* Static procedure at address pr->adr. Sigh. */ /* FIXME-32x64. assuming pr->adr fits in long. */ complaint (&symfile_complaints, - "can't handle PDR for static proc at 0x%lx", + _("can't handle PDR for static proc at 0x%lx"), (unsigned long) pr->adr); return; } @@ -1921,7 +1970,8 @@ parse_procedure (PDR *pr, struct symtab *search_symtab, the same name exists, lookup_symbol will eventually read in the symtab for the global function and clobber cur_fdr. */ FDR *save_cur_fdr = cur_fdr; - s = lookup_symbol (sh_name, NULL, VAR_DOMAIN, 0, NULL); + + s = lookup_symbol (sh_name, NULL, VAR_DOMAIN, 0); cur_fdr = save_cur_fdr; #else s = mylookup_symbol @@ -1941,7 +1991,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab, } else { - complaint (&symfile_complaints, "PDR for %s, but no symbol", sh_name); + complaint (&symfile_complaints, _("PDR for %s, but no symbol"), sh_name); #if 1 return; #else @@ -1950,8 +2000,9 @@ parse_procedure (PDR *pr, struct symtab *search_symtab, SYMBOL_DOMAIN (s) = VAR_DOMAIN; SYMBOL_CLASS (s) = LOC_BLOCK; /* Donno its type, hope int is ok */ - SYMBOL_TYPE (s) = lookup_function_type (mdebug_type_int); - add_symbol (s, top_stack->cur_block); + SYMBOL_TYPE (s) + = lookup_function_type (objfile_type (pst->objfile)->builtin_int); + add_symbol (s, top_stack->cur_st, top_stack->cur_block); /* Wont have symbols for this one */ b = new_block (2); SYMBOL_BLOCK_VALUE (s) = b; @@ -1965,13 +2016,14 @@ parse_procedure (PDR *pr, struct symtab *search_symtab, #endif } - i = mylookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_DOMAIN, LOC_CONST); + i = mylookup_symbol (MDEBUG_EFI_SYMBOL_NAME, b, LABEL_DOMAIN, LOC_CONST); if (i) { - e = (struct mips_extra_func_info *) SYMBOL_VALUE (i); + struct mdebug_extra_func_info *e; + + e = (struct mdebug_extra_func_info *) SYMBOL_VALUE_BYTES (i); e->pdr = *pr; - e->pdr.isym = (long) s; /* GDB expects the absolute function start address for the procedure descriptor in e->pdr.adr. @@ -1984,16 +2036,6 @@ parse_procedure (PDR *pr, struct symtab *search_symtab, To work around these problems, we replace e->pdr.adr with the start address of the function. */ e->pdr.adr = BLOCK_START (b); - - /* Correct incorrect setjmp procedure descriptor from the library - to make backtrace through setjmp work. */ - if (e->pdr.pcreg == 0 && DEPRECATED_STREQ (sh_name, "setjmp")) - { - complaint (&symfile_complaints, "fixing bad setjmp PDR from libc"); - e->pdr.pcreg = RA_REGNUM; - e->pdr.regmask = 0x80000000; - e->pdr.regoffset = -4; - } } /* It would be reasonable that functions that have been compiled @@ -2014,19 +2056,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab, if (processing_gcc_compilation == 0 && found_ecoff_debugging_info == 0 && TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (s))) == TYPE_CODE_VOID) - SYMBOL_TYPE (s) = nodebug_func_symbol_type; -} - -/* Relocate the extra function info pointed to by the symbol table. */ - -void -ecoff_relocate_efi (struct symbol *sym, CORE_ADDR delta) -{ - struct mips_extra_func_info *e; - - e = (struct mips_extra_func_info *) SYMBOL_VALUE (sym); - - e->pdr.adr += delta; + SYMBOL_TYPE (s) = objfile_type (pst->objfile)->nodebug_text_symbol; } /* Parse the external symbol ES. Just call parse_symbol() after @@ -2086,7 +2116,7 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets, n_undef_symbols++; /* FIXME: Turn this into a complaint? */ if (info_verbose) - printf_filtered ("Warning: %s `%s' is undefined (in %s)\n", + printf_filtered (_("Warning: %s `%s' is undefined (in %s)\n"), what, debug_info->ssext + es->asym.iss, fdr_name (cur_fdr)); return; @@ -2187,7 +2217,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines, if (lt->nitems >= maxlines) { complaint (&symfile_complaints, - "guessed size of linetable for %s incorrectly", + _("guessed size of linetable for %s incorrectly"), fdr_name (fh)); break; } @@ -2201,16 +2231,96 @@ static void function_outside_compilation_unit_complaint (const char *arg1) { complaint (&symfile_complaints, - "function `%s' appears to be defined outside of all compilation units", + _("function `%s' appears to be defined outside of all compilation units"), arg1); } +/* Use the STORAGE_CLASS to compute which section the given symbol + belongs to, and then records this new minimal symbol. */ + +static void +record_minimal_symbol (const char *name, const CORE_ADDR address, + enum minimal_symbol_type ms_type, int storage_class, + struct objfile *objfile) +{ + int section; + asection *bfd_section; + + switch (storage_class) + { + case scText: + section = SECT_OFF_TEXT (objfile); + bfd_section = bfd_get_section_by_name (cur_bfd, ".text"); + break; + case scData: + section = SECT_OFF_DATA (objfile); + bfd_section = bfd_get_section_by_name (cur_bfd, ".data"); + break; + case scBss: + section = SECT_OFF_BSS (objfile); + bfd_section = bfd_get_section_by_name (cur_bfd, ".bss"); + break; + case scSData: + section = get_section_index (objfile, ".sdata"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".sdata"); + break; + case scSBss: + section = get_section_index (objfile, ".sbss"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".sbss"); + break; + case scRData: + section = get_section_index (objfile, ".rdata"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".rdata"); + break; + case scInit: + section = get_section_index (objfile, ".init"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".init"); + break; + case scXData: + section = get_section_index (objfile, ".xdata"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".xdata"); + break; + case scPData: + section = get_section_index (objfile, ".pdata"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".pdata"); + break; + case scFini: + section = get_section_index (objfile, ".fini"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".fini"); + break; + case scRConst: + section = get_section_index (objfile, ".rconst"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".rconst"); + break; +#ifdef scTlsData + case scTlsData: + section = get_section_index (objfile, ".tlsdata"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsdata"); + break; +#endif +#ifdef scTlsBss + case scTlsBss: + section = get_section_index (objfile, ".tlsbss"); + bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsbss"); + break; +#endif + default: + /* This kind of symbol is not associated to a section. */ + section = -1; + bfd_section = NULL; + } + + prim_record_minimal_symbol_and_info (name, address, ms_type, + section, bfd_section, objfile); +} + /* Master parsing procedure for first-pass reading of file symbols into a partial_symtab. */ static void parse_partial_symbols (struct objfile *objfile) { + struct gdbarch *gdbarch = get_objfile_arch (objfile); const bfd_size_type external_sym_size = debug_swap->external_sym_size; const bfd_size_type external_rfd_size = debug_swap->external_rfd_size; const bfd_size_type external_ext_size = debug_swap->external_ext_size; @@ -2257,7 +2367,7 @@ parse_partial_symbols (struct objfile *objfile) && (bfd_get_section_flags (cur_bfd, text_sect) & SEC_RELOC)) relocatable = 1; - extern_tab = (EXTR *) obstack_alloc (&objfile->psymbol_obstack, + extern_tab = (EXTR *) obstack_alloc (&objfile->objfile_obstack, sizeof (EXTR) * hdr->iextMax); includes_allocated = 30; @@ -2294,6 +2404,7 @@ parse_partial_symbols (struct objfile *objfile) fdr_to_pst++; { struct partial_symtab *pst = new_psymtab ("", objfile); + fdr_to_pst[-1].pst = pst; FDR_IDX (pst) = -1; } @@ -2301,7 +2412,7 @@ parse_partial_symbols (struct objfile *objfile) /* Allocate the global pending list. */ pending_list = ((struct mdebug_pending **) - obstack_alloc (&objfile->psymbol_obstack, + obstack_alloc (&objfile->objfile_obstack, hdr->ifdMax * sizeof (struct mdebug_pending *))); memset (pending_list, 0, hdr->ifdMax * sizeof (struct mdebug_pending *)); @@ -2382,14 +2493,14 @@ parse_partial_symbols (struct objfile *objfile) if (ext_in->ifd < -1 || ext_in->ifd >= hdr->ifdMax) { complaint (&symfile_complaints, - "bad ifd for external symbol: %d (max %ld)", ext_in->ifd, + _("bad ifd for external symbol: %d (max %ld)"), ext_in->ifd, hdr->ifdMax); continue; } if (ext_in->asym.iss < 0 || ext_in->asym.iss >= hdr->issExtMax) { complaint (&symfile_complaints, - "bad iss for external symbol: %ld (max %ld)", + _("bad iss for external symbol: %ld (max %ld)"), ext_in->asym.iss, hdr->issExtMax); continue; } @@ -2519,7 +2630,8 @@ parse_partial_symbols (struct objfile *objfile) unknown_ext_complaint (name); } if (!ECOFF_IN_ELF (cur_bfd)) - prim_record_minimal_symbol (name, svalue, ms_type, objfile); + record_minimal_symbol (name, svalue, ms_type, ext_in->asym.sc, + objfile); } /* Pass 3 over files, over local syms: fill in static symbols */ @@ -2552,9 +2664,8 @@ parse_partial_symbols (struct objfile *objfile) textlow, objfile->global_psymbols.next, objfile->static_psymbols.next); - pst->read_symtab_private = ((char *) - obstack_alloc (&objfile->psymbol_obstack, - sizeof (struct symloc))); + pst->read_symtab_private = obstack_alloc (&objfile->objfile_obstack, + sizeof (struct symloc)); memset (pst->read_symtab_private, 0, sizeof (struct symloc)); save_pst = pst; @@ -2608,7 +2719,8 @@ parse_partial_symbols (struct objfile *objfile) ((char *) debug_info->external_sym + (fh->isymBase + 1) * external_sym_size), &sh); - if (DEPRECATED_STREQ (debug_info->ss + fh->issBase + sh.iss, stabs_symbol)) + if (strcmp (debug_info->ss + fh->issBase + sh.iss, + stabs_symbol) == 0) processing_gcc_compilation = 2; } @@ -2635,13 +2747,9 @@ parse_partial_symbols (struct objfile *objfile) if (sh.st == stStaticProc) { namestring = debug_info->ss + fh->issBase + sh.iss; - prim_record_minimal_symbol_and_info (namestring, - sh.value, - mst_file_text, - NULL, - SECT_OFF_TEXT (objfile), - NULL, - objfile); + record_minimal_symbol (namestring, sh.value, + mst_file_text, sh.sc, + objfile); } procaddr = sh.value; @@ -2683,13 +2791,9 @@ parse_partial_symbols (struct objfile *objfile) case scXData: namestring = debug_info->ss + fh->issBase + sh.iss; sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile)); - prim_record_minimal_symbol_and_info (namestring, - sh.value, - mst_file_data, - NULL, - SECT_OFF_DATA (objfile), - NULL, - objfile); + record_minimal_symbol (namestring, sh.value, + mst_file_data, sh.sc, + objfile); break; default: @@ -2697,13 +2801,9 @@ parse_partial_symbols (struct objfile *objfile) then have the default be abs? */ namestring = debug_info->ss + fh->issBase + sh.iss; sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile)); - prim_record_minimal_symbol_and_info (namestring, - sh.value, - mst_file_bss, - NULL, - SECT_OFF_BSS (objfile), - NULL, - objfile); + record_minimal_symbol (namestring, sh.value, + mst_file_bss, sh.sc, + objfile); break; } } @@ -2713,6 +2813,7 @@ parse_partial_symbols (struct objfile *objfile) { char *stabstring = debug_info->ss + fh->issBase + sh.iss; int len = strlen (stabstring); + while (stabstring[len - 1] == '\\') { SYMR sh2; @@ -2749,6 +2850,7 @@ parse_partial_symbols (struct objfile *objfile) switch (type_code) { char *p; + /* * Standard, external, non-debugger, symbols */ @@ -2839,25 +2941,23 @@ parse_partial_symbols (struct objfile *objfile) prev_textlow_not_set = textlow_not_set; -#ifdef SOFUN_ADDRESS_MAYBE_MISSING /* A zero value is probably an indication for the SunPRO 3.0 compiler. end_psymtab explicitly tests for zero, so don't relocate it. */ - if (sh.value == 0) + if (sh.value == 0 + && gdbarch_sofun_address_maybe_missing (gdbarch)) { textlow_not_set = 1; valu = 0; } else textlow_not_set = 0; -#else - textlow_not_set = 0; -#endif + past_first_source_file = 1; if (prev_so_symnum != symnum - 1) - { /* Here if prev stab wasn't N_SO */ + { /* Here if prev stab wasn't N_SO */ first_so_symnum = symnum; if (pst) @@ -2903,6 +3003,7 @@ parse_partial_symbols (struct objfile *objfile) case N_SOL: { enum language tmp_language; + /* Mark down an include file in the current psymtab */ /* SET_NAMESTRING ();*/ @@ -2929,12 +3030,15 @@ parse_partial_symbols (struct objfile *objfile) things like "break c-exp.y:435" need to work (I suppose the psymtab_include_list could be hashed or put in a binary tree, if profiling shows this is a major hog). */ - if (pst && DEPRECATED_STREQ (namestring, pst->filename)) + if (pst && strcmp (namestring, pst->filename) == 0) continue; + { int i; + for (i = 0; i < includes_used; i++) - if (DEPRECATED_STREQ (namestring, psymtab_include_list[i])) + if (strcmp (namestring, + psymtab_include_list[i]) == 0) { i = -1; break; @@ -2993,10 +3097,12 @@ parse_partial_symbols (struct objfile *objfile) { case 'S': sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile)); -#ifdef STATIC_TRANSFORM_NAME - namestring = STATIC_TRANSFORM_NAME (namestring); -#endif - add_psymbol_to_list (namestring, p - namestring, + + if (gdbarch_static_transform_name_p (gdbarch)) + namestring = gdbarch_static_transform_name + (gdbarch, namestring); + + add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_STATIC, &objfile->static_psymbols, 0, sh.value, @@ -3006,7 +3112,7 @@ parse_partial_symbols (struct objfile *objfile) sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile)); /* The addresses in these entries are reported to be wrong. See the code that reads 'G's for symtabs. */ - add_psymbol_to_list (namestring, p - namestring, + add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_STATIC, &objfile->global_psymbols, 0, sh.value, @@ -3024,7 +3130,7 @@ parse_partial_symbols (struct objfile *objfile) || (p == namestring + 1 && namestring[0] != ' ')) { - add_psymbol_to_list (namestring, p - namestring, + add_psymbol_to_list (namestring, p - namestring, 1, STRUCT_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, sh.value, 0, @@ -3033,6 +3139,7 @@ parse_partial_symbols (struct objfile *objfile) { /* Also a typedef with the same name. */ add_psymbol_to_list (namestring, p - namestring, + 1, VAR_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, sh.value, 0, @@ -3044,7 +3151,7 @@ parse_partial_symbols (struct objfile *objfile) case 't': if (p != namestring) /* a name is there, not just :T... */ { - add_psymbol_to_list (namestring, p - namestring, + add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, sh.value, 0, @@ -3106,7 +3213,7 @@ parse_partial_symbols (struct objfile *objfile) ; /* Note that the value doesn't matter for enum constants in psymtabs, just in symtabs. */ - add_psymbol_to_list (p, q - p, + add_psymbol_to_list (p, q - p, 1, VAR_DOMAIN, LOC_CONST, &objfile->static_psymbols, 0, 0, psymtab_language, objfile); @@ -3123,7 +3230,7 @@ parse_partial_symbols (struct objfile *objfile) continue; case 'c': /* Constant, e.g. from "const" in Pascal. */ - add_psymbol_to_list (namestring, p - namestring, + add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_CONST, &objfile->static_psymbols, sh.value, 0, psymtab_language, objfile); @@ -3134,13 +3241,14 @@ parse_partial_symbols (struct objfile *objfile) { int name_len = p - namestring; char *name = xmalloc (name_len + 1); + memcpy (name, namestring, name_len); name[name_len] = '\0'; function_outside_compilation_unit_complaint (name); xfree (name); } sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - add_psymbol_to_list (namestring, p - namestring, + add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_BLOCK, &objfile->static_psymbols, 0, sh.value, @@ -3155,13 +3263,14 @@ parse_partial_symbols (struct objfile *objfile) { int name_len = p - namestring; char *name = xmalloc (name_len + 1); + memcpy (name, namestring, name_len); name[name_len] = '\0'; function_outside_compilation_unit_complaint (name); xfree (name); } sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - add_psymbol_to_list (namestring, p - namestring, + add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_BLOCK, &objfile->global_psymbols, 0, sh.value, @@ -3206,7 +3315,7 @@ parse_partial_symbols (struct objfile *objfile) a backslash. */ complaint (&symfile_complaints, - "unknown symbol descriptor `%c'", p[1]); + _("unknown symbol descriptor `%c'"), p[1]); /* Ignore it; perhaps it is an extension that we don't know about. */ @@ -3217,19 +3326,18 @@ parse_partial_symbols (struct objfile *objfile) continue; case N_ENDM: -#ifdef SOFUN_ADDRESS_MAYBE_MISSING /* Solaris 2 end of module, finish current partial symbol table. END_PSYMTAB will set pst->texthigh to the proper value, which is necessary if a module compiled without debugging info follows this module. */ - if (pst) + if (pst + && gdbarch_sofun_address_maybe_missing (gdbarch)) { pst = (struct partial_symtab *) 0; includes_used = 0; dependencies_used = 0; } -#endif continue; case N_RBRAC: @@ -3267,8 +3375,8 @@ parse_partial_symbols (struct objfile *objfile) default: /* If we haven't found it yet, ignore it. It's probably some new type we don't know about yet. */ - complaint (&symfile_complaints, "unknown symbol type %s", - local_hex_string (type_code)); /*CUR_SYMBOL_TYPE*/ + complaint (&symfile_complaints, _("unknown symbol type %s"), + hex_string (type_code)); /*CUR_SYMBOL_TYPE*/ continue; } if (stabstring @@ -3339,7 +3447,7 @@ parse_partial_symbols (struct objfile *objfile) case stStaticProc: prim_record_minimal_symbol_and_info (name, sh.value, - mst_file_text, NULL, + mst_file_text, SECT_OFF_TEXT (objfile), NULL, objfile); @@ -3364,7 +3472,7 @@ parse_partial_symbols (struct objfile *objfile) { /* This should not happen either... FIXME. */ complaint (&symfile_complaints, - "bad proc end in aux found from symbol %s", + _("bad proc end in aux found from symbol %s"), name); new_sdx = cur_sdx + 1; /* Don't skip backward */ } @@ -3391,12 +3499,12 @@ parse_partial_symbols (struct objfile *objfile) symbol table, and the MAIN__ symbol via the minimal symbol table. */ if (sh.st == stProc) - add_psymbol_to_list (name, strlen (name), + add_psymbol_to_list (name, strlen (name), 1, VAR_DOMAIN, LOC_BLOCK, &objfile->global_psymbols, 0, sh.value, psymtab_language, objfile); else - add_psymbol_to_list (name, strlen (name), + add_psymbol_to_list (name, strlen (name), 1, VAR_DOMAIN, LOC_BLOCK, &objfile->static_psymbols, 0, sh.value, psymtab_language, objfile); @@ -3425,13 +3533,13 @@ parse_partial_symbols (struct objfile *objfile) case stStatic: /* Variable */ if (SC_IS_DATA (sh.sc)) prim_record_minimal_symbol_and_info (name, sh.value, - mst_file_data, NULL, + mst_file_data, SECT_OFF_DATA (objfile), NULL, objfile); else prim_record_minimal_symbol_and_info (name, sh.value, - mst_file_bss, NULL, + mst_file_bss, SECT_OFF_BSS (objfile), NULL, objfile); @@ -3465,7 +3573,7 @@ parse_partial_symbols (struct objfile *objfile) && sh.iss != 0 && sh.index != cur_sdx + 2) { - add_psymbol_to_list (name, strlen (name), + add_psymbol_to_list (name, strlen (name), 1, STRUCT_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, 0, (CORE_ADDR) 0, @@ -3479,7 +3587,7 @@ parse_partial_symbols (struct objfile *objfile) { /* This happens with the Ultrix kernel. */ complaint (&symfile_complaints, - "bad aux index at block symbol %s", name); + _("bad aux index at block symbol %s"), name); new_sdx = cur_sdx + 1; /* Don't skip backward */ } cur_sdx = new_sdx; @@ -3499,14 +3607,14 @@ parse_partial_symbols (struct objfile *objfile) default: /* Both complaints are valid: one gives symbol name, the other the offending symbol type. */ - complaint (&symfile_complaints, "unknown local symbol %s", + complaint (&symfile_complaints, _("unknown local symbol %s"), name); - complaint (&symfile_complaints, "with type %d", sh.st); + complaint (&symfile_complaints, _("with type %d"), sh.st); cur_sdx++; continue; } /* Use this gdb symbol */ - add_psymbol_to_list (name, strlen (name), + add_psymbol_to_list (name, strlen (name), 1, VAR_DOMAIN, class, &objfile->static_psymbols, 0, sh.value, psymtab_language, objfile); @@ -3527,7 +3635,7 @@ parse_partial_symbols (struct objfile *objfile) CORE_ADDR svalue; if (ext_ptr->ifd != f_idx) - internal_error (__FILE__, __LINE__, "failed internal consistency check"); + internal_error (__FILE__, __LINE__, _("failed internal consistency check")); psh = &ext_ptr->asym; /* Do not add undefined symbols to the partial symbol table. */ @@ -3582,7 +3690,7 @@ parse_partial_symbols (struct objfile *objfile) break; } name = debug_info->ssext + psh->iss; - add_psymbol_to_list (name, strlen (name), + add_psymbol_to_list (name, strlen (name), 1, VAR_DOMAIN, class, &objfile->global_psymbols, 0, svalue, @@ -3599,13 +3707,6 @@ parse_partial_symbols (struct objfile *objfile) includes_used = 0; dependencies_used = 0; - if (objfile->ei.entry_point >= save_pst->textlow && - objfile->ei.entry_point < save_pst->texthigh) - { - objfile->ei.deprecated_entry_file_lowpc = save_pst->textlow; - objfile->ei.deprecated_entry_file_highpc = save_pst->texthigh; - } - /* The objfile has its functions reordered if this partial symbol table overlaps any other partial symbol table. We cannot assume a reordered objfile if a partial symbol table @@ -3654,7 +3755,7 @@ parse_partial_symbols (struct objfile *objfile) pst->number_of_dependencies = 0; pst->dependencies = ((struct partial_symtab **) - obstack_alloc (&objfile->psymbol_obstack, + obstack_alloc (&objfile->objfile_obstack, ((fh->crfd - 1) * sizeof (struct partial_symtab *)))); for (s_idx = 1; s_idx < fh->crfd; s_idx++) @@ -3667,7 +3768,7 @@ parse_partial_symbols (struct objfile *objfile) &rh); if (rh < 0 || rh >= hdr->ifdMax) { - complaint (&symfile_complaints, "bad file number %ld", rh); + complaint (&symfile_complaints, _("bad file number %ld"), rh); continue; } @@ -3752,7 +3853,7 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype, /* Note that the value doesn't matter for enum constants in psymtabs, just in symtabs. */ - add_psymbol_to_list (name, strlen (name), + add_psymbol_to_list (name, strlen (name), 1, VAR_DOMAIN, LOC_CONST, &objfile->static_psymbols, 0, (CORE_ADDR) 0, psymtab_language, objfile); @@ -3861,8 +3962,8 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename) ((char *) debug_info->external_sym + (fh->isymBase + 1) * external_sym_size), &sh); - if (DEPRECATED_STREQ (debug_info->ss + fh->issBase + sh.iss, - stabs_symbol)) + if (strcmp (debug_info->ss + fh->issBase + sh.iss, + stabs_symbol) == 0) { /* We indicate that this is a GCC compilation so that certain features will be enabled in stabsread/dbxread. */ @@ -3872,6 +3973,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename) if (processing_gcc_compilation != 0) { + struct gdbarch *gdbarch = get_objfile_arch (pst->objfile); /* This symbol table contains stabs-in-ecoff entries. */ @@ -3939,17 +4041,17 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename) { /* Make up special symbol to contain procedure specific info */ - struct mips_extra_func_info *e = - ((struct mips_extra_func_info *) - obstack_alloc (¤t_objfile->symbol_obstack, - sizeof (struct mips_extra_func_info))); - struct symbol *s = new_symbol (MIPS_EFI_SYMBOL_NAME); + struct mdebug_extra_func_info *e = + ((struct mdebug_extra_func_info *) + obstack_alloc (¤t_objfile->objfile_obstack, + sizeof (struct mdebug_extra_func_info))); + struct symbol *s = new_symbol (MDEBUG_EFI_SYMBOL_NAME); - memset (e, 0, sizeof (struct mips_extra_func_info)); + memset (e, 0, sizeof (struct mdebug_extra_func_info)); SYMBOL_DOMAIN (s) = LABEL_DOMAIN; SYMBOL_CLASS (s) = LOC_CONST; - SYMBOL_TYPE (s) = mdebug_type_void; - SYMBOL_VALUE (s) = (long) e; + SYMBOL_TYPE (s) = objfile_type (pst->objfile)->builtin_void; + SYMBOL_VALUE_BYTES (s) = (gdb_byte *) e; e->pdr.framereg = -1; add_symbol_to_list (s, &local_symbols); } @@ -3966,7 +4068,8 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename) { /* Handle encoded stab line number. */ valu += ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (pst->objfile)); - record_line (current_subfile, sh.index, valu); + record_line (current_subfile, sh.index, + gdbarch_addr_bits_remove (gdbarch, valu)); } } else if (sh.st == stProc || sh.st == stStaticProc @@ -3974,7 +4077,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename) /* These are generated by gcc-2.x, do not complain */ ; else - complaint (&symfile_complaints, "unknown stabs symbol %s", name); + complaint (&symfile_complaints, _("unknown stabs symbol %s"), name); } if (! last_symtab_ended) @@ -4032,7 +4135,6 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename) { /* This symbol table contains ordinary ecoff entries. */ - int f_max; int maxlines; EXTR *ext_ptr; @@ -4157,7 +4259,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename) from a shared library, so tell the user only if verbose is on. */ if (info_verbose && n_undef_symbols) { - printf_filtered ("File %s contains %d unresolved references:", + printf_filtered (_("File %s contains %d unresolved references:"), st->filename, n_undef_symbols); printf_filtered ("\n\t%4d variables\n\t%4d procedures\n\t%4d labels\n", n_undef_vars, n_undef_procs, n_undef_labels); @@ -4330,7 +4432,7 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_cod &tir); if (tir.tq0 != tqNil) complaint (&symfile_complaints, - "illegal tq0 in forward typedef for %s", sym_name); + _("illegal tq0 in forward typedef for %s"), sym_name); switch (tir.bt) { case btVoid: @@ -4368,7 +4470,7 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_cod default: complaint (&symfile_complaints, - "illegal bt %d in forward typedef for %s", tir.bt, + _("illegal bt %d in forward typedef for %s"), tir.bt, sym_name); *tpp = init_type (type_code, 0, 0, (char *) NULL, current_objfile); @@ -4423,10 +4525,10 @@ mylookup_symbol (char *name, struct block *block, inc = name[0]; ALL_BLOCK_SYMBOLS (block, iter, sym) { - if (DEPRECATED_SYMBOL_NAME (sym)[0] == inc + if (SYMBOL_LINKAGE_NAME (sym)[0] == inc && SYMBOL_DOMAIN (sym) == domain && SYMBOL_CLASS (sym) == class - && strcmp (DEPRECATED_SYMBOL_NAME (sym), name) == 0) + && strcmp (SYMBOL_LINKAGE_NAME (sym), name) == 0) return sym; } @@ -4440,8 +4542,9 @@ mylookup_symbol (char *name, struct block *block, /* Add a new symbol S to a block B. */ static void -add_symbol (struct symbol *s, struct block *b) +add_symbol (struct symbol *s, struct symtab *symtab, struct block *b) { + SYMBOL_SYMTAB (s) = symtab; dict_add_symbol (BLOCK_DICT (b), s); } @@ -4502,7 +4605,7 @@ add_line (struct linetable *lt, int lineno, CORE_ADDR adr, int last) static int compare_blocks (const void *arg1, const void *arg2) { - int addr_diff; + LONGEST addr_diff; struct block **b1 = (struct block **) arg1; struct block **b2 = (struct block **) arg2; @@ -4584,8 +4687,7 @@ new_symtab (char *name, int maxlines, struct objfile *objfile) BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK); s->free_code = free_linetable; - s->debugformat = obsavestring ("ECOFF", 5, - &objfile->symbol_obstack); + s->debugformat = "ECOFF"; return (s); } @@ -4601,9 +4703,8 @@ new_psymtab (char *name, struct objfile *objfile) /* Keep a backpointer to the file's symbols */ - psymtab->read_symtab_private = ((char *) - obstack_alloc (&objfile->psymbol_obstack, - sizeof (struct symloc))); + psymtab->read_symtab_private = obstack_alloc (&objfile->objfile_obstack, + sizeof (struct symloc)); memset (psymtab->read_symtab_private, 0, sizeof (struct symloc)); CUR_BFD (psymtab) = cur_bfd; DEBUG_SWAP (psymtab) = debug_swap; @@ -4640,7 +4741,6 @@ new_linetable (int size) static struct linetable * shrink_linetable (struct linetable *lt) { - return (struct linetable *) xrealloc ((void *) lt, (sizeof (struct linetable) + ((lt->nitems - 1) @@ -4690,12 +4790,12 @@ static struct symbol * new_symbol (char *name) { struct symbol *s = ((struct symbol *) - obstack_alloc (¤t_objfile->symbol_obstack, + obstack_alloc (¤t_objfile->objfile_obstack, sizeof (struct symbol))); memset (s, 0, sizeof (*s)); - SYMBOL_LANGUAGE (s) = psymtab_language; - SYMBOL_SET_NAMES (s, name, strlen (name), current_objfile); + SYMBOL_SET_LANGUAGE (s, psymtab_language); + SYMBOL_SET_NAMES (s, name, strlen (name), 1, current_objfile); return s; } @@ -4708,7 +4808,7 @@ new_type (char *name) t = alloc_type (current_objfile); TYPE_NAME (t) = name; - TYPE_CPLUS_SPECIFIC (t) = (struct cplus_struct_type *) &cplus_struct_default; + INIT_CPLUS_SPECIFIC (t); return t; } @@ -4733,11 +4833,11 @@ elfmdebug_build_psymtabs (struct objfile *objfile, back_to = make_cleanup_discard_minimal_symbols (); info = ((struct ecoff_debug_info *) - obstack_alloc (&objfile->psymbol_obstack, + obstack_alloc (&objfile->objfile_obstack, sizeof (struct ecoff_debug_info))); if (!(*swap->read_debug_info) (abfd, sec, info)) - error ("Error reading ECOFF debugging information: %s", + error (_("Error reading ECOFF debugging information: %s"), bfd_errmsg (bfd_get_error ())); mdebug_build_psymtabs (objfile, swap, info); @@ -4745,246 +4845,9 @@ elfmdebug_build_psymtabs (struct objfile *objfile, install_minimal_symbols (objfile); do_cleanups (back_to); } - - -/* Things used for calling functions in the inferior. - These functions are exported to our companion - mips-tdep.c file and are here because they play - with the symbol-table explicitly. */ - -/* Sigtramp: make sure we have all the necessary information - about the signal trampoline code. Since the official code - from MIPS does not do so, we make up that information ourselves. - If they fix the library (unlikely) this code will neutralize itself. */ - -/* FIXME: This function is called only by mips-tdep.c. It needs to be - here because it calls functions defined in this file, but perhaps - this could be handled in a better way. Only compile it in when - tm-mips.h is included. */ - -#ifdef TM_MIPS_H - -void -fixup_sigtramp (void) -{ - struct symbol *s; - struct symtab *st; - struct block *b, *b0 = NULL; - - sigtramp_address = -1; - - /* We have to handle the following cases here: - a) The Mips library has a sigtramp label within sigvec. - b) Irix has a _sigtramp which we want to use, but it also has sigvec. */ - s = lookup_symbol ("sigvec", 0, VAR_DOMAIN, 0, NULL); - if (s != 0) - { - b0 = SYMBOL_BLOCK_VALUE (s); - s = lookup_symbol ("sigtramp", b0, VAR_DOMAIN, 0, NULL); - } - if (s == 0) - { - /* No sigvec or no sigtramp inside sigvec, try _sigtramp. */ - s = lookup_symbol ("_sigtramp", 0, VAR_DOMAIN, 0, NULL); - } - - /* But maybe this program uses its own version of sigvec */ - if (s == 0) - return; - - /* Did we or MIPSco fix the library ? */ - if (SYMBOL_CLASS (s) == LOC_BLOCK) - { - sigtramp_address = BLOCK_START (SYMBOL_BLOCK_VALUE (s)); - sigtramp_end = BLOCK_END (SYMBOL_BLOCK_VALUE (s)); - return; - } - - sigtramp_address = SYMBOL_VALUE (s); - sigtramp_end = sigtramp_address + 0x88; /* black magic */ - - /* But what symtab does it live in ? */ - st = find_pc_symtab (SYMBOL_VALUE (s)); - - /* - * Ok, there goes the fix: turn it into a procedure, with all the - * needed info. Note we make it a nested procedure of sigvec, - * which is the way the (assembly) code is actually written. - */ - SYMBOL_DOMAIN (s) = VAR_DOMAIN; - SYMBOL_CLASS (s) = LOC_BLOCK; - SYMBOL_TYPE (s) = init_type (TYPE_CODE_FUNC, 4, 0, (char *) NULL, - st->objfile); - TYPE_TARGET_TYPE (SYMBOL_TYPE (s)) = mdebug_type_void; - - /* Need a block to allocate MIPS_EFI_SYMBOL_NAME in */ - b = new_block (NON_FUNCTION_BLOCK); - SYMBOL_BLOCK_VALUE (s) = b; - BLOCK_START (b) = sigtramp_address; - BLOCK_END (b) = sigtramp_end; - BLOCK_FUNCTION (b) = s; - BLOCK_SUPERBLOCK (b) = BLOCK_SUPERBLOCK (b0); - add_block (b, st); - sort_blocks (st); - - /* Make a MIPS_EFI_SYMBOL_NAME entry for it */ - { - struct mips_extra_func_info *e = - ((struct mips_extra_func_info *) - xzalloc (sizeof (struct mips_extra_func_info))); - - e->numargs = 0; /* the kernel thinks otherwise */ - e->pdr.frameoffset = 32; - e->pdr.framereg = SP_REGNUM; - /* Note that setting pcreg is no longer strictly necessary as - mips_frame_saved_pc is now aware of signal handler frames. */ - e->pdr.pcreg = PC_REGNUM; - e->pdr.regmask = -2; - /* Offset to saved r31, in the sigtramp case the saved registers - are above the frame in the sigcontext. - We have 4 alignment bytes, 12 bytes for onstack, mask and pc, - 32 * 4 bytes for the general registers, 12 bytes for mdhi, mdlo, ownedfp - and 32 * 4 bytes for the floating point registers. */ - e->pdr.regoffset = 4 + 12 + 31 * 4; - e->pdr.fregmask = -1; - /* Offset to saved f30 (first saved *double* register). */ - e->pdr.fregoffset = 4 + 12 + 32 * 4 + 12 + 30 * 4; - e->pdr.isym = (long) s; - e->pdr.adr = sigtramp_address; - - current_objfile = st->objfile; /* Keep new_symbol happy */ - s = new_symbol (MIPS_EFI_SYMBOL_NAME); - SYMBOL_VALUE (s) = (long) e; - SYMBOL_DOMAIN (s) = LABEL_DOMAIN; - SYMBOL_CLASS (s) = LOC_CONST; - SYMBOL_TYPE (s) = mdebug_type_void; - current_objfile = NULL; - } - - dict_add_symbol (BLOCK_DICT (b), s); -} - -#endif /* TM_MIPS_H */ void _initialize_mdebugread (void) { - mdebug_type_void = - init_type (TYPE_CODE_VOID, 1, - 0, - "void", (struct objfile *) NULL); - mdebug_type_char = - init_type (TYPE_CODE_INT, 1, - 0, - "char", (struct objfile *) NULL); - mdebug_type_unsigned_char = - init_type (TYPE_CODE_INT, 1, - TYPE_FLAG_UNSIGNED, - "unsigned char", (struct objfile *) NULL); - mdebug_type_short = - init_type (TYPE_CODE_INT, 2, - 0, - "short", (struct objfile *) NULL); - mdebug_type_unsigned_short = - init_type (TYPE_CODE_INT, 2, - TYPE_FLAG_UNSIGNED, - "unsigned short", (struct objfile *) NULL); - mdebug_type_int_32 = - init_type (TYPE_CODE_INT, 4, - 0, - "int", (struct objfile *) NULL); - mdebug_type_unsigned_int_32 = - init_type (TYPE_CODE_INT, 4, - TYPE_FLAG_UNSIGNED, - "unsigned int", (struct objfile *) NULL); - mdebug_type_int_64 = - init_type (TYPE_CODE_INT, 8, - 0, - "int", (struct objfile *) NULL); - mdebug_type_unsigned_int_64 = - init_type (TYPE_CODE_INT, 8, - TYPE_FLAG_UNSIGNED, - "unsigned int", (struct objfile *) NULL); - mdebug_type_long_32 = - init_type (TYPE_CODE_INT, 4, - 0, - "long", (struct objfile *) NULL); - mdebug_type_unsigned_long_32 = - init_type (TYPE_CODE_INT, 4, - TYPE_FLAG_UNSIGNED, - "unsigned long", (struct objfile *) NULL); - mdebug_type_long_64 = - init_type (TYPE_CODE_INT, 8, - 0, - "long", (struct objfile *) NULL); - mdebug_type_unsigned_long_64 = - init_type (TYPE_CODE_INT, 8, - TYPE_FLAG_UNSIGNED, - "unsigned long", (struct objfile *) NULL); - mdebug_type_long_long_64 = - init_type (TYPE_CODE_INT, 8, - 0, - "long long", (struct objfile *) NULL); - mdebug_type_unsigned_long_long_64 = - init_type (TYPE_CODE_INT, 8, - TYPE_FLAG_UNSIGNED, - "unsigned long long", (struct objfile *) NULL); - mdebug_type_adr_32 = - init_type (TYPE_CODE_PTR, 4, - TYPE_FLAG_UNSIGNED, - "adr_32", (struct objfile *) NULL); - TYPE_TARGET_TYPE (mdebug_type_adr_32) = mdebug_type_void; - mdebug_type_adr_64 = - init_type (TYPE_CODE_PTR, 8, - TYPE_FLAG_UNSIGNED, - "adr_64", (struct objfile *) NULL); - TYPE_TARGET_TYPE (mdebug_type_adr_64) = mdebug_type_void; - mdebug_type_float = - init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT, - 0, - "float", (struct objfile *) NULL); - mdebug_type_double = - init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT, - 0, - "double", (struct objfile *) NULL); - mdebug_type_complex = - init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT, - 0, - "complex", (struct objfile *) NULL); - TYPE_TARGET_TYPE (mdebug_type_complex) = mdebug_type_float; - mdebug_type_double_complex = - init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT, - 0, - "double complex", (struct objfile *) NULL); - TYPE_TARGET_TYPE (mdebug_type_double_complex) = mdebug_type_double; - - /* Is a "string" the way btString means it the same as TYPE_CODE_STRING? - FIXME. */ - mdebug_type_string = - init_type (TYPE_CODE_STRING, - TARGET_CHAR_BIT / TARGET_CHAR_BIT, - 0, "string", - (struct objfile *) NULL); - - /* We use TYPE_CODE_INT to print these as integers. Does this do any - good? Would we be better off with TYPE_CODE_ERROR? Should - TYPE_CODE_ERROR print things in hex if it knows the size? */ - mdebug_type_fixed_dec = - init_type (TYPE_CODE_INT, - TARGET_INT_BIT / TARGET_CHAR_BIT, - 0, "fixed decimal", - (struct objfile *) NULL); - - mdebug_type_float_dec = - init_type (TYPE_CODE_ERROR, - TARGET_DOUBLE_BIT / TARGET_CHAR_BIT, - 0, "floating decimal", - (struct objfile *) NULL); - - nodebug_func_symbol_type = init_type (TYPE_CODE_FUNC, 1, 0, - "", NULL); - TYPE_TARGET_TYPE (nodebug_func_symbol_type) = mdebug_type_int; - nodebug_var_symbol_type = - init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0, - "", NULL); + basic_type_data = register_objfile_data (); }