1e18e3516Sopenharmony_ci/************************************************* 2e18e3516Sopenharmony_ci* Perl-Compatible Regular Expressions * 3e18e3516Sopenharmony_ci*************************************************/ 4e18e3516Sopenharmony_ci 5e18e3516Sopenharmony_ci/* PCRE is a library of functions to support regular expressions whose syntax 6e18e3516Sopenharmony_ciand semantics are as close as possible to those of the Perl 5 language. 7e18e3516Sopenharmony_ci 8e18e3516Sopenharmony_ci Written by Philip Hazel 9e18e3516Sopenharmony_ci Original API code Copyright (c) 1997-2012 University of Cambridge 10e18e3516Sopenharmony_ci New API code Copyright (c) 2016 University of Cambridge 11e18e3516Sopenharmony_ci 12e18e3516Sopenharmony_ci----------------------------------------------------------------------------- 13e18e3516Sopenharmony_ciRedistribution and use in source and binary forms, with or without 14e18e3516Sopenharmony_cimodification, are permitted provided that the following conditions are met: 15e18e3516Sopenharmony_ci 16e18e3516Sopenharmony_ci * Redistributions of source code must retain the above copyright notice, 17e18e3516Sopenharmony_ci this list of conditions and the following disclaimer. 18e18e3516Sopenharmony_ci 19e18e3516Sopenharmony_ci * Redistributions in binary form must reproduce the above copyright 20e18e3516Sopenharmony_ci notice, this list of conditions and the following disclaimer in the 21e18e3516Sopenharmony_ci documentation and/or other materials provided with the distribution. 22e18e3516Sopenharmony_ci 23e18e3516Sopenharmony_ci * Neither the name of the University of Cambridge nor the names of its 24e18e3516Sopenharmony_ci contributors may be used to endorse or promote products derived from 25e18e3516Sopenharmony_ci this software without specific prior written permission. 26e18e3516Sopenharmony_ci 27e18e3516Sopenharmony_ciTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 28e18e3516Sopenharmony_ciAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 29e18e3516Sopenharmony_ciIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 30e18e3516Sopenharmony_ciARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 31e18e3516Sopenharmony_ciLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32e18e3516Sopenharmony_ciCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33e18e3516Sopenharmony_ciSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34e18e3516Sopenharmony_ciINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35e18e3516Sopenharmony_ciCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36e18e3516Sopenharmony_ciARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37e18e3516Sopenharmony_ciPOSSIBILITY OF SUCH DAMAGE. 38e18e3516Sopenharmony_ci----------------------------------------------------------------------------- 39e18e3516Sopenharmony_ci*/ 40e18e3516Sopenharmony_ci 41e18e3516Sopenharmony_ci 42e18e3516Sopenharmony_ci#ifndef INCLUDED_FROM_PCRE2_JIT_COMPILE 43e18e3516Sopenharmony_ci#error This file must be included from pcre2_jit_compile.c. 44e18e3516Sopenharmony_ci#endif 45e18e3516Sopenharmony_ci 46e18e3516Sopenharmony_ci 47e18e3516Sopenharmony_ci 48e18e3516Sopenharmony_ci/************************************************* 49e18e3516Sopenharmony_ci* Free JIT read-only data * 50e18e3516Sopenharmony_ci*************************************************/ 51e18e3516Sopenharmony_ci 52e18e3516Sopenharmony_civoid 53e18e3516Sopenharmony_ciPRIV(jit_free_rodata)(void *current, void *allocator_data) 54e18e3516Sopenharmony_ci{ 55e18e3516Sopenharmony_ci#ifndef SUPPORT_JIT 56e18e3516Sopenharmony_ci(void)current; 57e18e3516Sopenharmony_ci(void)allocator_data; 58e18e3516Sopenharmony_ci#else /* SUPPORT_JIT */ 59e18e3516Sopenharmony_civoid *next; 60e18e3516Sopenharmony_ci 61e18e3516Sopenharmony_ciSLJIT_UNUSED_ARG(allocator_data); 62e18e3516Sopenharmony_ci 63e18e3516Sopenharmony_ciwhile (current != NULL) 64e18e3516Sopenharmony_ci { 65e18e3516Sopenharmony_ci next = *(void**)current; 66e18e3516Sopenharmony_ci SLJIT_FREE(current, allocator_data); 67e18e3516Sopenharmony_ci current = next; 68e18e3516Sopenharmony_ci } 69e18e3516Sopenharmony_ci 70e18e3516Sopenharmony_ci#endif /* SUPPORT_JIT */ 71e18e3516Sopenharmony_ci} 72e18e3516Sopenharmony_ci 73e18e3516Sopenharmony_ci/************************************************* 74e18e3516Sopenharmony_ci* Free JIT compiled code * 75e18e3516Sopenharmony_ci*************************************************/ 76e18e3516Sopenharmony_ci 77e18e3516Sopenharmony_civoid 78e18e3516Sopenharmony_ciPRIV(jit_free)(void *executable_jit, pcre2_memctl *memctl) 79e18e3516Sopenharmony_ci{ 80e18e3516Sopenharmony_ci#ifndef SUPPORT_JIT 81e18e3516Sopenharmony_ci(void)executable_jit; 82e18e3516Sopenharmony_ci(void)memctl; 83e18e3516Sopenharmony_ci#else /* SUPPORT_JIT */ 84e18e3516Sopenharmony_ci 85e18e3516Sopenharmony_ciexecutable_functions *functions = (executable_functions *)executable_jit; 86e18e3516Sopenharmony_civoid *allocator_data = memctl; 87e18e3516Sopenharmony_ciint i; 88e18e3516Sopenharmony_ci 89e18e3516Sopenharmony_cifor (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++) 90e18e3516Sopenharmony_ci { 91e18e3516Sopenharmony_ci if (functions->executable_funcs[i] != NULL) 92e18e3516Sopenharmony_ci sljit_free_code(functions->executable_funcs[i], NULL); 93e18e3516Sopenharmony_ci PRIV(jit_free_rodata)(functions->read_only_data_heads[i], allocator_data); 94e18e3516Sopenharmony_ci } 95e18e3516Sopenharmony_ci 96e18e3516Sopenharmony_ciSLJIT_FREE(functions, allocator_data); 97e18e3516Sopenharmony_ci 98e18e3516Sopenharmony_ci#endif /* SUPPORT_JIT */ 99e18e3516Sopenharmony_ci} 100e18e3516Sopenharmony_ci 101e18e3516Sopenharmony_ci 102e18e3516Sopenharmony_ci/************************************************* 103e18e3516Sopenharmony_ci* Free unused JIT memory * 104e18e3516Sopenharmony_ci*************************************************/ 105e18e3516Sopenharmony_ci 106e18e3516Sopenharmony_ciPCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION 107e18e3516Sopenharmony_cipcre2_jit_free_unused_memory(pcre2_general_context *gcontext) 108e18e3516Sopenharmony_ci{ 109e18e3516Sopenharmony_ci#ifndef SUPPORT_JIT 110e18e3516Sopenharmony_ci(void)gcontext; /* Suppress warning */ 111e18e3516Sopenharmony_ci#else /* SUPPORT_JIT */ 112e18e3516Sopenharmony_ciSLJIT_UNUSED_ARG(gcontext); 113e18e3516Sopenharmony_ci#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) 114e18e3516Sopenharmony_cisljit_free_unused_memory_exec(); 115e18e3516Sopenharmony_ci#endif /* SLJIT_EXECUTABLE_ALLOCATOR */ 116e18e3516Sopenharmony_ci#endif /* SUPPORT_JIT */ 117e18e3516Sopenharmony_ci} 118e18e3516Sopenharmony_ci 119e18e3516Sopenharmony_ci 120e18e3516Sopenharmony_ci 121e18e3516Sopenharmony_ci/************************************************* 122e18e3516Sopenharmony_ci* Allocate a JIT stack * 123e18e3516Sopenharmony_ci*************************************************/ 124e18e3516Sopenharmony_ci 125e18e3516Sopenharmony_ciPCRE2_EXP_DEFN pcre2_jit_stack * PCRE2_CALL_CONVENTION 126e18e3516Sopenharmony_cipcre2_jit_stack_create(size_t startsize, size_t maxsize, 127e18e3516Sopenharmony_ci pcre2_general_context *gcontext) 128e18e3516Sopenharmony_ci{ 129e18e3516Sopenharmony_ci#ifndef SUPPORT_JIT 130e18e3516Sopenharmony_ci 131e18e3516Sopenharmony_ci(void)gcontext; 132e18e3516Sopenharmony_ci(void)startsize; 133e18e3516Sopenharmony_ci(void)maxsize; 134e18e3516Sopenharmony_cireturn NULL; 135e18e3516Sopenharmony_ci 136e18e3516Sopenharmony_ci#else /* SUPPORT_JIT */ 137e18e3516Sopenharmony_ci 138e18e3516Sopenharmony_cipcre2_jit_stack *jit_stack; 139e18e3516Sopenharmony_ci 140e18e3516Sopenharmony_ciif (startsize == 0 || maxsize == 0 || maxsize > SIZE_MAX - STACK_GROWTH_RATE) 141e18e3516Sopenharmony_ci return NULL; 142e18e3516Sopenharmony_ciif (startsize > maxsize) 143e18e3516Sopenharmony_ci startsize = maxsize; 144e18e3516Sopenharmony_cistartsize = (startsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1); 145e18e3516Sopenharmony_cimaxsize = (maxsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1); 146e18e3516Sopenharmony_ci 147e18e3516Sopenharmony_cijit_stack = PRIV(memctl_malloc)(sizeof(pcre2_real_jit_stack), (pcre2_memctl *)gcontext); 148e18e3516Sopenharmony_ciif (jit_stack == NULL) return NULL; 149e18e3516Sopenharmony_cijit_stack->stack = sljit_allocate_stack(startsize, maxsize, &jit_stack->memctl); 150e18e3516Sopenharmony_ciif (jit_stack->stack == NULL) 151e18e3516Sopenharmony_ci { 152e18e3516Sopenharmony_ci jit_stack->memctl.free(jit_stack, jit_stack->memctl.memory_data); 153e18e3516Sopenharmony_ci return NULL; 154e18e3516Sopenharmony_ci } 155e18e3516Sopenharmony_cireturn jit_stack; 156e18e3516Sopenharmony_ci 157e18e3516Sopenharmony_ci#endif 158e18e3516Sopenharmony_ci} 159e18e3516Sopenharmony_ci 160e18e3516Sopenharmony_ci 161e18e3516Sopenharmony_ci/************************************************* 162e18e3516Sopenharmony_ci* Assign a JIT stack to a pattern * 163e18e3516Sopenharmony_ci*************************************************/ 164e18e3516Sopenharmony_ci 165e18e3516Sopenharmony_ciPCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION 166e18e3516Sopenharmony_cipcre2_jit_stack_assign(pcre2_match_context *mcontext, pcre2_jit_callback callback, 167e18e3516Sopenharmony_ci void *callback_data) 168e18e3516Sopenharmony_ci{ 169e18e3516Sopenharmony_ci#ifndef SUPPORT_JIT 170e18e3516Sopenharmony_ci(void)mcontext; 171e18e3516Sopenharmony_ci(void)callback; 172e18e3516Sopenharmony_ci(void)callback_data; 173e18e3516Sopenharmony_ci#else /* SUPPORT_JIT */ 174e18e3516Sopenharmony_ci 175e18e3516Sopenharmony_ciif (mcontext == NULL) return; 176e18e3516Sopenharmony_cimcontext->jit_callback = callback; 177e18e3516Sopenharmony_cimcontext->jit_callback_data = callback_data; 178e18e3516Sopenharmony_ci 179e18e3516Sopenharmony_ci#endif /* SUPPORT_JIT */ 180e18e3516Sopenharmony_ci} 181e18e3516Sopenharmony_ci 182e18e3516Sopenharmony_ci 183e18e3516Sopenharmony_ci/************************************************* 184e18e3516Sopenharmony_ci* Free a JIT stack * 185e18e3516Sopenharmony_ci*************************************************/ 186e18e3516Sopenharmony_ci 187e18e3516Sopenharmony_ciPCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION 188e18e3516Sopenharmony_cipcre2_jit_stack_free(pcre2_jit_stack *jit_stack) 189e18e3516Sopenharmony_ci{ 190e18e3516Sopenharmony_ci#ifndef SUPPORT_JIT 191e18e3516Sopenharmony_ci(void)jit_stack; 192e18e3516Sopenharmony_ci#else /* SUPPORT_JIT */ 193e18e3516Sopenharmony_ciif (jit_stack != NULL) 194e18e3516Sopenharmony_ci { 195e18e3516Sopenharmony_ci sljit_free_stack((struct sljit_stack *)(jit_stack->stack), &jit_stack->memctl); 196e18e3516Sopenharmony_ci jit_stack->memctl.free(jit_stack, jit_stack->memctl.memory_data); 197e18e3516Sopenharmony_ci } 198e18e3516Sopenharmony_ci#endif /* SUPPORT_JIT */ 199e18e3516Sopenharmony_ci} 200e18e3516Sopenharmony_ci 201e18e3516Sopenharmony_ci 202e18e3516Sopenharmony_ci/************************************************* 203e18e3516Sopenharmony_ci* Get target CPU type * 204e18e3516Sopenharmony_ci*************************************************/ 205e18e3516Sopenharmony_ci 206e18e3516Sopenharmony_ciconst char* 207e18e3516Sopenharmony_ciPRIV(jit_get_target)(void) 208e18e3516Sopenharmony_ci{ 209e18e3516Sopenharmony_ci#ifndef SUPPORT_JIT 210e18e3516Sopenharmony_cireturn "JIT is not supported"; 211e18e3516Sopenharmony_ci#else /* SUPPORT_JIT */ 212e18e3516Sopenharmony_cireturn sljit_get_platform_name(); 213e18e3516Sopenharmony_ci#endif /* SUPPORT_JIT */ 214e18e3516Sopenharmony_ci} 215e18e3516Sopenharmony_ci 216e18e3516Sopenharmony_ci 217e18e3516Sopenharmony_ci/************************************************* 218e18e3516Sopenharmony_ci* Get size of JIT code * 219e18e3516Sopenharmony_ci*************************************************/ 220e18e3516Sopenharmony_ci 221e18e3516Sopenharmony_cisize_t 222e18e3516Sopenharmony_ciPRIV(jit_get_size)(void *executable_jit) 223e18e3516Sopenharmony_ci{ 224e18e3516Sopenharmony_ci#ifndef SUPPORT_JIT 225e18e3516Sopenharmony_ci(void)executable_jit; 226e18e3516Sopenharmony_cireturn 0; 227e18e3516Sopenharmony_ci#else /* SUPPORT_JIT */ 228e18e3516Sopenharmony_cisljit_uw *executable_sizes = ((executable_functions *)executable_jit)->executable_sizes; 229e18e3516Sopenharmony_ciSLJIT_COMPILE_ASSERT(JIT_NUMBER_OF_COMPILE_MODES == 3, number_of_compile_modes_changed); 230e18e3516Sopenharmony_cireturn executable_sizes[0] + executable_sizes[1] + executable_sizes[2]; 231e18e3516Sopenharmony_ci#endif 232e18e3516Sopenharmony_ci} 233e18e3516Sopenharmony_ci 234e18e3516Sopenharmony_ci/* End of pcre2_jit_misc.c */ 235