From f212e8dcf8f5a94b91b2ca36a5f0e6823bd745d4 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 6 Jun 2003 05:54:15 +0000 Subject: [PATCH] * sysdeps/alpha/dl-machine.h (RTLD_START): Fix top-of-stack backtrace. * sysdeps/unix/sysv/linux/alpha/clone.S: Likewise. * sysdeps/alpha/elf/start.S: Likewise. Remove pointless allocation. * sysdeps/unix/sysv/linux/alpha/rt_sigaction.S: Use standard ldgp entry sequence and explicit relocs. Add unwind info for sigreturn and rt_sigreturn. * configure.in (libc_cv_asm_cfi_directives): Test .cfi_remember_state. * configure: Regenerate. * sysdeps/alpha/dl-machine.h (RTLD_START): Fix top-of-stack backtrace. * sysdeps/unix/sysv/linux/alpha/clone.S: Likewise. * sysdeps/alpha/elf/start.S: Likewise. Remove pointless allocation. * sysdeps/unix/sysv/linux/alpha/rt_sigaction.S: Use standard ldgp entry sequence and explicit relocs. Add unwind info for sigreturn and rt_sigreturn. * configure.in (libc_cv_asm_cfi_directives): Test .cfi_remember_state. * configure: Regenerate. --- ChangeLog | 9 +++ configure | 1 + configure.in | 1 + sysdeps/alpha/dl-machine.h | 3 +- sysdeps/alpha/elf/start.S | 7 +-- sysdeps/generic/sysdep.h | 38 ++++++++++-- sysdeps/unix/sysv/linux/alpha/clone.S | 3 +- sysdeps/unix/sysv/linux/alpha/rt_sigaction.S | 91 +++++++++++++++++++--------- 8 files changed, 115 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6896c24..4cc5d6f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2003-06-04 Richard Henderson + * sysdeps/alpha/dl-machine.h (RTLD_START): Fix top-of-stack backtrace. + * sysdeps/unix/sysv/linux/alpha/clone.S: Likewise. + * sysdeps/alpha/elf/start.S: Likewise. Remove pointless allocation. + * sysdeps/unix/sysv/linux/alpha/rt_sigaction.S: Use standard ldgp + entry sequence and explicit relocs. Add unwind info for sigreturn + and rt_sigreturn. + * configure.in (libc_cv_asm_cfi_directives): Test .cfi_remember_state. + * configure: Regenerate. + * sysdeps/unix/sysv/linux/alpha/syscalls.list (semtimedop): New. Annotate some parameters. * sysdeps/unix/sysv/linux/alpha/sysdep.h (__NR_semtimedop): New. diff --git a/configure b/configure index 3c95ce6..f9036d6 100755 --- a/configure +++ b/configure @@ -5736,6 +5736,7 @@ else .type func,@function func: .cfi_startproc + .cfi_remember_state .cfi_endproc EOF if { ac_try='${CC-cc} $ASFLAGS -c conftest.s 1>&5' diff --git a/configure.in b/configure.in index d241dad..8ad2dd8 100644 --- a/configure.in +++ b/configure.in @@ -1529,6 +1529,7 @@ cat > conftest.s <&AS_MESSAGE_LOG_FD); then diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h index 4704428..0101ba4 100644 --- a/sysdeps/alpha/dl-machine.h +++ b/sysdeps/alpha/dl-machine.h @@ -303,6 +303,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) .globl _start \n\ .ent _start \n\ _start: \n\ + .frame $31,0,$31,0 \n\ br $gp, 0f \n\ 0: ldgp $gp, 0($gp) \n\ .prologue 0 \n\ @@ -314,7 +315,7 @@ _start: \n\ .globl _dl_start_user \n\ .ent _dl_start_user \n\ _dl_start_user: \n\ - .frame $30,0,$31,0 \n\ + .frame $31,0,$31,0 \n\ .prologue 0 \n\ /* Save the user entry point address in s0. */ \n\ mov $0, $9 \n\ diff --git a/sysdeps/alpha/elf/start.S b/sysdeps/alpha/elf/start.S index 3f98111..dbe4223 100644 --- a/sysdeps/alpha/elf/start.S +++ b/sysdeps/alpha/elf/start.S @@ -1,5 +1,6 @@ /* Startup code for Alpha/ELF. - Copyright (C) 1993,1995,1996,1997,1998,2000,2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1993, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson @@ -26,8 +27,7 @@ .ent _start, 0 .type _start,@function _start: - .frame fp, 0, zero - mov zero, fp + .frame $31, 0, $31 br gp, 1f 1: ldgp gp, 0(gp) subq sp, 16, sp @@ -65,6 +65,5 @@ weak_alias(_start, __start) .data .globl __data_start __data_start: - .long 0 .weak data_start data_start = __data_start diff --git a/sysdeps/generic/sysdep.h b/sysdeps/generic/sysdep.h index 0feed3c..687f5f4 100644 --- a/sysdeps/generic/sysdep.h +++ b/sysdeps/generic/sysdep.h @@ -49,13 +49,19 @@ /* Makros to generate eh_frame unwind information. */ # ifdef HAVE_ASM_CFI_DIRECTIVES -# define cfi_startproc .cfi_startproc -# define cfi_endproc .cfi_endproc -# define cfi_def_cfa(reg, off) .cfi_def_cfa reg, off +# define cfi_startproc .cfi_startproc +# define cfi_endproc .cfi_endproc +# define cfi_def_cfa(reg, off) .cfi_def_cfa reg, off # define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg # define cfi_def_cfa_offset(off) .cfi_def_cfa_offset off # define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off -# define cfi_offset(reg, off) .cfi_offset reg, off +# define cfi_offset(reg, off) .cfi_offset reg, off +# define cfi_register(r1, r2) .cfi_register r1, r2 +# define cfi_return_column(reg) .cfi_return_column reg +# define cfi_restore(reg) .cfi_restore reg +# define cfi_undefined(reg) .cfi_undefined reg +# define cfi_remember_state .cfi_remember_state +# define cfi_restore_state .cfi_restore_state # else # define cfi_startproc # define cfi_endproc @@ -64,6 +70,12 @@ # define cfi_def_cfa_offset(off) # define cfi_adjust_cfa_offset(off) # define cfi_offset(reg, off) +# define cfi_register(r1, r2) +# define cfi_return_column(reg) +# define cfi_restore(reg) +# define cfi_undefined(reg) +# define cfi_remember_state +# define cfi_restore_state # endif #else /* ! ASSEMBLER */ @@ -82,6 +94,18 @@ ".cfi_adjust_cfa_offset " CFI_STRINGIFY(off) # define CFI_OFFSET(reg, off) \ ".cfi_offset " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off) +# define CFI_REGISTER(r1, r2) \ + ".cfi_register " CFI_STRINGIFY(r1) "," CFI_STRINGIFY(r2) +# define CFI_RETURN_COLUMN(reg) \ + ".cfi_return_column " CFI_STRINGIFY(reg) +# define CFI_RESTORE(reg) \ + ".cfi_restore " CFI_STRINGIFY(reg) +# define CFI_UNDEFINED(reg) \ + ".cfi_undefined " CFI_STRINGIFY(reg) +# define CFI_REMEMBER_STATE \ + ".cfi_remember_state" +# define CFI_RESTORE_STATE \ + ".cfi_restore_state" # else # define CFI_STARTPROC # define CFI_ENDPROC @@ -90,6 +114,12 @@ # define CFI_DEF_CFA_OFFSET(off) # define CFI_ADJUST_CFA_OFFSET(off) # define CFI_OFFSET(reg, off) +# define CFI_REGISTER(r1, r2) +# define CFI_RETURN_COLUMN(reg) +# define CFI_RESTORE(reg) +# define CFI_UNDEFINED(reg) +# define CFI_REMEMBER_STATE +# define CFI_RESTORE_STATE # endif #endif /* __ASSEMBLER__ */ diff --git a/sysdeps/unix/sysv/linux/alpha/clone.S b/sysdeps/unix/sysv/linux/alpha/clone.S index 42df98a..2aa9bb7 100644 --- a/sysdeps/unix/sysv/linux/alpha/clone.S +++ b/sysdeps/unix/sysv/linux/alpha/clone.S @@ -83,8 +83,7 @@ $error: .ent thread_start thread_start: - .frame fp,0,zero,0 - mov zero,fp + .frame zero,0,zero,0 .prologue 0 /* Load up the arguments. */ diff --git a/sysdeps/unix/sysv/linux/alpha/rt_sigaction.S b/sysdeps/unix/sysv/linux/alpha/rt_sigaction.S index 5f166a7..3e02a66 100644 --- a/sysdeps/unix/sysv/linux/alpha/rt_sigaction.S +++ b/sysdeps/unix/sysv/linux/alpha/rt_sigaction.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson , 1998 @@ -28,55 +28,92 @@ #ifdef __NR_rt_sigaction .text + ENTRY(__syscall_rt_sigaction) .frame sp,0,ra,0 -#ifdef PROF ldgp gp,0(pv) +#ifdef PROF .set noat lda AT, _mcount jsr AT, (AT), _mcount .set at #endif - /* Indicate non-standard use of our PV. */ - .prologue 2 + .prologue 1 beq a1, 0f - ldl t0, 8(a1) # sa_flags - lda a4, sigreturn-__syscall_rt_sigaction(pv) - lda t1, rt_sigreturn-__syscall_rt_sigaction(pv) - and t0, 0x00000040, t0 # SA_SIGINFO + ldl t0, 8(a1) # sa_flags + ldah a4, sigreturn(gp) !gprelhigh + ldah t1, rt_sigreturn(gp) !gprelhigh + lda a4, sigreturn(a4) !gprellow + lda t1, rt_sigreturn(a4) !gprellow + and t0, 0x00000040, t0 # SA_SIGINFO cmovne t0, t1, a4 -0: ldi v0,__NR_rt_sigaction +0: ldi v0, __NR_rt_sigaction callsys - bne a3,1f + bne a3, SYSCALL_ERROR_LABEL ret -1: -#ifndef PROF - br gp,2f -2: ldgp gp,0(gp) -#endif - SYSCALL_ERROR_HANDLER +PSEUDO_END(__syscall_rt_sigaction) -END(__syscall_rt_sigaction) +/* To enable unwinding through the signal frame without special hackery + elsewhere, describe the entire struct sigcontext with unwind info. + Note that we begin the unwind info one instruction before the start + of the function; the unwinder will subtract one from the return address + attempting to find the call instruction that led us here, since we + didn't get here via a normal call. */ + + .macro SIGCONTEXT_REGS_I base, from=0 + cfi_offset (\from, \base + (4 + \from) * 8) + .if 30-\from + SIGCONTEXT_REGS_I \base, "(\from+1)" + .endif + .endm - .align 5 - .ent sigreturn + .macro SIGCONTEXT_REGS_F base, from=32 + cfi_offset (\from, \base + (4 + 1 + \from) * 8) + .if 62-\from + SIGCONTEXT_REGS_F \base, "(\from+1)" + .endif + .endm + + .macro SIGCONTEXT_REGS base + SIGCONTEXT_REGS_I \base + SIGCONTEXT_REGS_F \base + cfi_offset (63, \base + (4 + 32 + 1 + 32) * 8) + cfi_offset (64, \base + 2 * 8) + .endm + + .align 4 + nop + nop + nop + + cfi_startproc + cfi_return_column (64) + SIGCONTEXT_REGS -648 + cfi_def_cfa_offset (648) + nop sigreturn: - .prologue 0 - mov sp,a0 - ldi v0,__NR_sigreturn + mov sp, a0 + ldi v0, __NR_sigreturn callsys - .end sigreturn + cfi_endproc + .size sigreturn, .-sigreturn + .type sigreturn, @function - .align 4 - .ent rt_sigreturn + cfi_startproc + cfi_return_column (64) + SIGCONTEXT_REGS -648 + cfi_def_cfa_offset (176 + 648) + nop rt_sigreturn: - .prologue 0 mov sp,a0 ldi v0,__NR_rt_sigreturn callsys - .end rt_sigreturn + cfi_endproc + .size rt_sigreturn, .-rt_sigreturn + .type rt_sigreturn, @function + #else ENTRY(__syscall_rt_sigaction) ldgp $29,0($27) -- 2.7.4