Module Name: src Committed By: rin Date: Thu Sep 14 03:37:01 UTC 2023
Modified Files: src/sys/arch/mips/include: asm.h Log Message: mips: Add initial support to gprof(1) for n64 userland Use gp relative call for _mcount(). Stop using macro name MCOUNT as well for clarity. It has nothing to do with one provided by <machine/profile.h>. Now, gprof(1) works just fine for C programs. On the other hand, some C++ profiling tests of ATF fail as partially observed for n32. More C++ profile tests become broken for GCC12 in comparison to GCC10. Something needs to be adjusted for us, or GCC, or both. To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.75 src/sys/arch/mips/include/asm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/include/asm.h diff -u src/sys/arch/mips/include/asm.h:1.74 src/sys/arch/mips/include/asm.h:1.75 --- src/sys/arch/mips/include/asm.h:1.74 Thu Feb 23 14:56:00 2023 +++ src/sys/arch/mips/include/asm.h Thu Sep 14 03:37:01 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: asm.h,v 1.74 2023/02/23 14:56:00 riastradh Exp $ */ +/* $NetBSD: asm.h,v 1.75 2023/09/14 03:37:01 rin Exp $ */ /* * Copyright (c) 1992, 1993 @@ -71,6 +71,9 @@ #define __SHIFTIN(__x, __mask) ((__x) * __LOWEST_SET_BIT(__mask)) #endif /* __ASSEMBLER__ */ +#ifndef GPROF +#define _MIPS_ASM_MCOUNT(x) +#else /* * Define -pg profile entry code. * Must always be noreorder, must never use a macro instruction. @@ -81,7 +84,7 @@ * stack and the final addiu to t9 must always equal the size of this * _MIPS_ASM_MCOUNT. */ -#define _MIPS_ASM_MCOUNT \ +#define _MIPS_ASM_MCOUNT(x) \ .set push; \ .set noreorder; \ .set noat; \ @@ -104,7 +107,8 @@ * call _mcount(). For the no abicalls case, skip the reloc dance. */ #ifdef __mips_abicalls -#define _MIPS_ASM_MCOUNT \ +#if defined(__mips_n32) /* n32 */ +#define _MIPS_ASM_MCOUNT(x) \ .set push; \ .set noreorder; \ .set noat; \ @@ -118,8 +122,28 @@ lw t9,8(sp); \ addiu sp,16; \ .set pop; +#else /* n64 */ +#define _MIPS_ASM_MCOUNT(x) \ + .set push; \ + .set noreorder; \ + .set noat; \ + dsubu sp,16; \ + sd gp,0(sp); \ + sd t9,8(sp); \ + move AT,ra; \ + lui gp,%hi(%neg(%gp_rel(x))); \ + daddiu gp,%lo(%neg(%gp_rel(x))); \ + daddu gp,gp,t9; \ + ld t9,%call16(_mcount)(gp); \ + jalr t9; \ + nop; \ + ld gp,0(sp); \ + ld t9,8(sp); \ + daddiu sp,16; \ + .set pop; +#endif #else /* !__mips_abicalls */ -#define _MIPS_ASM_MCOUNT \ +#define _MIPS_ASM_MCOUNT(x) \ .set push; \ .set noreorder; \ .set noat; \ @@ -129,12 +153,7 @@ .set pop; #endif /* !__mips_abicalls */ #endif /* n32/n64 */ - -#ifdef GPROF -#define MCOUNT _MIPS_ASM_MCOUNT -#else -#define MCOUNT -#endif +#endif /* GPROF */ #ifdef USE_AENT #define AENT(x) \ @@ -187,7 +206,7 @@ _C_LABEL(x): ; \ */ #define STATIC_LEAF(x) \ STATIC_LEAF_NOPROFILE(x); \ - MCOUNT + _MIPS_ASM_MCOUNT(x) /* * LEAF @@ -198,7 +217,7 @@ _C_LABEL(x): ; \ */ #define LEAF(x) \ LEAF_NOPROFILE(x); \ - MCOUNT + _MIPS_ASM_MCOUNT(x) /* * STATIC_XLEAF @@ -241,7 +260,7 @@ _C_LABEL(x): ; \ */ #define NESTED(x, fsize, retpc) \ NESTED_NOPROFILE(x, fsize, retpc); \ - MCOUNT + _MIPS_ASM_MCOUNT(x) /* * STATIC_NESTED @@ -249,7 +268,7 @@ _C_LABEL(x): ; \ */ #define STATIC_NESTED(x, fsize, retpc) \ STATIC_NESTED_NOPROFILE(x, fsize, retpc); \ - MCOUNT + _MIPS_ASM_MCOUNT(x) /* * XNESTED