From: Nikita Popov Date: Sun, 29 Sep 2019 09:33:45 +0000 (+0200) Subject: Don't use asm arithmetic under msan X-Git-Tag: php-7.4.7RC1~190 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a5680c25b3e6d758cc25268c89e0ceb04147ad7;p=php Don't use asm arithmetic under msan Clang 9 supports asm goto, so these no longer get automatically skipped. (cherry picked from commit 33bf1495b215d555d45ec638376bd434d8a038b3) --- diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index c5f4ae84a8..dad23bc4d8 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -500,9 +500,15 @@ ZEND_API void zend_update_current_locale(void); #define ZVAL_OFFSETOF_TYPE \ (offsetof(zval, u1.type_info) - offsetof(zval, value)) +#if defined(HAVE_ASM_GOTO) && !__has_feature(memory_sanitizer) +# define ZEND_USE_ASM_ARITHMETIC 1 +#else +# define ZEND_USE_ASM_ARITHMETIC 0 +#endif + static zend_always_inline void fast_long_increment_function(zval *op1) { -#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) +#if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) __asm__ goto( "addl $1,(%0)\n\t" "jo %l1\n" @@ -513,7 +519,7 @@ static zend_always_inline void fast_long_increment_function(zval *op1) return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0); -#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__) +#elif ZEND_USE_ASM_ARITHMETIC && defined(__x86_64__) __asm__ goto( "addq $1,(%0)\n\t" "jo %l1\n" @@ -524,7 +530,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0); -#elif defined(HAVE_ASM_GOTO) && defined(__aarch64__) +#elif ZEND_USE_ASM_ARITHMETIC && defined(__aarch64__) __asm__ goto ( "ldr x5, [%0]\n\t" "adds x5, x5, 1\n\t" @@ -565,7 +571,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL static zend_always_inline void fast_long_decrement_function(zval *op1) { -#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) +#if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) __asm__ goto( "subl $1,(%0)\n\t" "jo %l1\n" @@ -576,7 +582,7 @@ static zend_always_inline void fast_long_decrement_function(zval *op1) return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0); -#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__) +#elif ZEND_USE_ASM_ARITHMETIC && defined(__x86_64__) __asm__ goto( "subq $1,(%0)\n\t" "jo %l1\n" @@ -587,7 +593,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0); -#elif defined(HAVE_ASM_GOTO) && defined(__aarch64__) +#elif ZEND_USE_ASM_ARITHMETIC && defined(__aarch64__) __asm__ goto ( "ldr x5, [%0]\n\t" "subs x5 ,x5, 1\n\t" @@ -628,7 +634,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL static zend_always_inline void fast_long_add_function(zval *result, zval *op1, zval *op2) { -#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) +#if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) __asm__ goto( "movl (%1), %%eax\n\t" "addl (%2), %%eax\n\t" @@ -646,7 +652,7 @@ static zend_always_inline void fast_long_add_function(zval *result, zval *op1, z return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2)); -#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__) +#elif ZEND_USE_ASM_ARITHMETIC && defined(__x86_64__) __asm__ goto( "movq (%1), %%rax\n\t" "addq (%2), %%rax\n\t" @@ -664,7 +670,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2)); -#elif defined(HAVE_ASM_GOTO) && defined(__aarch64__) +#elif ZEND_USE_ASM_ARITHMETIC && defined(__aarch64__) __asm__ goto( "ldr x5, [%1]\n\t" "ldr x6, [%2]\n\t" @@ -738,7 +744,7 @@ static zend_always_inline int fast_add_function(zval *result, zval *op1, zval *o static zend_always_inline void fast_long_sub_function(zval *result, zval *op1, zval *op2) { -#if defined(HAVE_ASM_GOTO) && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) +#if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) __asm__ goto( "movl (%1), %%eax\n\t" "subl (%2), %%eax\n\t" @@ -756,7 +762,7 @@ static zend_always_inline void fast_long_sub_function(zval *result, zval *op1, z return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2)); -#elif defined(HAVE_ASM_GOTO) && defined(__x86_64__) +#elif ZEND_USE_ASM_ARITHMETIC && defined(__x86_64__) __asm__ goto( "movq (%1), %%rax\n\t" "subq (%2), %%rax\n\t" @@ -774,7 +780,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL return; overflow: ZEND_ATTRIBUTE_COLD_LABEL ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2)); -#elif defined(HAVE_ASM_GOTO) && defined(__aarch64__) +#elif ZEND_USE_ASM_ARITHMETIC && defined(__aarch64__) __asm__ goto( "ldr x5, [%1]\n\t" "ldr x6, [%2]\n\t"