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

Bug#389225: Bad anulling of instruction in delay slot (gcc 4.1.1-13, sparc, building kernel)



Package: gcc-4.1
Version: 4.1.1-13
Severity: important

The compiler generates bad code when building the kernel using
gcc-4.1. I'm no expert at Sparc assembler syntax, but it seems
to be wrong.

This is from the assembler list file generated by gcc-4.1 when
compiling (-O2) /usr/src/linux/net/netfilter/xt_MARK.c:

        .align 4
        .type   target_v1, #function
        .proc   016
target_v1:
        ldub    [%o5+4], %g1
        cmp     %g1, 1
be,a .LL9 ld [%o0], %g3

; Here the load of %g3 is anulled, resulting in %g3 being used
; without being defined at label .LL9

bgeu .LL16 cmp %g1, 2 ld [%o5], %g2
.LL15:
        ld      [%o0], %g3
ld [%g3+128], %g1
.LL18:
.LL19:
cmp %g1, %g2 be .LL17 mov -1, %o0 st %g2, [%g3+128]
.LL17:
jmp %o7+8
         nop
.LL16:
bne .LL15 mov 0, %g2
        ld      [%o0], %g3
ld [%o5], %g2 ld [%g3+128], %g1 b .LL18 or %g1, %g2, %g2

.LL9:
ld [%o5], %g2 ld [%g3+128], %g1

; Here we use %g3 without prior definition.

b .LL19 and %g1, %g2, %g2
        .size   target_v1, .-target_v1

This causes iptables to fail when adding targets that use the MARK
target.

Regards
/Daniel



Reply to: