Disable optimiization of BN_num_bits_word() for VS2005 ARM compiler due to
authoraSoujyuTanaka <soujyu.tanaka@access-company.com>
Sat, 11 Apr 2020 18:58:44 +0000 (03:58 +0900)
committerRichard Levitte <levitte@openssl.org>
Wed, 15 Jul 2020 21:03:22 +0000 (23:03 +0200)
its miscompilation of the function.
https://mta.openssl.org/pipermail/openssl-users/2018-August/008465.html

Reviewed-by: Mark J. Cox <mark@awe.com>
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/11526)

crypto/bn/bn_lib.c

index 57783e47d80b47675f86ddaf2c36a23f66724b77..13a52ccb29dbbad13ecadfa2c079dfd5c73832f9 100644 (file)
@@ -88,6 +88,15 @@ const BIGNUM *BN_value_one(void)
     return &const_one;
 }
 
+/*
+ * Old Visual Studio ARM compiler miscompiles BN_num_bits_word()
+ * https://mta.openssl.org/pipermail/openssl-users/2018-August/008465.html
+ */
+#if defined(_MSC_VER) && defined(_ARM_) && defined(_WIN32_WCE) \
+    && _MSC_VER>=1400 && _MSC_VER<1501
+# define MS_BROKEN_BN_num_bits_word
+# pragma optimize("", off)
+#endif
 int BN_num_bits_word(BN_ULONG l)
 {
     BN_ULONG x, mask;
@@ -132,6 +141,9 @@ int BN_num_bits_word(BN_ULONG l)
 
     return bits;
 }
+#ifdef MS_BROKEN_BN_num_bits_word
+# pragma optimize("", on)
+#endif
 
 /*
  * This function still leaks `a->dmax`: it's caller's responsibility to