.TH PCREJIT 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE JUST-IN-TIME COMPILER SUPPORT"
.rs
.sp
Just-in-time compiling is a heavyweight optimization that can greatly speed up
pattern matching. However, it comes at the cost of extra processing before the
match is performed. Therefore, it is of most benefit when the same pattern is
going to be matched many times. This does not necessarily mean many calls of
\fPpcre_exec()\fP; if the pattern is not anchored, matching attempts may take
place many times at various positions in the subject, even for a single call to
\fBpcre_exec()\fP. If the subject string is very long, it may still pay to use
JIT for one-off matches.
.P
JIT support applies only to the traditional matching function,
\fBpcre_exec()\fP. It does not apply when \fBpcre_dfa_exec()\fP is being used.
The code for this support was written by Zoltan Herczeg.
.
.
.SH "AVAILABILITY OF JIT SUPPORT"
.rs
.sp
JIT support is an optional feature of PCRE. The "configure" option --enable-jit
(or equivalent CMake option) must be set when PCRE is built if you want to use
JIT. The support is limited to the following hardware platforms:
.sp
  ARM v5, v7, and Thumb2
  Intel x86 32-bit and 64-bit
  MIPS 32-bit
  Power PC 32-bit and 64-bit (experimental)
.sp
The Power PC support is designated as experimental because it has not been
fully tested. If --enable-jit is set on an unsupported platform, compilation
fails.
.P
A program that is linked with PCRE 8.20 or later can tell if JIT support is
available by calling \fBpcre_config()\fP with the PCRE_CONFIG_JIT option. The
result is 1 when JIT is available, and 0 otherwise. However, a simple program
does not need to check this in order to use JIT. The API is implemented in a
way that falls back to the ordinary PCRE code if JIT is not available.
.P
If your program may sometimes be linked with versions of PCRE that are older
than 8.20, but you want to use JIT when it is available, you can test
the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such
as PCRE_CONFIG_JIT, for compile-time control of your code.
.
.
.SH "SIMPLE USE OF JIT"
.rs
.sp
You have to do two things to make use of the JIT support in the simplest way:
.sp
  (1) Call \fBpcre_study()\fP with the PCRE_STUDY_JIT_COMPILE option for
      each compiled pattern, and pass the resulting \fBpcre_extra\fP block to
      \fBpcre_exec()\fP.
.sp
  (2) Use \fBpcre_free_study()\fP to free the \fBpcre_extra\fP block when it is
      no longer needed instead of just freeing it yourself. This
      ensures that any JIT data is also freed.
.sp
For a program that may be linked with pre-8.20 versions of PCRE, you can insert
.sp
  #ifndef PCRE_STUDY_JIT_COMPILE
  #define PCRE_STUDY_JIT_COMPILE 0
  #endif
.sp
so that no option is passed to \fBpcre_study()\fP, and then use something like
this to free the study data:
.sp
  #ifdef PCRE_CONFIG_JIT
      pcre_free_study(study_ptr);
  #else
      pcre_free(study_ptr);
  #endif
.sp
In some circumstances you may need to call additional functions. These are
described in the section entitled
.\" HTML <a href="#stackcontrol">
.\" </a>
"Controlling the JIT stack"
.\"
below.
.P
If JIT support is not available, PCRE_STUDY_JIT_COMPILE is ignored, and no JIT
data is set up. Otherwise, the compiled pattern is passed to the JIT compiler,
which turns it into machine code that executes much faster than the normal
interpretive code. When \fBpcre_exec()\fP is passed a \fBpcre_extra\fP block
containing a pointer to JIT code, it obeys that instead of the normal code. The
result is identical, but the code runs much faster.
.P
There are some \fBpcre_exec()\fP options that are not supported for JIT
execution. There are also some pattern items that JIT cannot handle. Details
are given below. In both cases, execution automatically falls back to the
interpretive code.
.P
If the JIT compiler finds an unsupported item, no JIT data is generated. You
can find out if JIT execution is available after studying a pattern by calling
\fBpcre_fullinfo()\fP with the PCRE_INFO_JIT option. A result of 1 means that
JIT compilation was successful. A result of 0 means that JIT support is not
available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE, or the
JIT compiler was not able to handle the pattern.
.P
Once a pattern has been studied, with or without JIT, it can be used as many
times as you like for matching different subject strings.
.
.
.SH "UNSUPPORTED OPTIONS AND PATTERN ITEMS"
.rs
.sp
The only \fBpcre_exec()\fP options that are supported for JIT execution are
PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, and
PCRE_NOTEMPTY_ATSTART. Note in particular that partial matching is not
supported.
.P
The unsupported pattern items are:
.sp
  \eC             match a single byte; not supported in UTF-8 mode
  (?Cn)          callouts
  (*COMMIT)      )
  (*MARK)        )
  (*PRUNE)       ) the backtracking control verbs
  (*SKIP)        )
  (*THEN)        )
.sp
Support for some of these may be added in future.
.
.
.SH "RETURN VALUES FROM JIT EXECUTION"
.rs
.sp
When a pattern is matched using JIT execution, the return values are the same
as those given by the interpretive \fBpcre_exec()\fP code, with the addition of
one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used
for the JIT stack was insufficient. See
.\" HTML <a href="#stackcontrol">
.\" </a>
"Controlling the JIT stack"
.\"
below for a discussion of JIT stack usage. For compatibility with the
interpretive \fBpcre_exec()\fP code, no more than two-thirds of the
\fIovector\fP argument is used for passing back captured substrings.
.P
The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a
very large pattern tree goes on for too long, as it is in the same circumstance
when JIT is not used, but the details of exactly what is counted are not the
same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT
execution.
.
.
.SH "SAVING AND RESTORING COMPILED PATTERNS"
.rs
.sp
The code that is generated by the JIT compiler is architecture-specific, and is
also position dependent. For those reasons it cannot be saved (in a file or
database) and restored later like the bytecode and other data of a compiled
pattern. Saving and restoring compiled patterns is not something many people
do. More detail about this facility is given in the
.\" HREF
\fBpcreprecompile\fP
.\"
documentation. It should be possible to run \fBpcre_study()\fP on a saved and
restored pattern, and thereby recreate the JIT data, but because JIT
compilation uses significant resources, it is probably not worth doing this;
you might as well recompile the original pattern.
.
.
.\" HTML <a name="stackcontrol"></a>
.SH "CONTROLLING THE JIT STACK"
.rs
.sp
When the compiled JIT code runs, it needs a block of memory to use as a stack.
By default, it uses 32K on the machine stack. However, some large or
complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT
is given when there is not enough stack. Three functions are provided for
managing blocks of memory for use as JIT stacks. There is further discussion
about the use of JIT stacks in the section entitled
.\" HTML <a href="#stackcontrol">
.\" </a>
"JIT stack FAQ"
.\"
below.
.P
The \fBpcre_jit_stack_alloc()\fP function creates a JIT stack. Its arguments
are a starting size and a maximum size, and it returns a pointer to an opaque
structure of type \fBpcre_jit_stack\fP, or NULL if there is an error. The
\fBpcre_jit_stack_free()\fP function can be used to free a stack that is no
longer needed. (For the technically minded: the address space is allocated by
mmap or VirtualAlloc.)
.P
JIT uses far less memory for recursion than the interpretive code,
and a maximum stack size of 512K to 1M should be more than enough for any
pattern.
.P
The \fBpcre_assign_jit_stack()\fP function specifies which stack JIT code
should use. Its arguments are as follows:
.sp
  pcre_extra         *extra
  pcre_jit_callback  callback
  void               *data
.sp
The \fIextra\fP argument must be the result of studying a pattern with
PCRE_STUDY_JIT_COMPILE. There are three cases for the values of the other two
options:
.sp
  (1) If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block
      on the machine stack is used.
.sp
  (2) If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must be
      a valid JIT stack, the result of calling \fBpcre_jit_stack_alloc()\fP.
.sp
  (3) If \fIcallback\fP not NULL, it must point to a function that is called
      with \fIdata\fP as an argument at the start of matching, in order to
      set up a JIT stack. If the result is NULL, the internal 32K stack
      is used; otherwise the return value must be a valid JIT stack,
      the result of calling \fBpcre_jit_stack_alloc()\fP.
.sp
You may safely assign the same JIT stack to more than one pattern, as long as
they are all matched sequentially in the same thread. In a multithread
application, each thread must use its own JIT stack.
.P
Strictly speaking, even more is allowed. You can assign the same stack to any
number of patterns as long as they are not used for matching by multiple
threads at the same time. For example, you can assign the same stack to all
compiled patterns, and use a global mutex in the callback to wait until the
stack is available for use. However, this is an inefficient solution, and
not recommended.
.P
This is a suggestion for how a typical multithreaded program might operate:
.sp
  During thread initalization
    thread_local_var = pcre_jit_stack_alloc(...)
.sp
  During thread exit
    pcre_jit_stack_free(thread_local_var)
.sp
  Use a one-line callback function
    return thread_local_var
.sp
All the functions described in this section do nothing if JIT is not available,
and \fBpcre_assign_jit_stack()\fP does nothing unless the \fBextra\fP argument
is non-NULL and points to a \fBpcre_extra\fP block that is the result of a
successful study with PCRE_STUDY_JIT_COMPILE.
.
.
.\" HTML <a name="stackfaq"></a>
.SH "JIT STACK FAQ"
.rs
.sp
(1) Why do we need JIT stacks?
.sp
PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where
the local data of the current node is pushed before checking its child nodes.
Allocating real machine stack on some platforms is difficult. For example, the
stack chain needs to be updated every time if we extend the stack on PowerPC.
Although it is possible, its updating time overhead decreases performance. So
we do the recursion in memory.
.P
(2) Why don't we simply allocate blocks of memory with \fBmalloc()\fP?
.sp
Modern operating systems have a nice feature: they can reserve an address space
instead of allocating memory. We can safely allocate memory pages inside this
address space, so the stack could grow without moving memory data (this is
important because of pointers). Thus we can allocate 1M address space, and use
only a single memory page (usually 4K) if that is enough. However, we can still
grow up to 1M anytime if needed.
.P
(3) Who "owns" a JIT stack?
.sp
The owner of the stack is the user program, not the JIT studied pattern or
anything else. The user program must ensure that if a stack is used by
\fBpcre_exec()\fP, (that is, it is assigned to the pattern currently running),
that stack must not be used by any other threads (to avoid overwriting the same
memory area). The best practice for multithreaded programs is to allocate a
stack for each thread, and return this stack through the JIT callback function.
.P
(4) When should a JIT stack be freed?
.sp
You can free a JIT stack at any time, as long as it will not be used by
\fBpcre_exec()\fP again. When you assign the stack to a pattern, only a pointer
is set. There is no reference counting or any other magic. You can free the
patterns and stacks in any order, anytime. Just \fIdo not\fP call
\fBpcre_exec()\fP with a pattern pointing to an already freed stack, as that
will cause SEGFAULT. (Also, do not free a stack currently used by
\fBpcre_exec()\fP in another thread). You can also replace the stack for a
pattern at any time. You can even free the previous stack before assigning a
replacement.
.P
(5) Should I allocate/free a stack every time before/after calling
\fBpcre_exec()\fP?
.sp
No, because this is too costly in terms of resources. However, you could
implement some clever idea which release the stack if it is not used in let's
say two minutes. The JIT callback can help to achive this without keeping a
list of the currently JIT studied patterns.
.P
(6) OK, the stack is for long term memory allocation. But what happens if a
pattern causes stack overflow with a stack of 1M? Is that 1M kept until the
stack is freed?
.sp
Especially on embedded sytems, it might be a good idea to release
memory sometimes without freeing the stack. There is no API for this at the
moment. Probably a function call which returns with the currently allocated
memory for any stack and another which allows releasing memory (shrinking the
stack) would be a good idea if someone needs this.
.P
(7) This is too much of a headache. Isn't there any better solution for JIT
stack handling?
.sp
No, thanks to Windows. If POSIX threads were used everywhere, we could throw
out this complicated API.
.
.
.SH "EXAMPLE CODE"
.rs
.sp
This is a single-threaded example that specifies a JIT stack without using a
callback.
.sp
  int rc;
  int ovector[30];
  pcre *re;
  pcre_extra *extra;
  pcre_jit_stack *jit_stack;
.sp
  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
  /* Check for errors */
  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
  /* Check for error (NULL) */
  pcre_assign_jit_stack(extra, NULL, jit_stack);
  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);
  /* Check results */
  pcre_free(re);
  pcre_free_study(extra);
  pcre_jit_stack_free(jit_stack);
.sp
.
.
.SH "SEE ALSO"
.rs
.sp
\fBpcreapi\fP(3)
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel (FAQ by Zoltan Herczeg)
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 26 November 2011
Copyright (c) 1997-2011 University of Cambridge.
.fi
