aboutsummaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2001-10-24 22:44:47 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2001-10-24 18:44:47 -0400
commit356b0698803bd8b317e1ab3ae459022b957ebbde (patch)
tree9ae3be7e784ed0714e0263f7c8732b1d1eb4b649 /gcc/dwarf2out.c
parente23381dfb4a651cd26e4143fcbae06381371da3c (diff)
downloadgcc-356b0698803bd8b317e1ab3ae459022b957ebbde.zip
gcc-356b0698803bd8b317e1ab3ae459022b957ebbde.tar.gz
gcc-356b0698803bd8b317e1ab3ae459022b957ebbde.tar.bz2
* dwarf2out.c (file_info_cmp): Always return consistent results.
From-SVN: r46480
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r--gcc/dwarf2out.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index d98b3f2..caa1e9a 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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;
}
}