X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fxcoffread.c;h=b8ab292bc3a0ad081d4f8acab408b360130fb9e8;hb=e3ecd631339aaa2a4af57f59f0694671d4ce00ab;hp=7f4e63e64120269a6a93067cddcf023c64514d26;hpb=edb0470b99a9f399ccb5d666173c4315f6cb02c0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 7f4e63e641..b8ab292bc3 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -1,5 +1,5 @@ /* Read AIX xcoff symbol tables and convert to internal format, for GDB. - Copyright (C) 1986-2018 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. Derived from coffread.c, dbxread.c, and a lot of hacking. Contributed by IBM Corporation. @@ -41,7 +41,7 @@ /* FIXME: ezannoni/2004-02-13 Verify if the include below is really needed. */ #include "symfile.h" #include "objfiles.h" -#include "buildsym.h" +#include "buildsym-legacy.h" #include "stabsread.h" #include "expression.h" #include "complaints.h" @@ -713,6 +713,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end) /* Line numbers are not necessarily ordered. xlc compilation will put static function to the end. */ + struct subfile *current_subfile = get_current_subfile (); lineTb = arrange_linetable (lv); if (lv == lineTb) { @@ -775,8 +776,9 @@ process_linenos (CORE_ADDR start, CORE_ADDR end) if (fakename == NULL) fakename = " ?"; start_subfile (fakename); - xfree (current_subfile->name); + xfree (get_current_subfile ()->name); } + struct subfile *current_subfile = get_current_subfile (); current_subfile->name = xstrdup (inclTable[ii].name); #endif @@ -1020,6 +1022,7 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst) int just_started = 1; int depth = 0; CORE_ADDR fcn_start_addr = 0; + enum language pst_symtab_language; struct coff_symbol fcn_stab_saved = { 0 }; @@ -1040,10 +1043,11 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst) set_last_source_file (NULL); last_csect_name = 0; + pst_symtab_language = deduce_language_from_filename (filestring); start_stabs (); start_symtab (objfile, filestring, (char *) NULL, file_start_addr, - language_unknown); + pst_symtab_language); record_debugformat (debugfmt); symnum = ((struct symloc *) pst->read_symtab_private)->first_symnum; max_symnum = @@ -1136,8 +1140,8 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst) } start_stabs (); - start_symtab (objfile, "_globals_", (char *) NULL, (CORE_ADDR) 0, - language_unknown); + start_symtab (objfile, "_globals_", (char *) NULL, + (CORE_ADDR) 0, pst_symtab_language); record_debugformat (debugfmt); cur_src_end_addr = first_object_file_end; /* Done with all files, everything from here on is globals. */ @@ -1227,7 +1231,7 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst) /* Give all csects for this source file the same name. */ start_symtab (objfile, filestring, NULL, - (CORE_ADDR) 0, language_unknown); + (CORE_ADDR) 0, pst_symtab_language); record_debugformat (debugfmt); } @@ -1348,7 +1352,7 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst) start_stabs (); start_symtab (objfile, filestring, (char *) NULL, (CORE_ADDR) 0, - language_unknown); + pst_symtab_language); record_debugformat (debugfmt); last_csect_name = 0; @@ -1397,17 +1401,17 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst) within_function = 0; break; } - newobj = pop_context (); + struct context_stack cstk = pop_context (); /* Stack must be empty now. */ - if (!outermost_context_p () || newobj == NULL) + if (!outermost_context_p ()) { ef_complaint (cs->c_symnum); within_function = 0; break; } - finish_block (newobj->name, &local_symbols, newobj->old_blocks, - NULL, newobj->start_addr, + finish_block (cstk.name, cstk.old_blocks, + NULL, cstk.start_addr, (fcn_cs_saved.c_value + fcn_aux_saved.x_sym.x_misc.x_fsize + ANOFFSET (objfile->section_offsets, @@ -1419,12 +1423,12 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst) case C_BSTAT: /* Begin static block. */ { - struct internal_syment symbol; + struct internal_syment static_symbol; - read_symbol (&symbol, cs->c_value); - static_block_base = symbol.n_value; + read_symbol (&static_symbol, cs->c_value); + static_block_base = static_symbol.n_value; static_block_section = - secnum_to_section (symbol.n_scnum, objfile); + secnum_to_section (static_symbol.n_scnum, objfile); } break; @@ -1488,23 +1492,23 @@ read_xcoff_symtab (struct objfile *objfile, struct partial_symtab *pst) eb_complaint (cs->c_symnum); break; } - newobj = pop_context (); - if (depth-- != newobj->depth) + struct context_stack cstk = pop_context (); + if (depth-- != cstk.depth) { eb_complaint (cs->c_symnum); break; } - if (local_symbols && !outermost_context_p ()) + if (*get_local_symbols () && !outermost_context_p ()) { /* Make a block for the local symbols within. */ - finish_block (newobj->name, &local_symbols, - newobj->old_blocks, NULL, - newobj->start_addr, + finish_block (cstk.name, + cstk.old_blocks, NULL, + cstk.start_addr, (cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))); } - local_symbols = newobj->locals; + *get_local_symbols () = cstk.locals; } break; @@ -1592,9 +1596,9 @@ process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile) SYMBOL_DUP (sym, sym2); if (cs->c_sclass == C_EXT || C_WEAKEXT) - add_symbol_to_list (sym2, &global_symbols); + add_symbol_to_list (sym2, get_global_symbols ()); else if (cs->c_sclass == C_HIDEXT || cs->c_sclass == C_STAT) - add_symbol_to_list (sym2, &file_symbols); + add_symbol_to_list (sym2, get_file_symbols ()); } else { @@ -1868,7 +1872,6 @@ xcoff_psymtab_to_symtab_1 (struct objfile *objfile, struct partial_symtab *pst) { /* Init stuff necessary for reading in symbols. */ stabsread_init (); - buildsym_init (); scoped_free_pendings free_pending; read_xcoff_symtab (objfile, pst); @@ -1920,7 +1923,6 @@ static void xcoff_new_init (struct objfile *objfile) { stabsread_new_init (); - buildsym_init (); } /* Do initialization in preparation for reading symbols from OBJFILE. @@ -2093,8 +2095,6 @@ xcoff_end_psymtab (struct objfile *objfile, struct partial_symtab *pst, subpst->read_symtab_private = XOBNEW (&objfile->objfile_obstack, symloc); ((struct symloc *) subpst->read_symtab_private)->first_symnum = 0; ((struct symloc *) subpst->read_symtab_private)->numsyms = 0; - subpst->textlow = 0; - subpst->texthigh = 0; /* We could save slight bits of space by only making one of these, shared by the entire set of include files. FIXME-someday. */ @@ -2344,10 +2344,11 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, CORE_ADDR highval = symbol.n_value + csect_aux.x_csect.x_scnlen.l; - if (highval > pst->texthigh) - pst->texthigh = highval; - if (pst->textlow == 0 || symbol.n_value < pst->textlow) - pst->textlow = symbol.n_value; + if (highval > pst->raw_text_high ()) + pst->set_text_high (highval); + if (!pst->text_low_valid + || symbol.n_value < pst->raw_text_low ()) + pst->set_text_low (symbol.n_value); } misc_func_recorded = 0; break; @@ -2660,27 +2661,24 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, switch (p[1]) { case 'S': - symbol.n_value += ANOFFSET (objfile->section_offsets, - SECT_OFF_DATA (objfile)); - 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, + SECT_OFF_DATA (objfile), &objfile->static_psymbols, symbol.n_value, psymtab_language, objfile); continue; case 'G': - symbol.n_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, 1, VAR_DOMAIN, LOC_STATIC, + SECT_OFF_DATA (objfile), &objfile->global_psymbols, symbol.n_value, psymtab_language, objfile); @@ -2698,14 +2696,14 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, && namestring[0] != ' ')) { add_psymbol_to_list (namestring, p - namestring, 1, - STRUCT_DOMAIN, LOC_TYPEDEF, + STRUCT_DOMAIN, LOC_TYPEDEF, -1, &objfile->static_psymbols, 0, psymtab_language, objfile); if (p[2] == 't') { /* Also a typedef with the same name. */ add_psymbol_to_list (namestring, p - namestring, 1, - VAR_DOMAIN, LOC_TYPEDEF, + VAR_DOMAIN, LOC_TYPEDEF, -1, &objfile->static_psymbols, 0, psymtab_language, objfile); p += 1; @@ -2717,7 +2715,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, if (p != namestring) /* a name is there, not just :T... */ { add_psymbol_to_list (namestring, p - namestring, 1, - VAR_DOMAIN, LOC_TYPEDEF, + VAR_DOMAIN, LOC_TYPEDEF, -1, &objfile->static_psymbols, 0, psymtab_language, objfile); } @@ -2779,7 +2777,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, /* Note that the value doesn't matter for enum constants in psymtabs, just in symtabs. */ add_psymbol_to_list (p, q - p, 1, - VAR_DOMAIN, LOC_CONST, + VAR_DOMAIN, LOC_CONST, -1, &objfile->static_psymbols, 0, psymtab_language, objfile); /* Point past the name. */ @@ -2797,7 +2795,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, case 'c': /* Constant, e.g. from "const" in Pascal. */ add_psymbol_to_list (namestring, p - namestring, 1, - VAR_DOMAIN, LOC_CONST, + VAR_DOMAIN, LOC_CONST, -1, &objfile->static_psymbols, 0, psymtab_language, objfile); continue; @@ -2813,10 +2811,9 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, function_outside_compilation_unit_complaint (name); xfree (name); } - symbol.n_value += ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_BLOCK, + SECT_OFF_TEXT (objfile), &objfile->static_psymbols, symbol.n_value, psymtab_language, objfile); @@ -2844,10 +2841,9 @@ scan_xcoff_symtab (minimal_symbol_reader &reader, if (startswith (namestring, "@FIX")) continue; - symbol.n_value += ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); add_psymbol_to_list (namestring, p - namestring, 1, VAR_DOMAIN, LOC_BLOCK, + SECT_OFF_TEXT (objfile), &objfile->global_psymbols, symbol.n_value, psymtab_language, objfile);