regex sets: fix Solaris optimiser bug
authorDavid Mitchell <davem@iabyn.com>
Sat, 12 Mar 2016 09:39:41 +0000 (09:39 +0000)
committerDavid Mitchell <davem@iabyn.com>
Sat, 12 Mar 2016 10:22:51 +0000 (10:22 +0000)
commitd9cb8415c513b2fde359b11064306563502cbdeb
tree379d271a98e9ac92235b2deea797498ecc8246e4
parent6de23f80b0db931a33c28fa9eea3c74f533d772b
regex sets: fix Solaris optimiser bug

[perl #127455]

On Solaris with -DDEBUGGING, re/regex_sets.t was failing to compile.

This appears to be due to an optimiser bug.

The code in question looked like:

  handle_operand:
    top_index = av_tindex_nomg(stack);
    if (top_index - fence >= 0) {
        ...
    }

printf()ing the value of fence after the av_tindex_nomg() showed that its
value was corrupted (compared with its expected value based on a different
platform with the same debugging print). However, putting a another printf
prior to the av_tindex_nomg() call not only displayed the correct value,
but caused the later printf() to also display the correct value. It seems
that merely accessing fence prior to av_tindex_nomg() avoids the
corruption.

Simplifying the av_tindex_nomg(), the bad behaviour could be reduced to:

    if (!stack) { __assert( "" , "", 1); }

Putting a printf after this gave a corrupted fence; a printf before
made everything work.

So this workaround commit just makes sure that fence is accessed prior to
calling av_tindex_nomg().
regcomp.c