Disable the valgrind helpers which use MIPS floating point operations when floating point support is deactivated in the toolchain. The fix from this commit is not sufficient any more: https://sourceware.org/git/?p=valgrind.git;a=commitdiff;h=869fcf2f6739f17b4eff36ec68f8dca826c8afeb This fixes the following error message when compiling with a GCC 10 MIPS BE 32: --------------------------------------------------------- ../VEX/priv/guest_mips_helpers.c: In function 'mips_dirtyhelper_calculate_FCSR_fp32': ../VEX/priv/guest_mips_helpers.c:640:10: error: the register '$f21' cannot be clobbered in 'asm' for the current target 640 | ASM_VOLATILE_UNARY32_DOUBLE(round.w.d) | ^ --------------------------------------------------------- --- a/VEX/priv/guest_mips_helpers.c +++ b/VEX/priv/guest_mips_helpers.c @@ -617,6 +617,7 @@ extern UInt mips_dirtyhelper_calculate_F flt_op inst ) { UInt ret = 0; +#ifndef __mips_soft_float #if defined(__mips__) VexGuestMIPS32State* guest_state = (VexGuestMIPS32State*)gs; UInt loFsVal, hiFsVal, loFtVal, hiFtVal; @@ -699,6 +700,7 @@ extern UInt mips_dirtyhelper_calculate_F break; } #endif +#endif return ret; } @@ -708,6 +710,7 @@ extern UInt mips_dirtyhelper_calculate_F flt_op inst ) { UInt ret = 0; +#ifndef __mips_soft_float #if defined(__mips__) && ((__mips == 64) || \ (defined(__mips_isa_rev) && (__mips_isa_rev >= 2))) #if defined(VGA_mips32) @@ -860,6 +863,7 @@ extern UInt mips_dirtyhelper_calculate_F break; } #endif +#endif return ret; } --- a/coregrind/m_machine.c +++ b/coregrind/m_machine.c @@ -1828,6 +1828,7 @@ Bool VG_(machine_get_hwcaps)( void ) we are using alternative way to determine FP mode */ ULong result = 0; +#ifndef __mips_soft_float if (!VG_MINIMAL_SETJMP(env_unsup_insn)) { __asm__ volatile ( ".set push\n\t" @@ -1845,6 +1846,9 @@ Bool VG_(machine_get_hwcaps)( void ) fpmode = (result != 0x3FF0000000000000ull); } +#else + fpmode = 0; +#endif } if (fpmode != 0)