[Mips] Fix wrong ELF FP ABI info when inline asm was empty (#146457)

When Mips process emitStartOfAsmFile and updateABIInfo, it did not know
the real value of IsSoftFloat and STI.useSoftFloat(). And when inline
asm instruction was empty, Mips did not process asm parser, so it would
not do TS.updateABIInfo(STI) again and at this time the value of
IsSoftFloat is correct.

Fix #135283.

(cherry picked from commit 778fb76e6308534a63239a91b98f5dad055f6fdb)
This commit is contained in:
yingopq 2025-07-28 09:07:51 +08:00 committed by Tobias Hieta
parent 949c6cc95a
commit bde97f2cef
2 changed files with 18 additions and 2 deletions

View File

@ -747,14 +747,18 @@ void MipsAsmPrinter::emitStartOfAsmFile(Module &M) {
if (FS.empty() && M.size() && F->hasFnAttribute("target-features"))
FS = F->getFnAttribute("target-features").getValueAsString();
std::string strFS = FS.str();
if (M.size() && F->getFnAttribute("use-soft-float").getValueAsBool())
strFS += strFS.empty() ? "+soft-float" : ",+soft-float";
// Compute MIPS architecture attributes based on the default subtarget
// that we'd have constructed.
// FIXME: For ifunc related functions we could iterate over and look
// for a feature string that doesn't match the default one.
StringRef CPU = MIPS_MC::selectMipsCPU(TT, TM.getTargetCPU());
const MipsTargetMachine &MTM = static_cast<const MipsTargetMachine &>(TM);
const MipsSubtarget STI(TT, CPU, FS, MTM.isLittleEndian(), MTM,
std::nullopt);
const MipsSubtarget STI(TT, CPU, StringRef(strFS), MTM.isLittleEndian(),
MTM, std::nullopt);
bool IsABICalls = STI.isABICalls();
const MipsABIInfo &ABI = MTM.getABI();

View File

@ -0,0 +1,12 @@
; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32 %s -o tmp.o
; RUN: llvm-readobj -A tmp.o | FileCheck %s -check-prefix=OBJ
; RUN: llc -filetype=asm -mtriple mipsel-unknown-linux -mcpu=mips32 %s -o - | \
; RUN: FileCheck %s -check-prefix=ASM
; OBJ: FP ABI: Soft float
; ASM: .module softfloat
define dso_local void @asm_is_null() "use-soft-float"="true" {
call void asm sideeffect "", ""()
ret void
}