diff options
Diffstat (limited to 'lib/Target/Mips/AsmParser/MipsAsmParser.cpp')
-rw-r--r-- | lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 447e7dc6e1..c2e4bba87b 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +#include "AsmParser/MipsAsmFlags.h" +#include "MCTargetDesc/MipsELFStreamer.h" #include "MCTargetDesc/MipsMCTargetDesc.h" #include "MipsRegisterInfo.h" #include "llvm/ADT/StringSwitch.h" @@ -59,6 +61,7 @@ class MipsAsmParser : public MCTargetAsmParser { MCSubtargetInfo &STI; MCAsmParser &Parser; MipsAssemblerOptions Options; + MipsMCAsmFlags Flags; bool hasConsumedDollar; #define GET_ASSEMBLER_HEADER @@ -228,6 +231,8 @@ class MipsAsmParser : public MCTargetAsmParser { bool processInstruction(MCInst &Inst, SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions); + void emitEndOfAsmFile(MCStreamer &Out); + public: MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser, const MCInstrInfo &MII) @@ -2172,9 +2177,23 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) { return false; } + if (IDVal == ".abicalls") { + Flags.setRelocationModel(MipsMCAsmFlags::MAF_RM_CPIC); + if (Parser.getTok().isNot(AsmToken::EndOfStatement)) + return Error(Parser.getTok().getLoc(), "unexpected token in directive"); + return false; + } + return true; } +/// End of assembly processing such as updating ELF header flags. +void MipsAsmParser::emitEndOfAsmFile(MCStreamer &OutStreamer) { + if (MipsELFStreamer *MES = dyn_cast<MipsELFStreamer>(&OutStreamer)) + MES->emitELFHeaderFlagsAsm(Flags); + MCTargetAsmParser::emitEndOfAsmFile(OutStreamer); +} + extern "C" void LLVMInitializeMipsAsmParser() { RegisterMCAsmParser<MipsAsmParser> X(TheMipsTarget); RegisterMCAsmParser<MipsAsmParser> Y(TheMipselTarget); |