From: Richard Kenner Date: Wed, 24 Oct 2001 22:44:47 +0000 (+0000) Subject: * dwarf2out.c (file_info_cmp): Always return consistent results. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=356b0698803bd8b317e1ab3ae459022b957ebbde;p=gcc.git * dwarf2out.c (file_info_cmp): Always return consistent results. From-SVN: r46480 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1dfc93937bf..f7ac78c1b3e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +Wed Oct 24 18:43:42 2001 Richard Kenner + + * dwarf2out.c (file_info_cmp): Always return consistent results. + 2001-10-24 Roger Sayle * stmt.c (expand_end_case): Index jumptables from zero for diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index d98b3f2921b..caa1e9a77e3 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; } }