diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2019-08-01 20:14:53 +0300 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2019-08-01 20:14:53 +0300 |
commit | ce0454d9419dbcd73e65dae2a3eba15eeddbe338 (patch) | |
tree | 77afb8b4e0b9aa4081ff1695ebd5ff725a38b365 /gcc/vec.c | |
parent | f339eb66071559a02a0c05b3ee89fc8352969bc9 (diff) | |
download | gcc-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.c | 21 |
1 files changed, 11 insertions, 10 deletions
@@ -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. */ |