From 386b47eabe8a5f259ab214c17fbf6768dc5cc5e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Herczeg?= Date: Sun, 5 Oct 2014 06:20:41 +0000 Subject: [PATCH] More JIT fixes. --- src/pcre2_jit_compile.c | 42 +++++++++++++++++++++++------------------ src/pcre2_jit_match.c | 12 ++++++------ src/pcre2_jit_misc.c | 22 ++++++++++++++------- 3 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/pcre2_jit_compile.c b/src/pcre2_jit_compile.c index 2828fc0..7ffc27e 100644 --- a/src/pcre2_jit_compile.c +++ b/src/pcre2_jit_compile.c @@ -196,7 +196,7 @@ typedef struct executable_functions { sljit_uw *read_only_data[JIT_NUMBER_OF_COMPILE_MODES]; sljit_uw executable_sizes[JIT_NUMBER_OF_COMPILE_MODES]; pcre2_jit_callback callback; - void *userdata; + void *callback_data; sljit_ui top_bracket; sljit_ui limit_match; } executable_functions; @@ -5769,7 +5769,7 @@ switch(type) return cc + 32 / sizeof(PCRE2_UCHAR); -#if defined SUPPORT_UTF || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32 +#if defined SUPPORT_UNICODE || PCRE2_CODE_UNIT_WIDTH == 16 || PCRE2_CODE_UNIT_WIDTH == 32 case OP_XCLASS: compile_xclass_matchingpath(common, cc + LINK_SIZE, backtracks); return cc + GET(cc, 0) - 1; @@ -6355,16 +6355,17 @@ static SLJIT_INLINE PCRE2_SPTR compile_callout_matchingpath(compiler_common *com { DEFINE_COMPILER; backtrack_common *backtrack; +sljit_si mov_opcode; PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL); allocate_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw)); +SLJIT_ASSERT(common->capture_last_ptr != 0); OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr); OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); -SLJIT_ASSERT(common->capture_last_ptr != 0); -OP1(SLJIT_MOV_SI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_number), SLJIT_IMM, cc[1]); -OP1(SLJIT_MOV_SI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(capture_last), TMP2, 0); +OP1(SLJIT_MOV_UI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_number), SLJIT_IMM, cc[1]); +OP1(SLJIT_MOV_UI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(capture_last), TMP2, 0); /* These pointer sized fields temporarly stores internal variables. */ OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); @@ -6373,8 +6374,9 @@ OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(subject), TMP2, 0); if (common->mark_ptr != 0) OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr)); -OP1(SLJIT_MOV_SI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(pattern_position), SLJIT_IMM, GET(cc, 2)); -OP1(SLJIT_MOV_SI, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(next_item_length), SLJIT_IMM, GET(cc, 2 + LINK_SIZE)); +mov_opcode = (sizeof(PCRE2_SIZE) == 4) ? SLJIT_MOV_UI : SLJIT_MOV; +OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(pattern_position), SLJIT_IMM, GET(cc, 2)); +OP1(mov_opcode, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(next_item_length), SLJIT_IMM, GET(cc, 2 + LINK_SIZE)); OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(mark), (common->mark_ptr != 0) ? TMP2 : SLJIT_IMM, 0); /* Needed to save important temporary registers. */ @@ -6971,13 +6973,6 @@ if (ket == OP_KET && PRIVATE_DATA(matchingpath) != 0) ket = OP_KETRMIN; } -if ((opcode == OP_COND || opcode == OP_SCOND) && cc[1 + LINK_SIZE] == OP_FALSE) - { - /* Drop this bracket_backtrack. */ - parent->top = backtrack->prev; - return matchingpath + 1 + LINK_SIZE + repeat_length; - } - matchingpath = ccbegin + 1 + LINK_SIZE; SLJIT_ASSERT(ket == OP_KET || ket == OP_KETRMAX || ket == OP_KETRMIN); SLJIT_ASSERT(!((bra == OP_BRAZERO && ket == OP_KETRMIN) || (bra == OP_BRAMINZERO && ket == OP_KETRMAX))); @@ -6985,7 +6980,11 @@ cc += GET(cc, 1); has_alternatives = *cc == OP_ALT; if (SLJIT_UNLIKELY(opcode == OP_COND || opcode == OP_SCOND)) - has_alternatives = (*matchingpath == OP_RREF || *matchingpath == OP_DNRREF) ? FALSE : TRUE; + { + SLJIT_COMPILE_ASSERT(OP_DNRREF == OP_RREF + 1 && OP_FALSE == OP_RREF + 2 && OP_TRUE == OP_RREF + 3, + compile_time_checks_must_be_grouped_together); + has_alternatives = (*matchingpath >= OP_RREF && *matchingpath <= OP_TRUE) ? FALSE : TRUE; + } if (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN)) opcode = OP_SCOND; @@ -7243,13 +7242,20 @@ if (opcode == OP_COND || opcode == OP_SCOND) add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), JUMP(SLJIT_ZERO)); matchingpath += 1 + 2 * IMM2_SIZE; } - else if (*matchingpath == OP_RREF || *matchingpath == OP_DNRREF) + else if (*matchingpath >= OP_RREF && *matchingpath <= OP_TRUE) { /* Never has other case. */ BACKTRACK_AS(bracket_backtrack)->u.condfailed = NULL; SLJIT_ASSERT(!has_alternatives); - if (*matchingpath == OP_RREF) + if (*matchingpath == OP_TRUE) + { + stacksize = 1; + matchingpath++; + } + else if (*matchingpath == OP_FALSE) + stacksize = 0; + else if (*matchingpath == OP_RREF) { stacksize = GET2(matchingpath, 1); if (common->currententry == NULL) @@ -10023,7 +10029,7 @@ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0); /* Copy the limit of allowed recursions. */ OP1(SLJIT_MOV, COUNT_MATCH, 0, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH); if (common->capture_last_ptr != 0) - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, -1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, 0); if (common->needs_start_ptr) { diff --git a/src/pcre2_jit_match.c b/src/pcre2_jit_match.c index 6b960f7..1bae952 100644 --- a/src/pcre2_jit_match.c +++ b/src/pcre2_jit_match.c @@ -155,6 +155,9 @@ if (oveccount > max_oveccount) oveccount = max_oveccount; arguments.oveccount = oveccount << 1; +if (jit_stack == NULL && functions->callback != NULL) + jit_stack = functions->callback(functions->callback_data); + convert_executable_func.executable_func = functions->executable_funcs[index]; if (jit_stack != NULL) { @@ -169,12 +172,9 @@ if (rc > (int)oveccount) match_data->code = re; match_data->subject = subject; match_data->rc = rc; -/* -match_data->startchar = start_match - subject; -match_data->leftchar = mb->start_used_ptr - subject; -match_data->rightchar = ((mb->last_used_ptr > mb->end_match_ptr)? - mb->last_used_ptr : mb->end_match_ptr) - subject; -*/ +match_data->startchar = 0; +match_data->leftchar = 0; +match_data->rightchar = 0; match_data->mark = arguments.mark_ptr; return match_data->rc; diff --git a/src/pcre2_jit_misc.c b/src/pcre2_jit_misc.c index f797ee0..82a4c04 100644 --- a/src/pcre2_jit_misc.c +++ b/src/pcre2_jit_misc.c @@ -108,8 +108,8 @@ return jit_stack; * Assign a JIT stack to a pattern * *************************************************/ -PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION -pcre2_jit_stack_assign(const pcre2_code *code, pcre2_jit_callback callback, +PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION +pcre2_jit_stack_assign(const pcre2_code *code, pcre2_jit_callback callback, void *callback_data) { #ifndef SUPPORT_JIT @@ -120,10 +120,18 @@ pcre2_jit_stack_assign(const pcre2_code *code, pcre2_jit_callback callback, #else /* SUPPORT_JIT */ -/* Dummy code */ -code=code; -callback=callback; -callback_data=callback_data; +pcre2_real_code *re = (pcre2_real_code *)code; +executable_functions *functions; + +if (re == NULL) + return; + +functions = (executable_functions *)re->executable_jit; +if (functions != NULL) + { + functions->callback = callback; + functions->callback_data = callback_data; + } #endif /* SUPPORT_JIT */ } @@ -133,7 +141,7 @@ callback_data=callback_data; * Free a JIT stack * *************************************************/ -PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION +PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION pcre2_jit_stack_free(pcre2_jit_stack *jit_stack) { #ifndef SUPPORT_JIT