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

Bug#561550: gcc-4.4: sh4: undefined reference to `__sync_bool_compare_and_swap_2'



Package: gcc-4.4
Version: 4.4.2-5
Severity: important
Tags: patch
User: debian-sh4@superh.org
Usertags: sh4
X-Debbugs-CC: debian-superh@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__ */

Reply to: