PERL_DEBUG_READONLY_COW

Make perls compiled with -Accflags=-DPERL_DEBUG_READONLY_COW to turn
COW buffer violations into crashes.

We do this using mmap to allocate memory and then mprotect to mark
memory as read-only when buffers are shared.

We have to do this at the safesysmalloc level, because some code does
SvPV_set with buffers it allocates on its own via safemalloc().

Unfortunately this means many things are allocated using mmap that
will never be marked read-only, slowing things down considerably, but
I see no other way.

Because munmap and mprotect need to know the length, we use the
existing sTHX/perl_memory_debug_header mechanism used already by
PERL_TRACK_MEMPOOL and store the size there (as PERL_POISON already
does when PERL_TRACK_MEMPOOL is enabled).  perl_memory_debug_header is
a struct positioned at the beginning of every allocated buffer, for
tracking things.
Make XS::APItest::establish_cleanup protect existing stacks

It causes pp_entersub to be called in odd places, which can cause the
context stack to be reallocated when an outer function call (like
pp_leavesub) has a pointer into the context stack in a C auto.

cleanup.t was failing for me under PERL_DEBUG_READONLY_COW +
STRESS_REALLOC + threads, because the context stack was reallocated
and the old address then freed and reused for something else, being
zeroed in the mean time.  So pp_leavesub returned NULL (trying to
read retop from the context stack), causing the program to exit.
During global destruction, subs that had not be exited properly were
undefined, leading to:

1..3
Can't undef active subroutine during global destruction.
threads.t: Increase watchdog timeout

PERL_DEBUG_READONLY_COW is too slow for a 60s timeout.
XS::APItest: Flatten src for utf16_to_utf8_reversed

utf16_to_utf8_reversed (the C function) modifies its input, so the XS
function of the same name should flatten the input to avoid modifying
shared buffers.

Brought to you by PERL_DEBUG_READONLY_COW.
COW documentation

plus read-only documentation, since hysterically the two are
intertwined.
Teach podcheck about mmap(2)
perldiag for new mprotect warnings
SvGROW should un-cow under PERL_OLD_COPY_ON_WRITE

Otherwise pp_uc (and presumably other pieces of code) will end up mod-
ifying shared buffers.

Brought to you by PERL_DEBUG_READONLY_COW.
Skip t/re/uniprops.t under PERL_DEBUG_READONLY_COW

Under Linux, using mmap for all memory allocation stops working when we
get up to 70,000 lines of code.  So just skip it.
util.c: A couple of defines to simplify #ifdef maze

No real simplification in terms of the number of #ifdefs, but more
readability (hopefully).
[Merge] Cow Tools

This branch provides a PERL_DEBUG_READONLY_COW mode that turns COW
violations into crashes.  It also add documentation to perlguts
explaining how to handle COW strings in XS code.

There are two ‘known’ failures in IO::Compress’ tests.  A patch has
been sent upstream.

(Apologies to Gary Larson.)