Replace hand-coded unwind tables from x86-64 pthread_once.
authorUlrich Drepper <drepper@redhat.com>
Fri, 17 Jul 2009 21:45:08 +0000 (14:45 -0700)
committerUlrich Drepper <drepper@redhat.com>
Fri, 17 Jul 2009 21:45:08 +0000 (14:45 -0700)
ChangeLog
nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S
sysdeps/generic/sysdep.h

index dce8cbc..da91742 100644 (file)
--- 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]
index 2551faa..084ebe6 100644 (file)
@@ -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>
 
index c3b2b51..ccc1849 100644 (file)
@@ -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>
        .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
index 15d951c..54884d9 100644 (file)
@@ -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
 #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 */
    ".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
 #  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