diff options
Diffstat (limited to 'lib/Target/Mips/AsmParser')
-rw-r--r-- | lib/Target/Mips/AsmParser/MipsAsmFlags.h | 53 | ||||
-rw-r--r-- | lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 19 |
2 files changed, 72 insertions, 0 deletions
diff --git a/lib/Target/Mips/AsmParser/MipsAsmFlags.h b/lib/Target/Mips/AsmParser/MipsAsmFlags.h new file mode 100644 index 0000000..bf141db --- /dev/null +++ b/lib/Target/Mips/AsmParser/MipsAsmFlags.h @@ -0,0 +1,53 @@ +//=== MipsMCAsmFlags.h - MipsMCAsmFlags --------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENCE.TXT for details. +// +//===-------------------------------------------------------------------===// +#ifndef MIPSMCASMFLAGS_H_ +#define MIPSMCASMFLAGS_H_ + +namespace llvm { +class MipsMCAsmFlags; + +// We have the flags apart from the ELF defines because state will determine +// the final values put into the ELF flag bits. +// +// Currently we have only Relocation Model, but will soon follow with ABI, +// Architecture, and ASE. +class MipsMCAsmFlags { +public: + // These act as bit flags because more that one can be + // active at the same time, sometimes ;-) + enum MAFRelocationModelTy { + MAF_RM_DEFAULT = 0, + MAF_RM_STATIC = 1, + MAF_RM_CPIC = 2, + MAF_RM_PIC = 4 + } MAFRelocationModel; + +public: + MipsMCAsmFlags() : Model(MAF_RM_DEFAULT) {} + + ~MipsMCAsmFlags() {} + + // Setting a bit we can later translate to the ELF header flags. + void setRelocationModel(unsigned RM) { (Model |= RM); } + + bool isModelCpic() const { return (Model & MAF_RM_CPIC) == MAF_RM_CPIC; } + bool isModelPic() const { return (Model & MAF_RM_PIC) == MAF_RM_PIC; } + bool isModelStatic() const { + return (Model & MAF_RM_STATIC) == MAF_RM_STATIC; + } + bool isModelDefault() const { + return (Model & MAF_RM_DEFAULT) == MAF_RM_DEFAULT; + } + +private: + unsigned Model; // pic, cpic, etc. +}; +} + +#endif /* MIPSMCASMFLAGS_H_ */ diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 447e7dc..c2e4bba 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); |