]> granicus.if.org Git - php/commitdiff
Improve access to zend_map_ptr data
authorDmitry Stogov <dmitry@zend.com>
Mon, 13 Jan 2020 11:27:35 +0000 (14:27 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 13 Jan 2020 11:27:35 +0000 (14:27 +0300)
Zend/zend.c
Zend/zend_map_ptr.h
ext/opcache/ZendAccelerator.c
ext/opcache/jit/zend_jit_x86.dasc

index 3561b36af125883f1012e08f9e197bf59df0628a..f342a989a46ef6c94166a6c0afc856d0d0336b13 100644 (file)
@@ -650,14 +650,15 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{
 
 #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
        /* Map region is going to be created and resized at run-time. */
-       compiler_globals->map_ptr_base = NULL;
+       ZEND_MAP_PTR_SET_REAL_BASE(compiler_globals->map_ptr_base, NULL);
        compiler_globals->map_ptr_size = 0;
        compiler_globals->map_ptr_last = global_map_ptr_last;
        if (compiler_globals->map_ptr_last) {
                /* Allocate map_ptr table */
                compiler_globals->map_ptr_size = ZEND_MM_ALIGNED_SIZE_EX(compiler_globals->map_ptr_last, 4096);
-               compiler_globals->map_ptr_base = pemalloc(compiler_globals->map_ptr_size * sizeof(void*), 1);
-               memset(compiler_globals->map_ptr_base, 0, compiler_globals->map_ptr_last * sizeof(void*));
+               base = pemalloc(compiler_globals->map_ptr_size * sizeof(void*), 1);
+               ZEND_MAP_PTR_SET_BASE(base);
+               memset(base, 0, compiler_globals->map_ptr_last * sizeof(void*));
        }
 #else
 # error "Unknown ZEND_MAP_PTR_KIND"
@@ -682,9 +683,9 @@ static void compiler_globals_dtor(zend_compiler_globals *compiler_globals) /* {{
        if (compiler_globals->script_encoding_list) {
                pefree((char*)compiler_globals->script_encoding_list, 1);
        }
-       if (compiler_globals->map_ptr_base) {
-               free(compiler_globals->map_ptr_base);
-               compiler_globals->map_ptr_base = NULL;
+       if (ZEND_MAP_PTR_REAL_BASE(compiler_globals->map_ptr_base)) {
+               free(ZEND_MAP_PTR_REAL_BASE(compiler_globals->map_ptr_base));
+               ZEND_MAP_PTR_SET_REAL_BASE(compiler_globals->map_ptr_base, NULL);
                compiler_globals->map_ptr_size = 0;
        }
 }
@@ -913,10 +914,10 @@ int zend_startup(zend_utility_functions *utility_functions) /* {{{ */
                 */
                CG(map_ptr_size) = 1024 * 1024; // TODO: initial size ???
                CG(map_ptr_last) = 0;
-               CG(map_ptr_base) = pemalloc(CG(map_ptr_size) * sizeof(void*), 1);
+               ZEND_MAP_PTR_SET_BASE(pemalloc(CG(map_ptr_size) * sizeof(void*), 1));
 # elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
                /* Map region is going to be created and resized at run-time. */
-               CG(map_ptr_base) = NULL;
+               ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_base), NULL);
                CG(map_ptr_size) = 0;
                CG(map_ptr_last) = 0;
 # else
@@ -1039,8 +1040,10 @@ int zend_post_startup(void) /* {{{ */
        compiler_globals->function_table = NULL;
        free(compiler_globals->class_table);
        compiler_globals->class_table = NULL;
-       free(compiler_globals->map_ptr_base);
-       compiler_globals->map_ptr_base = NULL;
+       if (ZEND_MAP_PTR_REAL_BASE(compiler_globals->map_ptr_base)) {
+               free(ZEND_MAP_PTR_REAL_BASE(compiler_globals->map_ptr_base));
+       }
+       ZEND_MAP_PTR_SET_REAL_BASE(compiler_globals->map_ptr_base, NULL);
        if ((script_encoding_list = (zend_encoding **)compiler_globals->script_encoding_list)) {
                compiler_globals_ctor(compiler_globals);
                compiler_globals->script_encoding_list = (const zend_encoding **)script_encoding_list;
@@ -1095,9 +1098,9 @@ void zend_shutdown(void) /* {{{ */
        ts_free_id(executor_globals_id);
        ts_free_id(compiler_globals_id);
 #else
-       if (CG(map_ptr_base)) {
-               free(CG(map_ptr_base));
-               CG(map_ptr_base) = NULL;
+       if (ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base))) {
+               free(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)));
+               ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_base), NULL);
                CG(map_ptr_size) = 0;
        }
 #endif
@@ -1181,7 +1184,7 @@ ZEND_API void zend_activate(void) /* {{{ */
        init_executor();
        startup_scanner();
        if (CG(map_ptr_last)) {
-               memset(CG(map_ptr_base), 0, CG(map_ptr_last) * sizeof(void*));
+               memset(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)), 0, CG(map_ptr_last) * sizeof(void*));
        }
 }
 /* }}} */
@@ -1734,12 +1737,12 @@ ZEND_API void *zend_map_ptr_new(void)
 #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
                /* Grow map_ptr table */
                CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(CG(map_ptr_last) + 1, 4096);
-               CG(map_ptr_base) = perealloc(CG(map_ptr_base), CG(map_ptr_size) * sizeof(void*), 1);
+               ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_base), perealloc(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)), CG(map_ptr_size) * sizeof(void*), 1));
 #else
 # error "Unknown ZEND_MAP_PTR_KIND"
 #endif
        }
-       ptr = (void**)CG(map_ptr_base) + CG(map_ptr_last);
+       ptr = (void**)ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)) + CG(map_ptr_last);
        *ptr = NULL;
        CG(map_ptr_last)++;
 #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
@@ -1763,12 +1766,12 @@ ZEND_API void zend_map_ptr_extend(size_t last)
 #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
                        /* Grow map_ptr table */
                        CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(last, 4096);
-                       CG(map_ptr_base) = perealloc(CG(map_ptr_base), CG(map_ptr_size) * sizeof(void*), 1);
+                       ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_base), perealloc(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)), CG(map_ptr_size) * sizeof(void*), 1));
 #else
 # error "Unknown ZEND_MAP_PTR_KIND"
 #endif
                }
-               ptr = (void**)CG(map_ptr_base) + CG(map_ptr_last);
+               ptr = (void**)ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)) + CG(map_ptr_last);
                memset(ptr, 0, (last - CG(map_ptr_last)) * sizeof(void*));
                CG(map_ptr_last) = last;
        }
index 5c88ce0bc4ad24c281053c4002dc057c849ade6c..46596b5c37f2bdf682d4b667587ab8d725ced62f 100644 (file)
 # define ZEND_MAP_PTR_NEW(ptr) do { \
                ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
        } while (0)
+# define ZEND_MAP_PTR_REAL_BASE(base) \
+       (base)
+# define ZEND_MAP_PTR_SET_REAL_BASE(base, ptr) do { \
+               base = (ptr); \
+       } while (0)
 #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
 # define ZEND_MAP_PTR(ptr) \
        ptr ## __ptr
 # define ZEND_MAP_PTR_IS_OFFSET(ptr) \
        (((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L)
 # define ZEND_MAP_PTR_OFFSET2PTR(ptr) \
-       ((void**)((char*)CG(map_ptr_base) + (uintptr_t)ZEND_MAP_PTR(ptr) - 1))
+       ((void**)((char*)CG(map_ptr_base) + (uintptr_t)ZEND_MAP_PTR(ptr)))
 # define ZEND_MAP_PTR_PTR2OFFSET(ptr) \
-       ((void*)((uintptr_t)(((char*)(ptr)) - ((char*)CG(map_ptr_base))) | 1L))
+       ((void*)(((char*)(ptr)) - ((char*)CG(map_ptr_base))))
 # define ZEND_MAP_PTR_GET(ptr) \
-       (ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
-               *(ZEND_MAP_PTR_OFFSET2PTR(ptr)) : \
-               (void*)(*(ZEND_MAP_PTR(ptr))))
+       (*(ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
+               ZEND_MAP_PTR_OFFSET2PTR(ptr) : \
+               ((void**)(ZEND_MAP_PTR(ptr)))))
 # define ZEND_MAP_PTR_SET(ptr, val) do { \
+               void **__p = (void**)(ZEND_MAP_PTR(ptr)); \
                if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \
-                       *(ZEND_MAP_PTR_OFFSET2PTR(ptr)) = (val); \
-               } else { \
-                       *(ZEND_MAP_PTR(ptr)) = (val); \
+                       __p = ZEND_MAP_PTR_OFFSET2PTR(ptr); \
                } \
+               *__p = (val); \
        } while (0)
 # define ZEND_MAP_PTR_INIT(ptr, val) do { \
                ZEND_MAP_PTR(ptr) = (val); \
 # define ZEND_MAP_PTR_NEW(ptr) do { \
                ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
        } while (0)
+# define ZEND_MAP_PTR_REAL_BASE(base) \
+       ((void*)(((char*)(base)) + 1))
+# define ZEND_MAP_PTR_SET_REAL_BASE(base, ptr) do { \
+               base = (void*)(((char*)(ptr)) - 1); \
+       } while (0)
 #else
 # error "Unknown ZEND_MAP_PTR_KIND"
 #endif
index 8f0890401b9f7cc3fa477e7b492ec61ff56a2e26..d86ba0fda7741bfa3bd2f6a6716955752aaca5c3 100644 (file)
@@ -4302,7 +4302,7 @@ static void preload_load(void)
        if (CG(map_ptr_last) != ZCSG(map_ptr_last)) {
                CG(map_ptr_last) = ZCSG(map_ptr_last);
                CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(CG(map_ptr_last) + 1, 4096);
-               CG(map_ptr_base) = perealloc(CG(map_ptr_base), CG(map_ptr_size) * sizeof(void*), 1);
+               ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_size), perealloc(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_size)), CG(map_ptr_size) * sizeof(void*), 1));
        }
 }
 
index f3e375838f046a024717dac91ff856c9241fe543..6c4c316890dff9b62af668afa2c1742b7b882079 100644 (file)
@@ -2160,13 +2160,11 @@ static int zend_jit_hybrid_profile_jit_stub(dasm_State **Dst)
 #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
        |       mov r2, aword [r2]
 #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
-       |       xor r1, r1
        |       test r2, 1
        |       jz >1
-       |       MEM_OP2_2_ZTS mov, r1, aword, compiler_globals, map_ptr_base, r1
-       |       sub r1, 1
+       |       MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
        |1:
-       |       mov     r2, aword [r1 + r2]
+       |       mov     r2, aword [r2]
 #else
 # error "Unknown ZEND_MAP_PTR_KIND"
 #endif
@@ -7010,13 +7008,11 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
 #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
                                |       mov r2, aword [r2]
 #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
-                               |       xor r1, r1
                                |       test r2, 1
                                |       jz >1
-                               |       MEM_OP2_2_ZTS mov, r1, aword, compiler_globals, map_ptr_base, r1
-                               |       sub r1, 1
+                               |       MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
                                |1:
-                               |       mov     r2, aword [r1 + r2]
+                               |       mov     r2, aword [r2]
 #else
 # error "Unknown ZEND_MAP_PTR_KIND"
 #endif