Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / dwarf2.c
index 25a9ebce7374428c6dce5ecf1bdbcbe8e524dbb8..0ef3e1fc534252c41d6806c40c3b07902b5f3b5b 100644 (file)
@@ -906,7 +906,8 @@ read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash)
 
   abbrev_ptr = stash->dwarf_abbrev_buffer + offset;
   abbrev_end = stash->dwarf_abbrev_buffer + stash->dwarf_abbrev_size;
-  abbrev_number = safe_read_leb128 (abfd, abbrev_ptr, &bytes_read, FALSE, abbrev_end);
+  abbrev_number = _bfd_safe_read_leb128 (abfd, abbrev_ptr, &bytes_read,
+                                        FALSE, abbrev_end);
   abbrev_ptr += bytes_read;
 
   /* Loop until we reach an abbrev number of 0.  */
@@ -2737,12 +2738,19 @@ scan_unit_for_symbols (struct comp_unit *unit)
          continue;
        }
 
-      abbrev = lookup_abbrev (abbrev_number,unit->abbrevs);
+      abbrev = lookup_abbrev (abbrev_number, unit->abbrevs);
       if (! abbrev)
        {
-         _bfd_error_handler
-           (_("Dwarf Error: Could not find abbrev number %u."),
-            abbrev_number);
+         static unsigned int previous_failed_abbrev = -1U;
+
+         /* Avoid multiple reports of the same missing abbrev.  */
+         if (abbrev_number != previous_failed_abbrev)
+           {
+             _bfd_error_handler
+               (_("Dwarf Error: Could not find abbrev number %u."),
+                abbrev_number);
+             previous_failed_abbrev = abbrev_number;
+           }
          bfd_set_error (bfd_error_bad_value);
          goto fail;
        }
@@ -2759,7 +2767,7 @@ scan_unit_for_symbols (struct comp_unit *unit)
          func->tag = abbrev->tag;
          func->prev_func = unit->function_table;
          unit->function_table = func;
-      unit->number_of_functions++;
+         unit->number_of_functions++;
          BFD_ASSERT (!unit->cached);
 
          if (func->tag == DW_TAG_inlined_subroutine)
@@ -2784,7 +2792,8 @@ scan_unit_for_symbols (struct comp_unit *unit)
              var->stack = 1;
              var->prev_var = unit->variable_table;
              unit->variable_table = var;
-             BFD_ASSERT (!unit->cached);
+             /* PR 18205: Missing debug information can cause this
+                var to be attached to an already cached unit.  */
            }
 
          /* No inline function in scope at this nesting level.  */
@@ -4196,7 +4205,7 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
          looking up the function by section + offset uses the
          DW_AT_decl_line from the function DW_TAG_subprogram for the line,
          which will be the line of the function name.  */
-      if ((section->flags & SEC_CODE) == 0)
+      if (symbols != NULL && (section->flags & SEC_CODE) == 0)
        {
          asymbol **tmp;
 
This page took 0.02465 seconds and 4 git commands to generate.