Hello folks,
I've put in some work on PCRE lately, and would like to submit my changes.
They largely address (1) compatibility with the IBM C compiler (xlc), and
(2) memory leaks in the pcretest test driver.
Everything is in the attached patch, against SVN trunk. A walk-through is
below:
++ RunTest
@ The initial goal here was to quell the "illegal option" error message
from older diff(1) programs; the restructuring of the conditional is a
parallel to my changes to RunGrepTest
++ pcre_jit_compile.c
@ This comment is intended to help folks who are led to that
SLJIT_MALLOC() by Valgrind. It certainly would have helped me, as
pcretest was doing the clear-the-PCRE_EXTRA_EXECUTABLE_JIT-flag thing!
++ sljit/sljitNativePPC_common.c
@ Allow this file to be compiled by IBM's xlc compiler, which specifically
supports GCC asm syntax, but does not define __GNUC__. This support can
be switched off with -qnoasm, however...
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/topic/com.ibm.xlcpp8l.doc/compiler/ref/ruoptasm.htm
... so give a more helpful error in that case.
Use __asm__ instead of plain "asm", as the latter can be de-recognized as
a keyword with -qnokeyword=asm, and so the former is more robust:
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/topic/com.ibm.xlcpp8l.doc/compiler/ref/ruoptkey.htm
Also, I encountered a mysterious assembly error when building with -O3
and -qfuncsect:
--------8<--------
libtool: compile: /usr/vac/bin/xlc_r -DHAVE_CONFIG_H -I. -I/srcdir/pcre-8.30 -O3 -q64 -qfuncsect -c -M
/srcdir/pcre-8.30/pcre_jit_compile.c -DPIC -o pcre_jit_compile.o
"/srcdir/pcre-8.30/sljit/sljitNativePPC_common.c", line 42.2: 1506-948 (W) #warning "This file may fail to compile if -qfuncsect is
used"
Assembler:
pcre_jit_compile.s: line 59973: undefined symbol "S.8704.IPRA._sljit_emit_cmp"
pcre_jit_compile.s: line 59973: illegal expression
pcre_jit_compile.s: line 59988: undefined symbol "S.8705.IPRA._compile_xclass_hotpath"
pcre_jit_compile.s: line 59988: illegal expression
pcre_jit_compile.s: line 59991: undefined symbol "S.8706.IPRA._compile_char1_hotpath"
pcre_jit_compile.s: line 59991: illegal expression
pcre_jit_compile.s: line 60000: undefined symbol "S.8707.IPRA._compile_iterator_hotpath"
pcre_jit_compile.s: line 60000: illegal expression
1500-067: (S) asm statement generates errors in assembler output.
1586-346 (U) An error occurred during code generation. The code generation return code was 1.
make: The error code from the last command is 1.
Stop.
make: The error code from the last command is 2.
-------->8--------
(I was using a handful of other options as well, but they had no bearing
on this failure mode.)
This error appears to be due to the inline assembly of ppc_cache_flush(),
because if I comment out the asm statement, the error goes away.
Removing -qfuncsect allows the source to compile, asm and all, so I added
a #warning for folks using the IBM compiler to help them diagnose the
problem.
@ Quelled a warning about converting a function pointer to void*
++ sljit/sljitNativePPC_64.c
@ Allow compilation with the IBM compiler and use __asm__ instead of "asm"
++ sljit/sljitConfigInternal.h
@ The IBM compiler does define __powerpc__, but not __powerpc64__, even in
64-bit mode. It does, however, define _ARCH_PPC and _ARCH_PPC64:
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/topic/com.ibm.xlcpp8a.doc/compiler/ref/ruoptarc.htm
++ pcretest.c
@ There were a few "if (re != NULL) ..." bits below this, and I thought,
this is silly---just check whether "re" is NULL right after the
new_malloc() call, and bail out if it is
@ "re" was being leaked
@ new_free(re) unconditionally, because we know it's not NULL
@ "re" and "f" were being leaked
@ extra->executable_jit was being leaked because an existing pcre_extra
object with JIT data would enter this block, then have its
PCRE_EXTRA_EXECUTABLE_JIT cleared, and then there was no way to
subsequently tell whether extra->executable_jit was a valid pointer or not.
I resolved this just by calling PCRE_FREE_STUDY() and allocating a new
pcre_extra object every time. (Maybe there would be a use for a
pcre_clear_study() routine, that does everything pcre_free_study() does
except for the final free().)
@ dfa_workspace was being leaked
++ autogen.sh
@ test(1) a.k.a. "[" has "=" as an operator, not "=="
++ RunGrepTest
@ Rewrote the diff check. Again, the initial goal was to quash the error
message printed by older diff programs that don't do -u. The secondary
goal was to simplify the nested shell conditionals into something more
elegant; here, I've implemented a progression from the least-desirable
diff invocation to the most. Subjectively, I think this is cleaner.
Comments and critique welcome,
--Daniel
--
Daniel Richard G. || danielg@??? || Software Developer
Teragram Linguistic Technologies (a division of SAS)
http://www.teragram.com/