[Pkg-samba-maint] Bug#445566: compiler bug pin-down
Herbert Valerio Riedel
hvr at gnu.org
Mon Dec 31 10:25:38 UTC 2007
as usual, I have something to add few minutes after I've sent the
mail... :-)
On Mon, 2007-12-31 at 10:33 +0100, Herbert Valerio Riedel wrote:
[..]
> which when compiled with 4.2.3 20071123 (prerelease) (Debian 4.2.2-4),
> causes a segfault when using -O2, but works when either removing the
> 'static' modifier and thus avoiding inlining of do_segfault, or by using
> an optimization level which does avoid that...
>
> the generated assembler code is quite broken for the optimized case:
>
> (I've only pasted and commented the relevant section containing the 5
> nops)
>
> // r4 points to outbuf (= source buffer)
> // sp points to inbuf (= target buffer)
> #APP
> nop
> mov r2, sp
> add r1, sp, #56 // upper loop-bound; should have been #12
I actually wanted to say 'should have been #24' :-)
this overrun is what causes the segfault... and which goes away when not
inlining, but the source-ptr not updating...
> cmp r4, r1 // upper loop-bound check
> add r2, r2, #2 // increment target buffer (NB: source buffer is not incremented!)
> bne .L2 // repeat loop if upper loop-bound not reached yet
...stays even when avoiding inlining; it's somehow the optimizer that
gets confused by
in_buf[2*i] = ( out_buf[2*i] | out_buf[(2*i)+1]<<8 ) & 0xFF;
in_buf[(2*i)+1] = ( out_buf[2*i] | out_buf[(2*i)+1]<<8 ) >> 8;
which gcc correctly optimizes to
in_buf[2*i] = out_buf[2*i];
in_buf[(2*i)+1] = out_buf[(2*i)+1];
but then gets confused; if one takes away that confusion from gcc by
replacing the former two lines by their latter equivalent optimized
variants, code generation is fine for all optimization levels...
cheers,
hvr
More information about the Pkg-samba-maint
mailing list