From 0907fc6e9264a2e58d1221e2eb7d480df3135b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Herczeg?= Date: Thu, 9 Oct 2014 10:06:19 +0000 Subject: [PATCH] Support for JIT code free and small partial match optimization. --- src/pcre2_compile.c | 3 ++- src/pcre2_internal.h | 2 +- src/pcre2_jit_compile.c | 12 ++++++------ src/pcre2_jit_misc.c | 19 ++++++++++++++++--- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c index f3aef28..4876038 100644 --- a/src/pcre2_compile.c +++ b/src/pcre2_compile.c @@ -677,7 +677,8 @@ pcre2_code_free(pcre2_code *code) { if (code != NULL) { - if (code->executable_jit != NULL) PRIV(jit_free(code->executable_jit)); + if (code->executable_jit != NULL) + PRIV(jit_free)(code->executable_jit, &code->memctl); code->memctl.free(code, code->memctl.memory_data); } } diff --git a/src/pcre2_internal.h b/src/pcre2_internal.h index 26dd0fd..ca476e9 100644 --- a/src/pcre2_internal.h +++ b/src/pcre2_internal.h @@ -1878,7 +1878,7 @@ extern void _pcre2_compile_context_init(pcre2_compile_context *, BOOL); extern PCRE2_SPTR _pcre2_find_bracket(PCRE2_SPTR, BOOL, int); extern BOOL _pcre2_is_newline(PCRE2_SPTR, uint32_t, PCRE2_SPTR, uint32_t *, BOOL); -extern void _pcre2_jit_free(void *); +extern void _pcre2_jit_free(void *, pcre2_memctl *); extern size_t _pcre2_jit_get_size(void *); extern void _pcre2_match_context_init(pcre2_match_context *, BOOL); extern void *_pcre2_memctl_malloc(size_t, pcre2_memctl *); diff --git a/src/pcre2_jit_compile.c b/src/pcre2_jit_compile.c index 602dca7..34a8636 100644 --- a/src/pcre2_jit_compile.c +++ b/src/pcre2_jit_compile.c @@ -352,6 +352,8 @@ typedef struct compiler_common { int cbra_ptr; /* Output vector starting point. Must be divisible by 2. */ int ovector_start; + /* Points to the starting character of the current match. */ + int start_ptr; /* Last known position of the requested byte. */ int req_char_ptr; /* Head of the last recursion. */ @@ -369,8 +371,6 @@ typedef struct compiler_common { int control_head_ptr; /* Points to the last matched capture block index. */ int capture_last_ptr; - /* Points to the starting position of the current match. */ - int start_ptr; /* Flipped and lower case tables. */ const sljit_ub *fcc; @@ -2271,7 +2271,7 @@ SLJIT_ASSERT(common->start_used_ptr != 0 && common->start_ptr != 0 OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0); OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), - common->mode == PCRE2_JIT_PARTIAL_SOFT ? (common->hit_start + sizeof(sljit_sw)) : common->start_ptr); + common->mode == PCRE2_JIT_PARTIAL_SOFT ? common->hit_start : common->start_ptr); OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE2_ERROR_PARTIAL); /* Store match begin and end. */ @@ -9851,7 +9851,7 @@ if (mode != PCRE2_JIT_COMPLETE) if (mode == PCRE2_JIT_PARTIAL_SOFT) { common->hit_start = common->ovector_start; - common->ovector_start += 2 * sizeof(sljit_sw); + common->ovector_start += sizeof(sljit_sw); } } if ((re->overall_options & PCRE2_FIRSTLINE) != 0) @@ -10015,7 +10015,6 @@ if (mode == PCRE2_JIT_PARTIAL_SOFT) { jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start + sizeof(sljit_sw), STR_PTR, 0); JUMPHERE(jump); } else if (mode == PCRE2_JIT_PARTIAL_HARD) @@ -10080,7 +10079,7 @@ if (mode == PCRE2_JIT_PARTIAL_SOFT) { /* Update hit_start only in the first time. */ jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0); - OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, TMP1, 0); JUMPHERE(jump); @@ -10305,6 +10304,7 @@ if (mode == PCRE2_JIT_COMPLETE) else mode = (mode == PCRE2_JIT_PARTIAL_SOFT) ? 1 : 2; +SLJIT_ASSERT(mode >= 0 && mode < JIT_NUMBER_OF_COMPILE_MODES); functions->executable_funcs[mode] = executable_func; functions->read_only_data[mode] = common->read_only_data; functions->executable_sizes[mode] = executable_size; diff --git a/src/pcre2_jit_misc.c b/src/pcre2_jit_misc.c index 79a3337..c5b1cf6 100644 --- a/src/pcre2_jit_misc.c +++ b/src/pcre2_jit_misc.c @@ -50,14 +50,26 @@ POSSIBILITY OF SUCH DAMAGE. *************************************************/ void -PRIV(jit_free)(void *executable_jit) +PRIV(jit_free)(void *executable_jit, pcre2_memctl *memctl) { #ifndef SUPPORT_JIT (void)executable_jit; +(void)memctl; #else /* SUPPORT_JIT */ -/* Dummy code */ -(void)executable_jit; +executable_functions *functions = (executable_functions *)executable_jit; +void *allocator_data = memctl; +int i; + +for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++) + { + if (functions->executable_funcs[i] != NULL) + sljit_free_code(functions->executable_funcs[i]); + if (functions->read_only_data[i] != NULL) + SLJIT_FREE(functions->read_only_data[i], allocator_data); + } + +SLJIT_FREE(functions, allocator_data); #endif /* SUPPORT_JIT */ } @@ -192,6 +204,7 @@ return 0; #else /* SUPPORT_JIT */ sljit_uw *executable_sizes = ((executable_functions *)executable_jit)->executable_sizes; +SLJIT_COMPILE_ASSERT(JIT_NUMBER_OF_COMPILE_MODES == 3, number_of_compile_modes_changed); return executable_sizes[0] + executable_sizes[1] + executable_sizes[2]; #endif