[gdb/symtab] Fix version check in dwarf compilation unit header
[deliverable/binutils-gdb.git] / gdb / dwarf2read.c
index 7f1857930b1db46226032b107fb28cb3970ab058..372f45ee17571bec836e4be0cdbfe065639d55d2 100644 (file)
@@ -3415,15 +3415,15 @@ find_slot_in_mapped_hash (struct mapped_index *index, const char *name,
    Returns 1 if all went well, 0 otherwise.  */
 
 static bool
-read_index_from_section (struct objfile *objfile,
-                        const char *filename,
-                        bool deprecated_ok,
-                        struct dwarf2_section_info *section,
-                        struct mapped_index *map,
-                        const gdb_byte **cu_list,
-                        offset_type *cu_list_elements,
-                        const gdb_byte **types_list,
-                        offset_type *types_list_elements)
+read_gdb_index_from_section (struct objfile *objfile,
+                            const char *filename,
+                            bool deprecated_ok,
+                            struct dwarf2_section_info *section,
+                            struct mapped_index *map,
+                            const gdb_byte **cu_list,
+                            offset_type *cu_list_elements,
+                            const gdb_byte **types_list,
+                            offset_type *types_list_elements)
 {
   const gdb_byte *addr;
   offset_type version;
@@ -3532,7 +3532,7 @@ to use the section anyway."),
    elements of all the CUs and return 1.  Otherwise, return 0.  */
 
 static int
-dwarf2_read_index (struct dwarf2_per_objfile *dwarf2_per_objfile)
+dwarf2_read_gdb_index (struct dwarf2_per_objfile *dwarf2_per_objfile)
 {
   const gdb_byte *cu_list, *types_list, *dwz_list = NULL;
   offset_type cu_list_elements, types_list_elements, dwz_list_elements = 0;
@@ -3540,11 +3540,11 @@ dwarf2_read_index (struct dwarf2_per_objfile *dwarf2_per_objfile)
   struct objfile *objfile = dwarf2_per_objfile->objfile;
 
   std::unique_ptr<struct mapped_index> map (new struct mapped_index);
-  if (!read_index_from_section (objfile, objfile_name (objfile),
-                               use_deprecated_index_sections,
-                               &dwarf2_per_objfile->gdb_index, map.get (),
-                               &cu_list, &cu_list_elements,
-                               &types_list, &types_list_elements))
+  if (!read_gdb_index_from_section (objfile, objfile_name (objfile),
+                                   use_deprecated_index_sections,
+                                   &dwarf2_per_objfile->gdb_index, map.get (),
+                                   &cu_list, &cu_list_elements,
+                                   &types_list, &types_list_elements))
     return 0;
 
   /* Don't use the index if it's empty.  */
@@ -3560,12 +3560,12 @@ dwarf2_read_index (struct dwarf2_per_objfile *dwarf2_per_objfile)
       const gdb_byte *dwz_types_ignore;
       offset_type dwz_types_elements_ignore;
 
-      if (!read_index_from_section (objfile, bfd_get_filename (dwz->dwz_bfd),
-                                   1,
-                                   &dwz->gdb_index, &dwz_map,
-                                   &dwz_list, &dwz_list_elements,
-                                   &dwz_types_ignore,
-                                   &dwz_types_elements_ignore))
+      if (!read_gdb_index_from_section (objfile,
+                                       bfd_get_filename (dwz->dwz_bfd), 1,
+                                       &dwz->gdb_index, &dwz_map,
+                                       &dwz_list, &dwz_list_elements,
+                                       &dwz_types_ignore,
+                                       &dwz_types_elements_ignore))
        {
          warning (_("could not read '.gdb_index' section from %s; skipping"),
                   bfd_get_filename (dwz->dwz_bfd));
@@ -6198,7 +6198,7 @@ dwarf2_initialize_objfile (struct objfile *objfile, dw_index_kind *index_kind)
       return true;
     }
 
-  if (dwarf2_read_index (dwarf2_per_objfile))
+  if (dwarf2_read_gdb_index (dwarf2_per_objfile))
     {
       *index_kind = dw_index_kind::GDB_INDEX;
       return true;
@@ -6308,6 +6308,10 @@ read_comp_unit_head (struct comp_unit_head *cu_header,
   cu_header->offset_size = (bytes_read == 4) ? 4 : 8;
   info_ptr += bytes_read;
   cu_header->version = read_2_bytes (abfd, info_ptr);
+  if (cu_header->version < 2 || cu_header->version > 5)
+    error (_("Dwarf Error: wrong version in compilation unit header "
+          "(is %d, should be 2, 3, 4 or 5) [in module %s]"),
+          cu_header->version, filename);
   info_ptr += 2;
   if (cu_header->version < 5)
     switch (section_kind)
@@ -6410,11 +6414,6 @@ error_check_comp_unit_head (struct dwarf2_per_objfile *dwarf2_per_objfile,
 {
   const char *filename = get_section_file_name (section);
 
-  if (header->version < 2 || header->version > 5)
-    error (_("Dwarf Error: wrong version in compilation unit header "
-          "(is %d, should be 2, 3, 4 or 5) [in module %s]"), header->version,
-          filename);
-
   if (to_underlying (header->abbrev_sect_off)
       >= dwarf2_section_size (dwarf2_per_objfile->objfile, abbrev_section))
     error (_("Dwarf Error: bad offset (%s) in compilation unit header "
@@ -10217,7 +10216,7 @@ compute_compunit_symtab_includes (struct dwarf2_per_cu_data *per_cu)
 static void
 process_cu_includes (struct dwarf2_per_objfile *dwarf2_per_objfile)
 {
-  for (struct dwarf2_per_cu_data *iter : dwarf2_per_objfile->just_read_cus)
+  for (dwarf2_per_cu_data *iter : dwarf2_per_objfile->just_read_cus)
     {
       if (! iter->is_debug_types)
        compute_compunit_symtab_includes (iter);
@@ -20305,11 +20304,11 @@ public:
      we're processing the end of a sequence.  */
   void record_line (bool end_sequence);
 
-  /* Check address and if invalid nop-out the rest of the lines in this
-     sequence.  */
+  /* Check ADDRESS is zero and less than UNRELOCATED_LOWPC and if true
+     nop-out rest of the lines in this sequence.  */
   void check_line_address (struct dwarf2_cu *cu,
                           const gdb_byte *line_ptr,
-                          CORE_ADDR lowpc, CORE_ADDR address);
+                          CORE_ADDR unrelocated_lowpc, CORE_ADDR address);
 
   void handle_set_discriminator (unsigned int discriminator)
   {
@@ -20653,14 +20652,14 @@ lnp_state_machine::lnp_state_machine (gdbarch *arch, line_header *lh,
 void
 lnp_state_machine::check_line_address (struct dwarf2_cu *cu,
                                       const gdb_byte *line_ptr,
-                                      CORE_ADDR lowpc, CORE_ADDR address)
+                                      CORE_ADDR unrelocated_lowpc, CORE_ADDR address)
 {
-  /* If address < lowpc then it's not a usable value, it's outside the
-     pc range of the CU.  However, we restrict the test to only address
-     values of zero to preserve GDB's previous behaviour which is to
-     handle the specific case of a function being GC'd by the linker.  */
+  /* If ADDRESS < UNRELOCATED_LOWPC then it's not a usable value, it's outside
+     the pc range of the CU.  However, we restrict the test to only ADDRESS
+     values of zero to preserve GDB's previous behaviour which is to handle
+     the specific case of a function being GC'd by the linker.  */
 
-  if (address == 0 && address < lowpc)
+  if (address == 0 && address < unrelocated_lowpc)
     {
       /* This line table is for a function which has been
         GCd by the linker.  Ignore it.  PR gdb/12528 */
@@ -20754,7 +20753,7 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu,
                    line_ptr += bytes_read;
 
                    state_machine.check_line_address (cu, line_ptr,
-                                                     lowpc, address);
+                                                     lowpc - baseaddr, address);
                    state_machine.handle_set_address (baseaddr, address);
                  }
                  break;
@@ -24997,13 +24996,13 @@ free_one_cached_comp_unit (struct dwarf2_per_cu_data *target_per_cu)
     }
 }
 
-/* Release all extra memory associated with OBJFILE.  */
+/* Cleanup function for the dwarf2_per_objfile data.  */
 
-void
-dwarf2_free_objfile (struct objfile *objfile)
+static void
+dwarf2_free_objfile (struct objfile *objfile, void *datum)
 {
   struct dwarf2_per_objfile *dwarf2_per_objfile
-    = get_dwarf2_per_objfile (objfile);
+    = static_cast<struct dwarf2_per_objfile *> (datum);
 
   delete dwarf2_per_objfile;
 }
@@ -25325,8 +25324,8 @@ show_check_physname (struct ui_file *file, int from_tty,
 void
 _initialize_dwarf2_read (void)
 {
-
-  dwarf2_objfile_data_key = register_objfile_data ();
+  dwarf2_objfile_data_key
+    = register_objfile_data_with_cleanup (nullptr, dwarf2_free_objfile);
 
   add_prefix_cmd ("dwarf", class_maintenance, set_dwarf_cmd, _("\
 Set DWARF specific variables.\n\
This page took 0.0733 seconds and 4 git commands to generate.