| #include "MCTargetDesc/MipsMCTargetDesc.h" | |
| #include "llvm/ADT/Twine.h" | |
| #include "llvm/MC/MCAssembler.h" | |
| #include "llvm/MC/MCDirectives.h" | |
| #include "llvm/MC/MCELFObjectWriter.h" | |
| #include "llvm/MC/MCExpr.h" | |
| #include "llvm/MC/MCMachObjectWriter.h" | |
| #include "llvm/MC/MCObjectWriter.h" | |
| #include "llvm/MC/MCSectionELF.h" | |
| #include "llvm/MC/MCSectionMachO.h" | |
| #include "llvm/MC/MCAsmBackend.h" | |
| #include "llvm/MC/MCSubtargetInfo.h" | |
| #include "llvm/Object/MachOFormat.h" | |
| #include "llvm/Support/ELF.h" | |
| #include "llvm/Support/ErrorHandling.h" | |
| #include "llvm/Support/raw_ostream.h" | |
| using namespace llvm; | |
| namespace { | |
| class MipsELFObjectWriter : public MCELFObjectTargetWriter { | |
| public: | |
| MipsELFObjectWriter(bool is64Bit, Triple::OSType OSType, uint16_t EMachine, | |
| bool HasRelocationAddend) | |
| : MCELFObjectTargetWriter(is64Bit, OSType, EMachine, | |
| HasRelocationAddend) {} | |
| }; | |
| class MipsAsmBackend : public MCAsmBackend { | |
| public: | |
| MipsAsmBackend(const Target &T) | |
| : MCAsmBackend() {} | |
| unsigned getNumFixupKinds() const { | |
| return 1; //tbd | |
| } | |
| /// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided | |
| /// data fragment, at the offset specified by the fixup and following the | |
| /// fixup kind as appropriate. | |
| void ApplyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, | |
| uint64_t Value) const { | |
| } | |
| /// @name Target Relaxation Interfaces | |
| /// @{ | |
| /// MayNeedRelaxation - Check whether the given instruction may need | |
| /// relaxation. | |
| /// | |
| /// \param Inst - The instruction to test. | |
| bool MayNeedRelaxation(const MCInst &Inst) const { | |
| return false; | |
| } | |
| /// RelaxInstruction - Relax the instruction in the given fragment to the next | |
| /// wider instruction. | |
| /// | |
| /// \param Inst - The instruction to relax, which may be the same as the | |
| /// output. | |
| /// \parm Res [output] - On return, the relaxed instruction. | |
| void RelaxInstruction(const MCInst &Inst, MCInst &Res) const { | |
| } | |
| /// @} | |
| /// WriteNopData - Write an (optimal) nop sequence of Count bytes to the given | |
| /// output. If the target cannot generate such a sequence, it should return an | |
| /// error. | |
| /// | |
| /// \return - True on success. | |
| bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const { | |
| return false; | |
| } | |
| }; | |
| class MipsEB_AsmBackend : public MipsAsmBackend { | |
| public: | |
| Triple::OSType OSType; | |
| MipsEB_AsmBackend(const Target &T, Triple::OSType _OSType) | |
| : MipsAsmBackend(T), OSType(_OSType) {} | |
| MCObjectWriter *createObjectWriter(raw_ostream &OS) const { | |
| return createELFObjectWriter(createELFObjectTargetWriter(), | |
| OS, /*IsLittleEndian*/ false); | |
| } | |
| MCELFObjectTargetWriter *createELFObjectTargetWriter() const { | |
| return new MipsELFObjectWriter(false, OSType, ELF::EM_MIPS, false); | |
| } | |
| }; | |
| class MipsEL_AsmBackend : public MipsAsmBackend { | |
| public: | |
| Triple::OSType OSType; | |
| MipsEL_AsmBackend(const Target &T, Triple::OSType _OSType) | |
| : MipsAsmBackend(T), OSType(_OSType) {} | |
| MCObjectWriter *createObjectWriter(raw_ostream &OS) const { | |
| return createELFObjectWriter(createELFObjectTargetWriter(), | |
| OS, /*IsLittleEndian*/ true); | |
| } | |
| MCELFObjectTargetWriter *createELFObjectTargetWriter() const { | |
| return new MipsELFObjectWriter(false, OSType, ELF::EM_MIPS, false); | |
| } | |
| }; | |
| } | |
| MCAsmBackend *llvm::createMipsAsmBackend(const Target &T, StringRef TT) { | |
| Triple TheTriple(TT); | |
| // just return little endian for now | |
| // | |
| return new MipsEL_AsmBackend(T, Triple(TT).getOS()); | |
| } |