-/* 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.
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
/* Preserve the function pointer. */
1: pushq %rsi
-.Lpush_rsi:
+ cfi_adjust_cfa_offset(8)
xorq %r10, %r10
/* Not yet initialized or initialization in progress.
/* 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)
/* 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
syscall
4: addq $8, %rsp
-.Ladd2:
+ cfi_adjust_cfa_offset(-8)
xorl %eax, %eax
retq
-
.size __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)
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
.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
/* 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
# 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
# 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