aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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