diff --git a/linker/linker_mips.cpp b/linker/linker_mips.cpp index 75ea29042..4dc97c8bd 100644 --- a/linker/linker_mips.cpp +++ b/linker/linker_mips.cpp @@ -264,10 +264,18 @@ bool soinfo::mips_check_and_adjust_fp_modes() { // FP ABI-variant compatibility checks for MIPS o32 ABI if (abiflags == nullptr) { - // Old compiles lack the new abiflags section. - // These compilers used -mfp32 -mdouble-float -modd-spreg defaults, - // ie FP32 aka DOUBLE, using odd-numbered single-prec regs - mips_fpabi = MIPS_ABI_FP_DOUBLE; + // Old compilers and some translators don't emit the new abiflags section. + const char* filename = get_realpath(); + size_t len = strlen(filename); + if (len > 4 && (strcmp(filename+len-4, ".dex") == 0 || + strcmp(filename+len-4, ".oat") == 0 )) { + // Assume dex2oat is compatible with target + mips_fpabi = MIPS_ABI_FP_XX; + } else { + // Old Android compilers used -mfp32 -mdouble-float -modd-spreg defaults, + // ie FP32 aka DOUBLE, using FR=0 mode fpregs & odd single-prec fpregs + mips_fpabi = MIPS_ABI_FP_DOUBLE; + } } else { mips_fpabi = abiflags->fp_abi; if ( (abiflags->flags1 & MIPS_AFL_FLAGS1_ODDSPREG)