X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fmdebugread.c;h=04678168113d29665c0335c2ad07df7a02484a59;hb=8464be768129e057bc92e27de51317b99717da8f;hp=7d29b978d2ff7231f8ed7ed26193bb1c896533a2;hpb=1c9e835890dbd86ed06acc2820fd80fc586a3e5d;p=binutils-gdb.git diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 7d29b978d2f..04678168113 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -1,7 +1,7 @@ /* Read a symbol table in ECOFF format (Third-Eye). Copyright (C) 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, - 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009 + 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 @@ -57,6 +57,7 @@ #include "mdebugread.h" #include "gdb_stat.h" #include "gdb_string.h" +#include "psympriv.h" #include "bfd.h" @@ -270,7 +271,6 @@ static char *mdebug_next_symbol_text (struct objfile *); static void mdebug_psymtab_to_symtab (struct partial_symtab *pst) { - if (!pst) return; @@ -752,6 +752,7 @@ 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). */ @@ -997,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->objfile_obstack, - "", "", name); + TYPE_TAG_NAME (t) = obconcat (¤t_objfile->objfile_obstack, name, + (char *) NULL); TYPE_CODE (t) = type_code; TYPE_LENGTH (t) = sh->value; @@ -1153,6 +1154,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, 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) @@ -1173,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)); @@ -1575,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) { @@ -1662,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 @@ -1743,13 +1746,11 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs, /* 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) = "Low"; + 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) = "High"; TYPE_HIGH_BOUND (tp) = AUX_GET_DNHIGH (bigend, ax); ax++; } @@ -1969,6 +1970,7 @@ 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); cur_fdr = save_cur_fdr; #else @@ -2402,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; } @@ -2661,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->objfile_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; @@ -2811,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; @@ -2847,6 +2850,7 @@ parse_partial_symbols (struct objfile *objfile) switch (type_code) { char *p; + /* * Standard, external, non-debugger, symbols */ @@ -2953,7 +2957,7 @@ parse_partial_symbols (struct objfile *objfile) 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) @@ -2999,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 ();*/ @@ -3027,8 +3032,10 @@ parse_partial_symbols (struct objfile *objfile) in a binary tree, if profiling shows this is a major hog). */ if (pst && strcmp (namestring, pst->filename) == 0) continue; + { int i; + for (i = 0; i < includes_used; i++) if (strcmp (namestring, psymtab_include_list[i]) == 0) @@ -3095,7 +3102,7 @@ parse_partial_symbols (struct objfile *objfile) namestring = gdbarch_static_transform_name (gdbarch, namestring); - add_psymbol_to_list (namestring, p - namestring, + add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_STATIC, &objfile->static_psymbols, 0, sh.value, @@ -3105,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, @@ -3123,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, @@ -3132,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, @@ -3143,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, @@ -3205,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); @@ -3222,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); @@ -3233,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, @@ -3254,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, @@ -3489,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); @@ -3563,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, @@ -3604,7 +3614,7 @@ parse_partial_symbols (struct objfile *objfile) 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); @@ -3680,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, @@ -3843,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); @@ -4032,9 +4042,9 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename) /* Make up special symbol to contain procedure specific info */ struct mdebug_extra_func_info *e = - ((struct mdebug_extra_func_info *) - obstack_alloc (¤t_objfile->objfile_obstack, - sizeof (struct mdebug_extra_func_info))); + ((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 mdebug_extra_func_info)); @@ -4125,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; @@ -4694,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->objfile_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; @@ -4733,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) @@ -4787,8 +4794,8 @@ new_symbol (char *name) 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; } @@ -4801,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; }