From aee2665a1795c60aa1965387681d801cf3cda75c Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 17 Jul 2009 16:26:06 -0700 Subject: [PATCH] Replace hand-coded unwind tables from x86-64 sem_timedwait. --- nptl/ChangeLog | 2 + .../sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S | 151 ++++----------------- 2 files changed, 31 insertions(+), 122 deletions(-) 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 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 , 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 -- 2.7.4