X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fbuildsym.c;h=0f7449fed97f077c3432a824f6659550adb8e069;hb=1bee48c7ad5b75896ef8d84fedc774e181fb09a7;hp=24d1e0f806b412ff487c09aae0eb41e4f365e18d;hpb=468c0cbb327fadf28386a989f929fcbed4aed8b9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 24d1e0f806..0f7449fed9 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -1,5 +1,5 @@ /* Support routines for building symbol tables in GDB's internal format. - Copyright (C) 1986-2019 Free Software Foundation, Inc. + Copyright (C) 1986-2021 Free Software Foundation, Inc. This file is part of GDB. @@ -120,7 +120,7 @@ buildsym_compunit::get_macro_table () { if (m_pending_macros == nullptr) m_pending_macros = new_macro_table (&m_objfile->per_bfd->storage_obstack, - &m_objfile->per_bfd->macro_cache, + &m_objfile->per_bfd->string_cache, m_compunit_symtab); return m_pending_macros; } @@ -135,7 +135,7 @@ add_symbol_to_list (struct symbol *symbol, struct pending **listhead) struct pending *link; /* If this is an alias for another symbol, don't add it. */ - if (symbol->name && symbol->name[0] == '#') + if (symbol->linkage_name () && symbol->linkage_name ()[0] == '#') return; /* We keep PENDINGSIZE symbols in each link of the list. If we @@ -164,7 +164,7 @@ find_symbol_in_list (struct pending *list, char *name, int length) { for (j = list->nsyms; --j >= 0;) { - pp = SYMBOL_LINKAGE_NAME (list->symbol[j]); + pp = list->symbol[j]->linkage_name (); if (*pp == *name && strncmp (pp, name, length) == 0 && pp[length] == '\0') { @@ -213,7 +213,7 @@ buildsym_compunit::finish_block_internal CORE_ADDR start, CORE_ADDR end, int is_global, int expandable) { - struct gdbarch *gdbarch = get_objfile_arch (m_objfile); + struct gdbarch *gdbarch = m_objfile->arch (); struct pending *next, *next1; struct block *block; struct pending_block *pblock; @@ -254,7 +254,7 @@ buildsym_compunit::finish_block_internal SYMBOL_BLOCK_VALUE (symbol) = block; BLOCK_FUNCTION (block) = symbol; - if (TYPE_NFIELDS (ftype) <= 0) + if (ftype->num_fields () <= 0) { /* No parameter type information is recorded with the function's type. Set that from the type of the @@ -271,9 +271,10 @@ buildsym_compunit::finish_block_internal } if (nparams > 0) { - TYPE_NFIELDS (ftype) = nparams; - TYPE_FIELDS (ftype) = (struct field *) - TYPE_ALLOC (ftype, nparams * sizeof (struct field)); + ftype->set_num_fields (nparams); + ftype->set_fields + ((struct field *) + TYPE_ALLOC (ftype, nparams * sizeof (struct field))); iparams = 0; /* Here we want to directly access the dictionary, because @@ -285,7 +286,7 @@ buildsym_compunit::finish_block_internal if (SYMBOL_IS_ARGUMENT (sym)) { - TYPE_FIELD_TYPE (ftype, iparams) = SYMBOL_TYPE (sym); + ftype->field (iparams).set_type (SYMBOL_TYPE (sym)); TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0; iparams++; } @@ -319,7 +320,7 @@ buildsym_compunit::finish_block_internal { complaint (_("block end address less than block " "start address in %s (patched it)"), - SYMBOL_PRINT_NAME (symbol)); + symbol->print_name ()); } else { @@ -356,7 +357,7 @@ buildsym_compunit::finish_block_internal if (symbol) { complaint (_("inner block not inside outer block in %s"), - SYMBOL_PRINT_NAME (symbol)); + symbol->print_name ()); } else { @@ -620,15 +621,15 @@ buildsym_compunit::patch_subfile_names (struct subfile *subfile, set_last_source_file (name); /* Default the source language to whatever can be deduced from - the filename. If nothing can be deduced (such as for a C/C++ - include file with a ".h" extension), then inherit whatever - language the previous subfile had. This kludgery is - necessary because there is no standard way in some object - formats to record the source language. Also, when symtabs - are allocated we try to deduce a language then as well, but - it is too late for us to use that information while reading - symbols, since symtabs aren't allocated until after all the - symbols have been processed for a given source file. */ + the filename. If nothing can be deduced (such as for a C/C++ + include file with a ".h" extension), then inherit whatever + language the previous subfile had. This kludgery is + necessary because there is no standard way in some object + formats to record the source language. Also, when symtabs + are allocated we try to deduce a language then as well, but + it is too late for us to use that information while reading + symbols, since symtabs aren't allocated until after all the + symbols have been processed for a given source file. */ subfile->language = deduce_language_from_filename (subfile->name); if (subfile->language == language_unknown @@ -666,16 +667,10 @@ buildsym_compunit::pop_subfile () void buildsym_compunit::record_line (struct subfile *subfile, int line, - CORE_ADDR pc) + CORE_ADDR pc, bool is_stmt) { struct linetable_entry *e; - /* Ignore the dummy line number in libg.o */ - if (line == 0xffff) - { - return; - } - /* Make sure line vector exists and is big enough. */ if (!subfile->line_vector) { @@ -687,7 +682,7 @@ buildsym_compunit::record_line (struct subfile *subfile, int line, m_have_line_numbers = true; } - if (subfile->line_vector->nitems + 1 >= subfile->line_vector_length) + if (subfile->line_vector->nitems >= subfile->line_vector_length) { subfile->line_vector_length *= 2; subfile->line_vector = (struct linetable *) @@ -710,38 +705,28 @@ buildsym_compunit::record_line (struct subfile *subfile, int line, end of sequence markers. All we lose is the ability to set breakpoints at some lines which contain no instructions anyway. */ - if (line == 0 && subfile->line_vector->nitems > 0) + if (line == 0) { - e = subfile->line_vector->item + subfile->line_vector->nitems - 1; - while (subfile->line_vector->nitems > 0 && e->pc == pc) + struct linetable_entry *last = nullptr; + while (subfile->line_vector->nitems > 0) { - e--; + last = subfile->line_vector->item + subfile->line_vector->nitems - 1; + if (last->pc != pc) + break; subfile->line_vector->nitems--; } + + /* Ignore an end-of-sequence marker marking an empty sequence. */ + if (last == nullptr || last->line == 0) + return; } e = subfile->line_vector->item + subfile->line_vector->nitems++; e->line = line; + e->is_stmt = is_stmt ? 1 : 0; e->pc = pc; } -/* Needed in order to sort line tables from IBM xcoff files. Sigh! */ - -static bool -lte_is_less_than (const linetable_entry &ln1, const linetable_entry &ln2) -{ - /* Note: this code does not assume that CORE_ADDRs can fit in ints. - Please keep it that way. */ - if (ln1.pc < ln2.pc) - return true; - - if (ln1.pc > ln2.pc) - return false; - - /* If pc equal, sort by line. I'm not sure whether this is optimum - behavior (see comment at struct linetable in symtab.h). */ - return ln1.line < ln2.line; -} /* Subroutine of end_symtab to simplify it. Look for a subfile that matches the main source file's basename. If there is only one, and @@ -959,14 +944,27 @@ buildsym_compunit::end_symtab_with_blockvector (struct block *static_block, linetablesize = sizeof (struct linetable) + subfile->line_vector->nitems * sizeof (struct linetable_entry); - /* Like the pending blocks, the line table may be - scrambled in reordered executables. Sort it if - OBJF_REORDERED is true. */ + const auto lte_is_less_than + = [] (const linetable_entry &ln1, + const linetable_entry &ln2) -> bool + { + if (ln1.pc == ln2.pc + && ((ln1.line == 0) != (ln2.line == 0))) + return ln1.line == 0; + + return (ln1.pc < ln2.pc); + }; + + /* Like the pending blocks, the line table may be scrambled in + reordered executables. Sort it if OBJF_REORDERED is true. It + is important to preserve the order of lines at the same + address, as this maintains the inline function caller/callee + relationships, this is why std::stable_sort is used. */ if (m_objfile->flags & OBJF_REORDERED) - std::sort (subfile->line_vector->item, - subfile->line_vector->item - + subfile->line_vector->nitems, - lte_is_less_than); + std::stable_sort (subfile->line_vector->item, + subfile->line_vector->item + + subfile->line_vector->nitems, + lte_is_less_than); } /* Allocate a symbol table if necessary. */