Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -1900,6 +1900,11 @@ return true; } + // We know we emitted an instruction on the MER_NotAMacro or MER_Success path. + // If we're in microMIPS mode then we must also set EF_MIPS_MICROMIPS. + if (inMicroMipsMode()) + TOut.setUsesMicroMips(); + // If this instruction has a delay slot and .set reorder is active, // emit a NOP after it. if (FillDelaySlot) { @@ -5289,6 +5294,7 @@ getTargetStreamer().emitDirectiveSetDsp(); break; case Mips::FeatureMicroMips: + setFeatureBits(Mips::FeatureMicroMips, "micromips"); getTargetStreamer().emitDirectiveSetMicroMips(); break; case Mips::FeatureMips1: @@ -5587,6 +5593,7 @@ } else if (Tok.getString() == "nomips16") { return parseSetNoMips16Directive(); } else if (Tok.getString() == "nomicromips") { + clearFeatureBits(Mips::FeatureMicroMips, "micromips"); getTargetStreamer().emitDirectiveSetNoMicroMips(); Parser.eatToEndOfStatement(); return false; Index: lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -40,6 +40,7 @@ } void MipsTargetStreamer::emitDirectiveSetMicroMips() {} void MipsTargetStreamer::emitDirectiveSetNoMicroMips() {} +void MipsTargetStreamer::setUsesMicroMips() {} void MipsTargetStreamer::emitDirectiveSetMips16() {} void MipsTargetStreamer::emitDirectiveSetNoMips16() { forbidModuleDirective(); } void MipsTargetStreamer::emitDirectiveSetReorder() { forbidModuleDirective(); } @@ -830,11 +831,6 @@ void MipsTargetELFStreamer::emitDirectiveSetMicroMips() { MicroMipsEnabled = true; - - MCAssembler &MCA = getStreamer().getAssembler(); - unsigned Flags = MCA.getELFHeaderEFlags(); - Flags |= ELF::EF_MIPS_MICROMIPS; - MCA.setELFHeaderEFlags(Flags); forbidModuleDirective(); } @@ -843,6 +839,13 @@ forbidModuleDirective(); } +void MipsTargetELFStreamer::setUsesMicroMips() { + MCAssembler &MCA = getStreamer().getAssembler(); + unsigned Flags = MCA.getELFHeaderEFlags(); + Flags |= ELF::EF_MIPS_MICROMIPS; + MCA.setELFHeaderEFlags(Flags); +} + void MipsTargetELFStreamer::emitDirectiveSetMips16() { MCAssembler &MCA = getStreamer().getAssembler(); unsigned Flags = MCA.getELFHeaderEFlags(); Index: lib/Target/Mips/MipsTargetStreamer.h =================================================================== --- lib/Target/Mips/MipsTargetStreamer.h +++ lib/Target/Mips/MipsTargetStreamer.h @@ -30,6 +30,7 @@ virtual void emitDirectiveSetMicroMips(); virtual void emitDirectiveSetNoMicroMips(); + virtual void setUsesMicroMips(); virtual void emitDirectiveSetMips16(); virtual void emitDirectiveSetNoMips16(); @@ -290,6 +291,7 @@ void emitDirectiveSetMicroMips() override; void emitDirectiveSetNoMicroMips() override; + void setUsesMicroMips() override; void emitDirectiveSetMips16() override; void emitDirectiveSetNoReorder() override; Index: test/MC/Mips/elf_eflags_micromips.s =================================================================== --- test/MC/Mips/elf_eflags_micromips.s +++ test/MC/Mips/elf_eflags_micromips.s @@ -1,7 +1,12 @@ -# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 %s -o -| llvm-readobj -h | FileCheck %s +# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 \ +# RUN: -mattr=+micromips < /dev/null -o -| llvm-readobj -h | FileCheck \ +# RUN: -check-prefix=NO-MM %s +# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 %s -o - \ +# RUN: | llvm-readobj -h | FileCheck %s # This *MUST* match the output of 'gcc -c' compiled with the same triple. # CHECK: Flags [ (0x52001004) +# NO-MM: Flags [ (0x50001004) .set micromips f: Index: test/MC/Mips/elf_eflags_micromips2.s =================================================================== --- /dev/null +++ test/MC/Mips/elf_eflags_micromips2.s @@ -0,0 +1,11 @@ +# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 %s -o - \ +# RUN: | llvm-readobj -h | FileCheck %s + +# This *MUST* match the output of 'gcc -c' compiled with the same triple. +# The microMIPS flag is not set if no microMIPS code was emitted. +# CHECK: Flags [ (0x50001004) + + nop + .set micromips + .set nomicromips + nop