about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-03-06 07:34:44 +0000
committerJakub Jelinek <jakub@redhat.com>2006-03-06 07:34:44 +0000
commit69fd14bc7d6c37d79da1e8afaac2e340a757601a (patch)
tree8fad0e43f3b796e758d1d32edf2c8c872e9ec852
parent008a1add5e19cde902d2255d03cca1d5fff26126 (diff)
downloadglibc-69fd14bc7d6c37d79da1e8afaac2e340a757601a.tar.gz
glibc-69fd14bc7d6c37d79da1e8afaac2e340a757601a.tar.xz
glibc-69fd14bc7d6c37d79da1e8afaac2e340a757601a.zip
* sysdeps/unix/sysv/linux/i386/lowlevellock.h
	(LLL_STUB_UNWIND_INFO_START, LLL_STUB_UNWIND_INFO_END,
	LLL_STUB_UNWIND_INFO_3, LLL_STUB_UNWIND_INFO_4): Define.
	(lll_mutex_lock, lll_robust_mutex_lock, lll_mutex_cond_lock,
	lll_robust_mutex_cond_lock, lll_mutex_timedlock,
	lll_robust_mutex_timedlock, lll_mutex_unlock,
	lll_robust_mutex_unlock, lll_lock, lll_unlock): Use them.
	Add _L_*_ symbols around the subsection.
	* sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Add unwind info.
	* sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S: Likewise.
-rw-r--r--ChangeLog14
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S61
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S45
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h242
4 files changed, 280 insertions, 82 deletions
diff --git a/ChangeLog b/ChangeLog
index bdfd1c7ee3..88baea7e6d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2006-03-04  Jakub Jelinek  <jakub@redhat.com>
+	    Roland McGrath  <roland@redhat.com>
+
+	* sysdeps/unix/sysv/linux/i386/lowlevellock.h
+	(LLL_STUB_UNWIND_INFO_START, LLL_STUB_UNWIND_INFO_END,
+	LLL_STUB_UNWIND_INFO_3, LLL_STUB_UNWIND_INFO_4): Define.
+	(lll_mutex_lock, lll_robust_mutex_lock, lll_mutex_cond_lock,
+	lll_robust_mutex_cond_lock, lll_mutex_timedlock,
+	lll_robust_mutex_timedlock, lll_mutex_unlock,
+	lll_robust_mutex_unlock, lll_lock, lll_unlock): Use them.
+	Add _L_*_ symbols around the subsection.
+	* sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S: Add unwind info.
+	* sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S: Likewise.
+
 2006-03-03  Jakub Jelinek  <jakub@redhat.com>
 	    Roland McGrath  <roland@redhat.com>
 
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
index dc65b709a1..9acd81ae5a 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -41,9 +41,16 @@
 	.hidden	__lll_mutex_lock_wait
 	.align	16
 __lll_mutex_lock_wait:
+	cfi_startproc
 	pushl	%edx
+	cfi_adjust_cfa_offset(4)
 	pushl	%ebx
+	cfi_adjust_cfa_offset(4)
 	pushl	%esi
+	cfi_adjust_cfa_offset(4)
+	cfi_offset(%edx, -8)
+	cfi_offset(%ebx, -12)
+	cfi_offset(%esi, -16)
 
 	movl	$2, %edx
 	movl	%ecx, %ebx
@@ -63,9 +70,16 @@ __lll_mutex_lock_wait:
 	jnz,pn	1b
 
 	popl	%esi
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%esi)
 	popl	%ebx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%ebx)
 	popl	%edx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%edx)
 	ret
+	cfi_endproc
 	.size	__lll_mutex_lock_wait,.-__lll_mutex_lock_wait
 
 
@@ -75,17 +89,27 @@ __lll_mutex_lock_wait:
 	.hidden	__lll_mutex_timedlock_wait
 	.align	16
 __lll_mutex_timedlock_wait:
+	cfi_startproc
 	/* Check for a valid timeout value.  */
 	cmpl	$1000000000, 4(%edx)
 	jae	3f
 
 	pushl	%edi
+	cfi_adjust_cfa_offset(4)
 	pushl	%esi
+	cfi_adjust_cfa_offset(4)
 	pushl	%ebx
+	cfi_adjust_cfa_offset(4)
 	pushl	%ebp
+	cfi_adjust_cfa_offset(4)
+	cfi_offset(%edi, -8)
+	cfi_offset(%esi, -12)
+	cfi_offset(%ebx, -16)
+	cfi_offset(%ebp, -20)
 
 	/* Stack frame for the timespec and timeval structs.  */
 	subl	$8, %esp
+	cfi_adjust_cfa_offset(8)
 
 	movl	%ecx, %ebp
 	movl	%edx, %edi
@@ -140,12 +164,29 @@ __lll_mutex_timedlock_wait:
 	jnz	7f
 
 6:	addl	$8, %esp
+	cfi_adjust_cfa_offset(-8)
 	popl	%ebp
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%ebp)
 	popl	%ebx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%ebx)
 	popl	%esi
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%esi)
 	popl	%edi
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%edi)
 	ret
 
+3:	movl	$EINVAL, %eax
+	ret
+
+	cfi_adjust_cfa_offset(24)
+	cfi_offset(%edi, -8)
+	cfi_offset(%esi, -12)
+	cfi_offset(%ebx, -16)
+	cfi_offset(%ebp, -20)
 	/* Check whether the time expired.  */
 7:	cmpl	$-ETIMEDOUT, %ecx
 	je	5f
@@ -157,11 +198,9 @@ __lll_mutex_timedlock_wait:
 	jz	6b
 	jmp	1b
 
-3:	movl	$EINVAL, %eax
-	ret
-
 5:	movl	$ETIMEDOUT, %eax
 	jmp	6b
+	cfi_endproc
 	.size	__lll_mutex_timedlock_wait,.-__lll_mutex_timedlock_wait
 #endif
 
@@ -200,9 +239,16 @@ lll_unlock_wake_cb:
 	.hidden	__lll_mutex_unlock_wake
 	.align	16
 __lll_mutex_unlock_wake:
+	cfi_startproc
 	pushl	%ebx
+	cfi_adjust_cfa_offset(4)
 	pushl	%ecx
+	cfi_adjust_cfa_offset(4)
 	pushl	%edx
+	cfi_adjust_cfa_offset(4)
+	cfi_offset(%ebx, -8)
+	cfi_offset(%ecx, -12)
+	cfi_offset(%edx, -16)
 
 	movl	%eax, %ebx
 	movl	$0, (%eax)
@@ -212,9 +258,16 @@ __lll_mutex_unlock_wake:
 	ENTER_KERNEL
 
 	popl	%edx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%edx)
 	popl	%ecx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%ecx)
 	popl	%ebx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%ebx)
 	ret
+	cfi_endproc
 	.size	__lll_mutex_unlock_wake,.-__lll_mutex_unlock_wake
 
 
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S
index ff09745060..73d8bc4ccc 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S
+++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevelrobustlock.S
@@ -44,9 +44,16 @@
 	.hidden	__lll_robust_mutex_lock_wait
 	.align	16
 __lll_robust_mutex_lock_wait:
+	cfi_startproc
 	pushl	%edx
+	cfi_adjust_cfa_offset(4)
 	pushl	%ebx
+	cfi_adjust_cfa_offset(4)
 	pushl	%esi
+	cfi_adjust_cfa_offset(4)
+	cfi_offset(%edx, -8)
+	cfi_offset(%ebx, -12)
+	cfi_offset(%esi, -16)
 
 	movl	%ecx, %ebx
 	xorl	%esi, %esi	/* No timeout.  */
@@ -81,9 +88,16 @@ __lll_robust_mutex_lock_wait:
 	/* NB:	 %eax == 0 */
 
 3:	popl	%esi
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%esi)
 	popl	%ebx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%ebx)
 	popl	%edx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%edx)
 	ret
+	cfi_endproc
 	.size	__lll_robust_mutex_lock_wait,.-__lll_robust_mutex_lock_wait
 
 
@@ -92,17 +106,27 @@ __lll_robust_mutex_lock_wait:
 	.hidden	__lll_robust_mutex_timedlock_wait
 	.align	16
 __lll_robust_mutex_timedlock_wait:
+	cfi_startproc
 	/* Check for a valid timeout value.  */
 	cmpl	$1000000000, 4(%edx)
 	jae	3f
 
 	pushl	%edi
+	cfi_adjust_cfa_offset(4)
 	pushl	%esi
+	cfi_adjust_cfa_offset(4)
 	pushl	%ebx
+	cfi_adjust_cfa_offset(4)
 	pushl	%ebp
+	cfi_adjust_cfa_offset(4)
+	cfi_offset(%edi, -8)
+	cfi_offset(%esi, -12)
+	cfi_offset(%ebx, -16)
+	cfi_offset(%ebp, -20)
 
 	/* Stack frame for the timespec and timeval structs.  */
 	subl	$12, %esp
+	cfi_adjust_cfa_offset(12)
 
 	movl	%ecx, %ebp
 	movl	%edx, %edi
@@ -170,19 +194,34 @@ __lll_robust_mutex_timedlock_wait:
 	jnz	7f
 
 6:	addl	$12, %esp
+	cfi_adjust_cfa_offset(-12)
 	popl	%ebp
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%ebp)
 	popl	%ebx
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%ebx)
 	popl	%esi
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%esi)
 	popl	%edi
+	cfi_adjust_cfa_offset(-4)
+	cfi_restore(%edi)
 	ret
 
+3:	movl	$EINVAL, %eax
+	ret
+
+	cfi_adjust_cfa_offset(28)
+	cfi_offset(%edi, -8)
+	cfi_offset(%esi, -12)
+	cfi_offset(%ebx, -16)
+	cfi_offset(%ebp, -20)
 	/* Check whether the time expired.  */
 7:	cmpl	$-ETIMEDOUT, %ecx
 	jne	1b
 
 8:	movl	$ETIMEDOUT, %eax
 	jmp	6b
-
-3:	movl	$EINVAL, %eax
-	ret
+	cfi_endproc
 	.size	__lll_robust_mutex_timedlock_wait,.-__lll_robust_mutex_timedlock_wait
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
index afdba009a0..23e81f4e4b 100644
--- a/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
@@ -65,6 +65,88 @@
 #define BUSY_WAIT_NOP          asm ("rep; nop")
 
 
+#ifdef USE_CFA_VAL_EXPRESSION
+# define LLL_STUB_UNWIND_INFO_START \
+	".section	.eh_frame,\"a\",@progbits\n"		\
+"5:\t"	".long	7f-6f	# Length of Common Information Entry\n"	\
+"6:\t"	".long	0x0	# CIE Identifier Tag\n\t"		\
+	".byte	0x1	# CIE Version\n\t"			\
+	".ascii \"zR\\0\"	# CIE Augmentation\n\t"		\
+	".uleb128 0x1	# CIE Code Alignment Factor\n\t"	\
+	".sleb128 -4	# CIE Data Alignment Factor\n\t"	\
+	".byte	0x8	# CIE RA Column\n\t"			\
+	".uleb128 0x1	# Augmentation size\n\t"		\
+	".byte	0x1b	# FDE Encoding (pcrel sdata4)\n\t"	\
+	".byte	0xc	# DW_CFA_def_cfa\n\t"			\
+	".uleb128 0x4\n\t"					\
+	".uleb128 0x0\n\t"					\
+	".align 4\n"						\
+"7:\t"	".long	17f-8f	# FDE Length\n"				\
+"8:\t"	".long	8b-5b	# FDE CIE offset\n\t"			\
+	".long	1b-.	# FDE initial location\n\t"		\
+	".long	4b-1b	# FDE address range\n\t"		\
+	".uleb128 0x0	# Augmentation size\n\t"		\
+	".byte	0x16	# DW_CFA_val_expression\n\t"		\
+	".uleb128 0x8\n\t"					\
+	".uleb128 10f-9f\n"					\
+"9:\t"	".byte	0x78	# DW_OP_breg8\n\t"			\
+	".sleb128 3b-1b\n"
+# define LLL_STUB_UNWIND_INFO_END \
+	".byte	0x16	# DW_CFA_val_expression\n\t"		\
+	".uleb128 0x8\n\t"					\
+	".uleb128 12f-11f\n"					\
+"11:\t"	".byte	0x78	# DW_OP_breg8\n\t"			\
+	".sleb128 3b-2b\n"					\
+"12:\t"	".byte	0x40 + (3b-2b-1) # DW_CFA_advance_loc\n\t"	\
+	".byte	0x16	# DW_CFA_val_expression\n\t"		\
+	".uleb128 0x8\n\t"					\
+	".uleb128 16f-13f\n"					\
+"13:\t"	".byte	0x78	# DW_OP_breg8\n\t"			\
+	".sleb128 15f-14f\n\t"					\
+	".byte	0x0d	# DW_OP_const4s\n"			\
+"14:\t"	".4byte	3b-.\n\t"					\
+	".byte	0x1c	# DW_OP_minus\n\t"			\
+	".byte	0x0d	# DW_OP_const4s\n"			\
+"15:\t"	".4byte	18f-.\n\t"					\
+	".byte	0x22	# DW_OP_plus\n"				\
+"16:\t"	".align 4\n"						\
+"17:\t"	".previous\n"
+
+/* Unwind info for
+   1: lea ..., ...
+   2: call ...
+   3: jmp 18f
+   4:
+   snippet.  */
+# define LLL_STUB_UNWIND_INFO_3 \
+LLL_STUB_UNWIND_INFO_START					\
+"10:\t"	".byte	0x40 + (2b-1b) # DW_CFA_advance_loc\n\t"	\
+LLL_STUB_UNWIND_INFO_END
+
+/* Unwind info for
+   1: lea ..., ...
+   0: movl ..., ...
+   2: call ...
+   3: jmp 18f
+   4:
+   snippet.  */
+# define LLL_STUB_UNWIND_INFO_4 \
+LLL_STUB_UNWIND_INFO_START					\
+"10:\t"	".byte	0x40 + (0b-1b) # DW_CFA_advance_loc\n\t"	\
+	".byte	0x16	# DW_CFA_val_expression\n\t"		\
+	".uleb128 0x8\n\t"					\
+	".uleb128 20f-19f\n"					\
+"19:\t"	".byte	0x78	# DW_OP_breg8\n\t"			\
+	".sleb128 3b-0b\n"					\
+"20:\t"	".byte	0x40 + (2b-0b) # DW_CFA_advance_loc\n\t"	\
+LLL_STUB_UNWIND_INFO_END
+
+#else
+# define LLL_STUB_UNWIND_INFO_3
+# define LLL_STUB_UNWIND_INFO_4
+#endif
+
+
 #define lll_futex_wait(futex, val) \
   ({									      \
     int __status;							      \
@@ -165,13 +247,14 @@ extern int __lll_mutex_unlock_wake (int *__futex)
 			      "jnz _L_mutex_lock_%=\n\t"		      \
 			      ".subsection 1\n\t"			      \
 			      ".type _L_mutex_lock_%=,@function\n"	      \
-			      "_L_mutex_lock_%=:\n\t"			      \
-			      "leal %2, %%ecx\n\t"			      \
-			      "call __lll_mutex_lock_wait\n\t"		      \
-			      "jmp 1f\n\t"				      \
-			      ".size _L_mutex_lock_%=,.-_L_mutex_lock_%=\n"   \
+			      "_L_mutex_lock_%=:\n"			      \
+			      "1:\tleal %2, %%ecx\n"			      \
+			      "2:\tcall __lll_mutex_lock_wait\n"	      \
+			      "3:\tjmp 18f\n"				      \
+			      "4:\t.size _L_mutex_lock_%=, 4b-1b\n\t"	      \
 			      ".previous\n"				      \
-			      "1:"					      \
+			      LLL_STUB_UNWIND_INFO_3			      \
+			      "18:"					      \
 			      : "=a" (ignore1), "=c" (ignore2), "=m" (futex)  \
 			      : "0" (0), "1" (1), "m" (futex)		      \
 			      : "memory"); })
@@ -180,16 +263,17 @@ extern int __lll_mutex_unlock_wake (int *__futex)
 #define lll_robust_mutex_lock(futex, id) \
   ({ int result, ignore;						      \
      __asm __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"			      \
-		       "jnz _L_mutex_lock_%=\n\t"			      \
+		       "jnz _L_robust_mutex_lock_%=\n\t"		      \
 		       ".subsection 1\n\t"				      \
-		       ".type _L_mutex_lock_%=,@function\n"		      \
-		       "_L_mutex_lock_%=:\n\t"				      \
-		       "leal %2, %%ecx\n\t"				      \
-		       "call __lll_robust_mutex_lock_wait\n\t"		      \
-		       "jmp 1f\n\t"					      \
-		       ".size _L_mutex_lock_%=,.-_L_mutex_lock_%=\n"	      \
+		       ".type _L_robust_mutex_lock_%=,@function\n"	      \
+		       "_L_robust_mutex_lock_%=:\n"			      \
+		       "1:\tleal %2, %%ecx\n"				      \
+		       "2:\tcall __lll_robust_mutex_lock_wait\n"	      \
+		       "3:\tjmp 18f\n"					      \
+		       "4:\t.size _L_robust_mutex_lock_%=, 4b-1b\n\t"	      \
 		       ".previous\n"					      \
-		       "1:"						      \
+		       LLL_STUB_UNWIND_INFO_3				      \
+		       "18:"						      \
 		       : "=a" (result), "=c" (ignore), "=m" (futex)	      \
 		       : "0" (0), "1" (id), "m" (futex)			      \
 		       : "memory");					      \
@@ -204,13 +288,14 @@ extern int __lll_mutex_unlock_wake (int *__futex)
 			      "jnz _L_mutex_cond_lock_%=\n\t"		      \
 			      ".subsection 1\n\t"			      \
 			      ".type _L_mutex_cond_lock_%=,@function\n"	      \
-			      "_L_mutex_cond_lock_%=:\n\t"		      \
-			      "leal %2, %%ecx\n\t"			      \
-			      "call __lll_mutex_lock_wait\n\t"		      \
-			      "jmp 1f\n\t"				      \
-			      ".size _L_mutex_cond_lock_%=,.-_L_mutex_cond_lock_%=\n"   \
+			      "_L_mutex_cond_lock_%=:\n"		      \
+			      "1:\tleal %2, %%ecx\n"			      \
+			      "2:\tcall __lll_mutex_lock_wait\n"	      \
+			      "3:\tjmp 18f\n"				      \
+			      "4:\t.size _L_mutex_cond_lock_%=, 4b-1b\n\t"    \
 			      ".previous\n"				      \
-			      "1:"					      \
+			      LLL_STUB_UNWIND_INFO_3			      \
+			      "18:"					      \
 			      : "=a" (ignore1), "=c" (ignore2), "=m" (futex)  \
 			      : "0" (0), "1" (2), "m" (futex)		      \
 			      : "memory"); })
@@ -219,16 +304,17 @@ extern int __lll_mutex_unlock_wake (int *__futex)
 #define lll_robust_mutex_cond_lock(futex, id) \
   ({ int result, ignore;						      \
      __asm __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"			      \
-		       "jnz _L_mutex_cond_lock_%=\n\t"			      \
+		       "jnz _L_robust_mutex_cond_lock_%=\n\t"		      \
 		       ".subsection 1\n\t"				      \
-		       ".type _L_mutex_cond_lock_%=,@function\n"	      \
-		       "_L_mutex_cond_lock_%=:\n\t"			      \
-		       "leal %2, %%ecx\n\t"				      \
-		       "call __lll_robust_mutex_lock_wait\n\t"		      \
-		       "jmp 1f\n\t"					      \
-		       ".size _L_mutex_cond_lock_%=,.-_L_mutex_cond_lock_%=\n"\
+		       ".type _L_robust_mutex_cond_lock_%=,@function\n"	      \
+		       "_L_robust_mutex_cond_lock_%=:\n"		      \
+		       "1:\tleal %2, %%ecx\n"				      \
+		       "2:\tcall __lll_robust_mutex_lock_wait\n"	      \
+		       "3:\tjmp 18f\n"					      \
+		       "4:\t.size _L_robust_mutex_cond_lock_%=, 4b-1b\n\t"    \
 		       ".previous\n"					      \
-		       "1:"						      \
+		       LLL_STUB_UNWIND_INFO_3				      \
+		       "18:"						      \
 		       : "=a" (result), "=c" (ignore), "=m" (futex)	      \
 		       : "0" (0), "1" (id | FUTEX_WAITERS), "m" (futex)	      \
 		       : "memory");					      \
@@ -241,14 +327,15 @@ extern int __lll_mutex_unlock_wake (int *__futex)
 		       "jnz _L_mutex_timedlock_%=\n\t"			      \
 		       ".subsection 1\n\t"				      \
 		       ".type _L_mutex_timedlock_%=,@function\n"	      \
-		       "_L_mutex_timedlock_%=:\n\t"			      \
-		       "leal %3, %%ecx\n\t"				      \
-		       "movl %7, %%edx\n\t"				      \
-		       "call __lll_mutex_timedlock_wait\n\t"		      \
-		       "jmp 1f\n\t"					      \
-		       ".size _L_mutex_timedlock_%=,.-_L_mutex_timedlock_%=\n"\
+		       "_L_mutex_timedlock_%=:\n"			      \
+		       "1:\tleal %3, %%ecx\n"				      \
+		       "0:\tmovl %7, %%edx\n"				      \
+		       "2:\tcall __lll_mutex_timedlock_wait\n"		      \
+		       "3:\tjmp 18f\n"					      \
+		       "4:\t.size _L_mutex_timedlock_%=, 4b-1b\n\t"	      \
 		       ".previous\n"					      \
-		       "1:"						      \
+		       LLL_STUB_UNWIND_INFO_4				      \
+		       "18:"						      \
 		       : "=a" (result), "=c" (ignore1), "=&d" (ignore2),      \
 			 "=m" (futex)					      \
 		       : "0" (0), "1" (1), "m" (futex), "m" (timeout)	      \
@@ -259,17 +346,18 @@ extern int __lll_mutex_unlock_wake (int *__futex)
 #define lll_robust_mutex_timedlock(futex, timeout, id) \
   ({ int result, ignore1, ignore2;					      \
      __asm __volatile (LOCK_INSTR "cmpxchgl %1, %3\n\t"			      \
-		       "jnz _L_mutex_timedlock_%=\n\t"			      \
+		       "jnz _L_robust_mutex_timedlock_%=\n\t"		      \
 		       ".subsection 1\n\t"				      \
-		       ".type _L_mutex_timedlock_%=,@function\n"	      \
-		       "_L_mutex_timedlock_%=:\n\t"			      \
-		       "leal %3, %%ecx\n\t"				      \
-		       "movl %7, %%edx\n\t"				      \
-		       "call __lll_robust_mutex_timedlock_wait\n\t"	      \
-		       "jmp 1f\n\t"					      \
-		       ".size _L_mutex_timedlock_%=,.-_L_mutex_timedlock_%=\n"\
+		       ".type _L_robust_mutex_timedlock_%=,@function\n"	      \
+		       "_L_robust_mutex_timedlock_%=:\n"		      \
+		       "1:\tleal %3, %%ecx\n"				      \
+		       "0:\tmovl %7, %%edx\n"				      \
+		       "2:\tcall __lll_robust_mutex_timedlock_wait\n"	      \
+		       "3:\tjmp 18f\n"					      \
+		       "4:\t.size _L_robust_mutex_timedlock_%=, 4b-1b\n\t"    \
 		       ".previous\n"					      \
-		       "1:"						      \
+		       LLL_STUB_UNWIND_INFO_4				      \
+		       "18:"						      \
 		       : "=a" (result), "=c" (ignore1), "=&d" (ignore2),      \
 			 "=m" (futex)					      \
 		       : "0" (0), "1" (id), "m" (futex), "m" (timeout)	      \
@@ -283,13 +371,14 @@ extern int __lll_mutex_unlock_wake (int *__futex)
 			      "jne _L_mutex_unlock_%=\n\t"		      \
 			      ".subsection 1\n\t"			      \
 			      ".type _L_mutex_unlock_%=,@function\n"	      \
-			      "_L_mutex_unlock_%=:\n\t"			      \
-			      "leal %0, %%eax\n\t"			      \
-			      "call __lll_mutex_unlock_wake\n\t"	      \
-			      "jmp 1f\n\t"				      \
-			      ".size _L_mutex_unlock_%=,.-_L_mutex_unlock_%=\n" \
+			      "_L_mutex_unlock_%=:\n"			      \
+			      "1:\tleal %0, %%eax\n"			      \
+			      "2:\tcall __lll_mutex_unlock_wake\n"	      \
+			      "3:\tjmp 18f\n"				      \
+			      "4:\t.size _L_mutex_unlock_%=, 4b-1b\n\t"	      \
 			      ".previous\n"				      \
-			      "1:"					      \
+			      LLL_STUB_UNWIND_INFO_3			      \
+			      "18:"					      \
 			      : "=m" (futex), "=&a" (ignore)		      \
 			      : "m" (futex)				      \
 			      : "memory"); })
@@ -298,16 +387,17 @@ extern int __lll_mutex_unlock_wake (int *__futex)
 #define lll_robust_mutex_unlock(futex) \
   (void) ({ int ignore;							      \
             __asm __volatile (LOCK_INSTR "andl %2, %0\n\t"		      \
-			      "jne _L_mutex_unlock_%=\n\t"		      \
+			      "jne _L_robust_mutex_unlock_%=\n\t"	      \
 			      ".subsection 1\n\t"			      \
-			      ".type _L_mutex_unlock_%=,@function\n"	      \
-			      "_L_mutex_unlock_%=:\n\t"			      \
-			      "leal %0, %%eax\n\t"			      \
-			      "call __lll_mutex_unlock_wake\n\t"	      \
-			      "jmp 1f\n\t"				      \
-			      ".size _L_mutex_unlock_%=,.-_L_mutex_unlock_%=\n" \
+			      ".type _L_robust_mutex_unlock_%=,@function\n"   \
+			      "_L_robust_mutex_unlock_%=:\n\t"		      \
+			      "1:\tleal %0, %%eax\n"			      \
+			      "2:\tcall __lll_mutex_unlock_wake\n"	      \
+			      "3:\tjmp 18f\n"				      \
+			      "4:\t.size _L_robust_mutex_unlock_%=, 4b-1b\n\t"\
 			      ".previous\n"				      \
-			      "1:"					      \
+			      LLL_STUB_UNWIND_INFO_3			      \
+			      "18:"					      \
 			      : "=m" (futex), "=&a" (ignore)		      \
 			      : "i" (FUTEX_WAITERS), "m" (futex)	      \
 			      : "memory"); })
@@ -401,16 +491,17 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
 			      "je,pt 0f\n\t"				      \
 			      "lock\n"					      \
 			      "0:\tcmpxchgl %1, %2\n\t"			      \
-			      "jnz _L_mutex_lock_%=\n\t"		      \
+			      "jnz _L_lock_%=\n\t"			      \
 			      ".subsection 1\n\t"			      \
-			      ".type _L_mutex_lock_%=,@function\n"	      \
-			      "_L_mutex_lock_%=:\n\t"			      \
-			      "leal %2, %%ecx\n\t"			      \
-			      "call __lll_mutex_lock_wait\n\t"		      \
-			      "jmp 1f\n\t"				      \
-			      ".size _L_mutex_lock_%=,.-_L_mutex_lock_%=\n"   \
+			      ".type _L_lock_%=,@function\n"		      \
+			      "_L_lock_%=:\n"				      \
+			      "1:\tleal %2, %%ecx\n"			      \
+			      "2:\tcall __lll_mutex_lock_wait\n"	      \
+			      "3:\tjmp 18f\n"				      \
+			      "4:\t.size _L_lock_%=, 4b-1b\n\t"		      \
 			      ".previous\n"				      \
-			      "1:"					      \
+			      LLL_STUB_UNWIND_INFO_3			      \
+			      "18:"					      \
 			      : "=a" (ignore1), "=c" (ignore2), "=m" (futex)  \
 			      : "0" (0), "1" (1), "m" (futex),		      \
 		                "i" (offsetof (tcbhead_t, multiple_threads))  \
@@ -422,17 +513,18 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
             __asm __volatile ("cmpl $0, %%gs:%P3\n\t"			      \
 			      "je,pt 0f\n\t"				      \
 			      "lock\n"					      \
-			      "0:\tsubl $1,%0\n\t"		      \
-			      "jne _L_mutex_unlock_%=\n\t"		      \
+			      "0:\tsubl $1,%0\n\t"			      \
+			      "jne _L_unlock_%=\n\t"			      \
 			      ".subsection 1\n\t"			      \
-			      ".type _L_mutex_unlock_%=,@function\n"	      \
-			      "_L_mutex_unlock_%=:\n\t"			      \
-			      "leal %0, %%eax\n\t"			      \
-			      "call __lll_mutex_unlock_wake\n\t"	      \
-			      "jmp 1f\n\t"				      \
-			      ".size _L_mutex_unlock_%=,.-_L_mutex_unlock_%=\n" \
+			      ".type _L_unlock_%=,@function\n"		      \
+			      "_L_unlock_%=:\n"				      \
+			      "1:\tleal %0, %%eax\n"			      \
+			      "2:\tcall __lll_mutex_unlock_wake\n"	      \
+			      "3:\tjmp 18f\n\t"				      \
+			      "4:\t.size _L_unlock_%=, 4b-1b\n\t"	      \
 			      ".previous\n"				      \
-			      "1:"					      \
+			      LLL_STUB_UNWIND_INFO_3			      \
+			      "18:"					      \
 			      : "=m" (futex), "=&a" (ignore)		      \
 			      : "m" (futex),				      \
 				"i" (offsetof (tcbhead_t, multiple_threads))  \