This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: Add unwind information to i386 LinuxThreads syscalls
On Sun, Mar 13, 2005 at 10:31:58AM -0500, Daniel Jacobowitz wrote:
> On Sun, Mar 13, 2005 at 12:28:55AM -0800, Roland McGrath wrote:
> > > Tested on i686-linux, using both LinuxThreads and NPTL. Also
> > > hand-checked that the unwind information was right in various cases.
> >
> > Did you check that the NPTL unwind information was exactly the same as what
> > the hand-coded version said before?
>
> I did check for several individual cases, but I didn't diff the whole
> library. I can go do that now.
There were two changes in the unwind information for the library. One
of them was a bug in the patch - the old code covered the syscall error
handler, but the new code did not. The other was a bug in the existing
unwind information for syscalls with one argument; a negative value was
being used for DW_CFA_advance_loc, which caused it to decode as
DW_CFA_GNU_window_save. Someone moved the labels around without
checking the .eh_frame. Won't happen any more...
Here's the revised patch, and the diff in readelf -wf. Now some error
handlers that were previously uncovered are covered, and the window
save bug is fixed. These are diffs for libc.so; libpthread.so shows
the same behavior and librt.so is unchanged.
[BTW, LinuxThreads doesn't build on i386 --with-__thread any more. If
that's an unsupported configuration, can configure complain about it?
Undefined references to _res.]
--- unpatched.wf 2005-03-13 13:12:33.000000000 -0500
+++ patched.wf 2005-03-13 13:45:22.000000000 -0500
@@ -6479,13 +6479,13 @@
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 18 to 000a44fe
DW_CFA_restore: r3
- DW_CFA_advance_loc: 36 to 000a4522
- DW_CFA_def_cfa_offset: 8
- DW_CFA_GNU_window_save
+ DW_CFA_advance_loc: 17 to 000a450f
DW_CFA_register: r3 in r2
- DW_CFA_advance_loc: 18 to 000a4534
+ DW_CFA_advance_loc: 18 to 000a4521
DW_CFA_restore: r3
- DW_CFA_advance_loc: 9 to 000a453d
+ DW_CFA_advance_loc: 1 to 000a4522
+ DW_CFA_def_cfa_offset: 8
+ DW_CFA_advance_loc: 8 to 000a452a
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
@@ -7374,13 +7374,13 @@
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 18 to 000acb8e
DW_CFA_restore: r3
- DW_CFA_advance_loc: 36 to 000acbb2
- DW_CFA_def_cfa_offset: 8
- DW_CFA_GNU_window_save
+ DW_CFA_advance_loc: 17 to 000acb9f
DW_CFA_register: r3 in r2
- DW_CFA_advance_loc: 18 to 000acbc4
+ DW_CFA_advance_loc: 18 to 000acbb1
DW_CFA_restore: r3
- DW_CFA_advance_loc: 9 to 000acbcd
+ DW_CFA_advance_loc: 1 to 000acbb2
+ DW_CFA_def_cfa_offset: 8
+ DW_CFA_advance_loc: 8 to 000acbba
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
@@ -8126,7 +8126,7 @@
DW_CFA_advance_loc: 32 to 000b2779
DW_CFA_GNU_args_size: 4
-00004500 00000024 000003f0 FDE cie=00004114 pc=000b3ad0..000b3b29
+00004500 00000024 000003f0 FDE cie=00004114 pc=000b3ad0..000b3b46
DW_CFA_advance_loc: 12 to 000b3adc
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3af3
@@ -8144,14 +8144,14 @@
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
-00004528 00000014 00000418 FDE cie=00004114 pc=000b3b50..000b3b6f
+00004528 00000014 00000418 FDE cie=00004114 pc=000b3b50..000b3b8c
DW_CFA_advance_loc: 2 to 000b3b52
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3b69
DW_CFA_restore: r3
DW_CFA_nop
-00004540 00000024 00000430 FDE cie=00004114 pc=000b3b90..000b3be9
+00004540 00000024 00000430 FDE cie=00004114 pc=000b3b90..000b3c06
DW_CFA_advance_loc: 12 to 000b3b9c
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3bb3
@@ -8169,35 +8169,35 @@
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
-00004568 00000014 00000458 FDE cie=00004114 pc=000b3c10..000b3c2f
+00004568 00000014 00000458 FDE cie=00004114 pc=000b3c10..000b3c4c
DW_CFA_advance_loc: 2 to 000b3c12
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3c29
DW_CFA_restore: r3
DW_CFA_nop
-00004580 00000014 00000470 FDE cie=00004114 pc=000b3c50..000b3c6f
+00004580 00000014 00000470 FDE cie=00004114 pc=000b3c50..000b3c8c
DW_CFA_advance_loc: 2 to 000b3c52
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3c69
DW_CFA_restore: r3
DW_CFA_nop
-00004598 00000014 00000488 FDE cie=00004114 pc=000b3c90..000b3caf
+00004598 00000014 00000488 FDE cie=00004114 pc=000b3c90..000b3ccc
DW_CFA_advance_loc: 2 to 000b3c92
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3ca9
DW_CFA_restore: r3
DW_CFA_nop
-000045b0 00000014 000004a0 FDE cie=00004114 pc=000b3cd0..000b3cef
+000045b0 00000014 000004a0 FDE cie=00004114 pc=000b3cd0..000b3d0c
DW_CFA_advance_loc: 2 to 000b3cd2
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3ce9
DW_CFA_restore: r3
DW_CFA_nop
-000045c8 00000024 000004b8 FDE cie=00004114 pc=000b3d10..000b3d69
+000045c8 00000024 000004b8 FDE cie=00004114 pc=000b3d10..000b3d86
DW_CFA_advance_loc: 12 to 000b3d1c
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3d33
@@ -8215,7 +8215,7 @@
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
-000045f0 00000024 000004e0 FDE cie=00004114 pc=000b3d90..000b3de9
+000045f0 00000024 000004e0 FDE cie=00004114 pc=000b3d90..000b3e06
DW_CFA_advance_loc: 12 to 000b3d9c
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3db3
@@ -8233,7 +8233,7 @@
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
-00004618 00000024 00000508 FDE cie=00004114 pc=000b3e10..000b3e69
+00004618 00000024 00000508 FDE cie=00004114 pc=000b3e10..000b3e86
DW_CFA_advance_loc: 12 to 000b3e1c
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3e33
@@ -8251,7 +8251,7 @@
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
-00004640 00000024 00000530 FDE cie=00004114 pc=000b3e90..000b3ee9
+00004640 00000024 00000530 FDE cie=00004114 pc=000b3e90..000b3f06
DW_CFA_advance_loc: 12 to 000b3e9c
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3eb3
@@ -8269,7 +8269,7 @@
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
-00004668 00000024 00000558 FDE cie=00004114 pc=000b3f10..000b3f69
+00004668 00000024 00000558 FDE cie=00004114 pc=000b3f10..000b3f86
DW_CFA_advance_loc: 12 to 000b3f1c
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3f33
@@ -8287,7 +8287,7 @@
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
-00004690 00000024 00000580 FDE cie=00004114 pc=000b3f90..000b3fe9
+00004690 00000024 00000580 FDE cie=00004114 pc=000b3f90..000b4006
DW_CFA_advance_loc: 12 to 000b3f9c
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b3fb3
@@ -8305,28 +8305,28 @@
DW_CFA_def_cfa_offset: 4
DW_CFA_nop
-000046b8 00000014 000005a8 FDE cie=00004114 pc=000b4010..000b402f
+000046b8 00000014 000005a8 FDE cie=00004114 pc=000b4010..000b404c
DW_CFA_advance_loc: 2 to 000b4012
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b4029
DW_CFA_restore: r3
DW_CFA_nop
-000046d0 00000014 000005c0 FDE cie=00004114 pc=000b4050..000b406f
+000046d0 00000014 000005c0 FDE cie=00004114 pc=000b4050..000b408c
DW_CFA_advance_loc: 2 to 000b4052
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b4069
DW_CFA_restore: r3
DW_CFA_nop
-000046e8 00000014 000005d8 FDE cie=00004114 pc=000b4090..000b40af
+000046e8 00000014 000005d8 FDE cie=00004114 pc=000b4090..000b40cc
DW_CFA_advance_loc: 2 to 000b4092
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b40a9
DW_CFA_restore: r3
DW_CFA_nop
-00004700 00000014 000005f0 FDE cie=00004114 pc=000b40d0..000b40ef
+00004700 00000014 000005f0 FDE cie=00004114 pc=000b40d0..000b410c
DW_CFA_advance_loc: 2 to 000b40d2
DW_CFA_register: r3 in r2
DW_CFA_advance_loc: 23 to 000b40e9
--
Daniel Jacobowitz
CodeSourcery, LLC
./
2005-03-13 Daniel Jacobowitz <dan@codesourcery.com>
* sysdeps/unix/sysv/linux/i386/sysdep.h: Include
<sysdeps/generic/sysdep.h>.
(PSEUDO_END): Add cfi_endproc.
(_CFI, CFI_PUSH, CFI_POP): Define.
(PUSHARGS_1, POPARGS_1, _PUSHARGS_1, _POPARGS_1, _PUSHARGS_4,
_POPARGS_4, _PUSHARGS_5, _POPARGS_5, _PUSHARGS_6, _POPARGS_6): Use
them.
* sysdeps/unix/sysv/linux/i386/socket.S: Remove cfi_endproc.
nptl/
2005-03-13 Daniel Jacobowitz <dan@codesourcery.com>
* sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (_CFI): Define.
(PSEUDO, SAVE_OLDTYPE_2, PUSHCARGS_1, POPCARGS_1, _PUSHCARGS_1,
_POPCARGS_1, _PUSHCARGS_4, _POPCARGS_4, _PUSHCARGS_5, _POPCARGS_5,
POPSTATE_0, POPSTATE_2): Use CFI markers.
(AUGMENTATION_STRING, AUGMENTATION_PARAM, AUGMENTATION_PARAM_FDE,
START_SYMBOL_REF, EH_FRAME_0, EH_FRAME_1, EH_FRAME_2, EH_FRAME_3,
EH_FRAME_4, EH_FRAME_5, ASM_SIZE_DIRECTIVE): Delete.
linuxthreads/
2005-03-13 Daniel Jacobowitz <dan@codesourcery.com>
* sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (_CFI): Define.
(PSEUDO, SAVE_OLDTYPE_2, PUSHCARGS_1, POPCARGS_1, _PUSHCARGS_1,
_POPCARGS_1, _PUSHCARGS_4, _POPCARGS_4, _PUSHCARGS_5, _POPCARGS_5,
POPSTATE_0, POPSTATE_2): Add CFI markers.
* sysdeps/unix/sysv/linux/i386/vfork.S (_CFI): Define.
Index: linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
===================================================================
RCS file: /home/drow/rsync/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h,v
retrieving revision 1.12
diff -u -p -r1.12 sysdep-cancel.h
--- linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h 16 Apr 2004 21:54:33 -0000 1.12
+++ linuxthreads/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h 13 Mar 2005 18:31:39 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
@@ -26,10 +26,15 @@
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
+/* Enable CFI. */
+#undef _CFI
+#define _CFI(x) x
+
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY (name) \
+ cfi_startproc; \
SINGLE_THREAD_P; \
jne L(pseudo_cancel); \
DO_CALL (syscall_name, args); \
@@ -51,7 +56,7 @@
# define SAVE_OLDTYPE_0 movl %eax, %ecx;
# define SAVE_OLDTYPE_1 SAVE_OLDTYPE_0
-# define SAVE_OLDTYPE_2 pushl %eax;
+# define SAVE_OLDTYPE_2 pushl %eax; cfi_adjust_cfa_offset(4);
# define SAVE_OLDTYPE_3 SAVE_OLDTYPE_2
# define SAVE_OLDTYPE_4 SAVE_OLDTYPE_2
# define SAVE_OLDTYPE_5 SAVE_OLDTYPE_2
@@ -62,11 +67,11 @@
# define _PUSHCARGS_0 /* No arguments to push. */
# define _POPCARGS_0 /* No arguments to pop. */
-# define PUSHCARGS_1 movl %ebx, %edx; PUSHCARGS_0
+# define PUSHCARGS_1 movl %ebx, %edx; cfi_register(%ebx,%edx); PUSHCARGS_0
# define DOCARGS_1 _DOARGS_1 (4)
-# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx
-# define _PUSHCARGS_1 pushl %ebx; L(PUSHBX2): _PUSHCARGS_0
-# define _POPCARGS_1 _POPCARGS_0; popl %ebx; L(POPBX2):
+# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx; cfi_restore(%ebx);
+# define _PUSHCARGS_1 pushl %ebx; CFI_PUSH(%ebx); _PUSHCARGS_0
+# define _POPCARGS_1 _POPCARGS_0; popl %ebx; CFI_POP(%ebx);
# define PUSHCARGS_2 PUSHCARGS_1
# define DOCARGS_2 _DOARGS_2 (12)
@@ -83,14 +88,14 @@
# define PUSHCARGS_4 _PUSHCARGS_4
# define DOCARGS_4 _DOARGS_4 (28)
# define POPCARGS_4 _POPCARGS_4
-# define _PUSHCARGS_4 pushl %esi; L(PUSHSI2): _PUSHCARGS_3
-# define _POPCARGS_4 _POPCARGS_3; popl %esi; L(POPSI2):
+# define _PUSHCARGS_4 pushl %esi; CFI_PUSH(%esi); _PUSHCARGS_3
+# define _POPCARGS_4 _POPCARGS_3; popl %esi; CFI_POP(%esi);
# define PUSHCARGS_5 _PUSHCARGS_5
# define DOCARGS_5 _DOARGS_5 (36)
# define POPCARGS_5 _POPCARGS_5
-# define _PUSHCARGS_5 pushl %edi; L(PUSHDI2): _PUSHCARGS_4
-# define _POPCARGS_5 _POPCARGS_4; popl %edi; L(POPDI2):
+# define _PUSHCARGS_5 pushl %edi; CFI_POP(%edi); _PUSHCARGS_4
+# define _POPCARGS_5 _POPCARGS_4; popl %edi; CFI_POP(%edi);
# ifdef IS_IN_libpthread
# define CENABLE call __pthread_enable_asynccancel;
@@ -115,9 +120,9 @@
# define CENABLE call __libc_enable_asynccancel;
# define CDISABLE call __libc_disable_asynccancel
# endif
-# define POPSTATE_0 pushl %eax; movl %ecx, %eax; CDISABLE; popl %eax;
+# define POPSTATE_0 pushl %eax; cfi_adjust_cfa_offset(4); movl %ecx, %eax; CDISABLE; popl %eax; cfi_adjust_cfa_offset(-4);
# define POPSTATE_1 POPSTATE_0
-# define POPSTATE_2 xchgl (%esp), %eax; CDISABLE; popl %eax;
+# define POPSTATE_2 xchgl (%esp), %eax; CDISABLE; popl %eax; cfi_adjust_cfa_offset(-4);
# define POPSTATE_3 POPSTATE_2
# define POPSTATE_4 POPSTATE_2
# define POPSTATE_5 POPSTATE_2
Index: linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S
===================================================================
RCS file: /home/drow/rsync/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S,v
retrieving revision 1.4
diff -u -p -r1.4 vfork.S
--- linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S 11 Feb 2003 06:27:53 -0000 1.4
+++ linuxthreads/sysdeps/unix/sysv/linux/i386/vfork.S 13 Mar 2005 19:02:13 -0000
@@ -22,6 +22,10 @@
#include <bits/errno.h>
#include <kernel-features.h>
+/* We don't need unwind information for vfork. */
+#undef _CFI
+#define _CFI(x)
+
/* Clone the calling process, but without copying the whole address space.
The calling process is suspended until the new process exits or is
replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
Index: nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
===================================================================
RCS file: /home/drow/rsync/glibc/libc/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h,v
retrieving revision 1.18
diff -u -p -r1.18 sysdep-cancel.h
--- nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h 6 Jul 2004 04:25:45 -0000 1.18
+++ nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h 13 Mar 2005 18:31:38 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
@@ -25,11 +25,15 @@
#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
+/* Enable CFI. */
+#undef _CFI
+#define _CFI(x) x
+
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY (name) \
- L(name##START): \
+ cfi_startproc; \
cmpl $0, %gs:MULTIPLE_THREADS_OFFSET; \
jne L(pseudo_cancel); \
.type __##syscall_name##_nocancel,@function; \
@@ -51,258 +55,11 @@
POPSTATE_##args \
cmpl $-4095, %eax; \
jae SYSCALL_ERROR_LABEL; \
- L(pseudo_end): \
- \
- /* Create unwinding information for the syscall wrapper. */ \
- .section .eh_frame,"a",@progbits; \
- L(STARTFRAME): \
- /* Length of the CIE. */ \
- .long L(ENDCIE)-L(STARTCIE); \
- L(STARTCIE): \
- /* CIE ID. */ \
- .long 0; \
- /* Version number. */ \
- .byte 1; \
- /* NUL-terminated augmentation string. */ \
- AUGMENTATION_STRING; \
- /* Code alignment factor. */ \
- .uleb128 1; \
- /* Data alignment factor. */ \
- .sleb128 -4; \
- /* Return address register column. */ \
- .byte 8; \
- /* Optional augmentation parameter. */ \
- AUGMENTATION_PARAM \
- /* Start of the table initialization. */ \
- .byte 0xc; /* DW_CFA_def_cfa */ \
- .uleb128 4; \
- .uleb128 4; \
- .byte 0x88; /* DW_CFA_offset, column 0x8 */ \
- .uleb128 1; \
- .align 4; \
- L(ENDCIE): \
- /* Length of the FDE. */ \
- .long L(ENDFDE)-L(STARTFDE); \
- L(STARTFDE): \
- /* CIE pointer. */ \
- .long L(STARTFDE)-L(STARTFRAME); \
- /* Start address of the code. */ \
- START_SYMBOL_REF (name); \
- /* Length of the code. */ \
- .long L(name##END)-L(name##START); \
- /* Augmentation data. */ \
- AUGMENTATION_PARAM_FDE \
- /* The rest of the code depends on the number of parameters the syscall \
- takes. */ \
- EH_FRAME_##args(name); \
- .align 4; \
- L(ENDFDE): \
- .previous
-
-# ifdef SHARED
-/* NUL-terminated augmentation string. Note "z" means there is an
- augmentation value later on. */
-# define AUGMENTATION_STRING .string "zR"
-# define AUGMENTATION_PARAM \
- /* Augmentation value length. */ \
- .uleb128 1; \
- /* Encoding: DW_EH_PE_pcrel + DW_EH_PE_sdata4. */ \
- .byte 0x1b;
-# define AUGMENTATION_PARAM_FDE \
- /* No augmentation data. */ \
- .uleb128 0;
-# define START_SYMBOL_REF(name) \
- /* PC-relative start address of the code. */ \
- .long L(name##START)-.
-# else
-/* No augmentation. */
-# define AUGMENTATION_STRING .ascii "\0"
-# define AUGMENTATION_PARAM /* nothing */
-# define AUGMENTATION_PARAM_FDE /* nothing */
-# define START_SYMBOL_REF(name) \
- /* Absolute start address of the code. */ \
- .long L(name##START)
-# endif
-
-/* Callframe description for syscalls without parameters. This is very
- simple. The only place the stack pointer is changed is when the old
- cancellation state value is saved. */
-# define EH_FRAME_0(name) \
- .byte 0x40+L(PUSHSTATE)-L(name##START); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0x40+L(POPSTATE)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 4
-
-/* For syscalls with one and two parameters the code is the same as for
- those which take no parameter. */
-# define EH_FRAME_1(name) \
- .byte 0x40+L(SAVEBX1)-L(name##START); /* DW_CFA_advance_loc+N */ \
- .byte 9; /* DW_CFA_register */ \
- .uleb128 3; /* %ebx */ \
- .uleb128 2; /* %edx */ \
- .byte 0x40+L(RESTBX1)-L(SAVEBX1); /* DW_CFA_advance_loc+N */ \
- .byte 0xc3; /* DW_CFA_restore %ebx */ \
- .byte 0x40+L(PUSHSTATE)-L(RESTBX1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0x40+L(SAVEBX2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
- .byte 9; /* DW_CFA_register */ \
- .uleb128 3; /* %ebx */ \
- .uleb128 2; /* %edx */ \
- .byte 0x40+L(RESTBX2)-L(SAVEBX2); /* DW_CFA_advance_loc+N */ \
- .byte 0xc3; /* DW_CFA_restore %ebx */ \
- .byte 0x40+L(POPSTATE)-L(RESTBX2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 4
-
-# define EH_FRAME_2(name) EH_FRAME_1 (name)
-
-/* For syscalls with three parameters the stack pointer is changed
- also to save the content of the %ebx register. */
-# define EH_FRAME_3(name) \
- .byte 0x40+L(PUSHBX1)-L(name##START); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0x83; /* DW_CFA_offset %ebx */ \
- .uleb128 2; \
- .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 4; \
- .byte 0xc3; /* DW_CFA_restore %ebx */ \
- .byte 0x40+L(PUSHSTATE)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0x40+L(PUSHBX2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 12; \
- .byte 0x83; /* DW_CFA_offset %ebx */ \
- .uleb128 3; \
- .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0xc3; /* DW_CFA_restore %ebx */ \
- .byte 0x40+L(POPSTATE)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 4
-
-/* With four parameters the syscall wrappers have to save %ebx and %esi. */
-# define EH_FRAME_4(name) \
- .byte 0x40+L(PUSHSI1)-L(name##START); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0x86; /* DW_CFA_offset %esi */ \
- .uleb128 2; \
- .byte 0x40+L(PUSHBX1)-L(PUSHSI1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 12; \
- .byte 0x83; /* DW_CFA_offset %ebx */ \
- .uleb128 3; \
- .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0xc3; /* DW_CFA_restore %ebx */ \
- .byte 0x40+L(POPSI1)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 4; \
- .byte 0xc6; /* DW_CFA_restore %esi */ \
- .byte 0x40+L(PUSHSTATE)-L(POPSI1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0x40+L(PUSHSI2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 12; \
- .byte 0x86; /* DW_CFA_offset %esi */ \
- .uleb128 3; \
- .byte 0x40+L(PUSHBX2)-L(PUSHSI2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 16; \
- .byte 0x83; /* DW_CFA_offset %ebx */ \
- .uleb128 4; \
- .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 12; \
- .byte 0xc3; /* DW_CFA_restore %ebx */ \
- .byte 0x40+L(POPSI2)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0xc6; /* DW_CFA_restore %esi */ \
- .byte 0x40+L(POPSTATE)-L(POPSI2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 4
-
-/* With five parameters the syscall wrappers have to save %ebx, %esi,
- and %edi. */
-# define EH_FRAME_5(name) \
- .byte 0x40+L(PUSHDI1)-L(name##START); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0x87; /* DW_CFA_offset %edi */ \
- .uleb128 2; \
- .byte 0x40+L(PUSHSI1)-L(PUSHDI1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 12; \
- .byte 0x86; /* DW_CFA_offset %esi */ \
- .uleb128 3; \
- .byte 0x40+L(PUSHBX1)-L(PUSHSI1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 16; \
- .byte 0x83; /* DW_CFA_offset %ebx */ \
- .uleb128 4; \
- .byte 0x40+L(POPBX1)-L(PUSHBX1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 12; \
- .byte 0xc3; /* DW_CFA_restore %ebx */ \
- .byte 0x40+L(POPSI1)-L(POPBX1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0xc6; /* DW_CFA_restore %esi */ \
- .byte 0x40+L(POPDI1)-L(POPSI1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 4; \
- .byte 0xc7; /* DW_CFA_restore %edi */ \
- .byte 0x40+L(PUSHSTATE)-L(POPDI1); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0x40+L(PUSHDI2)-L(PUSHSTATE); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 12; \
- .byte 0x87; /* DW_CFA_offset %edi */ \
- .uleb128 3; \
- .byte 0x40+L(PUSHSI2)-L(PUSHDI2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 16; \
- .byte 0x86; /* DW_CFA_offset %esi */ \
- .uleb128 4; \
- .byte 0x40+L(PUSHBX2)-L(PUSHSI2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 20; \
- .byte 0x83; /* DW_CFA_offset %ebx */ \
- .uleb128 5; \
- .byte 0x40+L(POPBX2)-L(PUSHBX2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 16; \
- .byte 0xc3; /* DW_CFA_restore %ebx */ \
- .byte 0x40+L(POPSI2)-L(POPBX2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 12; \
- .byte 0xc6; /* DW_CFA_restore %esi */ \
- .byte 0x40+L(POPDI2)-L(POPSI2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 8; \
- .byte 0xc7; /* DW_CFA_restore %edi */ \
- .byte 0x40+L(POPSTATE)-L(POPDI2); /* DW_CFA_advance_loc+N */ \
- .byte 14; /* DW_CFA_def_cfa_offset */ \
- .uleb128 4
-
-
-# undef ASM_SIZE_DIRECTIVE
-# define ASM_SIZE_DIRECTIVE(name) L(name##END): .size name,.-name;
+ L(pseudo_end):
# define SAVE_OLDTYPE_0 movl %eax, %ecx;
# define SAVE_OLDTYPE_1 SAVE_OLDTYPE_0
-# define SAVE_OLDTYPE_2 pushl %eax; L(PUSHSTATE):
+# define SAVE_OLDTYPE_2 pushl %eax; cfi_adjust_cfa_offset(4);
# define SAVE_OLDTYPE_3 SAVE_OLDTYPE_2
# define SAVE_OLDTYPE_4 SAVE_OLDTYPE_2
# define SAVE_OLDTYPE_5 SAVE_OLDTYPE_2
@@ -313,11 +70,11 @@
# define _PUSHCARGS_0 /* No arguments to push. */
# define _POPCARGS_0 /* No arguments to pop. */
-# define PUSHCARGS_1 movl %ebx, %edx; L(SAVEBX2): PUSHCARGS_0
+# define PUSHCARGS_1 movl %ebx, %edx; cfi_register(%ebx,%edx); PUSHCARGS_0
# define DOCARGS_1 _DOARGS_1 (4)
-# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx; L(RESTBX2):
-# define _PUSHCARGS_1 pushl %ebx; L(PUSHBX2): _PUSHCARGS_0
-# define _POPCARGS_1 _POPCARGS_0; popl %ebx; L(POPBX2):
+# define POPCARGS_1 POPCARGS_0; movl %edx, %ebx; cfi_restore(%ebx);
+# define _PUSHCARGS_1 pushl %ebx; CFI_PUSH(%ebx); _PUSHCARGS_0
+# define _POPCARGS_1 _POPCARGS_0; popl %ebx; CFI_POP(%ebx);
# define PUSHCARGS_2 PUSHCARGS_1
# define DOCARGS_2 _DOARGS_2 (12)
@@ -334,14 +91,14 @@
# define PUSHCARGS_4 _PUSHCARGS_4
# define DOCARGS_4 _DOARGS_4 (28)
# define POPCARGS_4 _POPCARGS_4
-# define _PUSHCARGS_4 pushl %esi; L(PUSHSI2): _PUSHCARGS_3
-# define _POPCARGS_4 _POPCARGS_3; popl %esi; L(POPSI2):
+# define _PUSHCARGS_4 pushl %esi; CFI_PUSH(%esi); _PUSHCARGS_3
+# define _POPCARGS_4 _POPCARGS_3; popl %esi; CFI_POP(%esi);
# define PUSHCARGS_5 _PUSHCARGS_5
# define DOCARGS_5 _DOARGS_5 (36)
# define POPCARGS_5 _POPCARGS_5
-# define _PUSHCARGS_5 pushl %edi; L(PUSHDI2): _PUSHCARGS_4
-# define _POPCARGS_5 _POPCARGS_4; popl %edi; L(POPDI2):
+# define _PUSHCARGS_5 pushl %edi; CFI_PUSH(%edi); _PUSHCARGS_4
+# define _POPCARGS_5 _POPCARGS_4; popl %edi; CFI_POP(%edi);
# ifdef IS_IN_libpthread
# define CENABLE call __pthread_enable_asynccancel;
@@ -356,9 +113,9 @@
# error Unsupported library
# endif
# define POPSTATE_0 \
- pushl %eax; L(PUSHSTATE): movl %ecx, %eax; CDISABLE; popl %eax; L(POPSTATE):
+ pushl %eax; cfi_adjust_cfa_offset(4); movl %ecx, %eax; CDISABLE; popl %eax; cfi_adjust_cfa_offset(-4);
# define POPSTATE_1 POPSTATE_0
-# define POPSTATE_2 xchgl (%esp), %eax; CDISABLE; popl %eax; L(POPSTATE):
+# define POPSTATE_2 xchgl (%esp), %eax; CDISABLE; popl %eax; cfi_adjust_cfa_offset(-4);
# define POPSTATE_3 POPSTATE_2
# define POPSTATE_4 POPSTATE_3
# define POPSTATE_5 POPSTATE_4
Index: sysdeps/unix/sysv/linux/i386/socket.S
===================================================================
RCS file: /home/drow/rsync/glibc/libc/sysdeps/unix/sysv/linux/i386/socket.S,v
retrieving revision 1.19
diff -u -p -r1.19 socket.S
--- sysdeps/unix/sysv/linux/i386/socket.S 16 Jun 2003 23:06:41 -0000 1.19
+++ sysdeps/unix/sysv/linux/i386/socket.S 13 Mar 2005 18:36:00 -0000
@@ -118,7 +118,6 @@ L(pseudo_end):
/* Successful; return the syscall's value. */
ret
#endif
- cfi_endproc
PSEUDO_END (__socket)
#ifndef NO_WEAK_ALIAS
Index: sysdeps/unix/sysv/linux/i386/sysdep.h
===================================================================
RCS file: /home/drow/rsync/glibc/libc/sysdeps/unix/sysv/linux/i386/sysdep.h,v
retrieving revision 1.60
diff -u -p -r1.60 sysdep.h
--- sysdeps/unix/sysv/linux/i386/sysdep.h 8 Feb 2005 06:48:30 -0000 1.60
+++ sysdeps/unix/sysv/linux/i386/sysdep.h 13 Mar 2005 18:31:38 -0000
@@ -29,6 +29,8 @@
#include <dl-sysdep.h>
#include <tls.h>
+/* For the CFI macros. */
+#include <sysdeps/generic/sysdep.h>
/* For Linux we can use the system call table in the header file
/usr/include/asm/unistd.h
@@ -77,6 +79,7 @@
#undef PSEUDO_END
#define PSEUDO_END(name) \
SYSCALL_ERROR_HANDLER \
+ _CFI(cfi_endproc;) \
END (name)
#undef PSEUDO_NOERRNO
@@ -211,6 +214,11 @@ __i686.get_pc_thunk.reg: \
# define ENTER_KERNEL int $0x80
#endif
+/* By default do not include CFI. */
+#define _CFI(x)
+#define CFI_PUSH(reg) _CFI(cfi_adjust_cfa_offset(4); cfi_rel_offset(reg, 0);)
+#define CFI_POP(reg) _CFI(cfi_adjust_cfa_offset(-4); cfi_restore(reg);)
+
/* Linux takes system call arguments in registers:
syscall number %eax call-clobbered
@@ -270,12 +278,12 @@ __i686.get_pc_thunk.reg: \
#define _DOARGS_0(n) /* No arguments to frob. */
#define _POPARGS_0 /* No arguments to pop. */
-#define PUSHARGS_1 movl %ebx, %edx; L(SAVEBX1): PUSHARGS_0
+#define PUSHARGS_1 movl %ebx, %edx; _CFI(cfi_register(%ebx,%edx);) PUSHARGS_0
#define DOARGS_1 _DOARGS_1 (4)
-#define POPARGS_1 POPARGS_0; movl %edx, %ebx; L(RESTBX1):
-#define _PUSHARGS_1 pushl %ebx; L(PUSHBX1): _PUSHARGS_0
+#define POPARGS_1 POPARGS_0; movl %edx, %ebx; _CFI(cfi_restore(%ebx);)
+#define _PUSHARGS_1 pushl %ebx; CFI_PUSH(%ebx); _PUSHARGS_0
#define _DOARGS_1(n) movl n(%esp), %ebx; _DOARGS_0(n-4)
-#define _POPARGS_1 _POPARGS_0; popl %ebx; L(POPBX1):
+#define _POPARGS_1 _POPARGS_0; popl %ebx; CFI_POP(%ebx);
#define PUSHARGS_2 PUSHARGS_1
#define DOARGS_2 _DOARGS_2 (8)
@@ -294,23 +302,23 @@ __i686.get_pc_thunk.reg: \
#define PUSHARGS_4 _PUSHARGS_4
#define DOARGS_4 _DOARGS_4 (24)
#define POPARGS_4 _POPARGS_4
-#define _PUSHARGS_4 pushl %esi; L(PUSHSI1): _PUSHARGS_3
+#define _PUSHARGS_4 pushl %esi; CFI_PUSH(%esi); _PUSHARGS_3
#define _DOARGS_4(n) movl n(%esp), %esi; _DOARGS_3 (n-4)
-#define _POPARGS_4 _POPARGS_3; popl %esi; L(POPSI1):
+#define _POPARGS_4 _POPARGS_3; popl %esi; CFI_POP(%esi);
#define PUSHARGS_5 _PUSHARGS_5
#define DOARGS_5 _DOARGS_5 (32)
#define POPARGS_5 _POPARGS_5
-#define _PUSHARGS_5 pushl %edi; L(PUSHDI1): _PUSHARGS_4
+#define _PUSHARGS_5 pushl %edi; CFI_PUSH(%edi); _PUSHARGS_4
#define _DOARGS_5(n) movl n(%esp), %edi; _DOARGS_4 (n-4)
-#define _POPARGS_5 _POPARGS_4; popl %edi; L(POPDI1):
+#define _POPARGS_5 _POPARGS_4; popl %edi; CFI_POP(%edi);
#define PUSHARGS_6 _PUSHARGS_6
#define DOARGS_6 _DOARGS_6 (36)
#define POPARGS_6 _POPARGS_6
-#define _PUSHARGS_6 pushl %ebp; L(PUSHBP1): _PUSHARGS_5
+#define _PUSHARGS_6 pushl %ebp; CFI_PUSH(%ebp); _PUSHARGS_5
#define _DOARGS_6(n) movl n(%esp), %ebp; _DOARGS_5 (n-4)
-#define _POPARGS_6 _POPARGS_5; popl %ebp; L(POPBP1):
+#define _POPARGS_6 _POPARGS_5; popl %ebp; CFI_POP(%ebp);
#else /* !__ASSEMBLER__ */