X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcoffread.c;h=7fbdcc4f68fb6742634d328bfd5e73ef26a87cb3;hb=a65189c980ccd5370bc2d020220f66d1dd327190;hp=6e379dd1e5241bbe26c15d32ddab11df803db002;hpb=caa429d81a9999699a40b6394c9fb7b258669d54;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/coffread.c b/gdb/coffread.c index 6e379dd1e5..7fbdcc4f68 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -1,5 +1,5 @@ /* Read coff symbol tables and convert to internal format, for GDB. - Copyright (C) 1987-2019 Free Software Foundation, Inc. + Copyright (C) 1987-2020 Free Software Foundation, Inc. Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu). This file is part of GDB. @@ -222,15 +222,15 @@ coff_locate_sections (bfd *abfd, asection *sectp, void *csip) const char *name; csi = (struct coff_symfile_info *) csip; - name = bfd_get_section_name (abfd, sectp); + name = bfd_section_name (sectp); if (strcmp (name, ".text") == 0) { - csi->textaddr = bfd_section_vma (abfd, sectp); - csi->textsize += bfd_section_size (abfd, sectp); + csi->textaddr = bfd_section_vma (sectp); + csi->textsize += bfd_section_size (sectp); } else if (startswith (name, ".text")) { - csi->textsize += bfd_section_size (abfd, sectp); + csi->textsize += bfd_section_size (sectp); } else if (strcmp (name, ".stabstr") == 0) { @@ -307,7 +307,7 @@ cs_section_address (struct coff_symbol *cs, bfd *abfd) args.resultp = § bfd_map_over_sections (abfd, find_targ_sec, &args); if (sect != NULL) - addr = bfd_get_section_vma (abfd, sect); + addr = bfd_section_vma (sect); return addr; } @@ -417,7 +417,7 @@ static int is_import_fixup_symbol (struct coff_symbol *cs, enum minimal_symbol_type type) { - /* The following is a bit of a heuristic using the characterictics + /* The following is a bit of a heuristic using the characteristics of these fixup symbols, but should work well in practice... */ int i; @@ -456,14 +456,13 @@ record_minimal_symbol (minimal_symbol_reader &reader, { /* Because the value of these symbols is within a function code range, these symbols interfere with the symbol-from-address - reverse lookup; this manifests itselfs in backtraces, or any + reverse lookup; this manifests itself in backtraces, or any other commands that prints symbolic addresses. Just pretend these symbols do not exist. */ return NULL; } - return reader.record_full (cs->c_name, strlen (cs->c_name), true, address, - type, section); + return reader.record_full (cs->c_name, true, address, type, section); } /* coff_symfile_init () @@ -538,7 +537,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) struct coff_symfile_info *info; bfd *abfd = objfile->obfd; coff_data_type *cdata = coff_data (abfd); - char *filename = bfd_get_filename (abfd); + const char *filename = bfd_get_filename (abfd); int val; unsigned int num_symbols; int symtab_offset; @@ -641,7 +640,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) { for (minimal_symbol *msym : objfile->msymbols ()) { - const char *name = MSYMBOL_LINKAGE_NAME (msym); + const char *name = msym->linkage_name (); /* If the minimal symbols whose name are prefixed by "__imp_" or "_imp_", get rid of the prefix, and search the minimal @@ -692,7 +691,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) bfd_get_section_contents? */ bfd_seek (abfd, abfd->where, 0); - stabstrsize = bfd_section_size (abfd, info->stabstrsect); + stabstrsize = bfd_section_size (info->stabstrsect); coffstab_build_psymtabs (objfile, info->textaddr, info->textsize, @@ -754,7 +753,7 @@ coff_symtab_read (minimal_symbol_reader &reader, long symtab_offset, unsigned int nsyms, struct objfile *objfile) { - struct gdbarch *gdbarch = get_objfile_arch (objfile); + struct gdbarch *gdbarch = objfile->arch (); struct context_stack *newobj = nullptr; struct coff_symbol coff_symbol; struct coff_symbol *cs = &coff_symbol; @@ -920,8 +919,8 @@ coff_symtab_read (minimal_symbol_reader &reader, file with no symbols. */ if (in_source_file) complete_symtab (filestring, - cs->c_value + ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)), + (cs->c_value + + objfile->text_section_offset ()), main_aux.x_scn.x_scnlen); in_source_file = 0; } @@ -987,7 +986,7 @@ coff_symtab_read (minimal_symbol_reader &reader, || cs->c_sclass == C_THUMBEXTFUNC || cs->c_sclass == C_THUMBEXT || (pe_file && (cs->c_sclass == C_STAT))) - offset = ANOFFSET (objfile->section_offsets, sec); + offset = objfile->section_offsets[sec]; if (bfd_section->flags & SEC_CODE) { @@ -1114,8 +1113,7 @@ coff_symtab_read (minimal_symbol_reader &reader, NULL, cstk.start_addr, fcn_cs_saved.c_value + fcn_aux_saved.x_sym.x_misc.x_fsize - + ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile))); + + objfile->text_section_offset ()); within_function = 0; } break; @@ -1124,8 +1122,7 @@ coff_symtab_read (minimal_symbol_reader &reader, if (strcmp (cs->c_name, ".bb") == 0) { tmpaddr = cs->c_value; - tmpaddr += ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + tmpaddr += objfile->text_section_offset (); push_context (++depth, tmpaddr); } else if (strcmp (cs->c_name, ".eb") == 0) @@ -1148,9 +1145,7 @@ coff_symtab_read (minimal_symbol_reader &reader, } if (*get_local_symbols () && !outermost_context_p ()) { - tmpaddr = - cs->c_value + ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + tmpaddr = cs->c_value + objfile->text_section_offset (); /* Make a block for the local symbols within. */ finish_block (0, cstk.old_blocks, NULL, cstk.start_addr, tmpaddr); @@ -1407,7 +1402,7 @@ static void enter_linenos (long file_offset, int first_line, int last_line, struct objfile *objfile) { - struct gdbarch *gdbarch = get_objfile_arch (objfile); + struct gdbarch *gdbarch = objfile->arch (); char *rawptr; struct internal_lineno lptr; @@ -1442,8 +1437,7 @@ enter_linenos (long file_offset, int first_line, if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line) { CORE_ADDR addr = lptr.l_addr.l_paddr; - addr += ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + addr += objfile->text_section_offset (); record_line (get_current_subfile (), first_line + L_LNNO32 (&lptr), gdbarch_addr_bits_remove (gdbarch, addr)); @@ -1503,15 +1497,15 @@ patch_opaque_types (struct symtab *s) && TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR && TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0) { - const char *name = SYMBOL_LINKAGE_NAME (real_sym); + const char *name = real_sym->linkage_name (); int hash = hashname (name); struct symbol *sym, *prev; prev = 0; for (sym = opaque_type_chain[hash]; sym;) { - if (name[0] == SYMBOL_LINKAGE_NAME (sym)[0] - && strcmp (name + 1, SYMBOL_LINKAGE_NAME (sym) + 1) == 0) + if (name[0] == sym->linkage_name ()[0] + && strcmp (name + 1, sym->linkage_name () + 1) == 0) { if (prev) { @@ -1567,9 +1561,9 @@ process_coff_symbol (struct coff_symbol *cs, name = cs->c_name; name = EXTERNAL_NAME (name, objfile->obfd); - SYMBOL_SET_LANGUAGE (sym, get_current_subfile ()->language, - &objfile->objfile_obstack); - SYMBOL_SET_NAMES (sym, name, strlen (name), 1, objfile); + sym->set_language (get_current_subfile ()->language, + &objfile->objfile_obstack); + sym->compute_and_set_names (name, true, objfile->per_bfd); /* default assumptions */ SYMBOL_VALUE (sym) = cs->c_value; @@ -1578,8 +1572,7 @@ process_coff_symbol (struct coff_symbol *cs, if (ISFCN (cs->c_type)) { - SYMBOL_VALUE (sym) += ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + SYMBOL_VALUE (sym) += objfile->text_section_offset (); SYMBOL_TYPE (sym) = lookup_function_type (decode_function_type (cs, cs->c_type, aux, objfile)); @@ -1609,9 +1602,9 @@ process_coff_symbol (struct coff_symbol *cs, case C_THUMBEXTFUNC: case C_EXT: SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC; - SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value; - SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + SET_SYMBOL_VALUE_ADDRESS (sym, + (CORE_ADDR) cs->c_value + + objfile->section_offsets[SECT_OFF_TEXT (objfile)]); add_symbol_to_list (sym, get_global_symbols ()); break; @@ -1619,9 +1612,9 @@ process_coff_symbol (struct coff_symbol *cs, case C_THUMBSTATFUNC: case C_STAT: SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC; - SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value; - SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + SET_SYMBOL_VALUE_ADDRESS (sym, + (CORE_ADDR) cs->c_value + + objfile->section_offsets[SECT_OFF_TEXT (objfile)]); if (within_function) { /* Static symbol of local scope. */ @@ -1692,7 +1685,7 @@ process_coff_symbol (struct coff_symbol *cs, } else TYPE_NAME (SYMBOL_TYPE (sym)) = - xstrdup (SYMBOL_LINKAGE_NAME (sym)); + xstrdup (sym->linkage_name ()); } /* Keep track of any type which points to empty structured @@ -1706,7 +1699,7 @@ process_coff_symbol (struct coff_symbol *cs, && TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) != TYPE_CODE_UNDEF) { - int i = hashname (SYMBOL_LINKAGE_NAME (sym)); + int i = hashname (sym->linkage_name ()); SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i]; opaque_type_chain[i] = sym; @@ -1724,11 +1717,10 @@ process_coff_symbol (struct coff_symbol *cs, names for anonymous enums, structures, and unions, like "~0fake" or ".0fake". Thanks, but no thanks... */ if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0) - if (SYMBOL_LINKAGE_NAME (sym) != NULL - && *SYMBOL_LINKAGE_NAME (sym) != '~' - && *SYMBOL_LINKAGE_NAME (sym) != '.') - TYPE_NAME (SYMBOL_TYPE (sym)) = - concat (SYMBOL_LINKAGE_NAME (sym), (char *)NULL); + if (sym->linkage_name () != NULL + && *sym->linkage_name () != '~' + && *sym->linkage_name () != '.') + TYPE_NAME (SYMBOL_TYPE (sym)) = xstrdup (sym->linkage_name ()); add_symbol_to_list (sym, get_file_symbols ()); break; @@ -1784,11 +1776,9 @@ decode_type (struct coff_symbol *cs, unsigned int c_type, base_type = decode_type (cs, new_c_type, aux, objfile); index_type = objfile_type (objfile)->builtin_int; range_type - = create_static_range_type ((struct type *) NULL, - index_type, 0, n - 1); + = create_static_range_type (NULL, index_type, 0, n - 1); type = - create_array_type ((struct type *) NULL, - base_type, range_type); + create_array_type (NULL, base_type, range_type); } return type; } @@ -1844,7 +1834,7 @@ decode_base_type (struct coff_symbol *cs, union internal_auxent *aux, struct objfile *objfile) { - struct gdbarch *gdbarch = get_objfile_arch (objfile); + struct gdbarch *gdbarch = objfile->arch (); struct type *type; switch (c_type) @@ -2021,9 +2011,7 @@ coff_read_struct_type (int index, int length, int lastsym, list = newobj; /* Save the data. */ - list->field.name - = (const char *) obstack_copy0 (&objfile->objfile_obstack, - name, strlen (name)); + list->field.name = obstack_strdup (&objfile->objfile_obstack, name); FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux, objfile); SET_FIELD_BITPOS (list->field, 8 * ms->c_value); @@ -2039,9 +2027,7 @@ coff_read_struct_type (int index, int length, int lastsym, list = newobj; /* Save the data. */ - list->field.name - = (const char *) obstack_copy0 (&objfile->objfile_obstack, - name, strlen (name)); + list->field.name = obstack_strdup (&objfile->objfile_obstack, name); FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux, objfile); SET_FIELD_BITPOS (list->field, ms->c_value); @@ -2076,7 +2062,7 @@ static struct type * coff_read_enum_type (int index, int length, int lastsym, struct objfile *objfile) { - struct gdbarch *gdbarch = get_objfile_arch (objfile); + struct gdbarch *gdbarch = objfile->arch (); struct symbol *sym; struct type *type; int nsyms = 0; @@ -2111,9 +2097,8 @@ coff_read_enum_type (int index, int length, int lastsym, case C_MOE: sym = allocate_symbol (objfile); - name = (char *) obstack_copy0 (&objfile->objfile_obstack, name, - strlen (name)); - SYMBOL_SET_LINKAGE_NAME (sym, name); + name = obstack_strdup (&objfile->objfile_obstack, name); + sym->set_linkage_name (name); SYMBOL_ACLASS_INDEX (sym) = LOC_CONST; SYMBOL_DOMAIN (sym) = VAR_DOMAIN; SYMBOL_VALUE (sym) = ms->c_value; @@ -2160,7 +2145,7 @@ coff_read_enum_type (int index, int length, int lastsym, struct symbol *xsym = syms->symbol[j]; SYMBOL_TYPE (xsym) = type; - TYPE_FIELD_NAME (type, n) = SYMBOL_LINKAGE_NAME (xsym); + TYPE_FIELD_NAME (type, n) = xsym->linkage_name (); SET_FIELD_ENUMVAL (TYPE_FIELD (type, n), SYMBOL_VALUE (xsym)); if (SYMBOL_VALUE (xsym) < 0) unsigned_enum = 0; @@ -2201,8 +2186,9 @@ static const struct sym_fns coff_sym_fns = &psym_functions }; +void _initialize_coffread (); void -_initialize_coffread (void) +_initialize_coffread () { add_symtab_fns (bfd_target_coff_flavour, &coff_sym_fns);