Merge "[MIPS] Link .dex or .oat code lacking .MIPS.abiflags segment"
diff --git a/linker/linker_mips.cpp b/linker/linker_mips.cpp
index 75ea290..4dc97c8 100644
--- a/linker/linker_mips.cpp
+++ b/linker/linker_mips.cpp
@@ -264,10 +264,18 @@
// 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)