* 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/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
sysdeps/alpha/elf/start.S
sysdeps/unix/sysv/linux/alpha/clone.S
sysdeps/unix/sysv/linux/alpha/rt_sigaction.S

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 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)