[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