Fix the BFD library's find_nearest_line feature to produce consistent results.
authorNick Clifton <nickc@redhat.com>
Thu, 23 Feb 2023 09:44:50 +0000 (09:44 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 23 Feb 2023 09:44:50 +0000 (09:44 +0000)
 PR 30150
 * dwarf2.c (comp_unit_contains_address): Renamed to ... (comp_unit_may_contain_address): this,
 and added code to return true if the CU's ranges have not yet been computed.
 (_bfd_dwarf2_find_nearest_line_with_alt): Use the renamed function, simplifying code in the process.

bfd/ChangeLog
bfd/dwarf2.c

index b8987211dd4c5c25e362c4e9ec7fd5fa20bfeaf3..b7c03c11678b09fdd2c3c74eeaab0c1783418c16 100644 (file)
@@ -1,3 +1,13 @@
+2023-02-23  Nick Clifton  <nickc@redhat.com>
+            Alan Modra  <amodra@gmail.com>
+
+       PR 30150
+       * dwarf2.c (comp_unit_contains_address): Renamed to ...
+       (comp_unit_may_contain_address): this, and added code to return
+       true if the CU's ranges have not yet been computed.
+       (_bfd_dwarf2_find_nearest_line_with_alt): Use the renamed
+       function, simplifying code in the process.
+
 2023-02-21  Nick Clifton  <nickc@redhat.com>
 
        * opncls.c (bfd_fill_in_gnu_debuglink_section): Update
index b16ae11e5f275ef5a1134278c3681b4d2a456b97..8c9bd7a3026dc7c583fbb8bc7079505b24759b86 100644 (file)
@@ -4643,21 +4643,20 @@ parse_comp_unit (struct dwarf2_debug *stash,
    really contains the given address.  */
 
 static bool
-comp_unit_contains_address (struct comp_unit *unit, bfd_vma addr)
+comp_unit_may_contain_address (struct comp_unit *unit, bfd_vma addr)
 {
   struct arange *arange;
 
   if (unit->error)
     return false;
 
-  arange = &unit->arange;
-  do
-    {
-      if (addr >= arange->low && addr < arange->high)
-       return true;
-      arange = arange->next;
-    }
-  while (arange);
+  if (unit->arange.high == 0 /* No ranges have been computed yet.  */
+      || unit->line_table == NULL) /* The line info table has not been loaded.  */
+    return true;
+
+  for (arange = &unit->arange; arange != NULL; arange = arange->next)
+    if (addr >= arange->low && addr < arange->high)
+      return true;
 
   return false;
 }
@@ -5890,8 +5889,7 @@ _bfd_dwarf2_find_nearest_line_with_alt
       /* Check the previously read comp. units first.  */
       for (each = stash->f.all_comp_units; each; each = each->next_unit)
        if ((symbol->flags & BSF_FUNCTION) == 0
-           || each->arange.high == 0
-           || comp_unit_contains_address (each, addr))
+           || comp_unit_may_contain_address (each, addr))
          {
            found = comp_unit_find_line (each, symbol, addr, filename_ptr,
                                         linenumber_ptr);
@@ -5973,13 +5971,11 @@ _bfd_dwarf2_find_nearest_line_with_alt
         address.  */
       if (do_line)
        found = (((symbol->flags & BSF_FUNCTION) == 0
-                 || each->arange.high == 0
-                 || comp_unit_contains_address (each, addr))
+                 || comp_unit_may_contain_address (each, addr))
                 && comp_unit_find_line (each, symbol, addr,
                                         filename_ptr, linenumber_ptr));
       else
-       found = ((each->arange.high == 0
-                 || comp_unit_contains_address (each, addr))
+       found = (comp_unit_may_contain_address (each, addr)
                 && comp_unit_find_nearest_line (each, addr,
                                                 filename_ptr,
                                                 &function,