[PATCH v3 2/6] mips: Adapt mcount for microMIPSr6

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Wed Sep 17 21:04:05 GMT 2025



On 03/09/25 10:53, Jovan Dmitrovic wrote:
> Changes a few MIPS instructions in the mcount function to appropriate
> microMIPSr6 counterparts.
> ---
>  sysdeps/mips/machine-gmon.h | 84 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 84 insertions(+)
> 
> diff --git a/sysdeps/mips/machine-gmon.h b/sysdeps/mips/machine-gmon.h
> index 1f9af72d6b..5537f40288 100644
> --- a/sysdeps/mips/machine-gmon.h
> +++ b/sysdeps/mips/machine-gmon.h
> @@ -17,6 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #include <sgidefs.h>
> +#include <sysdep.h>
>  
>  #define _MCOUNT_DECL(frompc,selfpc) \
>  static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
> @@ -34,6 +35,43 @@ static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
>  # define CPRESTORE
>  #endif
>  
> +#if __mips_isa_rev > 5 && defined (__mips_micromips)

Is this really supported? Trying to configure a glibc with -march=mips64r6 -mmicromips
fails with:

configure:3513: mipsisa64r6el-glibc-linux-gnu-gcc -mabi=32 -mmicromips -c   conftest.c >&5
/tmp/cc6eaB4J.s: Assembler messages:
/tmp/cc6eaB4J.s:11: Fatal error: `micromips' cannot be used with `mips64r6'
configure:3517: $? = 1

with ld 2.44.50.20250120.

What am I missing here?

> +#define MCOUNT asm(\
> +	".globl _mcount;\n\t" \
> +	".align 2;\n\t" \
> +	".set push;\n\t" \
> +	".set nomips16;\n\t" \
> +	".type _mcount,@function;\n\t" \
> +	".ent _mcount\n\t" \
> +        "_mcount:\n\t" \
> +        ".frame $sp,44,$31\n\t" \
> +        ".set noreorder;\n\t" \
> +        ".set noat;\n\t" \
> +        CPLOAD \
> +	"subu $29,$29,48;\n\t" \
> +	CPRESTORE \
> +        "sw $4,24($29);\n\t" \
> +        "sw $5,28($29);\n\t" \
> +        "sw $6,32($29);\n\t" \
> +        "sw $7,36($29);\n\t" \
> +        "sw $2,40($29);\n\t" \
> +        "sw $1,16($29);\n\t" \
> +        "sw $31,20($29);\n\t" \
> +        "move $5,$31;\n\t" \
> +        "move $4,$1;\n\t" \
> +        "balc __mcount;\n\t" \
> +        "lw $4,24($29);\n\t" \
> +        "lw $5,28($29);\n\t" \
> +        "lw $6,32($29);\n\t" \
> +        "lw $7,36($29);\n\t" \
> +        "lw $2,40($29);\n\t" \
> +        "lw $1,20($29);\n\t" \
> +        "lw $31,16($29);\n\t" \
> +        "addu $29,$29,56;\n\t" \
> +        "jrc $1;\n\t" \
> +	".end _mcount;\n\t" \
> +	".set pop");
> +#else
>  #define MCOUNT asm(\
>  	".globl _mcount;\n\t" \
>  	".align 2;\n\t" \
> @@ -71,6 +109,7 @@ static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
>          "move $31,$1;\n\t" \
>  	".end _mcount;\n\t" \
>  	".set pop");
> +#endif
>  
>  #else
>  
> @@ -97,6 +136,50 @@ static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
>  # error "Unknown ABI"
>  #endif
>  
> +#if __mips_isa_rev > 5 && defined (__mips_micromips)
> +#define MCOUNT asm(\
> +	".globl _mcount;\n\t" \
> +	".align 3;\n\t" \
> +	".set push;\n\t" \
> +	".set nomips16;\n\t" \
> +	".type _mcount,@function;\n\t" \
> +	".ent _mcount\n\t" \
> +        "_mcount:\n\t" \
> +        ".frame $sp,88,$31\n\t" \
> +        ".set noat;\n\t" \
> +        PTR_SUBU_STRING " $29,$29,96;\n\t" \
> +        CPSETUP \
> +        "sd $4,24($29);\n\t" \
> +        "sd $5,32($29);\n\t" \
> +        "sd $6,40($29);\n\t" \
> +        "sd $7,48($29);\n\t" \
> +        "sd $8,56($29);\n\t" \
> +        "sd $9,64($29);\n\t" \
> +        "sd $10,72($29);\n\t" \
> +        "sd $11,80($29);\n\t" \
> +        "sd $2,16($29);\n\t" \
> +        "sd $1,0($29);\n\t" \
> +        "sd $31,8($29);\n\t" \
> +        "move $5,$31;\n\t" \
> +        "move $4,$1;\n\t" \
> +        "balc __mcount;\n\t" \
> +        "ld $4,24($29);\n\t" \
> +        "ld $5,32($29);\n\t" \
> +        "ld $6,40($29);\n\t" \
> +        "ld $7,48($29);\n\t" \
> +        "ld $8,56($29);\n\t" \
> +        "ld $9,64($29);\n\t" \
> +        "ld $10,72($29);\n\t" \
> +        "ld $11,80($29);\n\t" \
> +        "ld $2,16($29);\n\t" \
> +        "ld $1,8($29);\n\t" \
> +        "ld $31,0($29);\n\t" \
> +        CPRETURN \
> +        PTR_ADDU_STRING " $29,$29,96;\n\t" \
> +        "jrc $1;\n\t" \
> +	".end _mcount;\n\t" \
> +	".set pop");
> +#else
>  #define MCOUNT asm(\
>  	".globl _mcount;\n\t" \
>  	".align 3;\n\t" \
> @@ -142,5 +225,6 @@ static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
>          "move $31,$1;\n\t" \
>  	".end _mcount;\n\t" \
>  	".set pop");
> +#endif
>  
>  #endif



More information about the Libc-alpha mailing list