forked from OSchip/llvm-project
[Mips] TargetStreamer Support for .set mips16.
This patch updates .set mips16 support which affects the ELF ABI and its flags. In addition the patch uses a common interface for both the MipsTargetSteamer and MipsObjectStreamer that the assembler uses for both ELF and ASCII output for these directives. llvm-svn: 199851
This commit is contained in:
parent
8c7bd6ac1a
commit
39536724a7
|
@ -203,6 +203,8 @@ class MipsAsmParser : public MCTargetAsmParser {
|
|||
bool parseSetNoMacroDirective();
|
||||
bool parseSetReorderDirective();
|
||||
bool parseSetNoReorderDirective();
|
||||
bool parseSetMips16Directive();
|
||||
bool parseSetNoMips16Directive();
|
||||
|
||||
bool parseSetAssignment();
|
||||
|
||||
|
@ -2341,6 +2343,30 @@ bool MipsAsmParser::parseSetNoMacroDirective() {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetMips16Directive() {
|
||||
Parser.Lex();
|
||||
// If this is not the end of the statement, report an error.
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
reportParseError("unexpected token in statement");
|
||||
return false;
|
||||
}
|
||||
getTargetStreamer().emitDirectiveSetMips16(true);
|
||||
Parser.Lex(); // Consume the EndOfStatement.
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetNoMips16Directive() {
|
||||
Parser.Lex();
|
||||
// If this is not the end of the statement, report an error.
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
reportParseError("unexpected token in statement");
|
||||
return false;
|
||||
}
|
||||
// For now do nothing.
|
||||
Parser.Lex(); // Consume the EndOfStatement.
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MipsAsmParser::parseSetAssignment() {
|
||||
StringRef Name;
|
||||
const MCExpr *Value;
|
||||
|
@ -2382,10 +2408,10 @@ bool MipsAsmParser::parseDirectiveSet() {
|
|||
return parseSetMacroDirective();
|
||||
} else if (Tok.getString() == "nomacro") {
|
||||
return parseSetNoMacroDirective();
|
||||
} else if (Tok.getString() == "mips16") {
|
||||
return parseSetMips16Directive();
|
||||
} else if (Tok.getString() == "nomips16") {
|
||||
// Ignore this directive for now.
|
||||
Parser.eatToEndOfStatement();
|
||||
return false;
|
||||
return parseSetNoMips16Directive();
|
||||
} else if (Tok.getString() == "nomicromips") {
|
||||
getTargetStreamer().emitDirectiveSetNoMicroMips();
|
||||
Parser.eatToEndOfStatement();
|
||||
|
|
|
@ -63,6 +63,12 @@ void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
|
|||
void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
|
||||
OS << "\t.option\tpic0\n";
|
||||
}
|
||||
void MipsTargetAsmStreamer::emitDirectiveSetMips16(bool IsMips16) {
|
||||
if (IsMips16)
|
||||
OS << "\t.set\tmips16\n";
|
||||
else
|
||||
OS << "\t.set\tnomips16\n";
|
||||
}
|
||||
|
||||
// This part is for ELF object output.
|
||||
MipsTargetELFStreamer::MipsTargetELFStreamer() : MicroMipsEnabled(false) {}
|
||||
|
@ -122,3 +128,13 @@ void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
|
|||
Flags &= ~ELF::EF_MIPS_PIC;
|
||||
MCA.setELFHeaderEFlags(Flags);
|
||||
}
|
||||
void MipsTargetELFStreamer::emitDirectiveSetMips16(bool IsMips16) {
|
||||
// Don't do anything for .set nomips16
|
||||
if (!IsMips16)
|
||||
return;
|
||||
|
||||
MCAssembler &MCA = getStreamer().getAssembler();
|
||||
unsigned Flags = MCA.getELFHeaderEFlags();
|
||||
Flags |= ELF::EF_MIPS_ARCH_ASE_M16;
|
||||
MCA.setELFHeaderEFlags(Flags);
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ public:
|
|||
virtual void emitDirectiveEnt(const MCSymbol &Symbol) = 0;
|
||||
virtual void emitDirectiveAbiCalls() = 0;
|
||||
virtual void emitDirectiveOptionPic0() = 0;
|
||||
virtual void emitDirectiveSetMips16(bool IsMips16) = 0;
|
||||
};
|
||||
|
||||
// This part is for ascii assembly output
|
||||
|
@ -42,11 +43,13 @@ public:
|
|||
virtual void emitDirectiveEnt(const MCSymbol &Symbol);
|
||||
virtual void emitDirectiveAbiCalls();
|
||||
virtual void emitDirectiveOptionPic0();
|
||||
virtual void emitDirectiveSetMips16(bool IsMips16);
|
||||
};
|
||||
|
||||
// This part is for ELF object output
|
||||
class MipsTargetELFStreamer : public MipsTargetStreamer {
|
||||
bool MicroMipsEnabled;
|
||||
|
||||
public:
|
||||
bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
|
||||
MCELFStreamer &getStreamer();
|
||||
|
@ -63,6 +66,7 @@ public:
|
|||
virtual void emitDirectiveEnt(const MCSymbol &Symbol);
|
||||
virtual void emitDirectiveAbiCalls();
|
||||
virtual void emitDirectiveOptionPic0();
|
||||
virtual void emitDirectiveSetMips16(bool IsMips16);
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -5,8 +5,11 @@
|
|||
|
||||
.mips_hack_elf_flags 0x50001003
|
||||
|
||||
// CHECK: Flags [ (0x50001005)
|
||||
// CHECK: Flags [ (0x54001005)
|
||||
|
||||
.abicalls
|
||||
|
||||
.option pic0
|
||||
|
||||
// Set EF_MIPS_ARCH_ASE_M16 (0x04000000)
|
||||
.set mips16
|
||||
|
|
Loading…
Reference in New Issue