PowerPC: Add systemtap static probe points in setjmp/longjmp

This patch add static probes for setjmp/longjmp in the way gdb expects,fixing
the gdb.base/longjmp.exp gdb testcases.

It changes the symbol_name and use macros to to avoid change the probe names
and ending up adding more logic on GDB (since with the expected name
GDB work seamlessly).
This commit is contained in:
Adhemerval Zanella 2013-11-22 06:36:54 -06:00
parent 76a4a26979
commit eb5ad6b9bc
13 changed files with 128 additions and 60 deletions

View File

@ -1,3 +1,34 @@
2013-12-05 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
* sysdeps/powerpc/powerpc32/__longjmp-common.S: Add "longjmp" and
"longjmp_target" static probes.
(__longjmp): Rename to __longjmp_symbol.
* sysdeps/powerpc/powerpc32/fpu/__longjmp-common.S: Likewise.
* sysdeps/powerpc/powerpc32/__longjmp.S: Define __longjmp_symbol based
on which longjmp to generate.
* sysdeps/powerpc/powerpc32/fpu/__longjmp.S: Likewise.
* sysdeps/powerpc/powerpc32/fpu/setjmp-common.S: Add "setjmp" static
probe.
(__sigsetjmp): Rename to __sigsetjmp_symbol.
(__sigjmp_save): Rename to __sigjmp_save_symbol.
* sysdeps/powerpc/powerpc32/setjmp-common.S: Likewise.
* sysdeps/powerpc/powerpc32/fpu/setjmp.S: Define __sigsetjmp_symbol
and __sigjmp_save_symbol based on which sigsetjmp to generated.
* sysdeps/powerpc/powerpc32/setjmp.S: Likewise
* sysdeps/unix/sysv/linux/powerpc/powerpc32/____longjmp_chk.S: Define
__longjmp_symbol based on which __longjmp to generate.
* sysdeps/powerpc/powerpc64/setjmp-common.S: Add "setjmp" static
probe.
(setjmp): Rename to setjmp_symbol.
(__sigsetjmp): Rename to __sigsetjmp_symbol.
(_setjmp): Rename to _setjmp_symbol.
(__sigsetjmp): Rename to __sigsetjmp_symbol.
* sysdeps/powerpc/powerpc64/setjmp.S: Define setjmp_symbol,
_setjmp_symbol, __sigsetjmp_symbol, and __sigjmp_save_symbol based on
which setjmp to generate.
* sysdeps/powerpc/powerpc64/__longjmp-common.S: Add "longjmp" and
"longjmp_target" static probes.
2013-12-05 Siddhesh Poyarekar <siddhesh@redhat.com>
* benchtests/README: Add note about output arguments.

View File

@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <stap-probe.h>
#define _ASM
#ifdef __NO_VMX__
# include <novmxsetjmp.h>
@ -30,7 +31,7 @@
# define LOAD_GP(N) lwz r##N,((JB_GPRS+(N)-14)*4)(r3)
#endif
ENTRY (__longjmp)
ENTRY (__longjmp_symbol)
#if defined PTR_DEMANGLE || defined CHECK_SP
lwz r24,(JB_GPR1*4)(r3)
@ -58,20 +59,24 @@ ENTRY (__longjmp)
# endif
PTR_DEMANGLE2 (r0, r25)
#endif
/* longjmp/longjmp_target probe expects longjmp first argument (4@3),
second argument (-4@4), and target address (4@0), respectively. */
LIBC_PROBE (longjmp, 3, 4@3, -4@4, 4@0)
mtlr r0
LOAD_GP (21)
LOAD_GP (22)
lwz r0,(JB_CR*4)(r3)
lwz r5,(JB_CR*4)(r3)
LOAD_GP (23)
LOAD_GP (24)
LOAD_GP (25)
mtcrf 0xFF,r0
mtcrf 0xFF,r5
LOAD_GP (26)
LOAD_GP (27)
LOAD_GP (28)
LOAD_GP (29)
LOAD_GP (30)
LOAD_GP (31)
LIBC_PROBE (longjmp_target, 3, 4@3, -4@4, 4@0)
mr r3,r4
blr
END (__longjmp)
END (__longjmp_symbol)

View File

@ -21,18 +21,19 @@
#if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */
# define __longjmp_symbol __longjmp
# include "__longjmp-common.S"
#else /* !NOT_IN_libc */
strong_alias (__vmx__longjmp, __longjmp);
# define __longjmp __vmx__longjmp
# define __longjmp_symbol __vmx__longjmp
# include "__longjmp-common.S"
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
# define __NO_VMX__
# undef JB_SIZE
# undef __longjmp
# define __longjmp __novmx__longjmp
# undef __longjmp_symbol
# define __longjmp_symbol __novmx__longjmp
# include "__longjmp-common.S"
# endif
#endif /* !NOT_IN_libc */

View File

@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <stap-probe.h>
#define _ASM
#ifdef __NO_VMX__
# include <novmxsetjmp.h>
@ -25,7 +26,7 @@
#endif
.machine "altivec"
ENTRY (__longjmp)
ENTRY (__longjmp_symbol)
#ifndef __NO_VMX__
# ifdef PIC
mflr r6
@ -143,19 +144,22 @@ L(no_vmx):
# endif
PTR_DEMANGLE2 (r0, r25)
#endif
/* longjmp/longjmp_target probe expects longjmp first argument (4@3),
second argument (-4@4), and target address (4@0), respectively. */
LIBC_PROBE (longjmp, 3, 4@3, -4@4, 4@0)
mtlr r0
lwz r21,((JB_GPRS+7)*4)(r3)
lfd fp21,((JB_FPRS+7*2)*4)(r3)
lwz r22,((JB_GPRS+8)*4)(r3)
lfd fp22,((JB_FPRS+8*2)*4)(r3)
lwz r0,(JB_CR*4)(r3)
lwz r5,(JB_CR*4)(r3)
lwz r23,((JB_GPRS+9)*4)(r3)
lfd fp23,((JB_FPRS+9*2)*4)(r3)
lwz r24,((JB_GPRS+10)*4)(r3)
lfd fp24,((JB_FPRS+10*2)*4)(r3)
lwz r25,((JB_GPRS+11)*4)(r3)
lfd fp25,((JB_FPRS+11*2)*4)(r3)
mtcrf 0xFF,r0
mtcrf 0xFF,r5
lwz r26,((JB_GPRS+12)*4)(r3)
lfd fp26,((JB_FPRS+12*2)*4)(r3)
lwz r27,((JB_GPRS+13)*4)(r3)
@ -168,6 +172,7 @@ L(no_vmx):
lfd fp30,((JB_FPRS+16*2)*4)(r3)
lwz r31,((JB_GPRS+17)*4)(r3)
lfd fp31,((JB_FPRS+17*2)*4)(r3)
LIBC_PROBE (longjmp_target, 3, 4@3, -4@4, 4@0)
mr r3,r4
blr
END (__longjmp)
END (__longjmp_symbol)

View File

@ -22,20 +22,21 @@
#if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */
# define __longjmp_symbol __longjmp
# include "__longjmp-common.S"
#else /* !NOT_IN_libc */
/* Build a versioned object for libc. */
versioned_symbol (libc, __vmx__longjmp, __longjmp, GLIBC_2_3_4);
# define __longjmp __vmx__longjmp
# define __longjmp_symbol __vmx__longjmp
# include "__longjmp-common.S"
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
# define __NO_VMX__
# undef JB_SIZE
compat_symbol (libc, __novmx__longjmp, __longjmp, GLIBC_2_0);
# undef __longjmp
# define __longjmp __novmx__longjmp
# undef __longjmp_symbol
# define __longjmp_symbol __novmx__longjmp
# include "__longjmp-common.S"
# endif
#endif /* !NOT_IN_libc */

View File

@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <stap-probe.h>
#define _ASM
#ifdef __NO_VMX__
# include <novmxsetjmp.h>
@ -25,7 +26,7 @@
#endif
.machine "altivec"
ENTRY (__sigsetjmp)
ENTRY (__sigsetjmp_symbol)
#ifdef PTR_MANGLE
mr r5,r1
@ -35,6 +36,9 @@ ENTRY (__sigsetjmp)
stw r1,(JB_GPR1*4)(3)
#endif
mflr r0
/* setjmp probe expects longjmp first argument (4@3), second argument
(-4@4), and target address (4@0), respectively. */
LIBC_PROBE (setjmp, 3, 4@3, -4@4, 4@0)
stw r14,((JB_GPRS+0)*4)(3)
stfd fp14,((JB_FPRS+0*2)*4)(3)
#ifdef PTR_MANGLE
@ -175,5 +179,5 @@ L(aligned_save_vmx):
stvx 31,0,r6
L(no_vmx):
#endif
b __sigjmp_save@local
END (__sigsetjmp)
b __sigjmp_save_symbol@local
END (__sigsetjmp_symbol)

View File

@ -22,23 +22,25 @@
#if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */
# define __sigsetjmp_symbol __sigsetjmp
# define __sigjmp_save_symbol __sigjmp_save
# include "setjmp-common.S"
#else /* !NOT_IN_libc */
/* Build a versioned object for libc. */
versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
# define __sigsetjmp __vmx__sigsetjmp
# define __sigjmp_save __vmx__sigjmp_save
# define __sigsetjmp_symbol __vmx__sigsetjmp
# define __sigjmp_save_symbol __vmx__sigjmp_save
# include "setjmp-common.S"
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
# define __NO_VMX__
# undef __sigsetjmp
# undef __sigjmp_save
# undef __sigsetjmp_symbol
# undef __sigjmp_save_symbol
# undef JB_SIZE
compat_symbol (libc, __novmx__sigsetjmp, __sigsetjmp, GLIBC_2_0)
# define __sigsetjmp __novmx__sigsetjmp
# define __sigjmp_save __novmx__sigjmp_save
# define __sigsetjmp_symbol __novmx__sigsetjmp
# define __sigjmp_save_symbol __novmx__sigjmp_save
# include "setjmp-common.S"
# endif
#endif /* !NOT_IN_libc */

View File

@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <stap-probe.h>
#define _ASM
#ifdef __NO_VMX__
# include <novmxsetjmp.h>
@ -30,7 +31,7 @@
# define SAVE_GP(N) stw r##N,((JB_GPRS+(N)-14)*4)(3)
#endif
ENTRY (__sigsetjmp)
ENTRY (__sigsetjmp_symbol)
#ifdef PTR_MANGLE
mr r5,r1
@ -40,6 +41,9 @@ ENTRY (__sigsetjmp)
stw r1,(JB_GPR1*4)(3)
#endif
mflr r0
/* setjmp probe expects longjmp first argument (4@3), second argument
(-4@4), and target address (4@0), respectively. */
LIBC_PROBE (setjmp, 3, 4@3, -4@4, 4@0)
SAVE_GP (14)
#ifdef PTR_MANGLE
PTR_MANGLE2 (r0, r10)
@ -69,6 +73,6 @@ ENTRY (__sigsetjmp)
li r3,0
blr
#else
b __sigjmp_save@local
b __sigjmp_save_symbol@local
#endif
END (__sigsetjmp)
END (__sigsetjmp_symbol)

View File

@ -21,23 +21,25 @@
#if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */
# define __sigsetjmp_symbol __sigsetjmp
# define __sigjmp_save_symbol __sigjmp_save
# include "setjmp-common.S"
#else /* !NOT_IN_libc */
/* Build a versioned object for libc. */
versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
# define __sigsetjmp __vmx__sigsetjmp
# define __sigjmp_save __vmx__sigjmp_save
# define __sigsetjmp_symbol __vmx__sigsetjmp
# define __sigjmp_save_symbol __vmx__sigjmp_save
# include "setjmp-common.S"
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
# define __NO_VMX__
# undef __sigsetjmp
# undef __sigjmp_save
# undef __sigsetjmp_symbol
# undef __sigjmp_save_symbol
# undef JB_SIZE
compat_symbol (libc, __novmx__sigsetjmp, __sigsetjmp, GLIBC_2_0)
# define __sigsetjmp __novmx__sigsetjmp
# define __sigjmp_save __novmx__sigjmp_save
# define __sigsetjmp_symbol __novmx__sigsetjmp
# define __sigjmp_save_symbol __novmx__sigjmp_save
# include "setjmp-common.S"
# endif
#endif /* !NOT_IN_libc */

View File

@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <stap-probe.h>
#define _ASM
#define _SETJMP_H
#ifdef __NO_VMX__
@ -147,20 +148,23 @@ L(no_vmx):
#ifdef PTR_DEMANGLE
PTR_DEMANGLE2 (r0, r25)
#endif
/* longjmp/longjmp_target probe expects longjmp first argument (8@3),
second argument (-4@4), and target address (8@0), respectively. */
LIBC_PROBE (longjmp, 3, 8@3, -4@4, 8@0)
mtlr r0
/* std r2,FRAME_TOC_SAVE(r1) Restore the TOC save area. */
ld r21,((JB_GPRS+7)*8)(r3)
lfd fp21,((JB_FPRS+7)*8)(r3)
ld r22,((JB_GPRS+8)*8)(r3)
lfd fp22,((JB_FPRS+8)*8)(r3)
lwz r0,((JB_CR*8)+4)(r3) /* 32-bit CR. */
lwz r5,((JB_CR*8)+4)(r3) /* 32-bit CR. */
ld r23,((JB_GPRS+9)*8)(r3)
lfd fp23,((JB_FPRS+9)*8)(r3)
ld r24,((JB_GPRS+10)*8)(r3)
lfd fp24,((JB_FPRS+10)*8)(r3)
ld r25,((JB_GPRS+11)*8)(r3)
lfd fp25,((JB_FPRS+11)*8)(r3)
mtcrf 0xFF,r0
mtcrf 0xFF,r5
ld r26,((JB_GPRS+12)*8)(r3)
lfd fp26,((JB_FPRS+12)*8)(r3)
ld r27,((JB_GPRS+13)*8)(r3)
@ -173,6 +177,7 @@ L(no_vmx):
lfd fp30,((JB_FPRS+16)*8)(r3)
ld r31,((JB_GPRS+17)*8)(r3)
lfd fp31,((JB_FPRS+17)*8)(r3)
LIBC_PROBE (longjmp_target, 3, 8@3, -4@4, 8@0)
mr r3,r4
blr
END (__longjmp)

View File

@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <stap-probe.h>
#define _ASM
#ifdef __NO_VMX__
#include <novmxsetjmp.h>
@ -42,11 +43,11 @@
#endif
.machine "altivec"
ENTRY (setjmp)
ENTRY (setjmp_symbol)
CALL_MCOUNT 1
li r4,1 /* Set second argument to 1. */
b JUMPTARGET (GLUE(__sigsetjmp,_ent))
END (setjmp)
b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
END (setjmp_symbol)
#if defined SHARED && !defined IS_IN_rtld && !defined __NO_VMX__
/* When called from within libc we need a special version of _setjmp
@ -57,20 +58,20 @@ ENTRY (__GI__setjmp)
std r2,FRAME_TOC_SAVE(r1) /* Save the callers TOC in the save area. */
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */
b JUMPTARGET (GLUE(__sigsetjmp,_ent))
b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
END (__GI__setjmp)
#endif
ENTRY (_setjmp)
ENTRY (_setjmp_symbol)
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */
b JUMPTARGET (GLUE(__sigsetjmp,_ent))
END (_setjmp)
libc_hidden_def (_setjmp)
b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
END (_setjmp_symbol)
libc_hidden_def (_setjmp_symbol)
ENTRY (__sigsetjmp)
ENTRY (__sigsetjmp_symbol)
CALL_MCOUNT 2
JUMPTARGET(GLUE(__sigsetjmp,_ent)):
JUMPTARGET(GLUE(__sigsetjmp_symbol,_ent)):
#ifdef PTR_MANGLE
mr r5, r1
PTR_MANGLE (r5, r6)
@ -85,6 +86,9 @@ JUMPTARGET(GLUE(__sigsetjmp,_ent)):
#else
std r2,(JB_GPR2*8)(3)
#endif
/* setjmp probe expects longjmp first argument (8@3), second argument
(-4@4), and target address (8@0), respectively. */
LIBC_PROBE (setjmp, 3, 8@3, -4@4, 8@0)
std r14,((JB_GPRS+0)*8)(3)
stfd fp14,((JB_FPRS+0)*8)(3)
#ifdef PTR_MANGLE
@ -213,18 +217,18 @@ L(no_vmx):
li r3,0
blr
#elif defined SHARED
b JUMPTARGET (__sigjmp_save)
b JUMPTARGET (__sigjmp_save_symbol)
#else
mflr r0
std r0,FRAME_LR_SAVE(r1)
stdu r1,-FRAME_MIN_SIZE(r1)
cfi_adjust_cfa_offset(FRAME_MIN_SIZE)
cfi_offset(lr,FRAME_LR_SAVE)
bl JUMPTARGET (__sigjmp_save)
bl JUMPTARGET (__sigjmp_save_symbol)
nop
ld r0,FRAME_MIN_SIZE+FRAME_LR_SAVE(r1)
addi r1,r1,FRAME_MIN_SIZE
mtlr r0
blr
#endif
END (__sigsetjmp)
END (__sigsetjmp_symbol)

View File

@ -22,6 +22,10 @@
#if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */
# define setjmp_symbol setjmp
# define _setjmp_symbol _setjmp
# define __sigsetjmp_symbol __sigsetjmp
# define __sigjmp_save_symbol __sigjmp_save
# include "setjmp-common.S"
#else /* !NOT_IN_libc */
@ -29,28 +33,28 @@
versioned_symbol (libc, __vmxsetjmp, setjmp, GLIBC_2_3_4)
versioned_symbol (libc, __vmx_setjmp, _setjmp, GLIBC_2_3_4)
versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
# define setjmp __vmxsetjmp
# define _setjmp __vmx_setjmp
# define __sigsetjmp __vmx__sigsetjmp
# define __sigjmp_save __vmx__sigjmp_save
# define setjmp_symbol __vmxsetjmp
# define _setjmp_symbol __vmx_setjmp
# define __sigsetjmp_symbol __vmx__sigsetjmp
# define __sigjmp_save_symbol __vmx__sigjmp_save
# include "setjmp-common.S"
strong_alias (__vmxsetjmp, __vmx__setjmp)
strong_alias (__vmx__sigsetjmp, __setjmp)
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)
# undef setjmp
# undef _setjmp
# undef __sigsetjmp
# undef __sigjmp_save
# undef setjmp_symbol
# undef _setjmp_symbol
# undef __sigsetjmp_symbol
# undef __sigjmp_save_symbol
# undef JB_SIZE
# define __NO_VMX__
compat_symbol (libc, __novmxsetjmp, setjmp, GLIBC_2_3)
compat_symbol (libc, __novmx_setjmp,_setjmp, GLIBC_2_3);
compat_symbol (libc, __novmx__sigsetjmp,__sigsetjmp, GLIBC_2_3)
# define setjmp __novmxsetjmp
# define _setjmp __novmx_setjmp
# define __sigsetjmp __novmx__sigsetjmp
# define __sigjmp_save __novmx__sigjmp_save
# define setjmp_symbol __novmxsetjmp
# define _setjmp_symbol __novmx_setjmp
# define __sigsetjmp_symbol __novmx__sigsetjmp
# define __sigjmp_save_symbol __novmx__sigjmp_save
# include "setjmp-common.S"
strong_alias (__novmxsetjmp, __novmx__setjmp)
# endif

View File

@ -24,7 +24,7 @@
.string "longjmp causes uninitialized stack frame"
.text
#define __longjmp ____longjmp_chk
#define __longjmp_symbol ____longjmp_chk
#ifdef PIC
# define LOAD_ARG \