From: Dmitry Stogov Date: Mon, 13 Jan 2020 11:27:35 +0000 (+0300) Subject: Improve access to zend_map_ptr data X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=27815959e176fcdf30b54c5d9e2909f5f3e2b430;p=php Improve access to zend_map_ptr data --- diff --git a/Zend/zend.c b/Zend/zend.c index 3561b36af1..f342a989a4 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -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; } diff --git a/Zend/zend_map_ptr.h b/Zend/zend_map_ptr.h index 5c88ce0bc4..46596b5c37 100644 --- a/Zend/zend_map_ptr.h +++ b/Zend/zend_map_ptr.h @@ -46,6 +46,11 @@ # 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 @@ -54,19 +59,19 @@ # 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); \ @@ -74,6 +79,11 @@ # 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 diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 8f0890401b..d86ba0fda7 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -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)); } } diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index f3e375838f..6c4c316890 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -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