Revision: 5251
Author: [email protected]
Date: Thu Aug 12 04:43:10 2010
Log: Fix strict aliasing rule violations in dtoa.c.

Review URL: http://codereview.chromium.org/3172008
http://code.google.com/p/v8/source/detail?r=5251

Modified:
 /branches/bleeding_edge/src/platform-posix.cc
 /branches/bleeding_edge/src/third_party/dtoa/dtoa.c

=======================================
--- /branches/bleeding_edge/src/platform-posix.cc       Mon Jan 25 04:37:31 2010
+++ /branches/bleeding_edge/src/platform-posix.cc       Thu Aug 12 04:43:10 2010
@@ -238,7 +238,7 @@
   addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
   addr.sin_port = htons(port);
   int status = bind(socket_,
-                    reinterpret_cast<struct sockaddr *>(&addr),
+                    BitCast<struct sockaddr *>(&addr),
                     sizeof(addr));
   return status == 0;
 }
=======================================
--- /branches/bleeding_edge/src/third_party/dtoa/dtoa.c Mon May 17 08:41:16 2010 +++ /branches/bleeding_edge/src/third_party/dtoa/dtoa.c Thu Aug 12 04:43:10 2010
@@ -270,25 +270,14 @@

 typedef union { double d; ULong L[2]; } U;

-#ifdef YES_ALIAS
-#define dval(x) x
 #ifdef IEEE_8087
-#define word0(x) ((ULong *)&x)[1]
-#define word1(x) ((ULong *)&x)[0]
+#define word0(x) (x).L[1]
+#define word1(x) (x).L[0]
 #else
-#define word0(x) ((ULong *)&x)[0]
-#define word1(x) ((ULong *)&x)[1]
+#define word0(x) (x).L[0]
+#define word1(x) (x).L[1]
 #endif
-#else
-#ifdef IEEE_8087
-#define word0(x) ((U*)&x)->L[1]
-#define word1(x) ((U*)&x)->L[0]
-#else
-#define word0(x) ((U*)&x)->L[0]
-#define word1(x) ((U*)&x)->L[1]
-#endif
-#define dval(x) ((U*)&x)->d
-#endif
+#define dval(x) (x).d

 /* The following definition of Storeinc is appropriate for MIPS processors.
  * An alternative that might be better on some machines is
@@ -1108,13 +1097,15 @@
  static double
 ulp
 #ifdef KR_headers
-       (x) double x;
+       (dx) double dx;
 #else
-       (double x)
+       (double dx)
 #endif
 {
        register Long L;
-       double a;
+        U x, a;
+
+        dval(x) = dx;

        L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
 #ifndef Avoid_Underflow
@@ -1157,7 +1148,7 @@
 {
        ULong *xa, *xa0, w, y, z;
        int k;
-       double d;
+       U d;
 #ifdef VAX
        ULong d0, d1;
 #else
@@ -1220,9 +1211,9 @@
  static Bigint *
 d2b
 #ifdef KR_headers
-       (d, e, bits) double d; int *e, *bits;
+       (dd, e, bits) double dd; int *e, *bits;
 #else
-       (double d, int *e, int *bits)
+       (double dd, int *e, int *bits)
 #endif
 {
        Bigint *b;
@@ -1236,6 +1227,8 @@
        d0 = word0(d) >> 16 | word0(d) << 16;
        d1 = word1(d) >> 16 | word1(d) << 16;
 #else
+        U d;
+        dval(d) = dd;
 #define d0 word0(d)
 #define d1 word1(d)
 #endif
@@ -1368,7 +1361,7 @@
        (Bigint *a, Bigint *b)
 #endif
 {
-       double da, db;
+       U da, db;
        int k, ka, kb;

        dval(da) = b2d(a, &ka);
@@ -1542,7 +1535,8 @@
        int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
                 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
        CONST char *s, *s0, *s1;
-       double aadj, aadj1, adj, rv, rv0;
+        double aadj;
+       U aadj1, adj, rv, rv0;
        Long L;
        ULong y, z;
        Bigint *bb = NULL, *bb1, *bd = NULL, *bd0, *bs = NULL, *delta = NULL;
@@ -2042,12 +2036,12 @@
                                        }
                                if (rounding) {
                                        if (dsign) {
-                                               adj = 1.;
+                                               dval(adj) = 1.;
                                                goto apply_adj;
                                                }
                                        }
                                else if (!dsign) {
-                                       adj = -1.;
+                                       dval(adj) = -1.;
                                        if (!word1(rv)
                                         && !(word0(rv) & Frac_mask)) {
                                                y = word0(rv) & Exp_mask;
@@ -2059,7 +2053,7 @@
                                                  {
                                                  delta = lshift(delta,Log2P);
                                                  if (cmp(delta, bs) <= 0)
-                                                       adj = -0.5;
+                                                       dval(adj) = -0.5;
                                                  }
                                                }
  apply_adj:
@@ -2072,26 +2066,26 @@
                                        if ((word0(rv) & Exp_mask) <=
                                                        P*Exp_msk1) {
                                                word0(rv) += P*Exp_msk1;
-                                               dval(rv) += adj*ulp(dval(rv));
+                                               dval(rv) += 
dval(adj)*ulp(dval(rv));
                                                word0(rv) -= P*Exp_msk1;
                                                }
                                        else
 #endif /*Sudden_Underflow*/
 #endif /*Avoid_Underflow*/
-                                       dval(rv) += adj*ulp(dval(rv));
+                                       dval(rv) += dval(adj)*ulp(dval(rv));
                                        }
                                break;
                                }
-                       adj = ratio(delta, bs);
-                       if (adj < 1.)
-                               adj = 1.;
-                       if (adj <= 0x7ffffffe) {
+                       dval(adj) = ratio(delta, bs);
+                       if (dval(adj) < 1.)
+                               dval(adj) = 1.;
+                       if (dval(adj) <= 0x7ffffffe) {
                                /* adj = rounding ? ceil(adj) : floor(adj); */
-                               y = adj;
-                               if (y != adj) {
+                               y = dval(adj);
+                               if (y != dval(adj)) {
                                        if (!((rounding>>1) ^ dsign))
                                                y++;
-                                       adj = y;
+                                       dval(adj) = y;
                                        }
                                }
 #ifdef Avoid_Underflow
@@ -2101,21 +2095,21 @@
 #ifdef Sudden_Underflow
                        if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
                                word0(rv) += P*Exp_msk1;
-                               adj *= ulp(dval(rv));
+                               dval(adj) *= ulp(dval(rv));
                                if (dsign)
-                                       dval(rv) += adj;
+                                       dval(rv) += dval(adj);
                                else
-                                       dval(rv) -= adj;
+                                       dval(rv) -= dval(adj);
                                word0(rv) -= P*Exp_msk1;
                                goto cont;
                                }
 #endif /*Sudden_Underflow*/
 #endif /*Avoid_Underflow*/
-                       adj *= ulp(dval(rv));
+                       dval(adj) *= ulp(dval(rv));
                        if (dsign)
-                               dval(rv) += adj;
+                               dval(rv) += dval(adj);
                        else
-                               dval(rv) -= adj;
+                               dval(rv) -= dval(adj);
                        goto cont;
                        }
 #endif /*Honor_FLT_ROUNDS*/
@@ -2237,14 +2231,14 @@
                        }
                if ((aadj = ratio(delta, bs)) <= 2.) {
                        if (dsign)
-                               aadj = aadj1 = 1.;
+                                aadj = dval(aadj1) = 1.;
                        else if (word1(rv) || word0(rv) & Bndry_mask) {
 #ifndef Sudden_Underflow
                                if (word1(rv) == Tiny1 && !word0(rv))
                                        goto undfl;
 #endif
                                aadj = 1.;
-                               aadj1 = -1.;
+                               dval(aadj1) = -1.;
                                }
                        else {
                                /* special case -- power of FLT_RADIX to be */
@@ -2254,24 +2248,24 @@
                                        aadj = 1./FLT_RADIX;
                                else
                                        aadj *= 0.5;
-                               aadj1 = -aadj;
+                               dval(aadj1) = -aadj;
                                }
                        }
                else {
                        aadj *= 0.5;
-                       aadj1 = dsign ? aadj : -aadj;
+                       dval(aadj1) = dsign ? aadj : -aadj;
 #ifdef Check_FLT_ROUNDS
                        switch(Rounding) {
                                case 2: /* towards +infinity */
-                                       aadj1 -= 0.5;
+                                       dval(aadj1) -= 0.5;
                                        break;
                                case 0: /* towards 0 */
                                case 3: /* towards -infinity */
-                                       aadj1 += 0.5;
+                                       dval(aadj1) += 0.5;
                                }
 #else
                        if (Flt_Rounds == 0)
-                               aadj1 += 0.5;
+                               dval(aadj1) += 0.5;
 #endif /*Check_FLT_ROUNDS*/
                        }
                y = word0(rv) & Exp_mask;
@@ -2281,8 +2275,8 @@
                if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
                        dval(rv0) = dval(rv);
                        word0(rv) -= P*Exp_msk1;
-                       adj = aadj1 * ulp(dval(rv));
-                       dval(rv) += adj;
+                       dval(adj) = dval(aadj1) * ulp(dval(rv));
+                       dval(rv) += dval(adj);
                        if ((word0(rv) & Exp_mask) >=
                                        Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
                                if (word0(rv0) == Big0 && word1(rv0) == Big1)
@@ -2301,19 +2295,19 @@
                                        if ((z = aadj) <= 0)
                                                z = 1;
                                        aadj = z;
-                                       aadj1 = dsign ? aadj : -aadj;
+                                       dval(aadj1) = dsign ? aadj : -aadj;
                                        }
                                word0(aadj1) += (2*P+1)*Exp_msk1 - y;
                                }
-                       adj = aadj1 * ulp(dval(rv));
-                       dval(rv) += adj;
+                       dval(adj) = dval(aadj1) * ulp(dval(rv));
+                       dval(rv) += dval(adj);
 #else
 #ifdef Sudden_Underflow
                        if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
                                dval(rv0) = dval(rv);
                                word0(rv) += P*Exp_msk1;
-                               adj = aadj1 * ulp(dval(rv));
-                               dval(rv) += adj;
+                               dval(adj) = dval(aadj1) * ulp(dval(rv));
+                               dval(rv) += dval(adj);
 #ifdef IBM
                                if ((word0(rv) & Exp_mask) <  P*Exp_msk1)
 #else
@@ -2331,8 +2325,8 @@
                                        word0(rv) -= P*Exp_msk1;
                                }
                        else {
-                               adj = aadj1 * ulp(dval(rv));
-                               dval(rv) += adj;
+                               dval(adj) = dval(aadj1) * ulp(dval(rv));
+                               dval(rv) += dval(adj);
                                }
 #else /*Sudden_Underflow*/
                        /* Compute adj so that the IEEE rounding rules will
@@ -2343,12 +2337,12 @@
                         * example: 1.2e-307 .
                         */
                        if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
-                               aadj1 = (double)(int)(aadj + 0.5);
+                               dval(aadj1) = (double)(int)(aadj + 0.5);
                                if (!dsign)
-                                       aadj1 = -aadj1;
-                               }
-                       adj = aadj1 * ulp(dval(rv));
-                       dval(rv) += adj;
+                                       dval(aadj1) = -dval(aadj1);
+                               }
+                       dval(adj) = dval(aadj1) * ulp(dval(rv));
+                       dval(rv) += dval(adj);
 #endif /*Sudden_Underflow*/
 #endif /*Avoid_Underflow*/
                        }
@@ -2638,10 +2632,10 @@
  char *
 dtoa
 #ifdef KR_headers
-       (d, mode, ndigits, decpt, sign, rve)
-       double d; int mode, ndigits, *decpt, *sign; char **rve;
+       (dd, mode, ndigits, decpt, sign, rve)
+       double dd; int mode, ndigits, *decpt, *sign; char **rve;
 #else
-       (double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
+       (double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)
 #endif
 {
  /*    Arguments ndigits, decpt, sign are similar to those
@@ -2687,7 +2681,8 @@
        ULong x;
 #endif
        Bigint *b, *b1, *delta, *mlo, *mhi, *S;
-       double d2, ds, eps;
+        double ds;
+       U d2, eps;
        char *s, *s0;
 #ifdef Honor_FLT_ROUNDS
        int rounding;
@@ -2695,6 +2690,8 @@
 #ifdef SET_INEXACT
        int inexact, oldinexact;
 #endif
+        U d;
+        dval(d) = dd;

         /* In mode 2 and 3 we bias rounding up when there are ties. */
         bias_round_up = mode == 2 || mode == 3;

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to