Package: gcc-4.4 Version: 4.4.2-5 Severity: important Tags: patch User: debian-...@superh.org Usertags: sh4 X-Debbugs-CC: debian-sup...@lists.debian.org
Hi, I am now trying to run Debian on Renesas SH(sh4) CPU. http://buildd.debian-ports.org/status/architecture.php?suite=unstable&a=sh4 Package of current gcc-4.4 doesn't support build-in functions such as __sync_bool_compare_and_swap, __sync_value_compare_and_swap, and __sync_***_and_fetch. Therefore, the software that used these fails in build. ex) http://buildd.debian-ports.org/fetch.php?pkg=openscap&arch=sh4&ver=0.5.5-1&stamp=1261088412&file=log&as=raw http://buildd.debian-ports.org/fetch.php?&pkg=asterisk&ver=1%3A1.6.2.0~rc3-2&arch=sh4&stamp=1256868313&file=log&as=raw This problem is revised in r150371 and r150469 of upstream. And I made the patch which revised these problems for Debian. Could you check and apply this patch? There is this problem in gcc-4.3. Please apply to gcc-4.3, too. Best regards, Nobuhiro -- Nobuhiro Iwamatsu iwamatsu at {nigauri.org / debian.org} GPG ID: 40AD1FA6
--- a/src/gcc/config/sh/linux-atomic.asm 2009-04-10 08:23:07.000000000 +0900 +++ b/src/gcc/config/sh/linux-atomic.asm 2009-12-18 11:58:50.000000000 +0900 @@ -54,10 +54,10 @@ ATOMIC_TEST_AND_SET (4,l,mov) #define ATOMIC_COMPARE_AND_SWAP(N,T,EXTS,EXT) \ - .global __sync_compare_and_swap_##N; \ - HIDDEN_FUNC(__sync_compare_and_swap_##N); \ + .global __sync_val_compare_and_swap_##N; \ + HIDDEN_FUNC(__sync_val_compare_and_swap_##N); \ .align 2; \ -__sync_compare_and_swap_##N:; \ +__sync_val_compare_and_swap_##N:; \ mova 1f, r0; \ EXTS r5, r5; \ mov r15, r1; \ @@ -69,12 +69,34 @@ 1: mov r1, r15; \ rts; \ EXT r2, r0; \ - ENDFUNC(__sync_compare_and_swap_##N) + ENDFUNC(__sync_val_compare_and_swap_##N) ATOMIC_COMPARE_AND_SWAP (1,b,exts.b,extu.b) ATOMIC_COMPARE_AND_SWAP (2,w,exts.w,extu.w) ATOMIC_COMPARE_AND_SWAP (4,l,mov,mov) +#define ATOMIC_BOOL_COMPARE_AND_SWAP(N,T,EXTS) \ + .global __sync_bool_compare_and_swap_##N; \ + HIDDEN_FUNC(__sync_bool_compare_and_swap_##N); \ + .align 2; \ +__sync_bool_compare_and_swap_##N:; \ + mova 1f, r0; \ + EXTS r5, r5; \ + mov r15, r1; \ + mov #(0f-1f), r15; \ +0: mov.##T @r4, r2; \ + cmp/eq r2, r5; \ + bf 1f; \ + mov.##T r6, @r4; \ +1: mov r1, r15; \ + rts; \ + movt r0; \ + ENDFUNC(__sync_bool_compare_and_swap_##N) + +ATOMIC_BOOL_COMPARE_AND_SWAP (1,b,exts.b) +ATOMIC_BOOL_COMPARE_AND_SWAP (2,w,exts.w) +ATOMIC_BOOL_COMPARE_AND_SWAP (4,l,mov) + #define ATOMIC_FETCH_AND_OP(OP,N,T,EXT) \ .global __sync_fetch_and_##OP##_##N; \ HIDDEN_FUNC(__sync_fetch_and_##OP##_##N); \ @@ -135,4 +157,67 @@ ATOMIC_FETCH_AND_COMBOP(nand,and,not,2,w,extu.w) ATOMIC_FETCH_AND_COMBOP(nand,and,not,4,l,mov) +#define ATOMIC_OP_AND_FETCH(OP,N,T,EXT) \ + .global __sync_##OP##_and_fetch_##N; \ + HIDDEN_FUNC(__sync_##OP##_and_fetch_##N); \ + .align 2; \ +__sync_##OP##_and_fetch_##N:; \ + mova 1f, r0; \ + nop; \ + mov r15, r1; \ + mov #(0f-1f), r15; \ +0: mov.##T @r4, r2; \ + mov r5, r3; \ + OP r2, r3; \ + mov.##T r3, @r4; \ +1: mov r1, r15; \ + rts; \ + EXT r3, r0; \ + ENDFUNC(__sync_##OP##_and_fetch_##N) + +ATOMIC_OP_AND_FETCH(add,1,b,extu.b) +ATOMIC_OP_AND_FETCH(add,2,w,extu.w) +ATOMIC_OP_AND_FETCH(add,4,l,mov) + +ATOMIC_OP_AND_FETCH(or,1,b,extu.b) +ATOMIC_OP_AND_FETCH(or,2,w,extu.w) +ATOMIC_OP_AND_FETCH(or,4,l,mov) + +ATOMIC_OP_AND_FETCH(and,1,b,extu.b) +ATOMIC_OP_AND_FETCH(and,2,w,extu.w) +ATOMIC_OP_AND_FETCH(and,4,l,mov) + +ATOMIC_OP_AND_FETCH(xor,1,b,extu.b) +ATOMIC_OP_AND_FETCH(xor,2,w,extu.w) +ATOMIC_OP_AND_FETCH(xor,4,l,mov) + +#define ATOMIC_COMBOP_AND_FETCH(OP,OP0,OP1,N,T,EXT) \ + .global __sync_##OP##_and_fetch_##N; \ + HIDDEN_FUNC(__sync_##OP##_and_fetch_##N); \ + .align 2; \ +__sync_##OP##_and_fetch_##N:; \ + mova 1f, r0; \ + mov r15, r1; \ + mov #(0f-1f), r15; \ +0: mov.##T @r4, r2; \ + mov r5, r3; \ + OP0 r2, r3; \ + OP1 r3, r3; \ + mov.##T r3, @r4; \ +1: mov r1, r15; \ + rts; \ + EXT r3, r0; \ + ENDFUNC(__sync_##OP##_and_fetch_##N) + +ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,1,b,extu.b) +ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,2,w,extu.w) +ATOMIC_COMBOP_AND_FETCH(sub,sub,neg,4,l,mov) + +ATOMIC_COMBOP_AND_FETCH(nand,and,not,1,b,extu.b) +ATOMIC_COMBOP_AND_FETCH(nand,and,not,2,w,extu.w) +ATOMIC_COMBOP_AND_FETCH(nand,and,not,4,l,mov) + +.section .note.GNU-stack,"",%progbits +.previous + #endif /* ! __SH5__ */