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-243-ge4143e7
- From: drepper at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 1 Aug 2009 00:28:07 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.10-243-ge4143e7
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 e4143e7a06455b073c41a6025fcd28fc5c134211 (commit)
from 66ae9e50a336d87f943cc6314a0d405820fcdf8b (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=e4143e7a06455b073c41a6025fcd28fc5c134211
commit e4143e7a06455b073c41a6025fcd28fc5c134211
Author: Ulrich Drepper <drepper@redhat.com>
Date: Fri Jul 31 17:27:38 2009 -0700
Optimize x86 and x86-64 ____longjmp_chk for Linux.
diff --git a/ChangeLog b/ChangeLog
index fb046fe..6d2a62b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2009-07-31 Ulrich Drepper <drepper@redhat.com>
+ * sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S (longjmp_msg): Yet
+ another rewrite. Much smaller and faster.
+ * sysdeps/unix/sysv/linux/i386/____longjmp_chk.S: Likewise.
+
* sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S (longjmp_msg): Get
ss_flags from the correct location.
diff --git a/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S b/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
index b07e972..65c7bae 100644
--- a/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/i386/____longjmp_chk.S
@@ -58,8 +58,6 @@ ENTRY (____longjmp_chk)
PTR_DEMANGLE (%edx)
PTR_DEMANGLE (%edi)
- pushl $0
- cfi_adjust_cfa_offset(4)
cmpl %edi, %esp
jbe .Lok
@@ -69,15 +67,25 @@ ENTRY (____longjmp_chk)
movl %esp, %ecx
movl $__NR_sigaltstack, %eax
ENTER_KERNEL
- movl 4(%esp), %ebx
- addl $12, %esp
+ /* Without working sigaltstack we cannot perform the test. */
+ test %eax, %eax
+ jne .Lok2
+ testl $1, 4(%esp)
+ jz .Lfail
+
+ movl (%esp), %eax
+ addl 8(%esp), %eax
+ subl %edi, %eax
+ cmpl 8(%esp), %eax
+ jae .Lok2
+
+.Lfail: CALL_FAIL
+
+.Lok2: addl $12, %esp
cfi_adjust_cfa_offset(-12)
- movl 8(%esp), %ecx
- testl %eax, %eax
- jne .Lok
- andl $1, %ebx
- movl %ebx, (%esp)
-.Lok:
+ movl 4(%esp), %ecx
+
+.Lok: /* We add unwind information for the target here. */
cfi_def_cfa(%ecx, 0)
cfi_register(%eip, %edx)
cfi_register(%esp, %edi)
@@ -86,15 +94,11 @@ ENTRY (____longjmp_chk)
cfi_offset(%edi, JB_DI*4)
cfi_offset(%ebp, JB_BP*4)
- movl 12(%esp), %eax /* Second argument is return value. */
- xchgl %edi, %esp
- cfi_restore(%edi)
-
- cmpl %esp, %edi
- jnbe .Lcheck
+ movl 8(%esp), %eax /* Second argument is return value. */
+ movl %edi, %esp
/* Restore registers. */
-.Lout: movl (JB_BX*4)(%ecx), %ebx
+ movl (JB_BX*4)(%ecx), %ebx
movl (JB_SI*4)(%ecx), %esi
movl (JB_DI*4)(%ecx), %edi
movl (JB_BP*4)(%ecx), %ebp
@@ -105,39 +109,4 @@ ENTRY (____longjmp_chk)
/* Jump to saved PC. */
jmp *%edx
-
- cfi_def_cfa(%ecx, 0)
- cfi_register(%eip, %edx)
- cfi_offset(%ebx, JB_BX*4)
- cfi_offset(%esi, JB_SI*4)
- cfi_offset(%edi, JB_DI*4)
- cfi_offset(%ebp, JB_BP*4)
-
-.Lcheck:
- cmpl $0, (%edi)
- je .Lfail
-
- subl $12, %esp
- cfi_adjust_cfa_offset(12)
- xorl %ebx, %ebx
- movl %esp, %ecx
- movl $__NR_sigaltstack, %eax
- ENTER_KERNEL
- testl $1, 4(%esp)
- leal 12(%esp), %esp
- movl 8(%edi), %ecx
- movl 12(%edi), %eax
- cfi_adjust_cfa_offset(-12)
- je .Lout
-
-.Lfail: xchgl %edi, %esp
- cfi_def_cfa(%esp, 8)
- cfi_restore(%esp)
- cfi_restore(%ebx)
- cfi_restore(%esi)
- cfi_undefined(%edi)
- cfi_restore(%ebp)
-
- CALL_FAIL
- hlt
END (____longjmp_chk)
diff --git a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
index 4e53ea6..87c728d 100644
--- a/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
+++ b/sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S
@@ -58,31 +58,36 @@ ENTRY(____longjmp_chk)
PTR_DEMANGLE (%rdx)
#endif
+ cmpq %r8, %rsp
+ jbe .Lok
+
/* Save function parameters. */
movq %rdi, %r10
movl %esi, %ecx
- xorl %eax, %eax
- cmpq %r8, %rsp
- jbe .Lok
-
- subq $24, %rsp
- cfi_adjust_cfa_offset(24)
xorl %edi, %edi
- movq %rsp, %rsi
+ leaq -24(%rsp), %rsi
movl $__NR_sigaltstack, %eax
syscall
+ /* Without working sigaltstack we cannot perform the test. */
testl %eax, %eax
- movl $0, %eax
- leaq 24(%rsp), %rsp
- cfi_adjust_cfa_offset(-24)
- jne .Lok
- movl -16(%rsp), %eax
- andl $1, %eax
+ jne .Lok2
+ testl $1, -16(%rsp)
+ jz .Lfail
-.Lok:
- /* We add unwind information for the target here. */
- cfi_def_cfa(%r10, 0)
+ movq -24(%rsp), %rax
+ addq -8(%rsp), %rax
+ subq %r8, %rax
+ cmpq -8(%rsp), %rax
+ jae .Lok2
+
+.Lfail: CALL_FAIL
+
+.Lok2: movq %r10, %rdi
+ movl %ecx, %esi
+
+.Lok: /* We add unwind information for the target here. */
+ cfi_def_cfa(%rdi, 0)
cfi_register(%rsp,%r8)
cfi_register(%rbp,%r9)
cfi_register(%rip,%rdx)
@@ -91,55 +96,14 @@ ENTRY(____longjmp_chk)
cfi_offset(%r13,JB_R13*8)
cfi_offset(%r14,JB_R14*8)
cfi_offset(%r15,JB_R15*8)
-
- xchgq %r8, %rsp
- cfi_restore(%rsp)
- xchgq %r9, %rbp
- cfi_restore(%rbp)
-
- movq (JB_RBX*8)(%r10),%rbx
- movq (JB_R12*8)(%r10),%r12
- movq (JB_R13*8)(%r10),%r13
- movq (JB_R14*8)(%r10),%r14
- movq (JB_R15*8)(%r10),%r15
-
- cmpq %rsp, %r8
- jnbe .Lcheck
-
+ movq (JB_RBX*8)(%rdi),%rbx
+ movq (JB_R12*8)(%rdi),%r12
+ movq (JB_R13*8)(%rdi),%r13
+ movq (JB_R14*8)(%rdi),%r14
+ movq (JB_R15*8)(%rdi),%r15
/* Set return value for setjmp. */
-.Lout: movl %ecx, %eax
+ movl %esi, %eax
+ movq %r8,%rsp
+ movq %r9,%rbp
jmpq *%rdx
-
-.Lcheck:
- testl %eax, %eax
- je .Lfail
-
- subq $24, %rsp
- cfi_adjust_cfa_offset(24)
- xorl %edi, %edi
- movq %rsp, %rsi
- movl $__NR_sigaltstack, %eax
- syscall
- addq $24, %rsp
- cfi_adjust_cfa_offset(-24)
- testl $1, -16(%rsp)
- je .Lout
-
-.Lfail: xchgq %r8, %rsp
- /* We want the stack trace to show that of the caller. */
- cfi_def_cfa(%rsp, 8)
- cfi_restore(%rsp)
- cfi_register(%rbp, %r9)
- cfi_restore(%rip)
- cfi_restore(%rbx)
- cfi_restore(%r12)
- cfi_restore(%r13)
- cfi_restore(%r14)
- cfi_restore(%r15)
-
- xchgq %r9, %rbp
- cfi_restore(%rbp)
-
- CALL_FAIL
- hlt
END (BP_SYM (____longjmp_chk))
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 4 +
sysdeps/unix/sysv/linux/i386/____longjmp_chk.S | 73 +++++------------
sysdeps/unix/sysv/linux/x86_64/____longjmp_chk.S | 94 +++++++---------------
3 files changed, 54 insertions(+), 117 deletions(-)
hooks/post-receive
--
GNU C Library master sources