aboutsummaryrefslogtreecommitdiff
path: root/nptl
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-07-17 14:45:08 -0700
committerUlrich Drepper <drepper@redhat.com>2009-07-17 14:45:08 -0700
commit63601ccd1614250bf91e47f46c6b24b53dfd6af6 (patch)
treee8255d0cf8459bb609ffc5218fd2ba4e76b9d8d9 /nptl
parentd52c96e73a20d1c1d266f783fc31df6759207ea0 (diff)
downloadglibc-63601ccd1614250bf91e47f46c6b24b53dfd6af6.tar
glibc-63601ccd1614250bf91e47f46c6b24b53dfd6af6.tar.gz
glibc-63601ccd1614250bf91e47f46c6b24b53dfd6af6.tar.bz2
glibc-63601ccd1614250bf91e47f46c6b24b53dfd6af6.zip
Replace hand-coded unwind tables from x86-64 pthread_once.
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog2
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S128
2 files changed, 24 insertions, 106 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 2551faa0d9..084ebe63b6 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -3,6 +3,8 @@
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
(__condvar_cleanup): Rewrite to use cfi directives instead of
hand-coded unwind tables.
+ * sysdeps/unix/sysv/linux/x86_64/pthread_once.S (__pthread_once):
+ Likewise.
2009-06-12 Ulrich Drepper <drepper@redhat.com>
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 c3b2b51bdb..ccc18493a2 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -17,6 +17,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <sysdep.h>
#include <kernel-features.h>
#include <tcb-offsets.h>
#include <lowlevellock.h>
@@ -32,6 +33,15 @@
.align 16
__pthread_once:
.LSTARTCODE:
+ cfi_startproc
+#ifdef SHARED
+ cfi_personality(DW_EH_PE_pcrel | DW_EH_PE_sdata4 | DW_EH_PE_indirect,
+ DW.ref.__gcc_personality_v0)
+ cfi_lsda(DW_EH_PE_pcrel | DW_EH_PE_sdata4, .LexceptSTART)
+#else
+ cfi_personality(DW_EH_PE_udata4, __gcc_personality_v0)
+ cfi_lsda(DW_EH_PE_udata4, .LexceptSTART)
+#endif
testl $2, (%rdi)
jz 1f
xorl %eax, %eax
@@ -39,7 +49,7 @@ __pthread_once:
/* Preserve the function pointer. */
1: pushq %rsi
-.Lpush_rsi:
+ cfi_adjust_cfa_offset(8)
xorq %r10, %r10
/* Not yet initialized or initialization in progress.
@@ -86,9 +96,9 @@ __pthread_once:
/* Preserve the pointer to the control variable. */
3: pushq %rdi
-.Lpush_rdi:
+ cfi_adjust_cfa_offset(8)
pushq %rdi
-.Lpush_rdi2:
+ cfi_adjust_cfa_offset(8)
.LcleanupSTART:
callq *16(%rsp)
@@ -96,14 +106,14 @@ __pthread_once:
/* Get the control variable address back. */
popq %rdi
-.Lpop_rdi:
+ cfi_adjust_cfa_offset(-8)
/* Sucessful run of the initializer. Signal that we are done. */
LOCK
incl (%rdi)
addq $8, %rsp
-.Ladd1:
+ cfi_adjust_cfa_offset(-8)
/* Wake up all other threads. */
movl $0x7fffffff, %edx
@@ -117,10 +127,9 @@ __pthread_once:
syscall
4: addq $8, %rsp
-.Ladd2:
+ cfi_adjust_cfa_offset(-8)
xorl %eax, %eax
retq
-
.size __pthread_once,.-__pthread_once
@@ -134,6 +143,7 @@ pthread_once = __pthread_once
.type clear_once_control,@function
.align 16
clear_once_control:
+ cfi_adjust_cfa_offset(3 * 8)
movq (%rsp), %rdi
movq %rax, %r8
movl $0, (%rdi)
@@ -153,15 +163,15 @@ clear_once_control:
call _Unwind_Resume@PLT
hlt
.LENDCODE:
+ cfi_endproc
.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
+ .byte DW_EH_PE_omit # @LPStart format
+ .byte DW_EH_PE_omit # @TType format
+ .byte DW_EH_PE_uleb128 # call-site format
.uleb128 .Lcstend-.Lcstbegin
.Lcstbegin:
.uleb128 .LcleanupSTART-.LSTARTCODE
@@ -175,100 +185,6 @@ clear_once_control:
.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 .Lpush_rdi2-.Lpush_rdi
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 32
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpop_rdi-.Lpush_rdi2
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 24
- .byte 4 # DW_CFA_advance_loc4
- .long .Ladd1-.Lpop_rdi
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 16
- .byte 4 # DW_CFA_advance_loc4
- .long .Ladd2-.Ladd1
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 8
- .byte 4 # DW_CFA_advance_loc4
- .long clear_once_control-.Ladd2
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 32
-#if 0
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpop_rdi3-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