[PATCH][SH] SH CFI directives patch, revised

Chung-Lin Tang cltang@codesourcery.com
Thu May 17 10:35:00 GMT 2012


On 2012/5/17 06:33 PM, Chung-Lin Tang wrote:
> Here's an updated set of patches for SH CFI annotations, asides from the
> parts already committed by Thomas (the CFI modifications for
> cancellation point routines).

And, the patch :P
-------------- next part --------------
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
index fe4e3b6..dbdf6a8 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
@@ -165,6 +165,8 @@ __lll_lock_wait_private:
 	bf	1b
 
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	rts
 	 mov	r2, r0
 	cfi_endproc
@@ -208,7 +210,11 @@ __lll_lock_wait:
 	bf	1b
 
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	ret
 	 mov	r2, r0
 	cfi_endproc
@@ -285,6 +291,7 @@ __lll_timedlock_wait:
 	mov	r3, r0
 5:
 	rts
+	 /* Omit CFI for restore in delay slot.  */
 	 mov.l	@r15+, r12
 
 # ifndef __ASSUME_FUTEX_CLOCK_REALTIME
@@ -386,17 +393,31 @@ __lll_timedlock_wait:
 2:	mov	#ETIMEDOUT, r3
 
 6:
-	mov	r3, r0
+	cfi_remember_state
 	add	#8, r15
+	cfi_adjust_cfa_offset (-8)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	mov.l	@r15+, r11
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r11)
+	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
-	 mov.l	@r15+, r12
-
+	 mov	r3, r0
+	cfi_restore_state
 3:
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	#EINVAL, r0
 # endif
@@ -521,10 +542,16 @@ __lll_timedwait_tid:
 4:
 	mov	#0, r0
 3:
+	cfi_remember_state
 	add	#8, r15
+	cfi_adjust_cfa_offset (-8)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	rts
+	 /* Omit CFI for restore in delay slot.  */
 	 mov.l	@r15+, r9
+	cfi_restore_state
 1:
 	/* Check whether the time expired.  */
 	mov	#-ETIMEDOUT, r1
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S b/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S
index 8b1e006..e3aaeee 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevelrobustlock.S
@@ -115,6 +115,8 @@ __lll_robust_lock_wait:
 
 3:
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	ret
 	 mov	r4, r0
 	cfi_endproc
@@ -231,13 +233,22 @@ __lll_robust_timedlock_wait:
 	mov	#0, r0
 
 6:
+	cfi_remember_state
 	add	#8, r15
+	cfi_adjust_cfa_offset (-8)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	rts
+	 /* Omit CFI for restore in delay slot.  */
 	 mov.l	@r15+, r11
-
+	cfi_restore_state
 7:
 	/* Check whether the time expired.  */
 	mov	#-ETIMEDOUT, r1
@@ -248,6 +259,11 @@ __lll_robust_timedlock_wait:
 	bra	6b
 	 mov	#ETIMEDOUT, r0
 3:
+	/* Restore initial state for invalid timeout case.  */
+	cfi_restore (r8)
+	cfi_restore (r9)
+	cfi_restore (r10)
+	cfi_def_cfa_offset (0)
 	rts
 	 mov	#EINVAL, r0
 	cfi_endproc
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
index 58a9cde..0b4915a 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_barrier_wait.S
@@ -25,10 +25,17 @@
 	.globl	pthread_barrier_wait
 	.type	pthread_barrier_wait,@function
 	.align	5
+	cfi_startproc
 pthread_barrier_wait:
 	mov.l	r9, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r9, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	mov	r4, r8
 
 	/* Get the mutex.  */
@@ -98,12 +105,19 @@ pthread_barrier_wait:
 	bf	9f
 
 10:
-	mov	#0, r0		/* != PTHREAD_BARRIER_SERIAL_THREAD */
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
+	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	rts
-	 mov.l	@r15+, r9
-
+	 mov	#0, r0		/* != PTHREAD_BARRIER_SERIAL_THREAD */
+	cfi_restore_state
 3:
 	/* The necessary number of threads arrived.  */
 	mov.l	@(CURR_EVENT,r8), r1
@@ -140,11 +154,19 @@ pthread_barrier_wait:
 	tst	r2, r2
 	bf	4f
 5:
-	mov	#-1, r0		/* == PTHREAD_BARRIER_SERIAL_THREAD */
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
+	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	rts
-	 mov.l	@r15+, r9
+	 mov	#-1, r0		/* == PTHREAD_BARRIER_SERIAL_THREAD */
+	cfi_restore_state
 
 1:
 	mov.l	@(PRIVATE,r8), r6
@@ -200,6 +222,7 @@ pthread_barrier_wait:
 .Lwake2b:
 	bra	10b
 	 mov	r9, r6
+	cfi_endproc
 
 	.align	2
 .Lall:
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
index 7bd9355..0fe8cf2 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
@@ -30,11 +30,20 @@
 	.globl	__pthread_cond_broadcast
 	.type	__pthread_cond_broadcast, @function
 	.align	5
+	cfi_startproc
 __pthread_cond_broadcast:
 	mov.l   r10, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r10, 0)
 	mov.l   r9, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r9, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	mov	r4, r8
 
 	/* Get internal lock.  */
@@ -136,12 +145,22 @@ __pthread_cond_broadcast:
 	 add	#cond_futex, r4
 
 10:
-	mov	#0, r0
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
+	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	rts
-	 mov.l	@r15+, r10
+	 mov	#0, r0
+	cfi_restore_state
 
 4:
 	/* Unlock.  */
@@ -153,12 +172,22 @@ __pthread_cond_broadcast:
 	tst	r2, r2
 	bf	5f
 6:
-	mov	#0, r0
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
+	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	rts
-	 mov.l	@r15+, r10
+	 mov	#0, r0
+	cfi_restore_state
 
 1:
 	/* Initial locking failed.  */
@@ -244,7 +273,8 @@ __pthread_cond_broadcast:
 	SYSCALL_INST_PAD
 	bra	10b
 	 nop
-
+	cfi_endproc
+	
 #ifndef __ASSUME_PRIVATE_FUTEX
 .Lpfoff:
 	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S
index 320a3e8..118e62c 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_signal.S
@@ -29,9 +29,14 @@
 	.globl	__pthread_cond_signal
 	.type	__pthread_cond_signal, @function
 	.align	5
+	cfi_startproc
 __pthread_cond_signal:
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	mov	r4, r8
 
 	/* Get internal lock.  */
@@ -109,10 +114,16 @@ __pthread_cond_signal:
 	bt	7f
 
 6:
-	mov	#0, r0
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
+	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	rts
-	 mov.l	@r15+, r8
+	 mov	#0, r0
+	cfi_restore_state
 
 #ifndef __ASSUME_PRIVATE_FUTEX
 .Lpfoff:
@@ -178,6 +189,7 @@ __pthread_cond_signal:
 .Lwait4b:
 	bra	2b
 	 nop
+	cfi_endproc
 
 	.align	2
 .Lwait4:
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
index d945dbf..349f77e 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
@@ -416,15 +416,31 @@ __pthread_cond_timedwait:
 	mov.l	@(24,r15), r0
 
 18:	
+	cfi_remember_state
 	add	#64, r15
+	cfi_adjust_cfa_offset (-64)
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r13
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r13)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	mov.l	@r15+, r11
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r11)
 	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	rts
+	 /* Omit CFI for restore in delay slot.  */
 	 mov.l	@r15+, r8
+	cfi_restore_state
 
 #ifndef __ASSUME_PRIVATE_FUTEX
 .Lpfoff:
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
index d06673c..807bffd 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
@@ -285,14 +285,28 @@ __pthread_cond_wait:
 	/* We return the result of the mutex_lock operation.  */
 
 14:
+	cfi_remember_state
 	add	#48, r15
+	cfi_adjust_cfa_offset (-48)
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	mov.l	@r15+, r11
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r11)
 	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	rts
+	 /* Omit CFI for restore in delay slot.  */
 	 mov.l	@r15+, r8
+	cfi_restore_state
 
 #ifndef __ASSUME_PRIVATE_FUTEX
 .Lpfoff0:
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S
index ee88089..d700555 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_rdlock.S
@@ -29,11 +29,20 @@
 	.globl	__pthread_rwlock_rdlock
 	.type	__pthread_rwlock_rdlock,@function
 	.align	5
+	cfi_startproc
 __pthread_rwlock_rdlock:
 	mov.l	r12, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r12, 0)
 	mov.l	r9, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r9, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	mov	r4, r8
 
 	/* Get the lock.  */
@@ -134,12 +143,22 @@ __pthread_rwlock_rdlock:
 	tst	r2, r2
 	bf	6f
 7:
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	r3, r0
+	cfi_restore_state
 
 #ifndef __ASSUME_PRIVATE_FUTEX
 .Lpfoff:
@@ -234,6 +253,7 @@ __pthread_rwlock_rdlock:
 .Lwait1b:
 	bra	13b
 	 nop
+	cfi_endproc
 
 	.align	2
 .Lwait0:
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S
index a7c524d..5cbc34c 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedrdlock.S
@@ -29,13 +29,25 @@
 	.globl	pthread_rwlock_timedrdlock
 	.type	pthread_rwlock_timedrdlock,@function
 	.align	5
+	cfi_startproc
 pthread_rwlock_timedrdlock:
 	mov.l	r12, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r12, 0)
 	mov.l	r10, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r10, 0)
 	mov.l	r9, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r9, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	add	#-8, r15
+	cfi_adjust_cfa_offset (8)
 	mov	r4, r8
 	mov	r5, r9
 
@@ -183,14 +195,27 @@ pthread_rwlock_timedrdlock:
 	tst	r2, r2
 	bf	6f
 7:
+	cfi_remember_state
 	add	#8,r15
+	cfi_adjust_cfa_offset (-8)
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	r3, r0
+	cfi_restore_state
 
 #ifndef __ASSUME_PRIVATE_FUTEX
 .Lpfoff:
@@ -300,6 +325,7 @@ pthread_rwlock_timedrdlock:
 19:
 	bra	9b
 	 mov	#EINVAL, r3
+	cfi_endproc
 
 	.align	2
 .Lwait2:
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
index 04e2c63..4c31a2c 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_timedwrlock.S
@@ -29,13 +29,25 @@
 	.globl	pthread_rwlock_timedwrlock
 	.type	pthread_rwlock_timedwrlock,@function
 	.align	5
+	cfi_startproc
 pthread_rwlock_timedwrlock:
 	mov.l	r12, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r12, 0)
 	mov.l	r10, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r10, 0)
 	mov.l	r9, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r9, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	add	#-8, r15
+	cfi_adjust_cfa_offset (8)
 	mov	r4, r8
 	mov	r5, r9
 
@@ -181,14 +193,27 @@ pthread_rwlock_timedwrlock:
 	tst	r2, r2
 	bf	6f
 7:
+	cfi_remember_state
 	add	#8,r15
+	cfi_adjust_cfa_offset (-8)
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	r3, r0
+	cfi_restore_state
 
 #ifndef __ASSUME_PRIVATE_FUTEX
 .Lpfoff:
@@ -284,6 +309,7 @@ pthread_rwlock_timedwrlock:
 16:
 	bra	17b
 	 mov	#-ETIMEDOUT, r3
+	cfi_endproc
 
 	.align	2
 .Lwait6:
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S
index bd0b08a..ea51936 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_unlock.S
@@ -27,10 +27,17 @@
 	.globl	__pthread_rwlock_unlock
 	.type	__pthread_rwlock_unlock,@function
 	.align	5
+	cfi_startproc
 __pthread_rwlock_unlock:
 	mov.l	r12, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r12, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	mov	r4, r8
 
 	/* Get the lock.  */
@@ -108,11 +115,19 @@ __pthread_rwlock_unlock:
 	trapa	#0x14
 	SYSCALL_INST_PAD
 
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	#0, r0
+	cfi_restore_state
 6:
 #if MUTEX == 0
 	DEC (@r8, r2)
@@ -122,11 +137,19 @@ __pthread_rwlock_unlock:
 	tst	r2, r2
 	bf	3f
 4:
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	#0, r0
+	cfi_restore_state
 
 1:
 	mov	r8, r5
@@ -159,7 +182,9 @@ __pthread_rwlock_unlock:
 
 7:
 	mov.l	r4, @-r15
+	cfi_adjust_cfa_offset (4)
 	mov.l	r6, @-r15
+	cfi_adjust_cfa_offset (4)
 	mov	r8, r4
 #if MUTEX != 0
 	add	#MUTEX, r4
@@ -173,9 +198,12 @@ __pthread_rwlock_unlock:
 .Lwake9b:
 
 	mov.l	@r15+, r6
+	cfi_adjust_cfa_offset (-4)
 	bra	8b
 	 mov.l	@r15+, r4
 
+	cfi_endproc
+
 #ifndef __ASSUME_PRIVATE_FUTEX
 .Lpfoff:
 	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S
index b378df6..49ebfd9 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_rwlock_wrlock.S
@@ -29,11 +29,20 @@
 	.globl	__pthread_rwlock_wrlock
 	.type	__pthread_rwlock_wrlock,@function
 	.align	5
+	cfi_startproc
 __pthread_rwlock_wrlock:
 	mov.l	r12, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r12, 0)
 	mov.l	r9, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r9, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	mov	r4, r8
 
 	/* Get the lock.  */
@@ -128,12 +137,22 @@ __pthread_rwlock_wrlock:
 	tst	r2, r2
 	bf	6f
 7:
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	r3, r0
+	cfi_restore_state
 
 1:
 	mov	r8, r5
@@ -217,6 +236,8 @@ __pthread_rwlock_wrlock:
 	bra	13b
 	 nop
 
+	cfi_endproc
+
 	.align	2
 .Lwait4:
 	.long	__lll_lock_wait-.Lwait4b
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S
index b228a32..887287f 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S
@@ -28,6 +28,7 @@
 	.globl	__new_sem_post
 	.type	__new_sem_post,@function
 	.align	5
+	cfi_startproc
 __new_sem_post:
 	mov.l	@(VALUE,r4), r2
 0:
@@ -66,8 +67,14 @@ __new_sem_post:
 	mov	#EOVERFLOW, r2
 4:
 	mov.l	r12, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r12, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	mova	.Lgot3, r0
 	mov.l	.Lgot3, r12
 	add	r0, r12
@@ -83,10 +90,17 @@ __new_sem_post:
 .Lexit:
 	mov.l	r2, @r0
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	#-1, r0
+	cfi_endproc
 
 	.align	2
 .Lmax:
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S
index 9553bc7..f8f9de5 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S
@@ -170,14 +170,27 @@ sem_timedwait:
 	mov	#0, r0
 
 10:
+	cfi_remember_state
 	add	#8, r15
+	cfi_adjust_cfa_offset (-8)
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	mov.l	@r15+, r9
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r9)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	rts
 	 nop
+	cfi_restore_state
 
 3:
 	neg	r0, r0
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S
index 35ae9b2..39cd07a 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S
@@ -27,10 +27,17 @@
 	.globl	__new_sem_trywait
 	.type	__new_sem_trywait,@function
 	.align	5
+	cfi_startproc
 __new_sem_trywait:
 	mov.l	r12, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r12, 0)
 	mov.l	r8, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (r8, 0)
 	sts.l	pr, @-r15
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (pr, 0)
 	mov	r4, r8
 	mov.l	@r8, r0
 2:
@@ -44,11 +51,19 @@ __new_sem_trywait:
 	bf/s	2b
 	 mov	r2, r0
 
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	#0, r0
+	cfi_restore_state
 
 1:
 	mov	#EAGAIN, r8
@@ -67,11 +82,19 @@ __new_sem_trywait:
 .Lexit:
 	mov.l	r8, @r0
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r8
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r8)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	rts
 	 mov	#-1, r0
 
+	cfi_endproc
+
 	.align	2
 .Lgot1:
 	.long	_GLOBAL_OFFSET_TABLE_
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S
index f2dd0c8..740862c 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S
@@ -71,11 +71,20 @@ __new_sem_wait:
 7:
 	mov	#0, r0
 9:
+	cfi_remember_state
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 	mov.l	@r15+, r10
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r10)
 	rts
+	 /* Omit CFI for restore in delay slot.  */
 	 mov.l	@r15+, r8
+	cfi_restore_state
 
 .Lafter_ret:
 1:
diff --git a/sysdeps/sh/_mcount.S b/sysdeps/sh/_mcount.S
index 7956c01..5a8c423 100644
--- a/sysdeps/sh/_mcount.S
+++ b/sysdeps/sh/_mcount.S
@@ -58,10 +58,19 @@ C_LABEL(_mcount)
 
 	/* Pop the saved registers.  */
 	lds.l	@r15+,pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+,r7
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r7)
 	mov.l	@r15+,r6
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r6)
 	mov.l	@r15+,r5
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r5)
 	rts
+	 /* Omit CFI for restore in delay slot.  */
 	 mov.l	@r15+,r4
 
 	.align 2
diff --git a/sysdeps/unix/sh/sysdep.S b/sysdeps/unix/sh/sysdep.S
index e816575..ffd708a 100644
--- a/sysdeps/unix/sh/sysdep.S
+++ b/sysdeps/unix/sh/sysdep.S
@@ -41,13 +41,15 @@ skip:
 	sts.l	pr, @-r15
 	cfi_adjust_cfa_offset (4)
 	cfi_rel_offset (pr, 0)
-	jsr	@r1
-	 mov.l	r0, @-r15
+	mov.l	r0, @-r15
 	cfi_adjust_cfa_offset (4)
+	jsr	@r1
+	 nop
 	mov.l	@r15+, r1
 	cfi_adjust_cfa_offset (-4)
 	lds.l	@r15+, pr
 	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	r1, @r0
 #endif
 #else
@@ -77,10 +79,15 @@ skip:
 	jsr	@r1
 	 nop
 	lds.l	@r15+, pr
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (pr)
 	mov.l	@r15+, r1
+	cfi_adjust_cfa_offset (-4)
 	mov.l	r1, @r0
 #endif
 	mov.l	@r15+, r12
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r12)
 #endif
 	/* And just kick back a -1.  */
 	rts
diff --git a/sysdeps/unix/sysv/linux/sh/sh3/setcontext.S b/sysdeps/unix/sysv/linux/sh/sh3/setcontext.S
index abe384e..42e233a 100644
--- a/sysdeps/unix/sysv/linux/sh/sh3/setcontext.S
+++ b/sysdeps/unix/sysv/linux/sh/sh3/setcontext.S
@@ -90,6 +90,7 @@ ENTRY(__setcontext)
 	mov.l	@(oR7,r0), r7
 	mov.l	@(oR8,r0), r8
 	mov.l	@r15+, r0
+	cfi_adjust_cfa_offset(-4)
 	jmp	@r0
 	 mov.l	@r15+, r0
 
diff --git a/sysdeps/unix/sysv/linux/sh/sh3/swapcontext.S b/sysdeps/unix/sysv/linux/sh/sh3/swapcontext.S
index 92c476e..0cec1de 100644
--- a/sysdeps/unix/sysv/linux/sh/sh3/swapcontext.S
+++ b/sysdeps/unix/sysv/linux/sh/sh3/swapcontext.S
@@ -123,6 +123,7 @@ ENTRY(__swapcontext)
 	mov.l	@(oR7,r0), r7
 	mov.l	@(oR8,r0), r8
 	mov.l	@r15+, r0
+	cfi_adjust_cfa_offset(-4)
 	jmp	@r0
 	 mov.l	@r15+, r0
 	
diff --git a/sysdeps/unix/sysv/linux/sh/sh4/setcontext.S b/sysdeps/unix/sysv/linux/sh/sh4/setcontext.S
index a3c0e21..161c51d 100644
--- a/sysdeps/unix/sysv/linux/sh/sh4/setcontext.S
+++ b/sysdeps/unix/sysv/linux/sh/sh4/setcontext.S
@@ -132,6 +132,7 @@ ENTRY(__setcontext)
 	mov.l	@(oR7,r0), r7
 	mov.l	@(oR8,r0), r8
 	mov.l	@r15+, r0
+	cfi_adjust_cfa_offset(-4)
 	jmp	@r0
 	 mov.l	@r15+, r0
 
diff --git a/sysdeps/unix/sysv/linux/sh/sh4/swapcontext.S b/sysdeps/unix/sysv/linux/sh/sh4/swapcontext.S
index 3ff7fe4..24caae5 100644
--- a/sysdeps/unix/sysv/linux/sh/sh4/swapcontext.S
+++ b/sysdeps/unix/sysv/linux/sh/sh4/swapcontext.S
@@ -209,6 +209,7 @@ ENTRY(__swapcontext)
 	mov.l	@(oR7,r0), r7
 	mov.l	@(oR8,r0), r8
 	mov.l	@r15+, r0
+	cfi_adjust_cfa_offset(-4)
 	jmp	@r0
 	 mov.l	@r15+, r0
 
diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h
index 5215a84..a492d1f 100644
--- a/sysdeps/unix/sysv/linux/sh/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sh/sysdep.h
@@ -121,6 +121,8 @@
 #  define SYSCALL_ERROR_HANDLER \
 	neg r0,r1; \
 	mov r12,r2; \
+	cfi_remember_state; \
+	cfi_register (r12, r2); \
 	mov.l 0f,r12; \
 	mova 0f,r0; \
 	add r0,r12; \
@@ -128,6 +130,7 @@
 	stc gbr, r4; \
 	mov.l @(r0,r12),r0; \
 	mov r2,r12; \
+	cfi_restore_state; \
 	add r4,r0; \
 	mov.l r1,@r0; \
 	bra .Lpseudo_end; \
@@ -140,12 +143,15 @@
 #  define SYSCALL_ERROR_HANDLER						      \
 	neg r0,r1; \
 	mov r12,r2; \
+	cfi_remember_state; \
+	cfi_register (r12, r2); \
 	mov.l 0f,r12; \
 	mova 0f,r0; \
 	add r0,r12; \
 	mov.l 1f,r0; \
 	mov.l @(r0,r12),r0; \
 	mov r2,r12; \
+	cfi_restore_state; \
 	mov.l r1,@r0; \
 	bra .Lpseudo_end; \
 	 mov _IMM1,r0; \


More information about the Libc-alpha mailing list