Don't use asm arithmetic under msan

Clang 9 supports asm goto, so these no longer get automatically
skipped.

(cherry picked from commit 33bf1495b2)
This commit is contained in:
Nikita Popov 2019-09-29 11:33:45 +02:00
parent 1c6b084262
commit 5a5680c25b

View file

@ -500,9 +500,15 @@ ZEND_API void zend_update_current_locale(void);
#define ZVAL_OFFSETOF_TYPE \ #define ZVAL_OFFSETOF_TYPE \
(offsetof(zval, u1.type_info) - offsetof(zval, value)) (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) 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( __asm__ goto(
"addl $1,(%0)\n\t" "addl $1,(%0)\n\t"
"jo %l1\n" "jo %l1\n"
@ -513,7 +519,7 @@ static zend_always_inline void fast_long_increment_function(zval *op1)
return; return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0); 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( __asm__ goto(
"addq $1,(%0)\n\t" "addq $1,(%0)\n\t"
"jo %l1\n" "jo %l1\n"
@ -524,7 +530,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
return; return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(op1, (double)ZEND_LONG_MAX + 1.0); 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 ( __asm__ goto (
"ldr x5, [%0]\n\t" "ldr x5, [%0]\n\t"
"adds x5, x5, 1\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) 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( __asm__ goto(
"subl $1,(%0)\n\t" "subl $1,(%0)\n\t"
"jo %l1\n" "jo %l1\n"
@ -576,7 +582,7 @@ static zend_always_inline void fast_long_decrement_function(zval *op1)
return; return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0); 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( __asm__ goto(
"subq $1,(%0)\n\t" "subq $1,(%0)\n\t"
"jo %l1\n" "jo %l1\n"
@ -587,7 +593,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
return; return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(op1, (double)ZEND_LONG_MIN - 1.0); 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 ( __asm__ goto (
"ldr x5, [%0]\n\t" "ldr x5, [%0]\n\t"
"subs x5 ,x5, 1\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) 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( __asm__ goto(
"movl (%1), %%eax\n\t" "movl (%1), %%eax\n\t"
"addl (%2), %%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; return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2)); 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( __asm__ goto(
"movq (%1), %%rax\n\t" "movq (%1), %%rax\n\t"
"addq (%2), %%rax\n\t" "addq (%2), %%rax\n\t"
@ -664,7 +670,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
return; return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2)); 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( __asm__ goto(
"ldr x5, [%1]\n\t" "ldr x5, [%1]\n\t"
"ldr x6, [%2]\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) 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( __asm__ goto(
"movl (%1), %%eax\n\t" "movl (%1), %%eax\n\t"
"subl (%2), %%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; return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2)); 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( __asm__ goto(
"movq (%1), %%rax\n\t" "movq (%1), %%rax\n\t"
"subq (%2), %%rax\n\t" "subq (%2), %%rax\n\t"
@ -774,7 +780,7 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL
return; return;
overflow: ZEND_ATTRIBUTE_COLD_LABEL overflow: ZEND_ATTRIBUTE_COLD_LABEL
ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2)); 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( __asm__ goto(
"ldr x5, [%1]\n\t" "ldr x5, [%1]\n\t"
"ldr x6, [%2]\n\t" "ldr x6, [%2]\n\t"