Replace hand-coded unwind tables from x86-64 pthread_once.
This commit is contained in:
parent
d52c96e73a
commit
63601ccd16
@ -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]
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user