aboutsummaryrefslogtreecommitdiff
path: root/gcc/vec.c
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2019-08-01 20:14:53 +0300
committerAlexander Monakov <amonakov@gcc.gnu.org>2019-08-01 20:14:53 +0300
commitce0454d9419dbcd73e65dae2a3eba15eeddbe338 (patch)
tree77afb8b4e0b9aa4081ff1695ebd5ff725a38b365 /gcc/vec.c
parentf339eb66071559a02a0c05b3ee89fc8352969bc9 (diff)
downloadgcc-ce0454d9419dbcd73e65dae2a3eba15eeddbe338.zip
gcc-ce0454d9419dbcd73e65dae2a3eba15eeddbe338.tar.gz
gcc-ce0454d9419dbcd73e65dae2a3eba15eeddbe338.tar.bz2
sort.cc: introduce gcc_sort_r
* sort.cc (sort_r_ctx): New struct. (reorder23): Make templated on context type. (reorder45): Ditto. (cmp1): Ditto. Adjust signature. (netsort): Ditto. (mergesort): Ditto. [CHECKING_P] (cmp2to3): New static function. Use it... (gcc_qsort) [CHECKING_P]: ...here. (gcc_sort_r): New function. * system.h (sort_r_cmp_fn): New function typedef. (qsort_chk): Adjust signature. (gcc_sort_r): Declare. * vec.c (qsort_chk_error): Adjust. (qsort_chk): Adjust. From-SVN: r273977
Diffstat (limited to 'gcc/vec.c')
-rw-r--r--gcc/vec.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/gcc/vec.c b/gcc/vec.c
index cbd2db0..bac5eb7 100644
--- a/gcc/vec.c
+++ b/gcc/vec.c
@@ -192,21 +192,23 @@ dump_vec_loc_statistics (void)
ATTRIBUTE_NORETURN ATTRIBUTE_COLD
static void
qsort_chk_error (const void *p1, const void *p2, const void *p3,
- int (*cmp) (const void *, const void *))
+ sort_r_cmp_fn *cmp, void *data)
{
if (!p3)
{
- int r1 = cmp (p1, p2), r2 = cmp (p2, p1);
- error ("qsort comparator not anti-commutative: %d, %d", r1, r2);
+ int r1 = cmp (p1, p2, data), r2 = cmp (p2, p1, data);
+ error ("qsort comparator not anti-symmetric: %d, %d", r1, r2);
}
else if (p1 == p2)
{
- int r = cmp (p1, p3);
+ int r = cmp (p1, p3, data);
error ("qsort comparator non-negative on sorted output: %d", r);
}
else
{
- int r1 = cmp (p1, p2), r2 = cmp (p2, p3), r3 = cmp (p1, p3);
+ int r1 = cmp (p1, p2, data);
+ int r2 = cmp (p2, p3, data);
+ int r3 = cmp (p1, p3, data);
error ("qsort comparator not transitive: %d, %d, %d", r1, r2, r3);
}
internal_error ("qsort checking failed");
@@ -215,8 +217,7 @@ qsort_chk_error (const void *p1, const void *p2, const void *p3,
/* Verify anti-symmetry and transitivity for comparator CMP on sorted array
of N SIZE-sized elements pointed to by BASE. */
void
-qsort_chk (void *base, size_t n, size_t size,
- int (*cmp)(const void *, const void *))
+qsort_chk (void *base, size_t n, size_t size, sort_r_cmp_fn *cmp, void *data)
{
#if 0
#define LIM(n) (n)
@@ -225,9 +226,9 @@ qsort_chk (void *base, size_t n, size_t size,
#define LIM(n) ((n) <= 16 ? (n) : 12 + floor_log2 (n))
#endif
#define ELT(i) ((const char *) base + (i) * size)
-#define CMP(i, j) cmp (ELT (i), ELT (j))
-#define ERR2(i, j) qsort_chk_error (ELT (i), ELT (j), NULL, cmp)
-#define ERR3(i, j, k) qsort_chk_error (ELT (i), ELT (j), ELT (k), cmp)
+#define CMP(i, j) cmp (ELT (i), ELT (j), data)
+#define ERR2(i, j) qsort_chk_error (ELT (i), ELT (j), NULL, cmp, data)
+#define ERR3(i, j, k) qsort_chk_error (ELT (i), ELT (j), ELT (k), cmp, data)
size_t i1, i2, i, j;
/* This outer loop iterates over maximum spans [i1, i2) such that
elements within each span compare equal to each other. */