* coffgen.c (coff_find_nearest_line): Look for the best C_FILE,
authorIan Lance Taylor <ian@airs.com>
Thu, 25 Aug 1994 15:58:43 +0000 (15:58 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 25 Aug 1994 15:58:43 +0000 (15:58 +0000)
not merely the first.

bfd/ChangeLog
bfd/coffgen.c

index df27096..1bc2c1c 100644 (file)
@@ -1,5 +1,8 @@
 Thu Aug 25 10:44:53 1994  Ian Lance Taylor  (ian@sanguine.cygnus.com)
 
+       * coffgen.c (coff_find_nearest_line): Look for the best C_FILE,
+       not merely the first.
+
        * coffgen.c (coff_write_alien_symbol): If we are not using the
        symbol, clear the name so that it is not put in the string table.
        From Antti.Miettinen@ntc.nokia.com.
index 1b8a48b..44d1323 100644 (file)
@@ -1644,37 +1644,47 @@ coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
 
   if (p < pend)
     {
+      bfd_vma maxdiff;
+
       /* Look through the C_FILE symbols to find the best one.  */
       *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
-      i = 0;
+      maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
       while (1)
        {
          combined_entry_type *p2;
 
-         /* Avoid endless loops on erroneous files by ensuring that
-            we always move forward in the file.  */
-         if (i >= p->u.syment.n_value)
-           break;
-
-         i = p->u.syment.n_value;
-         if (i >= cof->raw_syment_count)
-           break;
-
-         p = cof->raw_syments + i;
-         if (p->u.syment.n_sclass != C_FILE)
-           break;
-         
-         for (p2 = p; p2 < pend; p2 += 1 + p2->u.syment.n_numaux)
+         for (p2 = p + 1 + p->u.syment.n_numaux;
+              p2 < pend;
+              p2 += 1 + p2->u.syment.n_numaux)
            {
-             if (section ==
-                 coff_section_from_bfd_index (abfd, p2->u.syment.n_scnum))
+             if (p2->u.syment.n_scnum > 0
+                 && (section
+                     == coff_section_from_bfd_index (abfd,
+                                                     p2->u.syment.n_scnum)))
                break;
+             if (p2->u.syment.n_sclass == C_FILE)
+               {
+                 p2 = pend;
+                 break;
+               }
            }
+
          if (p2 < pend
-             && offset < p2->u.syment.n_value)
+             && offset >= p2->u.syment.n_value
+             && offset - p2->u.syment.n_value < maxdiff)
+           {
+             *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
+             maxdiff = offset - p2->u.syment.n_value;
+           }
+
+         /* Avoid endless loops on erroneous files by ensuring that
+            we always move forward in the file.  */
+         if (p - cof->raw_syments >= p->u.syment.n_value)
            break;
 
-         *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
+         p = cof->raw_syments + p->u.syment.n_value;
+         if (p > pend || p->u.syment.n_sclass != C_FILE)
+           break;
        }
     }