Skip to content

Commit cda908a

Browse files
committedMay 16, 2016
[mips][ias] EF_MIPS_MICROMIPS should iff microMIPS code was emitted.
Summary: This fixes PR27682. Additionally, '.set micromips' by itself is not sufficient to raise the EF_MIPS_MICROMIPS flag. It is also necessary to emit a microMIPS instruction. This has also been fixed. Reviewers: sdardis, vkalintiris, rafael Subscribers: rafael, dsanders, sdardis, llvm-commits Differential Revision: http://reviews.llvm.org/D20214 llvm-svn: 269639
1 parent 367577a commit cda908a

File tree

5 files changed

+34
-6
lines changed

5 files changed

+34
-6
lines changed
 

‎llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,6 +1900,11 @@ bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,
19001900
return true;
19011901
}
19021902

1903+
// We know we emitted an instruction on the MER_NotAMacro or MER_Success path.
1904+
// If we're in microMIPS mode then we must also set EF_MIPS_MICROMIPS.
1905+
if (inMicroMipsMode())
1906+
TOut.setUsesMicroMips();
1907+
19031908
// If this instruction has a delay slot and .set reorder is active,
19041909
// emit a NOP after it.
19051910
if (FillDelaySlot) {
@@ -5288,6 +5293,7 @@ bool MipsAsmParser::parseSetFeature(uint64_t Feature) {
52885293
getTargetStreamer().emitDirectiveSetDsp();
52895294
break;
52905295
case Mips::FeatureMicroMips:
5296+
setFeatureBits(Mips::FeatureMicroMips, "micromips");
52915297
getTargetStreamer().emitDirectiveSetMicroMips();
52925298
break;
52935299
case Mips::FeatureMips1:
@@ -5586,6 +5592,7 @@ bool MipsAsmParser::parseDirectiveSet() {
55865592
} else if (Tok.getString() == "nomips16") {
55875593
return parseSetNoMips16Directive();
55885594
} else if (Tok.getString() == "nomicromips") {
5595+
clearFeatureBits(Mips::FeatureMicroMips, "micromips");
55895596
getTargetStreamer().emitDirectiveSetNoMicroMips();
55905597
Parser.eatToEndOfStatement();
55915598
return false;

‎llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ MipsTargetStreamer::MipsTargetStreamer(MCStreamer &S)
4040
}
4141
void MipsTargetStreamer::emitDirectiveSetMicroMips() {}
4242
void MipsTargetStreamer::emitDirectiveSetNoMicroMips() {}
43+
void MipsTargetStreamer::setUsesMicroMips() {}
4344
void MipsTargetStreamer::emitDirectiveSetMips16() {}
4445
void MipsTargetStreamer::emitDirectiveSetNoMips16() { forbidModuleDirective(); }
4546
void MipsTargetStreamer::emitDirectiveSetReorder() { forbidModuleDirective(); }
@@ -830,11 +831,6 @@ MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
830831

831832
void MipsTargetELFStreamer::emitDirectiveSetMicroMips() {
832833
MicroMipsEnabled = true;
833-
834-
MCAssembler &MCA = getStreamer().getAssembler();
835-
unsigned Flags = MCA.getELFHeaderEFlags();
836-
Flags |= ELF::EF_MIPS_MICROMIPS;
837-
MCA.setELFHeaderEFlags(Flags);
838834
forbidModuleDirective();
839835
}
840836

@@ -843,6 +839,13 @@ void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
843839
forbidModuleDirective();
844840
}
845841

842+
void MipsTargetELFStreamer::setUsesMicroMips() {
843+
MCAssembler &MCA = getStreamer().getAssembler();
844+
unsigned Flags = MCA.getELFHeaderEFlags();
845+
Flags |= ELF::EF_MIPS_MICROMIPS;
846+
MCA.setELFHeaderEFlags(Flags);
847+
}
848+
846849
void MipsTargetELFStreamer::emitDirectiveSetMips16() {
847850
MCAssembler &MCA = getStreamer().getAssembler();
848851
unsigned Flags = MCA.getELFHeaderEFlags();

‎llvm/lib/Target/Mips/MipsTargetStreamer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class MipsTargetStreamer : public MCTargetStreamer {
3030

3131
virtual void emitDirectiveSetMicroMips();
3232
virtual void emitDirectiveSetNoMicroMips();
33+
virtual void setUsesMicroMips();
3334
virtual void emitDirectiveSetMips16();
3435
virtual void emitDirectiveSetNoMips16();
3536

@@ -290,6 +291,7 @@ class MipsTargetELFStreamer : public MipsTargetStreamer {
290291

291292
void emitDirectiveSetMicroMips() override;
292293
void emitDirectiveSetNoMicroMips() override;
294+
void setUsesMicroMips() override;
293295
void emitDirectiveSetMips16() override;
294296

295297
void emitDirectiveSetNoReorder() override;

‎llvm/test/MC/Mips/elf_eflags_micromips.s

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 %s -o -| llvm-readobj -h | FileCheck %s
1+
# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 \
2+
# RUN: -mattr=+micromips < /dev/null -o -| llvm-readobj -h | FileCheck \
3+
# RUN: -check-prefix=NO-MM %s
4+
# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 %s -o - \
5+
# RUN: | llvm-readobj -h | FileCheck %s
26

37
# This *MUST* match the output of 'gcc -c' compiled with the same triple.
48
# CHECK: Flags [ (0x52001004)
9+
# NO-MM: Flags [ (0x50001004)
510

611
.set micromips
712
f:
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 %s -o - \
2+
# RUN: | llvm-readobj -h | FileCheck %s
3+
4+
# This *MUST* match the output of 'gcc -c' compiled with the same triple.
5+
# The microMIPS flag is not set if no microMIPS code was emitted.
6+
# CHECK: Flags [ (0x50001004)
7+
8+
nop
9+
.set micromips
10+
.set nomicromips
11+
nop

0 commit comments

Comments
 (0)
Please sign in to comment.