[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:
parent
949c6cc95a
commit
bde97f2cef
@ -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();
|
||||
|
12
llvm/test/CodeGen/Mips/abiflags-soft-float.ll
Normal file
12
llvm/test/CodeGen/Mips/abiflags-soft-float.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user