Fix the BFD library's find_nearest_line feature to produce consistent results.

 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.
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b898721..b7c03c1 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index b16ae11..8c9bd7a 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -4643,21 +4643,20 @@
    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 @@
       /* 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 @@
 	 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,