2004-10-06  Alan Modra  <amodra@bigpond.net.au>

	* gmon/Makefile (CFLAGS-mcount.c): Move before inclusion of "Rules".
	* sysdeps/powerpc/powerpc64/Makefile (CFLAGS-mcount.c): Add
	-msoft-float.
	* sysdeps/powerpc/powerpc64/sysdep.h (SAVE_ARG, REST_ARG): New macros.
	(CALL_MCOUNT): Replace with a gas macro implementation.
	(EALIGN): Delete PROF version.
	* sysdeps/powerpc/powerpc64/__longjmp-common.S: Invoke CALL_MCOUNT.
	* sysdeps/powerpc/powerpc64/bsd-_setjmp.S: Likewise.
	* sysdeps/powerpc/powerpc64/bsd-setjmp.S: Likewise.
	* sysdeps/powerpc/powerpc64/setjmp-common.S: Likewise.
	* sysdeps/powerpc/powerpc64/memcpy.S: Likewise.
	* sysdeps/powerpc/powerpc64/memset.S: Likewise.
	* sysdeps/powerpc/powerpc64/stpcpy.S: Likewise.
	* sysdeps/powerpc/powerpc64/strchr.S: Likewise.
	* sysdeps/powerpc/powerpc64/strcmp.S: Likewise.
	* sysdeps/powerpc/powerpc64/strcpy.S: Likewise.
	* sysdeps/powerpc/powerpc64/strlen.S: Likewise.
	* sysdeps/powerpc/powerpc64/strncmp.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_ceil.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_ceilf.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_copysign.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_floor.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_floorf.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_llrint.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_llrintf.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_llround.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_llroundf.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_rint.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_rintf.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_round.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_roundf.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_trunc.S: Likewise.
	* sysdeps/powerpc/powerpc64/fpu/s_truncf.S: Likewise.

	* sysdeps/powerpc/powerpc64/setjmp-common.S: Add extra entry point
	past _mcount call.
	* sysdeps/powerpc/powerpc64/bsd-_setjmp.S: Use it.
	* sysdeps/powerpc/powerpc64/bsd-setjmp.S: Likewise.
This commit is contained in:
Ulrich Drepper 2004-10-06 22:09:35 +00:00
parent 3feb8efa5d
commit d7d06f795f
31 changed files with 119 additions and 49 deletions

View File

@ -1,3 +1,44 @@
2004-10-06 Alan Modra <amodra@bigpond.net.au>
* gmon/Makefile (CFLAGS-mcount.c): Move before inclusion of "Rules".
* sysdeps/powerpc/powerpc64/Makefile (CFLAGS-mcount.c): Add
-msoft-float.
* sysdeps/powerpc/powerpc64/sysdep.h (SAVE_ARG, REST_ARG): New macros.
(CALL_MCOUNT): Replace with a gas macro implementation.
(EALIGN): Delete PROF version.
* sysdeps/powerpc/powerpc64/__longjmp-common.S: Invoke CALL_MCOUNT.
* sysdeps/powerpc/powerpc64/bsd-_setjmp.S: Likewise.
* sysdeps/powerpc/powerpc64/bsd-setjmp.S: Likewise.
* sysdeps/powerpc/powerpc64/setjmp-common.S: Likewise.
* sysdeps/powerpc/powerpc64/memcpy.S: Likewise.
* sysdeps/powerpc/powerpc64/memset.S: Likewise.
* sysdeps/powerpc/powerpc64/stpcpy.S: Likewise.
* sysdeps/powerpc/powerpc64/strchr.S: Likewise.
* sysdeps/powerpc/powerpc64/strcmp.S: Likewise.
* sysdeps/powerpc/powerpc64/strcpy.S: Likewise.
* sysdeps/powerpc/powerpc64/strlen.S: Likewise.
* sysdeps/powerpc/powerpc64/strncmp.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_ceil.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_ceilf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_copysign.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_floor.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_floorf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_llrint.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_llrintf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_llround.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_llroundf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_rint.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_rintf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_round.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_roundf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_trunc.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_truncf.S: Likewise.
* sysdeps/powerpc/powerpc64/setjmp-common.S: Add extra entry point
past _mcount call.
* sysdeps/powerpc/powerpc64/bsd-_setjmp.S: Use it.
* sysdeps/powerpc/powerpc64/bsd-setjmp.S: Likewise.
2004-10-06 Ulrich Drepper <drepper@redhat.com> 2004-10-06 Ulrich Drepper <drepper@redhat.com>
* resolv/res_mkquery.c (res_nmkquery): Reject randombits value if * resolv/res_mkquery.c (res_nmkquery): Reject randombits value if

View File

@ -29,11 +29,11 @@ elide-routines.os = bb_init_func bb_exit_func
tests := tst-sprofil tests := tst-sprofil
include ../Rules
# The mcount code won't work without a frame pointer. # The mcount code won't work without a frame pointer.
CFLAGS-mcount.c := -fno-omit-frame-pointer CFLAGS-mcount.c := -fno-omit-frame-pointer
include ../Rules
# We cannot compile mcount.c with -pg because that would # We cannot compile mcount.c with -pg because that would
# create recursive calls. Just copy the normal static object. # create recursive calls. Just copy the normal static object.
# On systems where `profil' is not a system call, the same # On systems where `profil' is not a system call, the same

View File

@ -22,3 +22,10 @@ ifeq ($(subdir),elf)
# help gcc inline asm code from dl-machine.h # help gcc inline asm code from dl-machine.h
+cflags += -finline-limit=2000 +cflags += -finline-limit=2000
endif endif
ifeq ($(subdir),gmon)
# The assembly functions assume that fp arg regs are not trashed.
# Compiling with -msoft-float ensures that fp regs are not used
# for moving memory around.
CFLAGS-mcount.c += -msoft-float
endif

View File

@ -42,6 +42,7 @@
.machine "altivec" .machine "altivec"
ENTRY (BP_SYM (__longjmp)) ENTRY (BP_SYM (__longjmp))
CALL_MCOUNT 2
CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
#ifndef __NO_VMX__ #ifndef __NO_VMX__
ld r5,.LC__dl_hwcap@toc(r2) ld r5,.LC__dl_hwcap@toc(r2)

View File

@ -25,8 +25,9 @@
#if defined NOT_IN_libc #if defined NOT_IN_libc
/* Build a non-versioned object for rtld-*. */ /* Build a non-versioned object for rtld-*. */
ENTRY (BP_SYM (_setjmp)) ENTRY (BP_SYM (_setjmp))
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */ li r4,0 /* Set second argument to 0. */
b JUMPTARGET(BP_SYM (__sigsetjmp)) b JUMPTARGET (__sigsetjmp_ent)
END (BP_SYM (_setjmp)) END (BP_SYM (_setjmp))
libc_hidden_def (_setjmp) libc_hidden_def (_setjmp)
@ -36,8 +37,9 @@ libc_hidden_def (_setjmp)
symbol_version (__novmx_setjmp,_setjmp,GLIBC_2.3); symbol_version (__novmx_setjmp,_setjmp,GLIBC_2.3);
ENTRY (BP_SYM (__novmx_setjmp)) ENTRY (BP_SYM (__novmx_setjmp))
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */ li r4,0 /* Set second argument to 0. */
b JUMPTARGET(BP_SYM (__novmx__sigsetjmp)) b JUMPTARGET (__novmx__sigsetjmp_ent)
END (BP_SYM (__novmx_setjmp)) END (BP_SYM (__novmx_setjmp))
libc_hidden_def (__novmx_setjmp) libc_hidden_def (__novmx_setjmp)
# endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4) */ # endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4) */
@ -50,13 +52,15 @@ ENTRY (BP_SYM (__GI__setjmp))
#if defined SHARED && !defined IS_IN_rtld #if defined SHARED && !defined IS_IN_rtld
std r2,40(r1) /* Save the callers TOC in the save area. */ std r2,40(r1) /* Save the callers TOC in the save area. */
#endif #endif
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */ li r4,0 /* Set second argument to 0. */
b JUMPTARGET(BP_SYM (__vmx__sigsetjmp)) b JUMPTARGET (__vmx__sigsetjmp_ent)
END (BP_SYM (__GI__setjmp)) END (BP_SYM (__GI__setjmp))
ENTRY (BP_SYM (__vmx_setjmp)) ENTRY (BP_SYM (__vmx_setjmp))
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */ li r4,0 /* Set second argument to 0. */
b JUMPTARGET(BP_SYM (__vmx__sigsetjmp)) b JUMPTARGET (__vmx__sigsetjmp_ent)
END (BP_SYM (__vmx_setjmp)) END (BP_SYM (__vmx_setjmp))
libc_hidden_def (__vmx_setjmp) libc_hidden_def (__vmx_setjmp)
#endif /* !NOT_IN_libc */ #endif /* !NOT_IN_libc */

View File

@ -25,8 +25,9 @@
ENTRY (__novmxsetjmp) ENTRY (__novmxsetjmp)
CALL_MCOUNT 1
li r4,1 /* Set second argument to 1. */ li r4,1 /* Set second argument to 1. */
b JUMPTARGET (__novmx__sigsetjmp) b JUMPTARGET (__novmx__sigsetjmp_ent)
END (__novmxsetjmp) END (__novmxsetjmp)
strong_alias (__novmxsetjmp, __novmx__setjmp) strong_alias (__novmxsetjmp, __novmx__setjmp)
symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3) symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3)
@ -35,8 +36,9 @@ symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3)
ENTRY (__vmxsetjmp) ENTRY (__vmxsetjmp)
CALL_MCOUNT 1
li r4,1 /* Set second argument to 1. */ li r4,1 /* Set second argument to 1. */
b JUMPTARGET (__vmx__sigsetjmp) b JUMPTARGET (__vmx__sigsetjmp_ent)
END (__vmxsetjmp) END (__vmxsetjmp)
strong_alias (__vmxsetjmp, __vmx__setjmp) strong_alias (__vmxsetjmp, __vmx__setjmp)
strong_alias (__vmx__sigsetjmp, __setjmp) strong_alias (__vmx__sigsetjmp, __setjmp)

View File

@ -27,6 +27,7 @@
.section ".text" .section ".text"
ENTRY (__ceil) ENTRY (__ceil)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */ mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1

View File

@ -27,6 +27,7 @@
.section ".text" .section ".text"
ENTRY (__ceilf) ENTRY (__ceilf)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */ mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1

View File

@ -23,6 +23,7 @@
#include <sysdep.h> #include <sysdep.h>
ENTRY(__copysign) ENTRY(__copysign)
CALL_MCOUNT 0
/* double [f1] copysign (double [f1] x, double [f2] y); /* double [f1] copysign (double [f1] x, double [f2] y);
copysign(x,y) returns a value with the magnitude of x and copysign(x,y) returns a value with the magnitude of x and
with the sign bit of y. */ with the sign bit of y. */

View File

@ -25,6 +25,7 @@
.section ".text" .section ".text"
ENTRY (__floor) ENTRY (__floor)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */ mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1

View File

@ -25,6 +25,7 @@
.section ".text" .section ".text"
ENTRY (__floorf) ENTRY (__floorf)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */ mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1

View File

@ -21,6 +21,7 @@
/* long long int[r3] __llrint (double x[fp1]) */ /* long long int[r3] __llrint (double x[fp1]) */
ENTRY (__llrint) ENTRY (__llrint)
CALL_MCOUNT 0
fctid fp13,fp1 fctid fp13,fp1
stfd fp13,-16(r1) stfd fp13,-16(r1)
nop /* Insure the following load is in a different dispatch group */ nop /* Insure the following load is in a different dispatch group */

View File

@ -21,6 +21,7 @@
/* long long int[r3] __llrintf (float x[fp1]) */ /* long long int[r3] __llrintf (float x[fp1]) */
ENTRY (__llrintf) ENTRY (__llrintf)
CALL_MCOUNT 0
fctid fp13,fp1 fctid fp13,fp1
stfd fp13,-16(r1) stfd fp13,-16(r1)
nop /* Insure the following load is in a different dispatch group */ nop /* Insure the following load is in a different dispatch group */

View File

@ -37,6 +37,7 @@
to the integer value. */ to the integer value. */
ENTRY (__llround) ENTRY (__llround)
CALL_MCOUNT 0
lfd fp12,.LC0@toc(2) lfd fp12,.LC0@toc(2)
lfd fp10,.LC1@toc(2) lfd fp10,.LC1@toc(2)
fcmpu cr6,fp1,fp12 /* if (x > 0.0) */ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */

View File

@ -37,6 +37,7 @@
to the integer value. */ to the integer value. */
ENTRY (__llroundf) ENTRY (__llroundf)
CALL_MCOUNT 0
lfd fp12,.LC0@toc(2) lfd fp12,.LC0@toc(2)
lfd fp10,.LC1@toc(2) lfd fp10,.LC1@toc(2)
fcmpu cr6,fp1,fp12 /* if (x < 0.0) */ fcmpu cr6,fp1,fp12 /* if (x < 0.0) */

View File

@ -28,6 +28,7 @@
.section ".text" .section ".text"
ENTRY (__rint) ENTRY (__rint)
CALL_MCOUNT 0
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1
fsub fp12,fp13,fp13 /* generate 0.0 */ fsub fp12,fp13,fp13 /* generate 0.0 */

View File

@ -25,6 +25,7 @@
.section ".text" .section ".text"
ENTRY (__rintf) ENTRY (__rintf)
CALL_MCOUNT 0
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1
fsubs fp12,fp13,fp13 /* generate 0.0 */ fsubs fp12,fp13,fp13 /* generate 0.0 */

View File

@ -39,6 +39,7 @@
to the integer value. */ to the integer value. */
ENTRY (__round) ENTRY (__round)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */ mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1

View File

@ -39,6 +39,7 @@
to the integer value. */ to the integer value. */
ENTRY (__roundf ) ENTRY (__roundf )
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */ mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1

View File

@ -34,6 +34,7 @@
subtracting +-2**52. */ subtracting +-2**52. */
ENTRY (__trunc) ENTRY (__trunc)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */ mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1

View File

@ -34,6 +34,7 @@
subtracting +-2**23. */ subtracting +-2**23. */
ENTRY (__truncf) ENTRY (__truncf)
CALL_MCOUNT 0
mffs fp11 /* Save current FPU rounding mode. */ mffs fp11 /* Save current FPU rounding mode. */
lfd fp13,.LC0@toc(2) lfd fp13,.LC0@toc(2)
fabs fp0,fp1 fabs fp0,fp1

View File

@ -37,6 +37,8 @@
Each case has a optimized unrolled loop. */ Each case has a optimized unrolled loop. */
EALIGN (BP_SYM (memcpy), 5, 0) EALIGN (BP_SYM (memcpy), 5, 0)
CALL_MCOUNT 3
cmpldi cr1,5,31 cmpldi cr1,5,31
neg 0,3 neg 0,3
std 3,-16(1) std 3,-16(1)

View File

@ -41,6 +41,7 @@
to 0, to take advantage of the dcbz instruction. */ to 0, to take advantage of the dcbz instruction. */
EALIGN (BP_SYM (memset), 5, 0) EALIGN (BP_SYM (memset), 5, 0)
CALL_MCOUNT 3
#define rTMP r0 #define rTMP r0
#define rRTN r3 /* Initial value of 1st argument. */ #define rRTN r3 /* Initial value of 1st argument. */
@ -274,6 +275,7 @@ libc_hidden_builtin_def (memset)
/* Copied from bzero.S to prevent the linker from inserting a stub /* Copied from bzero.S to prevent the linker from inserting a stub
between bzero and memset. */ between bzero and memset. */
ENTRY (BP_SYM (__bzero)) ENTRY (BP_SYM (__bzero))
CALL_MCOUNT 3
#if __BOUNDED_POINTERS__ #if __BOUNDED_POINTERS__
mr r6,r4 mr r6,r4
li r5,0 li r5,0

View File

@ -41,6 +41,10 @@
.machine "altivec" .machine "altivec"
ENTRY (BP_SYM (__sigsetjmp)) ENTRY (BP_SYM (__sigsetjmp))
CALL_MCOUNT 2
.globl JUMPTARGET(GLUE(__sigsetjmp,_ent))
.hidden JUMPTARGET(GLUE(__sigsetjmp,_ent))
JUMPTARGET(GLUE(__sigsetjmp,_ent)):
CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
std r1,(JB_GPR1*8)(3) std r1,(JB_GPR1*8)(3)
mflr r0 mflr r0

View File

@ -26,6 +26,7 @@
/* char * [r3] stpcpy (char *dest [r3], const char *src [r4]) */ /* char * [r3] stpcpy (char *dest [r3], const char *src [r4]) */
EALIGN (BP_SYM (__stpcpy), 4, 0) EALIGN (BP_SYM (__stpcpy), 4, 0)
CALL_MCOUNT 2
#define rTMP r0 #define rTMP r0
#define rRTN r3 #define rRTN r3

View File

@ -26,6 +26,7 @@
/* char * [r3] strchr (const char *s [r3] , int c [r4] ) */ /* char * [r3] strchr (const char *s [r3] , int c [r4] ) */
ENTRY (BP_SYM (strchr)) ENTRY (BP_SYM (strchr))
CALL_MCOUNT 2
#define rTMP1 r0 #define rTMP1 r0
#define rRTN r3 /* outgoing result */ #define rRTN r3 /* outgoing result */

View File

@ -26,6 +26,7 @@
/* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */ /* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */
EALIGN (BP_SYM(strcmp), 4, 0) EALIGN (BP_SYM(strcmp), 4, 0)
CALL_MCOUNT 2
#define rTMP r0 #define rTMP r0
#define rRTN r3 #define rRTN r3

View File

@ -26,6 +26,7 @@
/* char * [r3] strcpy (char *dest [r3], const char *src [r4]) */ /* char * [r3] strcpy (char *dest [r3], const char *src [r4]) */
EALIGN (BP_SYM (strcpy), 4, 0) EALIGN (BP_SYM (strcpy), 4, 0)
CALL_MCOUNT 2
#define rTMP r0 #define rTMP r0
#define rRTN r3 /* incoming DEST arg preserved as result */ #define rRTN r3 /* incoming DEST arg preserved as result */

View File

@ -79,6 +79,7 @@
/* int [r3] strlen (char *s [r3]) */ /* int [r3] strlen (char *s [r3]) */
ENTRY (BP_SYM (strlen)) ENTRY (BP_SYM (strlen))
CALL_MCOUNT 1
#define rTMP1 r0 #define rTMP1 r0
#define rRTN r3 /* incoming STR arg, outgoing result */ #define rRTN r3 /* incoming STR arg, outgoing result */

View File

@ -26,6 +26,7 @@
/* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */ /* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */
EALIGN (BP_SYM(strncmp), 4, 0) EALIGN (BP_SYM(strncmp), 4, 0)
CALL_MCOUNT 3
#define rTMP r0 #define rTMP r0
#define rRTN r3 #define rRTN r3

View File

@ -23,37 +23,36 @@
#ifdef __ASSEMBLER__ #ifdef __ASSEMBLER__
/* Support macros for CALL_MCOUNT. */
.macro SAVE_ARG NARG
.if \NARG
SAVE_ARG \NARG-1
std 2+\NARG,-72+8*(\NARG)(1)
.endif
.endm
.macro REST_ARG NARG
.if \NARG
REST_ARG \NARG-1
ld 2+\NARG,40+8*(\NARG)(1)
.endif
.endm
/* If compiled for profiling, call `_mcount' at the start of each function. /* If compiled for profiling, call `_mcount' at the start of each function.
see ppc-mcount.S for more details. */ see ppc-mcount.S for more details. */
.macro CALL_MCOUNT NARG
#ifdef PROF #ifdef PROF
/* The mcount code relies on a the return address being on the stack mflr r0
to locate our caller and so it can restore it; so store one just SAVE_ARG \NARG
for its benefit. */ std r0,16(r1)
#ifdef SYSV_ELF_PROFILING stdu r1,-112(r1)
#define CALL_MCOUNT \ bl JUMPTARGET (_mcount)
.pushsection; \ ld r0,128(r1)
.section ".data"; \ REST_ARG \NARG
.align ALIGNARG(2); \ addi r1,r1,112
__mcount: \ mtlr r0
.long 0; \ #endif
.previous; \ .endm
.section ".toc","aw"; \
.LC__mcount:; \
.tc __mcount[TC],__mcount; \
.previous; \
mflr r0; \
std r0,16(r1); \
ld r0,.LC__mcount@toc(r2); \
bl JUMPTARGET(_mcount);
#else /* SYSV_ELF_PROFILING */
#define CALL_MCOUNT \
mflr r0; \
std r0,16(r1); \
bl JUMPTARGET(_mcount);
#endif /* SYSV_ELF_PROFILING */
#else /* PROF */
#define CALL_MCOUNT /* Do nothing. */
#endif /* PROF */
#ifdef USE_PPC64_OVERLAPPING_OPD #ifdef USE_PPC64_OVERLAPPING_OPD
# define OPD_ENT(name) .quad BODY_LABEL (name), .TOC.@tocbase # define OPD_ENT(name) .quad BODY_LABEL (name), .TOC.@tocbase
@ -106,24 +105,11 @@ BODY_LABEL(name):
/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes /* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
past a 2^alignt boundary. */ past a 2^alignt boundary. */
#ifdef PROF
#define EALIGN(name, alignt, words) \
ENTRY_2(name) \
.align ALIGNARG(alignt); \
EALIGN_W_##words; \
BODY_LABEL(name): \
CALL_MCOUNT \
b 0f; \
.align ALIGNARG(alignt); \
EALIGN_W_##words; \
0:
#else /* PROF */
#define EALIGN(name, alignt, words) \ #define EALIGN(name, alignt, words) \
ENTRY_2(name) \ ENTRY_2(name) \
.align ALIGNARG(alignt); \ .align ALIGNARG(alignt); \
EALIGN_W_##words; \ EALIGN_W_##words; \
BODY_LABEL(name): BODY_LABEL(name):
#endif
/* Local labels stripped out by the linker. */ /* Local labels stripped out by the linker. */
#undef L #undef L