Author: kib
Date: Sun Jun 24 13:26:31 2018
New Revision: 335603
URL: https://svnweb.freebsd.org/changeset/base/335603

Log:
  MFC r334928:
  libc qsort(3): stop aliasing.
  
  PR:   228780

Modified:
  stable/11/lib/libc/stdlib/qsort.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/lib/libc/stdlib/qsort.c
==============================================================================
--- stable/11/lib/libc/stdlib/qsort.c   Sun Jun 24 13:23:27 2018        
(r335602)
+++ stable/11/lib/libc/stdlib/qsort.c   Sun Jun 24 13:26:31 2018        
(r335603)
@@ -41,53 +41,27 @@ typedef int          cmp_t(void *, const void *, const void 
*
 typedef int             cmp_t(const void *, const void *);
 #endif
 static inline char     *med3(char *, char *, char *, cmp_t *, void *);
-static inline void      swapfunc(char *, char *, size_t, int, int);
 
 #define        MIN(a, b)       ((a) < (b) ? a : b)
 
 /*
  * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
  */
-#define        swapcode(TYPE, parmi, parmj, n) {               \
-       size_t i = (n) / sizeof (TYPE);                 \
-       TYPE *pi = (TYPE *) (parmi);            \
-       TYPE *pj = (TYPE *) (parmj);            \
-       do {                                            \
-               TYPE    t = *pi;                \
-               *pi++ = *pj;                            \
-               *pj++ = t;                              \
-       } while (--i > 0);                              \
-}
 
-#define        SWAPINIT(TYPE, a, es) swaptype_ ## TYPE =       \
-       ((char *)a - (char *)0) % sizeof(TYPE) ||       \
-       es % sizeof(TYPE) ? 2 : es == sizeof(TYPE) ? 0 : 1;
-
 static inline void
-swapfunc(char *a, char *b, size_t n, int swaptype_long, int swaptype_int)
+swapfunc(char *a, char *b, size_t es)
 {
-       if (swaptype_long <= 1)
-               swapcode(long, a, b, n)
-       else if (swaptype_int <= 1)
-               swapcode(int, a, b, n)
-       else
-               swapcode(char, a, b, n)
+       char t;
+
+       do {
+               t = *a;
+               *a++ = *b;
+               *b++ = t;
+       } while (--es > 0);
 }
 
-#define        swap(a, b)                                      \
-       if (swaptype_long == 0) {                       \
-               long t = *(long *)(a);                  \
-               *(long *)(a) = *(long *)(b);            \
-               *(long *)(b) = t;                       \
-       } else if (swaptype_int == 0) {                 \
-               int t = *(int *)(a);                    \
-               *(int *)(a) = *(int *)(b);              \
-               *(int *)(b) = t;                        \
-       } else                                          \
-               swapfunc(a, b, es, swaptype_long, swaptype_int)
-
 #define        vecswap(a, b, n)                                \
-       if ((n) > 0) swapfunc(a, b, n, swaptype_long, swaptype_int)
+       if ((n) > 0) swapfunc(a, b, n)
 
 #ifdef I_AM_QSORT_R
 #define        CMP(t, x, y) (cmp((t), (x), (y)))
@@ -119,17 +93,16 @@ qsort(void *a, size_t n, size_t es, cmp_t *cmp)
        char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
        size_t d1, d2;
        int cmp_result;
-       int swaptype_long, swaptype_int, swap_cnt;
+       int swap_cnt;
 
-loop:  SWAPINIT(long, a, es);
-       SWAPINIT(int, a, es);
+loop:
        swap_cnt = 0;
        if (n < 7) {
                for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)
                        for (pl = pm; 
                             pl > (char *)a && CMP(thunk, pl - es, pl) > 0;
                             pl -= es)
-                               swap(pl, pl - es);
+                               swapfunc(pl, pl - es, es);
                return;
        }
        pm = (char *)a + (n / 2) * es;
@@ -145,7 +118,7 @@ loop:       SWAPINIT(long, a, es);
                }
                pm = med3(pl, pm, pn, cmp, thunk);
        }
-       swap(a, pm);
+       swapfunc(a, pm, es);
        pa = pb = (char *)a + es;
 
        pc = pd = (char *)a + (n - 1) * es;
@@ -153,7 +126,7 @@ loop:       SWAPINIT(long, a, es);
                while (pb <= pc && (cmp_result = CMP(thunk, pb, a)) <= 0) {
                        if (cmp_result == 0) {
                                swap_cnt = 1;
-                               swap(pa, pb);
+                               swapfunc(pa, pb, es);
                                pa += es;
                        }
                        pb += es;
@@ -161,14 +134,14 @@ loop:     SWAPINIT(long, a, es);
                while (pb <= pc && (cmp_result = CMP(thunk, pc, a)) >= 0) {
                        if (cmp_result == 0) {
                                swap_cnt = 1;
-                               swap(pc, pd);
+                               swapfunc(pc, pd, es);
                                pd -= es;
                        }
                        pc -= es;
                }
                if (pb > pc)
                        break;
-               swap(pb, pc);
+               swapfunc(pb, pc, es);
                swap_cnt = 1;
                pb += es;
                pc -= es;
@@ -178,7 +151,7 @@ loop:       SWAPINIT(long, a, es);
                        for (pl = pm; 
                             pl > (char *)a && CMP(thunk, pl - es, pl) > 0;
                             pl -= es)
-                               swap(pl, pl - es);
+                               swapfunc(pl, pl - es, es);
                return;
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to