diff options
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/Mips/AsmParser/MipsAsmFlags.h | 53 | ||||
-rw-r--r-- | lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 19 | ||||
-rw-r--r-- | lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp | 21 | ||||
-rw-r--r-- | lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h | 2 | ||||
-rw-r--r-- | lib/Target/Mips/MipsAsmPrinter.cpp | 4 |
5 files changed, 95 insertions, 4 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); diff --git a/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp b/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp index cfcb877..144cb1e 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp @@ -7,6 +7,7 @@ // //===-------------------------------------------------------------------===// #include "MCTargetDesc/MipsELFStreamer.h" +#include "AsmParser/MipsAsmFlags.h" #include "MipsSubtarget.h" #include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCELF.h" @@ -66,10 +67,26 @@ namespace llvm { Reloc::Model RM = Subtarget.getRelocationModel(); if (RM == Reloc::PIC_ || RM == Reloc::Default) EFlags |= ELF::EF_MIPS_PIC; - else if (RM == Reloc::Static) + + MCA.setELFHeaderEFlags(EFlags); + } + + // For llvm-mc. Set a group of ELF header flags + void MipsELFStreamer::emitELFHeaderFlagsAsm(const MipsMCAsmFlags &Flags) { + + // Update e_header flags + MCAssembler &MCA = getAssembler(); + unsigned EFlags = MCA.getELFHeaderEFlags(); + + // Relocation Model + if (Flags.isModelCpic() || Flags.isModelDefault()) + EFlags |= ELF::EF_MIPS_CPIC; + if (Flags.isModelStatic()) ; // Do nothing for Reloc::Static + else if (Flags.isModelPic() || Flags.isModelDefault()) + EFlags |= ELF::EF_MIPS_PIC; else - llvm_unreachable("Unsupported relocation model for e_flags"); + assert(0 && "Unsupported relocation model for e_flags"); MCA.setELFHeaderEFlags(EFlags); } diff --git a/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h b/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h index b10ccc7..9987f34 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h +++ b/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h @@ -13,6 +13,7 @@ namespace llvm { class MipsAsmPrinter; +class MipsMCAsmFlags; class MipsSubtarget; class MCSymbol; @@ -26,6 +27,7 @@ public: ~MipsELFStreamer() {} void emitELFHeaderFlagsCG(const MipsSubtarget &Subtarget); + void emitELFHeaderFlagsAsm(const MipsMCAsmFlags &MAFlags); void emitMipsSTOCG(const MipsSubtarget &Subtarget, MCSymbol *Sym, unsigned Val); diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp index 1dc3326..b12cb62 100644 --- a/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/MipsAsmPrinter.cpp @@ -594,8 +594,8 @@ void MipsAsmPrinter::EmitEndOfAsmFile(Module &M) { // Emit Mips ELF register info Subtarget->getMReginfo().emitMipsReginfoSectionCG( OutStreamer, getObjFileLowering(), *Subtarget); - if (MipsELFStreamer *MES = dyn_cast<MipsELFStreamer>(&OutStreamer)) - MES->emitELFHeaderFlagsCG(*Subtarget); + MipsELFStreamer *MES = cast<MipsELFStreamer>(&OutStreamer); + MES->emitELFHeaderFlagsCG(*Subtarget); } void MipsAsmPrinter::PrintDebugValueComment(const MachineInstr *MI, |