Add CFI information for MIPS assembly sources.

This commit is contained in:
Joseph Myers 2013-02-11 18:19:14 +00:00
parent 046f153e20
commit aea7a9b9d2
20 changed files with 191 additions and 34 deletions

View File

@ -1,3 +1,48 @@
2013-02-11 Joseph Myers <joseph@codesourcery.com>
* sysdeps/mips/include/sys/asm.h: New file.
* sysdeps/mips/mips64/bsd-_setjmp.S (_setjmp): Use SETUP_GP64_REG
and RESTORE_GP64_REG.
* sysdeps/mips/mips64/bsd-setjmp.S (setjmp): Likewise.
* sysdeps/mips/mips64/setjmp.S (__sigsetjmp): Likewise.
* sysdeps/mips/sys/asm.h (__mips_cfi_startproc): Define to empty.
(__mips_cfi_endproc): Likewise.
(LEAF): Use __mips_cfi_startproc.
(NESTED): Likewise.
(END): Use __mips_cfi_endproc.
(EXPORT): Use __mips_cfi_startproc.
* sysdeps/unix/mips/mips32/sysdep.h (PSEUDO): Add CFI information
for error-handling code in both definitions.
* sysdeps/unix/mips/mips64/n32/sysdep.h (PSEUDO): Likewise.
* sysdeps/unix/mips/mips64/n64/sysdep.h (PSEUDO): Likewise.
* sysdeps/unix/mips/sysdep.h (ENTRY): Use cfi_startproc.
(END): Use cfi_endproc.
(PSEUDO_END): Likewise.
(PSEUDO_END_NOERRNO): Likewise.
(PSEUDO_END_ERRVAL): Likewise.
* sysdeps/unix/sysv/linux/mips/clone.S (__clone): Add CFI
information. Use SETUP_GP64_STACK and RESTORE_GP64_STACK.
* sysdeps/unix/sysv/linux/mips/getcontext.S (__getcontext):
Likewise.
* sysdeps/unix/sysv/linux/mips/makecontext.S (__makecontext):
Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n64/ioctl.S (__ioctl): Use
SETUP_GP64_REG and RESTORE_GP64_REG.
* sysdeps/unix/sysv/linux/mips/mips64/nptl/sysdep-cancel.h
[(!NOT_IN_libc || IS_IN_libpthread || IS_IN_librt) && __PIC__]
(PSEUDO): Use cfi_endproc before ENTRY.
* sysdeps/unix/sysv/linux/mips/mips64/syscall.S (syscall): Add CFI
information. Use SETUP_GP64_REG and RESTORE_GP64_REG.
* sysdeps/unix/sysv/linux/mips/nptl/sysdep-cancel.h [(!NOT_IN_libc
|| IS_IN_libpthread || IS_IN_librt) && __PIC__] (PSEUDO): Use
cfi_endproc before ENTRY.
* sysdeps/unix/sysv/linux/mips/setcontext.S (__setcontext): Add
CFI information. Use SETUP_GP64_STACK and RESTORE_GP64_STACK.
* sysdeps/unix/sysv/linux/mips/swapcontext.S (__swapcontext):
Likewise.
* sysdeps/unix/sysv/linux/mips/vfork.S (__vfork): Add CFI
information. Use SETUP_GP64_REG and RESTORE_GP64_REG.
2013-02-08 Joseph Myers <joseph@codesourcery.com>
[BZ #13550]

View File

@ -0,0 +1,53 @@
/* Copyright (C) 2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_ASM_H
# include_next <sys/asm.h>
# undef __mips_cfi_startproc
# define __mips_cfi_startproc cfi_startproc
# undef __mips_cfi_endproc
# define __mips_cfi_endproc cfi_endproc
# if _MIPS_SIM == _ABIO32
# define SETUP_GP64_REG_CFI(a)
# define SETUP_GP64_REG(a, b)
# define SETUP_GP64_STACK_CFI(a)
# define SETUP_GP64_STACK(a, b)
# define RESTORE_GP64_REG
# define RESTORE_GP64_STACK
# else
# define SETUP_GP64_REG_CFI(gpsavereg) \
cfi_register (gp, gpsavereg)
# define SETUP_GP64_REG(gpsavereg, proc) \
SETUP_GP64 (gpsavereg, proc); \
SETUP_GP64_REG_CFI (gpsavereg)
# define SETUP_GP64_STACK_CFI(gpoffset) \
cfi_rel_offset (gp, gpoffset)
# define SETUP_GP64_STACK(gpoffset, proc) \
SETUP_GP64 (gpoffset, proc); \
SETUP_GP64_STACK_CFI (gpoffset)
# define RESTORE_GP64_REG \
RESTORE_GP64; \
cfi_restore (gp)
# define RESTORE_GP64_STACK \
RESTORE_GP64; \
cfi_restore (gp)
# endif
#endif

View File

@ -31,12 +31,12 @@ ENTRY (_setjmp)
#ifdef __PIC__
SETUP_GP
#endif
SETUP_GP64 (v0, C_SYMBOL_NAME (_setjmp))
SETUP_GP64_REG (v0, C_SYMBOL_NAME (_setjmp))
PTR_LA t9, C_SYMBOL_NAME (__sigsetjmp)
#if _MIPS_SIM == _ABIO32
nop
#endif
RESTORE_GP64
RESTORE_GP64_REG
move a1, zero /* Pass a second argument of zero. */
#ifdef __PIC__
jr t9

View File

@ -31,12 +31,12 @@ ENTRY (setjmp)
#ifdef __PIC__
SETUP_GP
#endif
SETUP_GP64 (v0, C_SYMBOL_NAME (setjmp))
SETUP_GP64_REG (v0, C_SYMBOL_NAME (setjmp))
PTR_LA t9, C_SYMBOL_NAME (__sigsetjmp)
#if _MIPS_SIM == _ABIO32
nop
#endif
RESTORE_GP64
RESTORE_GP64_REG
dli a1, 1 /* Pass a second argument of one. */
#ifdef __PIC__
jr t9

View File

@ -29,14 +29,14 @@ ENTRY (__sigsetjmp)
#ifdef __PIC__
SETUP_GP
#endif
SETUP_GP64 (v0, C_SYMBOL_NAME (__sigsetjmp))
SETUP_GP64_REG (v0, C_SYMBOL_NAME (__sigsetjmp))
move a2, sp
move a3, fp
PTR_LA t9, __sigsetjmp_aux
#if _MIPS_SIM == _ABIO32
nop
#endif
RESTORE_GP64
RESTORE_GP64_REG
#if _MIPS_SIM != _ABIO32
move a4, gp
#endif

View File

@ -26,6 +26,10 @@
# define CAT(str1,str2) __CAT(str1,str2)
#endif
/* Redefined as nonempty in the internal header. */
#define __mips_cfi_startproc /* Empty. */
#define __mips_cfi_endproc /* Empty. */
/*
* Macros to handle different pointer/register sizes for 32/64-bit code
*
@ -147,7 +151,8 @@ l: \
.align 2; \
.type symbol,@function; \
.ent symbol,0; \
symbol: .frame sp,0,ra
symbol: .frame sp,0,ra; \
__mips_cfi_startproc
/*
* NESTED - declare nested routine entry point
@ -157,13 +162,15 @@ symbol: .frame sp,0,ra
.align 2; \
.type symbol,@function; \
.ent symbol,0; \
symbol: .frame sp, framesize, rpc
symbol: .frame sp, framesize, rpc; \
__mips_cfi_startproc
/*
* END - mark end of function
*/
#ifndef END
# define END(function) \
__mips_cfi_endproc; \
.end function; \
.size function,.-function
#endif
@ -173,7 +180,7 @@ symbol: .frame sp, framesize, rpc
*/
#define EXPORT(symbol) \
.globl symbol; \
symbol:
symbol: __mips_cfi_startproc
/*
* ABS - export absolute symbol

View File

@ -24,8 +24,10 @@
#ifdef __PIC__
#define PSEUDO(name, syscall_name, args) \
.align 2; \
cfi_startproc; \
99: la t9,__syscall_error; \
jr t9; \
cfi_endproc; \
ENTRY(name) \
.set noreorder; \
.cpload t9; \
@ -38,8 +40,10 @@ L(syse1):
#define PSEUDO(name, syscall_name, args) \
.set noreorder; \
.align 2; \
cfi_startproc; \
99: j __syscall_error; \
nop; \
cfi_endproc; \
ENTRY(name) \
.set noreorder; \
li v0, SYS_ify(syscall_name); \

View File

@ -26,13 +26,17 @@
#ifdef __PIC__
#define PSEUDO(name, syscall_name, args) \
.align 2; \
cfi_startproc; \
99:; \
.set noat; \
.cpsetup t9, $1, name; \
cfi_register (gp, $1); \
.set at; \
la t9,__syscall_error; \
.cpreturn; \
cfi_restore (gp); \
jr t9; \
cfi_endproc; \
ENTRY(name) \
li v0, SYS_ify(syscall_name); \
syscall; \
@ -42,8 +46,10 @@ L(syse1):
#define PSEUDO(name, syscall_name, args) \
.set noreorder; \
.align 2; \
cfi_startproc; \
99: j __syscall_error; \
nop; \
cfi_endproc; \
ENTRY(name) \
.set noreorder; \
li v0, SYS_ify(syscall_name); \

View File

@ -26,13 +26,17 @@
#ifdef __PIC__
#define PSEUDO(name, syscall_name, args) \
.align 2; \
cfi_startproc; \
99:; \
.set noat; \
.cpsetup t9, $1, name; \
cfi_register (gp, $1); \
.set at; \
dla t9,__syscall_error; \
.cpreturn; \
cfi_restore (gp); \
jr t9; \
cfi_endproc; \
ENTRY(name) \
li v0, SYS_ify(syscall_name); \
syscall; \
@ -42,8 +46,10 @@ L(syse1):
#define PSEUDO(name, syscall_name, args) \
.set noreorder; \
.align 2; \
cfi_startproc; \
99: j __syscall_error; \
nop; \
cfi_endproc; \
ENTRY(name) \
.set noreorder; \
li v0, SYS_ify(syscall_name); \

View File

@ -27,17 +27,19 @@
.globl name; \
.align 2; \
.ent name,0; \
name##:
name##: \
cfi_startproc;
#undef END
#define END(function) \
cfi_endproc; \
.end function; \
.size function,.-function
#define ret j ra ; nop
#undef PSEUDO_END
#define PSEUDO_END(sym) .end sym; .size sym,.-sym
#define PSEUDO_END(sym) cfi_endproc; .end sym; .size sym,.-sym
#define PSEUDO_NOERRNO(name, syscall_name, args) \
.align 2; \
@ -47,7 +49,7 @@
syscall
#undef PSEUDO_END_NOERRNO
#define PSEUDO_END_NOERRNO(sym) .end sym; .size sym,.-sym
#define PSEUDO_END_NOERRNO(sym) cfi_endproc; .end sym; .size sym,.-sym
#define ret_NOERRNO ret
@ -59,7 +61,7 @@
syscall
#undef PSEUDO_END_ERRVAL
#define PSEUDO_END_ERRVAL(sym) .end sym; .size sym,.-sym
#define PSEUDO_END_ERRVAL(sym) cfi_endproc; .end sym; .size sym,.-sym
#define ret_ERRVAL ret

View File

@ -47,7 +47,8 @@ NESTED(__clone,4*SZREG,sp)
SETUP_GP
#endif
PTR_SUBU sp, FRAMESZ
SETUP_GP64 (GPOFF, __clone)
cfi_adjust_cfa_offset (FRAMESZ)
SETUP_GP64_STACK (GPOFF, __clone)
#ifdef __PIC__
SAVE_GP (GPOFF)
#endif
@ -88,26 +89,35 @@ NESTED(__clone,4*SZREG,sp)
/* Do the system call */
li v0,__NR_clone
cfi_endproc
syscall
bnez a3,L(error)
beqz v0,L(thread_start)
/* Successful return from the parent */
RESTORE_GP64
cfi_startproc
cfi_adjust_cfa_offset (FRAMESZ)
SETUP_GP64_STACK_CFI (GPOFF)
cfi_remember_state
RESTORE_GP64_STACK
PTR_ADDU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
ret
/* Something bad happened -- no child created */
L(error):
cfi_restore_state
#ifdef __PIC__
PTR_LA t9,__syscall_error
RESTORE_GP64
RESTORE_GP64_STACK
PTR_ADDU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
jr t9
#else
RESTORE_GP64
RESTORE_GP64_STACK
PTR_ADDU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
j __syscall_error
#endif
END(__clone)
@ -118,6 +128,7 @@ L(error):
ENTRY(__thread_start)
L(thread_start):
cfi_undefined ($31)
/* cp is already loaded. */
SAVE_GP (GPOFF)
/* The stackframe has been created on entry of clone(). */

View File

@ -54,7 +54,8 @@ NESTED (__getcontext, FRAMESZ, ra)
# endif
PTR_ADDIU sp, -FRAMESZ
SETUP_GP64 (GPOFF, __getcontext)
cfi_adjust_cfa_offset (FRAMESZ)
SETUP_GP64_STACK (GPOFF, __getcontext)
SAVE_GP (GPOFF)
#else /* ! __PIC__ */
@ -124,19 +125,23 @@ NESTED (__getcontext, FRAMESZ, ra)
li v0, SYS_ify (rt_sigprocmask)
syscall
bnez a3, 99f
cfi_remember_state
#ifdef __PIC__
RESTORE_GP64
RESTORE_GP64_STACK
PTR_ADDIU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
#endif
move v0, zero
jr ra
99:
cfi_restore_state
#ifdef __PIC__
PTR_LA t9, JUMPTARGET (__syscall_error)
RESTORE_GP64
RESTORE_GP64_STACK
PTR_ADDIU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
jr t9
#else /* ! __PIC__ */

View File

@ -63,9 +63,10 @@ NESTED (__makecontext, FRAMESZ, ra)
#endif
PTR_ADDIU sp, -FRAMESZ
cfi_adjust_cfa_offset (FRAMESZ)
#ifdef __PIC__
SETUP_GP64 (GPOFF, __makecontext)
SETUP_GP64_STACK (GPOFF, __makecontext)
SAVE_GP (GPOFF)
#endif
@ -145,8 +146,9 @@ NESTED (__makecontext, FRAMESZ, ra)
REG_S a1, MCONTEXT_PC(a0)
#ifdef __PIC__
RESTORE_GP64
RESTORE_GP64_STACK
PTR_ADDIU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
#endif
jr ra

View File

@ -31,9 +31,9 @@ ENTRY (__ioctl)
ret
L(error):
SETUP_GP64 (a0, __ioctl)
SETUP_GP64_REG (a0, __ioctl)
PTR_LA t9, __syscall_error
RESTORE_GP64
RESTORE_GP64_REG
jr t9
PSEUDO_END (__ioctl)

View File

@ -57,6 +57,7 @@
cfi_same_value (gp); \
RESTORESTK; \
ret; \
cfi_endproc; \
.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
ENTRY (name) \
SAVESTK; \

View File

@ -30,7 +30,9 @@ NESTED (syscall, SZREG, ra)
.mask 0x00010000, -SZREG
.fmask 0x00000000, 0
PTR_ADDIU sp, -SZREG
cfi_adjust_cfa_offset (SZREG)
REG_S s0, (sp)
cfi_rel_offset (s0, 0)
move s0, a0
move a0, a1 /* shift arg1 - arg7. */
@ -45,15 +47,17 @@ NESTED (syscall, SZREG, ra)
syscall /* Do the system call. */
REG_L s0, (sp)
cfi_restore (s0)
PTR_ADDIU sp, SZREG
cfi_adjust_cfa_offset (-SZREG)
bne a3, zero, L(error)
ret
L(error):
SETUP_GP64 (a0, syscall)
SETUP_GP64_REG (a0, syscall)
PTR_LA t9, __syscall_error
RESTORE_GP64
RESTORE_GP64_REG
jr t9
END (syscall)

View File

@ -52,6 +52,7 @@
.set reorder; \
bne a3, zero, 99b; \
ret; \
cfi_endproc; \
.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel; \
ENTRY (name) \
.set noreorder; \

View File

@ -56,9 +56,10 @@ NESTED (__setcontext, FRAMESZ, ra)
#endif
PTR_ADDIU sp, -FRAMESZ
cfi_adjust_cfa_offset (FRAMESZ)
#ifdef __PIC__
SETUP_GP64 (GPOFF, __setcontext)
SETUP_GP64_STACK (GPOFF, __setcontext)
SAVE_GP (GPOFF)
#endif
@ -152,6 +153,7 @@ NESTED (__setcontext, FRAMESZ, ra)
and call the signal return syscall as if a signal
handler exited normally. */
PTR_ADDIU sp, -((RT_SIGFRAME_SIZE + ALSZ) & ALMASK)
cfi_adjust_cfa_offset ((RT_SIGFRAME_SIZE + ALSZ) & ALMASK)
/* Only ucontext is referred to from rt_sigreturn,
copy it. */
@ -175,11 +177,13 @@ NESTED (__setcontext, FRAMESZ, ra)
path. Successful rt_sigreturn never returns to
its calling place. */
PTR_ADDIU sp, ((RT_SIGFRAME_SIZE + ALSZ) & ALMASK)
cfi_adjust_cfa_offset (-((RT_SIGFRAME_SIZE + ALSZ) & ALMASK))
99:
#ifdef __PIC__
PTR_LA t9, JUMPTARGET (__syscall_error)
RESTORE_GP64
RESTORE_GP64_STACK
PTR_ADDIU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
jr t9
#else /* ! __PIC__ */

View File

@ -63,7 +63,8 @@ NESTED (__swapcontext, FRAMESZ, ra)
# endif
PTR_ADDIU sp, -FRAMESZ
SETUP_GP64 (GPOFF, __swapcontext)
cfi_adjust_cfa_offset (FRAMESZ)
SETUP_GP64_STACK (GPOFF, __swapcontext)
SAVE_GP (GPOFF)
#else /* ! __PIC__ */
@ -198,8 +199,9 @@ NESTED (__swapcontext, FRAMESZ, ra)
99:
#ifdef __PIC__
PTR_LA t9, JUMPTARGET (__syscall_error)
RESTORE_GP64
RESTORE_GP64_STACK
PTR_ADDIU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
jr t9
#else /* ! __PIC__ */

View File

@ -42,7 +42,8 @@ NESTED(__vfork,FRAMESZ,sp)
SETUP_GP
#endif
PTR_SUBU sp, FRAMESZ
SETUP_GP64 (a5, __vfork)
cfi_adjust_cfa_offset (FRAMESZ)
SETUP_GP64_REG (a5, __vfork)
#ifdef __PIC__
SAVE_GP (GPOFF)
#endif
@ -63,6 +64,7 @@ NESTED(__vfork,FRAMESZ,sp)
#endif
PTR_ADDU sp, FRAMESZ
cfi_adjust_cfa_offset (-FRAMESZ)
SAVE_PID
@ -75,20 +77,22 @@ NESTED(__vfork,FRAMESZ,sp)
RESTORE_PID
cfi_remember_state
bnez a3,L(error)
/* Successful return from the parent or child. */
RESTORE_GP64
RESTORE_GP64_REG
ret
/* Something bad happened -- no child created. */
L(error):
cfi_restore_state
#ifdef __PIC__
PTR_LA t9, __syscall_error
RESTORE_GP64
RESTORE_GP64_REG
jr t9
#else
RESTORE_GP64
RESTORE_GP64_REG
j __syscall_error
#endif
END(__vfork)