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

Reply via email to