diff options
| author | Daniel Sanders <daniel.sanders@imgtec.com> | 2016-05-16 09:10:13 +0000 | 
|---|---|---|
| committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2016-05-16 09:10:13 +0000 | 
| commit | cda908a0b6bda12f9826c2f5fe66bcfd4dc0b5c7 (patch) | |
| tree | 94231bae36003158827b319973a81a7985fc3841 /llvm/lib | |
| parent | 367577aab9721ccdb46abe7b8bd3b5f9a01728a0 (diff) | |
| download | bcm5719-llvm-cda908a0b6bda12f9826c2f5fe66bcfd4dc0b5c7.tar.gz bcm5719-llvm-cda908a0b6bda12f9826c2f5fe66bcfd4dc0b5c7.zip  | |
[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
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp | 13 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsTargetStreamer.h | 2 | 
3 files changed, 17 insertions, 5 deletions
diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 71121fce35d..2c51a592eee 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -1900,6 +1900,11 @@ bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,      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) { @@ -5288,6 +5293,7 @@ bool MipsAsmParser::parseSetFeature(uint64_t Feature) {      getTargetStreamer().emitDirectiveSetDsp();      break;    case Mips::FeatureMicroMips: +    setFeatureBits(Mips::FeatureMicroMips, "micromips");      getTargetStreamer().emitDirectiveSetMicroMips();      break;    case Mips::FeatureMips1: @@ -5586,6 +5592,7 @@ bool MipsAsmParser::parseDirectiveSet() {    } else if (Tok.getString() == "nomips16") {      return parseSetNoMips16Directive();    } else if (Tok.getString() == "nomicromips") { +    clearFeatureBits(Mips::FeatureMicroMips, "micromips");      getTargetStreamer().emitDirectiveSetNoMicroMips();      Parser.eatToEndOfStatement();      return false; diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp index c6bb84d3b02..b24d7ae596f 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -40,6 +40,7 @@ MipsTargetStreamer::MipsTargetStreamer(MCStreamer &S)  }  void MipsTargetStreamer::emitDirectiveSetMicroMips() {}  void MipsTargetStreamer::emitDirectiveSetNoMicroMips() {} +void MipsTargetStreamer::setUsesMicroMips() {}  void MipsTargetStreamer::emitDirectiveSetMips16() {}  void MipsTargetStreamer::emitDirectiveSetNoMips16() { forbidModuleDirective(); }  void MipsTargetStreamer::emitDirectiveSetReorder() { forbidModuleDirective(); } @@ -830,11 +831,6 @@ MCELFStreamer &MipsTargetELFStreamer::getStreamer() {  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 @@ void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {    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(); diff --git a/llvm/lib/Target/Mips/MipsTargetStreamer.h b/llvm/lib/Target/Mips/MipsTargetStreamer.h index d418f80916b..01eee489c70 100644 --- a/llvm/lib/Target/Mips/MipsTargetStreamer.h +++ b/llvm/lib/Target/Mips/MipsTargetStreamer.h @@ -30,6 +30,7 @@ public:    virtual void emitDirectiveSetMicroMips();    virtual void emitDirectiveSetNoMicroMips(); +  virtual void setUsesMicroMips();    virtual void emitDirectiveSetMips16();    virtual void emitDirectiveSetNoMips16(); @@ -290,6 +291,7 @@ public:    void emitDirectiveSetMicroMips() override;    void emitDirectiveSetNoMicroMips() override; +  void setUsesMicroMips() override;    void emitDirectiveSetMips16() override;    void emitDirectiveSetNoReorder() override;  | 

