Skip to content

Commit

Permalink
* sysdeps/alpha/dl-machine.h (RTLD_START): Fix top-of-stack backtrac…
Browse files Browse the repository at this point in the history
…e. * 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.
  • Loading branch information
Richard Henderson committed Jun 6, 2003
1 parent a56e456 commit f212e8d
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 38 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
1 change: 1 addition & 0 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
1 change: 1 addition & 0 deletions configure.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion sysdeps/alpha/dl-machine.h
Original file line number Diff line number Diff line change
Expand Up @@ -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\
Expand All @@ -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\
Expand Down
7 changes: 3 additions & 4 deletions sysdeps/alpha/elf/start.S
Original file line number Diff line number Diff line change
@@ -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>

Expand All @@ -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
Expand Down Expand Up @@ -65,6 +65,5 @@ weak_alias(_start, __start)
.data
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start
38 changes: 34 additions & 4 deletions sysdeps/generic/sysdep.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 */
Expand All @@ -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
Expand All @@ -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__ */
Expand Down
3 changes: 1 addition & 2 deletions sysdeps/unix/sysv/linux/alpha/clone.S
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
91 changes: 64 additions & 27 deletions sysdeps/unix/sysv/linux/alpha/rt_sigaction.S
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit f212e8d

Please sign in to comment.