about summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S151
2 files changed, 137 insertions, 19 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index a739fe1db7..509f23a58b 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-01  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/unix/sysv/linux/x86_64/pthread_once.S: Add correct
+	cleanup support and unwind info.
+
 2003-06-30  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/unix/sysv/linux/i386/pthread_once.S (__pthread_once):
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
index cebcb38b2a..3fec0f4205 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
@@ -35,6 +35,7 @@
 	.type	__pthread_once,@function
 	.align	16
 __pthread_once:
+.LSTARTCODE:
 	testl	$2, (%rdi)
 	jz	1f
 	xorl	%eax, %eax
@@ -42,6 +43,7 @@ __pthread_once:
 
 	/* Preserve the function pointer.  */
 1:	pushq	%rsi
+.Lpush_rsi:
 	xorq	%r10, %r10
 
 	/* Not yet initialized or initialization in progress.
@@ -79,28 +81,15 @@ __pthread_once:
 
 	/* Preserve the pointer to the control variable.  */
 3:	pushq	%rdi
+.Lpush_rdi:
 
-	/* Call the initializer function after setting up the
-	   cancellation handler.  */
-	subq	$32, %rsp
-
-	/* Push the cleanup handler.  */
-	leaq	clear_once_control(%rip), %rsi
-	movq	%rdi, %rdx
-	movq	%rsp, %rdi
-	callq	__pthread_cleanup_push	/* Note: no @PLT.  */
-
-	callq	*40(%rsp)
-
-	/* Pop the cleanup handler.  */
-	movq	%rsp, %rdi
-	xorq	%rsi, %rsi
-	callq	__pthread_cleanup_pop	/* Note: no @PLT.  */
-
-	addq	$32, %rsp
+.LcleanupSTART:
+	callq	*8(%rsp)
+.LcleanupEND:
 
 	/* Get the control variable address back.  */
 	popq	%rdi
+.Lpop_rdi:
 
 	/* Sucessful run of the initializer.  Signal that we are done.  */
 	LOCK
@@ -113,6 +102,7 @@ __pthread_once:
 	syscall
 
 4:	addq	$8, %rsp
+.Ladd:
 	xorq	%rax, %rax
 	retq
 
@@ -129,6 +119,8 @@ pthread_once = __pthread_once
 	.type	clear_once_control,@function
 	.align	16
 clear_once_control:
+	movq	(%rsp), %rdi
+	movq	%rax, %r8
 	movl	$0, (%rdi)
 
 	movl	$0x7fffffff, %edx
@@ -136,5 +128,126 @@ clear_once_control:
 	movq	$SYS_futex, %rax
 	syscall
 
-	retq
+	movq	%r8, %rdi
+.LcallUR:
+	call	_Unwind_Resume@PLT
+	hlt
+.LENDCODE:
 	.size	clear_once_control,.-clear_once_control
+
+
+	.section .gcc_except_table,"a",@progbits
+.LexceptSTART:
+	.byte	0xff				# @LPStart format (omit)
+	.byte	0xff				# @TType format (omit)
+	.byte	0x01				# call-site format
+						# DW_EH_PE_uleb128
+	.uleb128 .Lcstend-.Lcstbegin
+.Lcstbegin:
+	.uleb128 .LcleanupSTART-.LSTARTCODE
+	.uleb128 .LcleanupEND-.LcleanupSTART
+	.uleb128 clear_once_control-.LSTARTCODE
+	.uleb128  0
+	.uleb128 .LcallUR-.LSTARTCODE
+	.uleb128 .LENDCODE-.LcallUR
+	.uleb128 0
+	.uleb128  0
+.Lcstend:
+
+
+	.section .eh_frame,"a",@progbits
+.LSTARTFRAME:
+	.long	.LENDCIE-.LSTARTCIE		# Length of the CIE.
+.LSTARTCIE:
+	.long	0				# CIE ID.
+	.byte	1				# Version number.
+#ifdef SHARED
+	.string	"zPLR"				# NUL-terminated augmentation
+						# string.
+#else
+	.string	"zPL"				# NUL-terminated augmentation
+						# string.
+#endif
+	.uleb128 1				# Code alignment factor.
+	.sleb128 -8				# Data alignment factor.
+	.byte	16				# Return address register
+						# column.
+#ifdef SHARED
+	.uleb128 7				# Augmentation value length.
+	.byte	0x9b				# Personality: DW_EH_PE_pcrel
+						# + DW_EH_PE_sdata4
+						# + DW_EH_PE_indirect
+	.long	DW.ref.__gcc_personality_v0-.
+	.byte	0x1b				# LSDA Encoding: DW_EH_PE_pcrel
+						# + DW_EH_PE_sdata4.
+	.byte	0x1b				# FDE Encoding: DW_EH_PE_pcrel
+						# + DW_EH_PE_sdata4.
+#else
+	.uleb128 10				# Augmentation value length.
+	.byte	0x0				# Personality: absolute
+	.quad	__gcc_personality_v0
+	.byte	0x0				# LSDA Encoding: absolute
+#endif
+	.byte 0x0c				# DW_CFA_def_cfa
+	.uleb128 7
+	.uleb128 8
+	.byte	0x90				# DW_CFA_offset, column 0x10
+	.uleb128 1
+	.align 8
+.LENDCIE:
+
+	.long	.LENDFDE-.LSTARTFDE		# Length of the FDE.
+.LSTARTFDE:
+	.long	.LSTARTFDE-.LSTARTFRAME		# CIE pointer.
+#ifdef SHARED
+	.long	.LSTARTCODE-.			# PC-relative start address
+						# of the code.
+	.long	.LENDCODE-.LSTARTCODE		# Length of the code.
+	.uleb128 4				# Augmentation size
+	.long	.LexceptSTART-.
+#else
+	.quad	.LSTARTCODE			# Start address of the code.
+	.quad	.LENDCODE-.LSTARTCODE		# Length of the code.
+	.uleb128 8				# Augmentation size
+	.quad	.LexceptSTART
+#endif
+	.byte	4				# DW_CFA_advance_loc4
+	.long	.Lpush_rsi-.LSTARTCODE
+	.byte	14				# DW_CFA_def_cfa_offset
+	.uleb128 16
+	.byte	4				# DW_CFA_advance_loc4
+	.long	.Lpush_rdi-.Lpush_rsi
+	.byte	14				# DW_CFA_def_cfa_offset
+	.uleb128 24
+	.byte	4				# DW_CFA_advance_loc4
+	.long	.Lpop_rdi-.Lpush_rdi
+	.byte	14				# DW_CFA_def_cfa_offset
+	.uleb128 16
+	.byte	4				# DW_CFA_advance_loc4
+	.long	.Ladd-.Lpop_rdi
+	.byte	14				# DW_CFA_def_cfa_offset
+	.uleb128 8
+	.byte	4				# DW_CFA_advance_loc4
+	.long	clear_once_control-.Ladd
+	.byte	14				# DW_CFA_def_cfa_offset
+	.uleb128 24
+#if 0
+	.byte	4				# DW_CFA_advance_loc4
+	.long	.Lpop_rdi2-clear_once_control
+	.byte	14				# DW_CFA_def_cfa_offset
+	.uleb128 16
+#endif
+	.align	8
+.LENDFDE:
+
+
+#ifdef SHARED
+	.hidden	DW.ref.__gcc_personality_v0
+	.weak	DW.ref.__gcc_personality_v0
+	.section .gnu.linkonce.d.DW.ref.__gcc_personality_v0,"aw",@progbits
+	.align	8
+	.type	DW.ref.__gcc_personality_v0, @object
+	.size	DW.ref.__gcc_personality_v0, 8
+DW.ref.__gcc_personality_v0:
+	.quad	__gcc_personality_v0
+#endif