]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Better test program for 128-bit math support
authorNick Mathewson <nickm@torproject.org>
Thu, 11 Apr 2013 21:52:26 +0000 (17:52 -0400)
committerNick Mathewson <nickm@torproject.org>
Thu, 11 Apr 2013 22:08:37 +0000 (18:08 -0400)
Clang 3.2 does constant-folding and variable substitution to determine
that the program is equivalent to "return 1".  Splitting the 128-bit
math into a new function seems sufficient to fix this.

configure.ac

index 8a79653e0446e4ffd0ae03a9d5e09b01ff080717..6f40ac4ad2e03b1c3881fe0f0ec299f37545c81c 100644 (file)
@@ -663,32 +663,38 @@ if test x$enable_curve25519 != xno; then
       [AC_LANG_PROGRAM([dnl
         #include <stdint.h>
         typedef unsigned uint128_t __attribute__((mode(TI)));
-       ], [dnl
-          uint64_t a = ((uint64_t)2000000000) * 1000000000;
-         uint64_t b = ((uint64_t)1234567890) << 24;
-         uint128_t c = ((uint128_t)a) * b;
-         int ok = ((uint64_t)(c>>96)) == 522859 &&
+       int func(uint64_t a, uint64_t b) {
+            uint128_t c = ((uint128_t)a) * b;
+             int ok = ((uint64_t)(c>>96)) == 522859 &&
                   (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
                    (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
                    (((uint64_t)(c))&0xffffffffL) == 0;
+             return ok;
+        }
+       ], [dnl
+         int ok = func( ((uint64_t)2000000000) * 1000000000,
+                        ((uint64_t)1234567890) << 24);
           return !ok;
         ])],
        [tor_cv_can_use_curve25519_donna_c64=yes],
         [tor_cv_can_use_curve25519_donna_c64=no],
        [AC_COMPILE_IFELSE(
           [AC_LANG_PROGRAM([dnl
-            #include <stdint.h>
-            typedef unsigned uint128_t __attribute__((mode(TI)));
-            ], [dnl
-              uint64_t a = ((uint64_t)2000000000) * 1000000000;
-             uint64_t b = ((uint64_t)1234567890) << 24;
-             uint128_t c = ((uint128_t)a) * b;
-             int ok = ((uint64_t)(c>>96)) == 522859 &&
-                    (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
-                     (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
-                     (((uint64_t)(c))&0xffffffffL) == 0;
-              return !ok;
-            ])],
+        #include <stdint.h>
+        typedef unsigned uint128_t __attribute__((mode(TI)));
+       int func(uint64_t a, uint64_t b) {
+            uint128_t c = ((uint128_t)a) * b;
+             int ok = ((uint64_t)(c>>96)) == 522859 &&
+                  (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
+                   (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
+                   (((uint64_t)(c))&0xffffffffL) == 0;
+             return ok;
+        }
+       ], [dnl
+         int ok = func( ((uint64_t)2000000000) * 1000000000,
+                        ((uint64_t)1234567890) << 24);
+          return !ok;
+        ])],
             [tor_cv_can_use_curve25519_donna_c64=cross],
            [tor_cv_can_use_curve25519_donna_c64=no])])])