This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, master, updated. glibc-2.10-167-gaee2665
- From: drepper at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 17 Jul 2009 23:28:23 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.10-167-gaee2665
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via aee2665a1795c60aa1965387681d801cf3cda75c (commit)
via 0adae4681750bea9eb729c8935d4b152de4a6b68 (commit)
via c3c2f3cf56ffcfd200f6c26aa5492049140bbbcb (commit)
via 63601ccd1614250bf91e47f46c6b24b53dfd6af6 (commit)
via d52c96e73a20d1c1d266f783fc31df6759207ea0 (commit)
from 00ebd7ed58df389a78e41dece058048725cb585e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=aee2665a1795c60aa1965387681d801cf3cda75c
commit aee2665a1795c60aa1965387681d801cf3cda75c
Author: Ulrich Drepper <drepper@redhat.com>
Date: Fri Jul 17 16:26:06 2009 -0700
Replace hand-coded unwind tables from x86-64 sem_timedwait.
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 5db47a1..867493c 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -9,6 +9,8 @@
* sysdeps/unix/sysv/linux/x86_64/pthread_once.S (__pthread_once):
Likewise.
* sysdeps/unix/sysv/linux/x86_64/sem_wait.S (sem_wait): Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait):
+ Likewise.
2009-06-12 Ulrich Drepper <drepper@redhat.com>
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
index 88e99cf..7d66d49 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.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.
@@ -34,6 +34,15 @@
.align 16
sem_timedwait:
.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
#if VALUE == 0
movl (%rdi), %eax
#else
@@ -56,13 +65,16 @@ sem_timedwait:
/* Check whether the timeout value is valid. */
1: pushq %r12
-.Lpush_r12:
+ cfi_adjust_cfa_offset(8)
+ cfi_rel_offset(%r12, 0)
pushq %r13
-.Lpush_r13:
+ cfi_adjust_cfa_offset(8)
+ cfi_rel_offset(%r13, 0)
pushq %r14
-.Lpush_r14:
+ cfi_adjust_cfa_offset(8)
+ cfi_rel_offset(%r14, 0)
subq $24, %rsp
-.Lsubq:
+ cfi_adjust_cfa_offset(24)
movq %rdi, %r12
movq %rsi, %r13
@@ -152,16 +164,22 @@ sem_timedwait:
subq $1, NWAITERS(%r12)
addq $24, %rsp
-.Laddq:
+ cfi_adjust_cfa_offset(-24)
popq %r14
-.Lpop_r14:
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r14)
popq %r13
-.Lpop_r13:
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r13)
popq %r12
-.Lpop_r12:
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r12)
retq
-.Lafter_retq:
+ cfi_adjust_cfa_offset(3 * 8 + 24)
+ cfi_rel_offset(%r12, 24 + 2 * 8)
+ cfi_rel_offset(%r13, 24 + 1 * 8)
+ cfi_rel_offset(%r14, 24)
3: negq %r14
6:
#if USE___THREAD
@@ -186,6 +204,7 @@ sem_timedwait_cleanup:
call _Unwind_Resume@PLT
hlt
.LENDCODE:
+ cfi_endproc
.size sem_timedwait_cleanup,.-sem_timedwait_cleanup
@@ -208,118 +227,6 @@ sem_timedwait_cleanup:
.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_r12-.LSTARTCODE
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 16
- .byte 0x8c # DW_CFA_offset %r12
- .uleb128 2
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpush_r13-.Lpush_r12
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 24
- .byte 0x8d # DW_CFA_offset %r13
- .uleb128 3
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpush_r14-.Lpush_r13
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 32
- .byte 0x8e # DW_CFA_offset %r14
- .uleb128 4
- .byte 4 # DW_CFA_advance_loc4
- .long .Lsubq-.Lpush_r14
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 56
- .byte 4 # DW_CFA_advance_loc4
- .long .Laddq-.Lsubq
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 32
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpop_r14-.Laddq
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 24
- .byte 0xce # DW_CFA_restore %r14
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpop_r13-.Lpop_r14
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 16
- .byte 0xcd # DW_CFA_restore %r13
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpop_r12-.Lpop_r13
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 8
- .byte 0xcc # DW_CFA_restore %r12
- .byte 4 # DW_CFA_advance_loc4
- .long .Lafter_retq-.Lpop_r12
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 56
- .byte 0x8c # DW_CFA_offset %r12
- .uleb128 2
- .byte 0x8d # DW_CFA_offset %r13
- .uleb128 3
- .byte 0x8e # DW_CFA_offset %r14
- .uleb128 4
- .align 8
-.LENDFDE:
-
-
#ifdef SHARED
.hidden DW.ref.__gcc_personality_v0
.weak DW.ref.__gcc_personality_v0
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=0adae4681750bea9eb729c8935d4b152de4a6b68
commit 0adae4681750bea9eb729c8935d4b152de4a6b68
Author: Ulrich Drepper <drepper@redhat.com>
Date: Fri Jul 17 15:50:23 2009 -0700
Optimize x86-64 sem_wait for uncontested semaphore.
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 5204ad1..5db47a1 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,5 +1,8 @@
2009-07-17 Ulrich Drepper <drepper@redhat.com>
+ * sysdeps/unix/sysv/linux/x86_64/sem_wait.S (sem_wait): Optimize
+ handling of uncontested semaphore.
+
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
(__condvar_cleanup): Rewrite to use cfi directives instead of
hand-coded unwind tables.
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
index de6a53b..a01d745 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
@@ -40,18 +40,11 @@ sem_wait:
cfi_personality(DW_EH_PE_udata4, __gcc_personality_v0)
cfi_lsda(DW_EH_PE_udata4, .LexceptSTART)
#endif
- pushq %r12
- cfi_adjust_cfa_offset(8)
- cfi_rel_offset(%r12, 0)
- pushq %r13
- cfi_adjust_cfa_offset(8)
- cfi_rel_offset(%r13, 0)
- movq %rdi, %r13
#if VALUE == 0
- movl (%r13), %eax
+ movl (%rdi), %eax
#else
- movl VALUE(%r13), %eax
+ movl VALUE(%rdi), %eax
#endif
2: testl %eax, %eax
je 1f
@@ -59,27 +52,24 @@ sem_wait:
leal -1(%rax), %edx
LOCK
#if VALUE == 0
- cmpxchgl %edx, (%r13)
+ cmpxchgl %edx, (%rdi)
#else
- cmpxchgl %edx, VALUE(%r13)
+ cmpxchgl %edx, VALUE(%rdi)
#endif
jne 2b
-7: xorl %eax, %eax
-
-9: popq %r13
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r13)
- popq %r12
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r12)
-
+ xorl %eax, %eax
retq
- cfi_adjust_cfa_offset(2 * 8)
- cfi_rel_offset(%r12, 8)
+1: pushq %r12
+ cfi_adjust_cfa_offset(8)
+ cfi_rel_offset(%r12, 0)
+ pushq %r13
+ cfi_adjust_cfa_offset(8)
cfi_rel_offset(%r13, 0)
-1: LOCK
+ movq %rdi, %r13
+
+ LOCK
addq $1, NWAITERS(%r13)
.LcleanupSTART:
@@ -128,8 +118,21 @@ sem_wait:
LOCK
subq $1, NWAITERS(%r13)
- jmp 7b
+ xorl %eax, %eax
+
+9: popq %r13
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r13)
+ popq %r12
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r12)
+
+ retq
+
+ cfi_adjust_cfa_offset(2 * 8)
+ cfi_rel_offset(%r12, 8)
+ cfi_rel_offset(%r13, 0)
4: negq %r12
#if USE___THREAD
movq errno@gottpoff(%rip), %rdx
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=c3c2f3cf56ffcfd200f6c26aa5492049140bbbcb
commit c3c2f3cf56ffcfd200f6c26aa5492049140bbbcb
Author: Ulrich Drepper <drepper@redhat.com>
Date: Fri Jul 17 15:31:36 2009 -0700
Replace hand-coded unwind tables from x86-64 sem_wait.
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 084ebe6..5204ad1 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -5,6 +5,7 @@
hand-coded unwind tables.
* sysdeps/unix/sysv/linux/x86_64/pthread_once.S (__pthread_once):
Likewise.
+ * sysdeps/unix/sysv/linux/x86_64/sem_wait.S (sem_wait): Likewise.
2009-06-12 Ulrich Drepper <drepper@redhat.com>
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
index 5320a91..de6a53b 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.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.
@@ -31,10 +31,21 @@
.align 16
sem_wait:
.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
pushq %r12
-.Lpush_r12:
+ cfi_adjust_cfa_offset(8)
+ cfi_rel_offset(%r12, 0)
pushq %r13
-.Lpush_r13:
+ cfi_adjust_cfa_offset(8)
+ cfi_rel_offset(%r13, 0)
movq %rdi, %r13
#if VALUE == 0
@@ -57,13 +68,17 @@ sem_wait:
7: xorl %eax, %eax
9: popq %r13
-.Lpop_r13:
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r13)
popq %r12
-.Lpop_r12:
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r12)
retq
-.Lafter_retq:
+ cfi_adjust_cfa_offset(2 * 8)
+ cfi_rel_offset(%r12, 8)
+ cfi_rel_offset(%r13, 0)
1: LOCK
addq $1, NWAITERS(%r13)
@@ -141,15 +156,15 @@ sem_wait_cleanup:
call _Unwind_Resume@PLT
hlt
.LENDCODE:
+ cfi_endproc
.size sem_wait_cleanup,.-sem_wait_cleanup
.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
@@ -163,97 +178,6 @@ sem_wait_cleanup:
.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_r12-.LSTARTCODE
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 16
- .byte 0x8c # DW_CFA_offset %r12
- .uleb128 2
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpush_r13-.Lpush_r12
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 24
- .byte 0x8d # DW_CFA_offset %r13
- .uleb128 3
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpop_r13-.Lpush_r13
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 16
- .byte 0xcd # DW_CFA_restore %r13
- .byte 4 # DW_CFA_advance_loc4
- .long .Lpop_r12-.Lpop_r13
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 8
- .byte 0xcc # DW_CFA_restore %r12
- .byte 4 # DW_CFA_advance_loc4
- .long .Lafter_retq-.Lpop_r12
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 24
- .byte 0x8c # DW_CFA_offset %r12
- .uleb128 2
- .byte 0x8d # DW_CFA_offset %r13
- .uleb128 3
- .align 8
-.LENDFDE:
-
-
#ifdef SHARED
.hidden DW.ref.__gcc_personality_v0
.weak DW.ref.__gcc_personality_v0
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=63601ccd1614250bf91e47f46c6b24b53dfd6af6
commit 63601ccd1614250bf91e47f46c6b24b53dfd6af6
Author: Ulrich Drepper <drepper@redhat.com>
Date: Fri Jul 17 14:45:08 2009 -0700
Replace hand-coded unwind tables from x86-64 pthread_once.
diff --git a/ChangeLog b/ChangeLog
index dce8cbc..da91742 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-17 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/generic/sysdep.h: Define cfi_personality, cfi_lsda,
+ CFI_PERSONALITY, CFI_LSDA, and DW_EH_PE_* constants.
+
2009-07-16 Ulrich Drepper <drepper@redhat.com>
[BZ #10360]
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 2551faa..084ebe6 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 c3b2b51..ccc1849 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
diff --git a/sysdeps/generic/sysdep.h b/sysdeps/generic/sysdep.h
index 15d951c..54884d9 100644
--- a/sysdeps/generic/sysdep.h
+++ b/sysdeps/generic/sysdep.h
@@ -1,5 +1,5 @@
/* Generic asm macros used on many machines.
- Copyright (C) 1991,92,93,96,98,2002,2003 Free Software Foundation, Inc.
+ Copyright (C) 1991,92,93,96,98,2002,2003,2009 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -39,13 +39,13 @@
#ifdef __ASSEMBLER__
/* Mark the end of function named SYM. This is used on some platforms
to generate correct debugging information. */
-#ifndef END
-#define END(sym)
-#endif
+# ifndef END
+# define END(sym)
+# endif
-#ifndef JUMPTARGET
-#define JUMPTARGET(sym) sym
-#endif
+# ifndef JUMPTARGET
+# define JUMPTARGET(sym) sym
+# endif
/* Makros to generate eh_frame unwind information. */
# ifdef HAVE_ASM_CFI_DIRECTIVES
@@ -65,6 +65,8 @@
# define cfi_remember_state .cfi_remember_state
# define cfi_restore_state .cfi_restore_state
# define cfi_window_save .cfi_window_save
+# define cfi_personality(enc, exp) .cfi_personality enc, exp
+# define cfi_lsda(enc, exp) .cfi_lsda enc, exp
# else
# define cfi_startproc
# define cfi_endproc
@@ -82,6 +84,8 @@
# define cfi_remember_state
# define cfi_restore_state
# define cfi_window_save
+# define cfi_personality(enc, exp)
+# define cfi_lsda(enc, exp)
# endif
#else /* ! ASSEMBLER */
@@ -116,6 +120,10 @@
".cfi_restore_state"
# define CFI_WINDOW_SAVE \
".cfi_window_save"
+# define CFI_PERSONALITY(enc, exp) \
+ ".cfi_personality " CFI_STRINGIFY(enc) "," CFI_STRINGIFY(exp)
+# define CFI_LSDA(enc, exp) \
+ ".cfi_lsda " CFI_STRINGIFY(enc) "," CFI_STRINGIFY(exp)
# else
# define CFI_STARTPROC
# define CFI_ENDPROC
@@ -132,6 +140,27 @@
# define CFI_REMEMBER_STATE
# define CFI_RESTORE_STATE
# define CFI_WINDOW_SAVE
+# define CFI_PERSONALITY(enc, exp)
+# define CFI_LSDA(enc, exp)
# endif
#endif /* __ASSEMBLER__ */
+
+/* Values used for encoding parameter of cfi_personality and cfi_lsda. */
+#define DW_EH_PE_absptr 0x00
+#define DW_EH_PE_omit 0xff
+#define DW_EH_PE_uleb128 0x01
+#define DW_EH_PE_udata2 0x02
+#define DW_EH_PE_udata4 0x03
+#define DW_EH_PE_udata8 0x04
+#define DW_EH_PE_sleb128 0x09
+#define DW_EH_PE_sdata2 0x0a
+#define DW_EH_PE_sdata4 0x0b
+#define DW_EH_PE_sdata8 0x0c
+#define DW_EH_PE_signed 0x08
+#define DW_EH_PE_pcrel 0x10
+#define DW_EH_PE_textrel 0x20
+#define DW_EH_PE_datarel 0x30
+#define DW_EH_PE_funcrel 0x40
+#define DW_EH_PE_aligned 0x50
+#define DW_EH_PE_indirect 0x80
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d52c96e73a20d1c1d266f783fc31df6759207ea0
commit d52c96e73a20d1c1d266f783fc31df6759207ea0
Author: Ulrich Drepper <drepper@redhat.com>
Date: Fri Jul 17 12:14:09 2009 -0700
Replace hand-coded unwind tables from x86-64 pthread_cond_wait.
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index ec9ace7..2551faa 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,9 @@
+2009-07-17 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+ (__condvar_cleanup): Rewrite to use cfi directives instead of
+ hand-coded unwind tables.
+
2009-06-12 Ulrich Drepper <drepper@redhat.com>
* Makefile (libpthread-routines): Add pthread_sigqueue.
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
index e5e802d..146a414 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2007, 2009 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -33,7 +33,10 @@
.globl __condvar_cleanup
.hidden __condvar_cleanup
__condvar_cleanup:
+ cfi_startproc
pushq %r12
+ cfi_adjust_cfa_offset(8)
+ cfi_rel_offset(%r12, 0)
/* Get internal lock. */
movq %rdi, %r8
@@ -141,8 +144,11 @@ __condvar_cleanup:
callq __pthread_mutex_cond_lock
popq %r12
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r12)
retq
+ cfi_endproc
.size __condvar_cleanup, .-__condvar_cleanup
@@ -151,12 +157,14 @@ __condvar_cleanup:
.type __pthread_cond_wait, @function
.align 16
__pthread_cond_wait:
-.LSTARTCODE:
+ cfi_startproc
pushq %r12
-.Lpush_r12:
+ cfi_adjust_cfa_offset(8)
+ cfi_rel_offset(%r12, 0)
#define FRAME_SIZE 64
subq $FRAME_SIZE, %rsp
-.Lsubq:
+ cfi_adjust_cfa_offset(FRAME_SIZE)
+
/* Stack frame:
rsp + 64
@@ -332,17 +340,19 @@ __pthread_cond_wait:
movq 16(%rsp), %rdi
callq __pthread_mutex_cond_lock
14: addq $FRAME_SIZE, %rsp
-.Laddq:
+ cfi_adjust_cfa_offset(-FRAME_SIZE)
popq %r12
-.Lpop_r12:
+ cfi_adjust_cfa_offset(-8)
+ cfi_restore(%r12)
/* We return the result of the mutex_lock operation. */
retq
/* Initial locking failed. */
1:
-.LSbl1:
+ cfi_adjust_cfa_offset(8 + FRAME_SIZE)
+ cfi_rel_offset(%r12, FRAME_SIZE)
#if cond_lock != 0
addq $cond_lock, %rdi
#endif
@@ -414,75 +424,7 @@ __pthread_cond_wait:
13: movq %r10, %rax
jmp 14b
-.LENDCODE:
+ cfi_endproc
.size __pthread_cond_wait, .-__pthread_cond_wait
versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
GLIBC_2_3_2)
-
-
- .section .eh_frame,"a",@progbits
-.LSTARTFRAME:
- .long L(ENDCIE)-L(STARTCIE) # Length of the CIE.
-.LSTARTCIE:
- .long 0 # CIE ID.
- .byte 1 # Version number.
-#ifdef SHARED
- .string "zR" # NUL-terminated augmentation
- # string.
-#else
- .ascii "\0" # NUL-terminated augmentation
- # string.
-#endif
- .uleb128 1 # Code alignment factor.
- .sleb128 -8 # Data alignment factor.
- .byte 16 # Return address register
- # column.
-#ifdef SHARED
- .uleb128 1 # Augmentation value length.
- .byte 0x1b # Encoding: DW_EH_PE_pcrel
- # + DW_EH_PE_sdata4.
-#endif
- .byte 0x0c # DW_CFA_def_cfa
- .uleb128 7
- .uleb128 8
- .byte 0x90 # DW_CFA_offset, column 0x8
- .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
-#else
- .long .LSTARTCODE # Start address of the code.
-#endif
- .long .LENDCODE-.LSTARTCODE # Length of the code.
-#ifdef SHARED
- .uleb128 0 # No augmentation data.
-#endif
- .byte 0x40+.Lpush_r12-.LSTARTCODE # DW_CFA_advance_loc+N
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 16
- .byte 0x8c # DW_CFA_offset %r12
- .uleb128 2
- .byte 0x40+.Lsubq-.Lpush_r12 # DW_CFA_advance_loc+N
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 16+FRAME_SIZE
- .byte 3 # DW_CFA_advance_loc2
- .2byte .Laddq-.Lsubq
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 16
- .byte 0x40+.Lpop_r12-.Laddq # DW_CFA_advance_loc+N
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 8
- .byte 0xcc # DW_CFA_restore %r12
- .byte 0x40+.LSbl1-.Lpop_r12 # DW_CFA_advance_loc+N
- .byte 14 # DW_CFA_def_cfa_offset
- .uleb128 80
- .byte 0x8c # DW_CFA_offset %r12
- .uleb128 2
- .align 8
-.LENDFDE:
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 5 +
nptl/ChangeLog | 14 ++
.../unix/sysv/linux/x86_64/pthread_cond_wait.S | 94 +++----------
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S | 128 +++-------------
.../sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S | 151 ++++---------------
nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S | 157 +++++--------------
sysdeps/generic/sysdep.h | 43 +++++-
7 files changed, 166 insertions(+), 426 deletions(-)
hooks/post-receive
--
GNU C Library master sources