aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/Mips/AsmParser
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/Mips/AsmParser')
-rw-r--r--lib/Target/Mips/AsmParser/MipsAsmFlags.h53
-rw-r--r--lib/Target/Mips/AsmParser/MipsAsmParser.cpp19
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);