MipsAsmBackend.cpp revision 226633
1264377Sdes#include "MCTargetDesc/MipsMCTargetDesc.h" 2225825Sdes#include "llvm/ADT/Twine.h" 3225825Sdes#include "llvm/MC/MCAssembler.h" 4225825Sdes#include "llvm/MC/MCDirectives.h" 5225825Sdes#include "llvm/MC/MCELFObjectWriter.h" 6225825Sdes#include "llvm/MC/MCExpr.h" 7225825Sdes#include "llvm/MC/MCMachObjectWriter.h" 8225825Sdes#include "llvm/MC/MCObjectWriter.h" 9225825Sdes#include "llvm/MC/MCSectionELF.h" 10225825Sdes#include "llvm/MC/MCSectionMachO.h" 11225825Sdes#include "llvm/MC/MCAsmBackend.h" 12225825Sdes#include "llvm/MC/MCSubtargetInfo.h" 13225825Sdes#include "llvm/Object/MachOFormat.h" 14225825Sdes#include "llvm/Support/ELF.h" 15225825Sdes#include "llvm/Support/ErrorHandling.h" 16225825Sdes#include "llvm/Support/raw_ostream.h" 17225825Sdesusing namespace llvm; 18225825Sdes 19225825Sdesnamespace { 20225825Sdesclass MipsELFObjectWriter : public MCELFObjectTargetWriter { 21225825Sdespublic: 22225825Sdes MipsELFObjectWriter(bool is64Bit, Triple::OSType OSType, uint16_t EMachine, 23225825Sdes bool HasRelocationAddend) 24225825Sdes : MCELFObjectTargetWriter(is64Bit, OSType, EMachine, 25225825Sdes HasRelocationAddend) {} 26225825Sdes}; 27240075Sdes 28225825Sdesclass MipsAsmBackend : public MCAsmBackend { 29225825Sdespublic: 30225825Sdes MipsAsmBackend(const Target &T) 31225825Sdes : MCAsmBackend() {} 32225825Sdes 33225825Sdes unsigned getNumFixupKinds() const { 34240075Sdes return 1; //tbd 35225825Sdes } 36225825Sdes 37225825Sdes /// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided 38225825Sdes /// data fragment, at the offset specified by the fixup and following the 39225825Sdes /// fixup kind as appropriate. 40225825Sdes void ApplyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, 41225825Sdes uint64_t Value) const { 42225825Sdes } 43225825Sdes 44225825Sdes /// @name Target Relaxation Interfaces 45225825Sdes /// @{ 46225825Sdes 47225825Sdes /// MayNeedRelaxation - Check whether the given instruction may need 48225825Sdes /// relaxation. 49225825Sdes /// 50225825Sdes /// \param Inst - The instruction to test. 51225825Sdes bool MayNeedRelaxation(const MCInst &Inst) const { 52225825Sdes return false; 53225825Sdes } 54225825Sdes 55225825Sdes /// RelaxInstruction - Relax the instruction in the given fragment to the next 56225825Sdes /// wider instruction. 57225825Sdes /// 58225825Sdes /// \param Inst - The instruction to relax, which may be the same as the 59225825Sdes /// output. 60255767Sdes /// \parm Res [output] - On return, the relaxed instruction. 61225825Sdes void RelaxInstruction(const MCInst &Inst, MCInst &Res) const { 62225825Sdes } 63225825Sdes 64240075Sdes /// @} 65225825Sdes 66225825Sdes /// WriteNopData - Write an (optimal) nop sequence of Count bytes to the given 67225825Sdes /// output. If the target cannot generate such a sequence, it should return an 68225825Sdes /// error. 69264377Sdes /// 70225825Sdes /// \return - True on success. 71225825Sdes bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const { 72225825Sdes return false; 73225825Sdes } 74225825Sdes}; 75225825Sdes 76225825Sdesclass MipsEB_AsmBackend : public MipsAsmBackend { 77225825Sdespublic: 78240075Sdes Triple::OSType OSType; 79225825Sdes 80225825Sdes MipsEB_AsmBackend(const Target &T, Triple::OSType _OSType) 81225825Sdes : MipsAsmBackend(T), OSType(_OSType) {} 82262566Sdes 83225825Sdes MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 84225825Sdes return createELFObjectWriter(createELFObjectTargetWriter(), 85225825Sdes OS, /*IsLittleEndian*/ false); 86225825Sdes } 87225825Sdes 88225825Sdes MCELFObjectTargetWriter *createELFObjectTargetWriter() const { 89225825Sdes return new MipsELFObjectWriter(false, OSType, ELF::EM_MIPS, false); 90240075Sdes } 91225825Sdes}; 92225825Sdes 93225825Sdesclass MipsEL_AsmBackend : public MipsAsmBackend { 94225825Sdespublic: 95225825Sdes Triple::OSType OSType; 96225825Sdes 97225825Sdes MipsEL_AsmBackend(const Target &T, Triple::OSType _OSType) 98225825Sdes : MipsAsmBackend(T), OSType(_OSType) {} 99240075Sdes 100240075Sdes MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 101240075Sdes return createELFObjectWriter(createELFObjectTargetWriter(), 102225825Sdes OS, /*IsLittleEndian*/ true); 103225825Sdes } 104225825Sdes 105225825Sdes MCELFObjectTargetWriter *createELFObjectTargetWriter() const { 106225825Sdes return new MipsELFObjectWriter(false, OSType, ELF::EM_MIPS, false); 107225825Sdes } 108225825Sdes}; 109240075Sdes} 110240075Sdes 111225825SdesMCAsmBackend *llvm::createMipsAsmBackend(const Target &T, StringRef TT) { 112225825Sdes Triple TheTriple(TT); 113240075Sdes 114225825Sdes // just return little endian for now 115240075Sdes // 116240075Sdes return new MipsEL_AsmBackend(T, Triple(TT).getOS()); 117240075Sdes} 118240075Sdes