tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: lang/php5 on m68k problems



Paul Ripke wrote:

>On Tue, Sep 30, 2008 at 05:29:11PM +0000, John Klos wrote:
>>[...]
>> /var/tmp//ccpS22Ph.s: Assembler messages:
>> /var/tmp//ccpS22Ph.s:231: Error: value out of range
>> /var/tmp//ccpS22Ph.s:231: Error: value of -286 too large for field of 1
>> bytes at 535
>> /var/tmp//ccpS22Ph.s:274: Error: value out of range
>> /var/tmp//ccpS22Ph.s:274: Error: value of -286 too large for field of 1
>> bytes at 627
>> /var/tmp//ccpS22Ph.s:352: Error: value out of range
>> /var/tmp//ccpS22Ph.s:352: Error: value of -286 too large for field of 1
>> bytes at 833
>        [...]
>        .set .LI70,.+2
>        move.w .L70-.LI70.b(%pc,%d1.l*2),%d0
>.L147:
>        moveq #6,%d2
>        cmp.l %d1,%d2
>        jbcs .L147
>.L148:
>        jmp %pc@(2,%d0:w)
>        .align  2
>.L70:
>        .word .L63-.L70
>        .word .L64-.L70
>        .word .L65-.L70
>        .word .L66-.L70
>        .word .L67-.L70
>        .word .L68-.L70
>        .word .L69-.L70
>
>and it's tripping up on the move.w. AFAICT, this is part of the
>expansion of a switch statement inside the php_conv_qprint_decode_convert
>function. BTW: that move.w is repeated 3 times in that function, leading
>to the three errors.
>
>Looks like a gcc bug. It *does* compile at -O however (but not -O2).

I can confirm that, and it could also be an assembler bug.
The PC-relative distance to the table at .L70 is calculated three
times via the symbol .LI70, which is always set to the address of
the move.w instruction + 2.

My guess is that the assembler uses the last set-value of .LI70,
when rendering the instruction, instead of the one defined in the
line above. This explains the errors showing three times the same
wrong value of -286!

I am crossposting this to tech-toolchain (or where do compiler/assembler
bugs belong?).


--
Frank Wille


Home | Main Index | Thread Index | Old Index