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