Assert size of elf_x86_64_{bnd|legacy}_plt2_entry
[deliverable/binutils-gdb.git] / bfd / dwarf2.c
index 5e322ce14c9f1872112917f7600c0bd18a3a1e74..8375da43ac5e6267992c9876cf1d979ee10aec49 100644 (file)
@@ -911,6 +911,14 @@ read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash)
   return abbrevs;
 }
 
+/* Returns true if the form is one which has a string value.  */
+
+static inline bfd_boolean
+is_str_attr (enum dwarf_form form)
+{
+  return form == DW_FORM_string || form == DW_FORM_strp || form == DW_FORM_GNU_strp_alt;
+}
+
 /* Read an attribute value described by an attribute form.  */
 
 static bfd_byte *
@@ -2201,7 +2209,7 @@ find_abstract_instance_name (struct comp_unit *unit,
                case DW_AT_name:
                  /* Prefer DW_AT_MIPS_linkage_name or DW_AT_linkage_name
                     over DW_AT_name.  */
-                 if (name == NULL)
+                 if (name == NULL && is_str_attr (attr.form))
                    name = attr.u.str;
                  break;
                case DW_AT_specification:
@@ -2209,7 +2217,10 @@ find_abstract_instance_name (struct comp_unit *unit,
                  break;
                case DW_AT_linkage_name:
                case DW_AT_MIPS_linkage_name:
-                 name = attr.u.str;
+                 /* PR 16949:  Corrupt debug info can place
+                    non-string forms into these attributes.  */
+                 if (is_str_attr (attr.form))
+                   name = attr.u.str;
                  break;
                default:
                  break;
@@ -2381,13 +2392,16 @@ scan_unit_for_symbols (struct comp_unit *unit)
                case DW_AT_name:
                  /* Prefer DW_AT_MIPS_linkage_name or DW_AT_linkage_name
                     over DW_AT_name.  */
-                 if (func->name == NULL)
+                 if (func->name == NULL && is_str_attr (attr.form))
                    func->name = attr.u.str;
                  break;
 
                case DW_AT_linkage_name:
                case DW_AT_MIPS_linkage_name:
-                 func->name = attr.u.str;
+                 /* PR 16949:  Corrupt debug info can place
+                    non-string forms into these attributes.  */
+                 if (is_str_attr (attr.form))
+                   func->name = attr.u.str;
                  break;
 
                case DW_AT_low_pc:
@@ -3588,19 +3602,19 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
    field and in the abbreviation offset, or zero to indicate that the
    default value should be used.  */
 
-static bfd_boolean
-find_line (bfd *abfd,
-          const struct dwarf_debug_section *debug_sections,
-          asection *section,
-          bfd_vma offset,
-          asymbol *symbol,
-          asymbol **symbols,
-          const char **filename_ptr,
-          const char **functionname_ptr,
-          unsigned int *linenumber_ptr,
-          unsigned int *discriminator_ptr,
-          unsigned int addr_size,
-          void **pinfo)
+bfd_boolean
+_bfd_dwarf2_find_nearest_line (bfd *abfd,
+                              asymbol **symbols,
+                              asymbol *symbol,
+                              asection *section,
+                              bfd_vma offset,
+                              const char **filename_ptr,
+                              const char **functionname_ptr,
+                              unsigned int *linenumber_ptr,
+                              unsigned int *discriminator_ptr,
+                              const struct dwarf_debug_section *debug_sections,
+                              unsigned int addr_size,
+                              void **pinfo)
 {
   /* Read each compilation unit from the section .debug_info, and check
      to see if it contains the address we are searching for.  If yes,
@@ -3631,21 +3645,18 @@ find_line (bfd *abfd,
 
   stash = (struct dwarf2_debug *) *pinfo;
 
-  do_line = (section == NULL
-            && offset == 0
-            && functionname_ptr == NULL
-            && symbol != NULL);
+  do_line = symbol != NULL;
   if (do_line)
     {
-      addr = symbol->value;
+      BFD_ASSERT (section == NULL && offset == 0 && functionname_ptr == NULL);
       section = bfd_get_section (symbol);
+      addr = symbol->value;
     }
-  else if (section != NULL
-          && functionname_ptr != NULL
-          && symbol == NULL)
-    addr = offset;
   else
-    abort ();
+    {
+      BFD_ASSERT (section != NULL && functionname_ptr != NULL);
+      addr = offset;
+    }
 
   if (section->output_section)
     addr += section->output_section->vma + section->output_offset;
@@ -3860,45 +3871,6 @@ find_line (bfd *abfd,
   return found;
 }
 
-/* The DWARF2 version of find_nearest_line.
-   Return TRUE if the line is found without error.  */
-
-bfd_boolean
-_bfd_dwarf2_find_nearest_line (bfd *abfd,
-                              const struct dwarf_debug_section *debug_sections,
-                              asection *section,
-                              asymbol **symbols,
-                              bfd_vma offset,
-                              const char **filename_ptr,
-                              const char **functionname_ptr,
-                              unsigned int *linenumber_ptr,
-                              unsigned int *discriminator_ptr,
-                              unsigned int addr_size,
-                              void **pinfo)
-{
-  return find_line (abfd, debug_sections, section, offset, NULL, symbols,
-                   filename_ptr, functionname_ptr, linenumber_ptr,
-                   discriminator_ptr, addr_size, pinfo);
-}
-
-/* The DWARF2 version of find_line.
-   Return TRUE if the line is found without error.  */
-
-bfd_boolean
-_bfd_dwarf2_find_line (bfd *abfd,
-                      asymbol **symbols,
-                      asymbol *symbol,
-                      const char **filename_ptr,
-                      unsigned int *linenumber_ptr,
-                      unsigned int *discriminator_ptr,
-                      unsigned int addr_size,
-                      void **pinfo)
-{
-  return find_line (abfd, dwarf_debug_sections, NULL, 0, symbol, symbols,
-                   filename_ptr, NULL, linenumber_ptr, discriminator_ptr,
-                   addr_size, pinfo);
-}
-
 bfd_boolean
 _bfd_dwarf2_find_inliner_info (bfd *abfd ATTRIBUTE_UNUSED,
                               const char **filename_ptr,
This page took 0.028588 seconds and 4 git commands to generate.