* sysdeps/alpha/dl-machine.h (RTLD_START): Fix top-of-stack backtrace. ...
authorRichard Henderson <rth@redhat.com>
Fri, 6 Jun 2003 05:54:15 +0000 (05:54 +0000)
committerRichard Henderson <rth@redhat.com>
Fri, 6 Jun 2003 05:54:15 +0000 (05:54 +0000)
        * 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
configure
configure.in
sysdeps/alpha/dl-machine.h
sysdeps/alpha/elf/start.S
sysdeps/generic/sysdep.h
sysdeps/unix/sysv/linux/alpha/clone.S
sysdeps/unix/sysv/linux/alpha/rt_sigaction.S

index 6896c24..4cc5d6f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2003-06-04  Richard Henderson  <rth@redhat.com>
 
+        * 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.
index 3c95ce6..f9036d6 100755 (executable)
--- 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'
index d241dad..8ad2dd8 100644 (file)
@@ -1529,6 +1529,7 @@ cat > conftest.s <<EOF
         .type   func,@function
 func:
         .cfi_startproc
+       .cfi_remember_state
         .cfi_endproc
 EOF
 if AC_TRY_COMMAND(${CC-cc} $ASFLAGS -c conftest.s 1>&AS_MESSAGE_LOG_FD); then
index 4704428..0101ba4 100644 (file)
@@ -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\
index 3f98111..dbe4223 100644 (file)
@@ -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 <rth@tamu.edu>
 
@@ -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
index 0feed3c..687f5f4 100644 (file)
 
 /* 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
 #  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 */
    ".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
 #  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__ */
index 42df98a..2aa9bb7 100644 (file)
@@ -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.  */
index 5f166a7..3e02a66 100644 (file)
@@ -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 <rth@cygnus.com>, 1998
 
 
 #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)