MipsAsmBackend.cpp revision 226584
1#include "MCTargetDesc/MipsMCTargetDesc.h"
2#include "llvm/ADT/Twine.h"
3#include "llvm/MC/MCAssembler.h"
4#include "llvm/MC/MCDirectives.h"
5#include "llvm/MC/MCELFObjectWriter.h"
6#include "llvm/MC/MCExpr.h"
7#include "llvm/MC/MCMachObjectWriter.h"
8#include "llvm/MC/MCObjectWriter.h"
9#include "llvm/MC/MCSectionELF.h"
10#include "llvm/MC/MCSectionMachO.h"
11#include "llvm/MC/MCAsmBackend.h"
12#include "llvm/MC/MCSubtargetInfo.h"
13#include "llvm/Object/MachOFormat.h"
14#include "llvm/Support/ELF.h"
15#include "llvm/Support/ErrorHandling.h"
16#include "llvm/Support/raw_ostream.h"
17using namespace llvm;
18
19namespace {
20class MipsELFObjectWriter : public MCELFObjectTargetWriter {
21public:
22  MipsELFObjectWriter(bool is64Bit, Triple::OSType OSType, uint16_t EMachine,
23                      bool HasRelocationAddend)
24    : MCELFObjectTargetWriter(is64Bit, OSType, EMachine,
25                              HasRelocationAddend) {}
26};
27
28class MipsAsmBackend : public MCAsmBackend {
29public:
30  MipsAsmBackend(const Target &T)
31    : MCAsmBackend() {}
32
33  unsigned getNumFixupKinds() const {
34    return 1;   //tbd
35  }
36
37  /// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided
38  /// data fragment, at the offset specified by the fixup and following the
39  /// fixup kind as appropriate.
40  void ApplyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
41                  uint64_t Value) const {
42  }
43
44  /// @name Target Relaxation Interfaces
45  /// @{
46
47  /// MayNeedRelaxation - Check whether the given instruction may need
48  /// relaxation.
49  ///
50  /// \param Inst - The instruction to test.
51  bool MayNeedRelaxation(const MCInst &Inst) const {
52    return false;
53  }
54
55  /// RelaxInstruction - Relax the instruction in the given fragment to the next
56  /// wider instruction.
57  ///
58  /// \param Inst - The instruction to relax, which may be the same as the
59  /// output.
60  /// \parm Res [output] - On return, the relaxed instruction.
61  void RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
62  }
63
64  /// @}
65
66  /// WriteNopData - Write an (optimal) nop sequence of Count bytes to the given
67  /// output. If the target cannot generate such a sequence, it should return an
68  /// error.
69  ///
70  /// \return - True on success.
71  bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const {
72    return false;
73  }
74};
75
76class MipsEB_AsmBackend : public MipsAsmBackend {
77public:
78  Triple::OSType OSType;
79
80  MipsEB_AsmBackend(const Target &T, Triple::OSType _OSType)
81    : MipsAsmBackend(T), OSType(_OSType) {}
82
83  MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
84    return createELFObjectWriter(createELFObjectTargetWriter(),
85                                 OS, /*IsLittleEndian*/ false);
86  }
87
88  MCELFObjectTargetWriter *createELFObjectTargetWriter() const {
89    return new MipsELFObjectWriter(false, OSType, ELF::EM_MIPS, false);
90  }
91};
92
93class MipsEL_AsmBackend : public MipsAsmBackend {
94public:
95  Triple::OSType OSType;
96
97  MipsEL_AsmBackend(const Target &T, Triple::OSType _OSType)
98    : MipsAsmBackend(T), OSType(_OSType) {}
99
100  MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
101    return createELFObjectWriter(createELFObjectTargetWriter(),
102                                 OS, /*IsLittleEndian*/ true);
103  }
104
105  MCELFObjectTargetWriter *createELFObjectTargetWriter() const {
106    return new MipsELFObjectWriter(false, OSType, ELF::EM_MIPS, false);
107  }
108};
109}
110
111MCAsmBackend *llvm::createMipsAsmBackend(const Target &T, StringRef TT) {
112  Triple TheTriple(TT);
113
114  // just return little endian for now
115  //
116  return new MipsEL_AsmBackend(T, Triple(TT).getOS());
117}
118