[llvm] r199181 - Replace .mips_hack_stocg with ".set micromips" and ".set nomicromips".

Rafael Espindola rafael.espindola at gmail.com
Mon Jan 13 20:25:14 PST 2014


Author: rafael
Date: Mon Jan 13 22:25:13 2014
New Revision: 199181

URL: http://llvm.org/viewvc/llvm-project?rev=199181&view=rev
Log:
Replace .mips_hack_stocg with ".set micromips" and ".set nomicromips".

This matches what gnu as does and implementing this is easier than arguing
about it.

Modified:
    llvm/trunk/include/llvm/MC/MCStreamer.h
    llvm/trunk/lib/MC/MCStreamer.cpp
    llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
    llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
    llvm/trunk/lib/Target/Mips/MipsTargetStreamer.h
    llvm/trunk/test/MC/Mips/elf_st_other.ll
    llvm/trunk/test/MC/Mips/elf_st_other.s

Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=199181&r1=199180&r2=199181&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
+++ llvm/trunk/include/llvm/MC/MCStreamer.h Mon Jan 13 22:25:13 2014
@@ -71,6 +71,9 @@ protected:
 public:
   virtual ~MCTargetStreamer();
   void setStreamer(MCStreamer *S) { Streamer = S; }
+
+  // Allow a target to add behavior to the EmitLabel of MCStreamer.
+  virtual void emitLabel(MCSymbol *Symbol);
 };
 
 // FIXME: declared here because it is used from

Modified: llvm/trunk/lib/MC/MCStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=199181&r1=199180&r2=199181&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCStreamer.cpp Mon Jan 13 22:25:13 2014
@@ -24,6 +24,7 @@ using namespace llvm;
 
 // Pin the vtables to this file.
 MCTargetStreamer::~MCTargetStreamer() {}
+void MCTargetStreamer::emitLabel(MCSymbol *Symbol) {}
 void ARMTargetStreamer::anchor() {}
 
 MCStreamer::MCStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer)
@@ -214,6 +215,10 @@ void MCStreamer::EmitLabel(MCSymbol *Sym
   assert(getCurrentSection().first && "Cannot emit before setting section!");
   AssignSection(Symbol, getCurrentSection().first);
   LastSymbol = Symbol;
+
+  MCTargetStreamer *TS = getTargetStreamer();
+  if (TS)
+    TS->emitLabel(Symbol);
 }
 
 void MCStreamer::EmitDebugLabel(MCSymbol *Symbol) {

Modified: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp?rev=199181&r1=199180&r2=199181&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Mon Jan 13 22:25:13 2014
@@ -194,7 +194,6 @@ class MipsAsmParser : public MCTargetAsm
 
   bool isEvaluated(const MCExpr *Expr);
   bool parseDirectiveSet();
-  bool parseDirectiveMipsHackStocg();
   bool parseDirectiveMipsHackELFFlags();
   bool parseDirectiveOption();
 
@@ -2388,7 +2387,11 @@ bool MipsAsmParser::parseDirectiveSet()
     Parser.eatToEndOfStatement();
     return false;
   } else if (Tok.getString() == "nomicromips") {
-    // Ignore this directive for now.
+    getTargetStreamer().emitDirectiveSetNoMicroMips();
+    Parser.eatToEndOfStatement();
+    return false;
+  } else if (Tok.getString() == "micromips") {
+    getTargetStreamer().emitDirectiveSetMicroMips();
     Parser.eatToEndOfStatement();
     return false;
   } else {
@@ -2400,29 +2403,6 @@ bool MipsAsmParser::parseDirectiveSet()
   return true;
 }
 
-bool MipsAsmParser::parseDirectiveMipsHackStocg() {
-  MCAsmParser &Parser = getParser();
-  StringRef Name;
-  if (Parser.parseIdentifier(Name))
-    reportParseError("expected identifier");
-
-  MCSymbol *Sym = getContext().GetOrCreateSymbol(Name);
-  if (getLexer().isNot(AsmToken::Comma)) {
-    TokError("unexpected token");
-    return false;
-  }
-  Lex();
-
-  int64_t Flags = 0;
-  if (Parser.parseAbsoluteExpression(Flags)) {
-    TokError("unexpected token");
-    return false;
-  }
-
-  getTargetStreamer().emitMipsHackSTOCG(Sym, Flags);
-  return false;
-}
-
 bool MipsAsmParser::parseDirectiveMipsHackELFFlags() {
   int64_t Flags = 0;
   if (Parser.parseAbsoluteExpression(Flags)) {
@@ -2552,9 +2532,6 @@ bool MipsAsmParser::ParseDirective(AsmTo
     return false;
   }
 
-  if (IDVal == ".mips_hack_stocg")
-    return parseDirectiveMipsHackStocg();
-
   if (IDVal == ".mips_hack_elf_flags")
     return parseDirectiveMipsHackELFFlags();
 

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp?rev=199181&r1=199180&r2=199181&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp Mon Jan 13 22:25:13 2014
@@ -38,16 +38,15 @@ void MipsTargetAsmStreamer::emitMipsHack
   OS.write_hex(Flags);
   OS << '\n';
 }
-void MipsTargetAsmStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) {
-  if (!PrintHackDirectives)
-    return;
-
-  OS << "\t.mips_hack_stocg ";
-  OS << Sym->getName();
-  OS << ", ";
-  OS << Val;
-  OS << '\n';
+
+void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() {
+  OS << "\t.set\tmicromips\n";
+}
+
+void MipsTargetAsmStreamer::emitDirectiveSetNoMicroMips() {
+  OS << "\t.set\tnomicromips\n";
 }
+
 void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
 void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
   OS << "\t.option\tpic0\n";
@@ -56,6 +55,15 @@ void MipsTargetAsmStreamer::emitDirectiv
 // This part is for ELF object output.
 MipsTargetELFStreamer::MipsTargetELFStreamer() {}
 
+void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
+  MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Symbol);
+  // The "other" values are stored in the last 6 bits of the second byte
+  // The traditional defines for STO values assume the full byte and thus
+  // the shift to pack it.
+  if (isMicroMipsEnabled())
+    MCELF::setOther(Data, ELF::STO_MIPS_MICROMIPS >> 2);
+}
+
 MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
   return static_cast<MCELFStreamer &>(*Streamer);
 }
@@ -65,14 +73,14 @@ void MipsTargetELFStreamer::emitMipsHack
   MCA.setELFHeaderEFlags(Flags);
 }
 
-// Set a symbol's STO flags.
-void MipsTargetELFStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) {
-  MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Sym);
-  // The "other" values are stored in the last 6 bits of the second byte
-  // The traditional defines for STO values assume the full byte and thus
-  // the shift to pack it.
-  MCELF::setOther(Data, Val >> 2);
+void MipsTargetELFStreamer::emitDirectiveSetMicroMips() {
+  MicroMipsEnabled = true;
+}
+
+void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
+  MicroMipsEnabled = false;
 }
+
 void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
   MCAssembler &MCA = getStreamer().getAssembler();
   unsigned Flags = MCA.getELFHeaderEFlags();

Modified: llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp?rev=199181&r1=199180&r2=199181&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp Mon Jan 13 22:25:13 2014
@@ -265,6 +265,9 @@ const char *MipsAsmPrinter::getCurrentAB
 }
 
 void MipsAsmPrinter::EmitFunctionEntryLabel() {
+  if (Subtarget->inMicroMipsMode())
+    getTargetStreamer().emitDirectiveSetMicroMips();
+
   if (OutStreamer.hasRawTextSupport()) {
     if (Subtarget->inMips16Mode())
       OutStreamer.EmitRawText(StringRef("\t.set\tmips16"));
@@ -275,9 +278,6 @@ void MipsAsmPrinter::EmitFunctionEntryLa
     OutStreamer.EmitRawText("\t.ent\t" + Twine(CurrentFnSym->getName()));
   }
 
-  if (Subtarget->inMicroMipsMode())
-    getTargetStreamer().emitMipsHackSTOCG(CurrentFnSym,
-                                          (unsigned)ELF::STO_MIPS_MICROMIPS);
   OutStreamer.EmitLabel(CurrentFnSym);
 }
 

Modified: llvm/trunk/lib/Target/Mips/MipsTargetStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetStreamer.h?rev=199181&r1=199180&r2=199181&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsTargetStreamer.h (original)
+++ llvm/trunk/lib/Target/Mips/MipsTargetStreamer.h Mon Jan 13 22:25:13 2014
@@ -19,7 +19,8 @@ class MipsTargetStreamer : public MCTarg
 
 public:
   virtual void emitMipsHackELFFlags(unsigned Flags) = 0;
-  virtual void emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) = 0;
+  virtual void emitDirectiveSetMicroMips() = 0;
+  virtual void emitDirectiveSetNoMicroMips() = 0;
   virtual void emitDirectiveAbiCalls() = 0;
   virtual void emitDirectiveOptionPic0() = 0;
 };
@@ -31,19 +32,26 @@ class MipsTargetAsmStreamer : public Mip
 public:
   MipsTargetAsmStreamer(formatted_raw_ostream &OS);
   virtual void emitMipsHackELFFlags(unsigned Flags);
-  virtual void emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val);
+  virtual void emitDirectiveSetMicroMips();
+  virtual void emitDirectiveSetNoMicroMips();
   virtual void emitDirectiveAbiCalls();
   virtual void emitDirectiveOptionPic0();
 };
 
 // This part is for ELF object output
 class MipsTargetELFStreamer : public MipsTargetStreamer {
+  bool MicroMipsEnabled;
 public:
+  bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
   MCELFStreamer &getStreamer();
   MipsTargetELFStreamer();
+
+  virtual void emitLabel(MCSymbol *Symbol) LLVM_OVERRIDE;
+
   // FIXME: emitMipsHackELFFlags() will be removed from this class.
   virtual void emitMipsHackELFFlags(unsigned Flags);
-  virtual void emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val);
+  virtual void emitDirectiveSetMicroMips();
+  virtual void emitDirectiveSetNoMicroMips();
   virtual void emitDirectiveAbiCalls();
   virtual void emitDirectiveOptionPic0();
 };

Modified: llvm/trunk/test/MC/Mips/elf_st_other.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/elf_st_other.ll?rev=199181&r1=199180&r2=199181&view=diff
==============================================================================
--- llvm/trunk/test/MC/Mips/elf_st_other.ll (original)
+++ llvm/trunk/test/MC/Mips/elf_st_other.ll Mon Jan 13 22:25:13 2014
@@ -8,4 +8,5 @@ entry:
   ret i32 0
 }
 
-; CHECK:     .mips_hack_stocg main, 128
+; CHECK: .set	micromips
+; CHECK: main:

Modified: llvm/trunk/test/MC/Mips/elf_st_other.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/elf_st_other.s?rev=199181&r1=199180&r2=199181&view=diff
==============================================================================
--- llvm/trunk/test/MC/Mips/elf_st_other.s (original)
+++ llvm/trunk/test/MC/Mips/elf_st_other.s Mon Jan 13 22:25:13 2014
@@ -1,13 +1,17 @@
 // RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux %s -o -| llvm-readobj -t | FileCheck %s
 
-        .text
-        .globl  main
-        .align  2
-        .type   main, at function
-        .set    nomips16                # @main
-        .ent    main
-        .mips_hack_stocg main, 128
-main:
 
-// CHECK:     Name: main
-// CHECK:     Other: 128
+.globl f1
+.set micromips
+f1:
+	nop
+
+.globl f2
+.set nomicromips
+f2:
+	nop
+
+// CHECK-LABEL: Name: f1
+// CHECK:       Other: 128
+// CHECK-LABEL: Name: f2
+// CHECK:       Other: 0





More information about the llvm-commits mailing list