* dwarf2out.c (file_info_cmp): Always return consistent results.
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Wed, 24 Oct 2001 22:44:47 +0000 (22:44 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 24 Oct 2001 22:44:47 +0000 (18:44 -0400)
From-SVN: r46480

gcc/ChangeLog
gcc/dwarf2out.c

index 1dfc93937bf7985983363bdb834a6a870611e8be..f7ac78c1b3e116c7f17378354483b8ab6bbabf20 100644 (file)
@@ -1,3 +1,7 @@
+Wed Oct 24 18:43:42 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * dwarf2out.c (file_info_cmp): Always return consistent results.
+
 2001-10-24  Roger Sayle <roger@eyesopen.com>
  
        * stmt.c (expand_end_case): Index jumptables from zero for
index d98b3f2921b90e17f80c779c09aae49b0f0c9314..caa1e9a77e3faac2e4225ff21994c29a44b0007a 100644 (file)
@@ -6573,6 +6573,7 @@ struct dir_info
 
 /* Callback function for file_info comparison.  We sort by looking at
    the directories in the path.  */
+
 static int
 file_info_cmp (p1, p2)
      const void *p1;
@@ -6583,11 +6584,13 @@ file_info_cmp (p1, p2)
   unsigned char *cp1;
   unsigned char *cp2;
 
-  /* Take care of file names without directories.  */
-  if (s1->path == s1->fname)
-    return -1;
-  else if (s2->path == s2->fname)
-    return 1;
+  /* Take care of file names without directories.  We need to make sure that
+     we return consistent values to qsort since some will get confused if
+     we return the same value when identical operands are passed in opposite
+     orders.  So if neither has a directory, return 0 and otherwise return
+     1 or -1 depending on which one has the directory.  */
+  if ((s1->path == s1->fname || s2->path == s2->fname))
+    return (s2->path == s2->fname) - (s1->path == s1->fname);
 
   cp1 = (unsigned char *) s1->path;
   cp2 = (unsigned char *) s2->path;
@@ -6596,17 +6599,14 @@ file_info_cmp (p1, p2)
     {
       ++cp1;
       ++cp2;
-      /* Reached the end of the first path?  */
-      if (cp1 == (unsigned char *) s1->fname)
-       /* It doesn't really matter in which order files from the
-          same directory are sorted in.  Therefore don't test for
-          the second path reaching the end.  */
-       return -1;
-      else if (cp2 == (unsigned char *) s2->fname)
-       return 1;
+      /* Reached the end of the first path?  If so, handle like above.  */
+      if ((cp1 == (unsigned char *) s1->fname)
+         || (cp2 == (unsigned char *) s2->fname))
+       return ((cp2 == (unsigned char *) s2->fname)
+               - (cp1 == (unsigned char *) s1->fname));
 
       /* Character of current path component the same?  */
-      if (*cp1 != *cp2)
+      else if (*cp1 != *cp2)
        return *cp1 - *cp2;
     }
 }