MipsAsmBackend.cpp revision 198ad916d736047f8a439f19dee25cee917df8a9
1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- MipsASMBackend.cpp - Mips Asm Backend  ----------------------------===//
247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//
347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//                     The LLVM Compiler Infrastructure
447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//
547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes// This file is distributed under the University of Illinois Open Source
647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes// License. See LICENSE.TXT for details.
747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//
847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//===----------------------------------------------------------------------===//
947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//
1047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes// This file implements the MipsAsmBackend and MipsELFObjectWriter classes.
1147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//
1247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//===----------------------------------------------------------------------===//
1347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//
1447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
1547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes#include "MipsFixupKinds.h"
1682ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "MCTargetDesc/MipsMCTargetDesc.h"
1747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes#include "llvm/MC/MCAsmBackend.h"
1882ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCAssembler.h"
1982ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCDirectives.h"
2082ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCELFObjectWriter.h"
21f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/MC/MCFixupKindInfo.h"
2282ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCObjectWriter.h"
2382ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCSubtargetInfo.h"
2482ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/Support/ErrorHandling.h"
2582ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/Support/raw_ostream.h"
26e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes
2782ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanakausing namespace llvm;
2882ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka
29e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes// Prepare value for the target space for it
3047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopesstatic unsigned adjustFixupValue(unsigned Kind, uint64_t Value) {
3147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
3247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  // Add/subtract and shift
3347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  switch (Kind) {
3447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  default:
35e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes    return 0;
36e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes  case FK_GPRel_4:
37e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes  case FK_Data_4:
38e2245bab3ca29dc2142d8f254005f4ae7c40cde2Jack Carter  case FK_Data_8:
39e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes  case Mips::fixup_Mips_LO16:
400140e55393c4403ab240c386501cdc5e438dcc0eJack Carter  case Mips::fixup_Mips_GPOFF_HI:
410140e55393c4403ab240c386501cdc5e438dcc0eJack Carter  case Mips::fixup_Mips_GPOFF_LO:
420140e55393c4403ab240c386501cdc5e438dcc0eJack Carter  case Mips::fixup_Mips_GOT_PAGE:
430140e55393c4403ab240c386501cdc5e438dcc0eJack Carter  case Mips::fixup_Mips_GOT_OFST:
44fd506efec628819f7e6fad8016a9dbb5d8612b8bJack Carter  case Mips::fixup_Mips_GOT_DISP:
45198ad916d736047f8a439f19dee25cee917df8a9Jack Carter  case Mips::fixup_Mips_GOT_LO16:
46198ad916d736047f8a439f19dee25cee917df8a9Jack Carter  case Mips::fixup_Mips_CALL_LO16:
4747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    break;
4847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  case Mips::fixup_Mips_PC16:
4947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // So far we are only using this type for branches.
5047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // For branches we start 1 instruction after the branch
5147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // so the displacement will be one instruction size less.
5247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    Value -= 4;
5347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // The displacement is then divided by 4 to give us an 18 bit
5447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // address range.
5547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    Value >>= 2;
5647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    break;
5747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  case Mips::fixup_Mips_26:
5847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // So far we are only using this type for jumps.
5947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // The displacement is then divided by 4 to give us an 28 bit
6047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // address range.
6147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    Value >>= 2;
6247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    break;
6384bfc2f090639f933df06cc675c4385511516befAkira Hatanaka  case Mips::fixup_Mips_HI16:
64e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes  case Mips::fixup_Mips_GOT_Local:
65198ad916d736047f8a439f19dee25cee917df8a9Jack Carter  case Mips::fixup_Mips_GOT_HI16:
66198ad916d736047f8a439f19dee25cee917df8a9Jack Carter  case Mips::fixup_Mips_CALL_HI16:
67fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    // Get the 2nd 16-bits. Also add 1 if bit 15 is 1.
68bca9c25dabbf50923319339ae780d6f916f56bfbAkira Hatanaka    Value = ((Value + 0x8000) >> 16) & 0xffff;
6984bfc2f090639f933df06cc675c4385511516befAkira Hatanaka    break;
70fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter  case Mips::fixup_Mips_HIGHER:
71fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    // Get the 3rd 16-bits.
72fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    Value = ((Value + 0x80008000LL) >> 32) & 0xffff;
73fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    break;
74fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter  case Mips::fixup_Mips_HIGHEST:
75fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    // Get the 4th 16-bits.
76fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    Value = ((Value + 0x800080008000LL) >> 48) & 0xffff;
77fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    break;
7847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  }
7947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
8047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  return Value;
8147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes}
8247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
8382ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanakanamespace {
8482ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanakaclass MipsAsmBackend : public MCAsmBackend {
85e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka  Triple::OSType OSType;
86e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka  bool IsLittle; // Big or little endian
87a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka  bool Is64Bit;  // 32 or 64 bit words
88e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka
8982ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanakapublic:
90a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka  MipsAsmBackend(const Target &T,  Triple::OSType _OSType,
91a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka                 bool _isLittle, bool _is64Bit)
92a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka    :MCAsmBackend(), OSType(_OSType), IsLittle(_isLittle), Is64Bit(_is64Bit) {}
93e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka
94e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka  MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
9539ae36337f87b1530c1680ae561c952c827d6e88Jack Carter    return createMipsELFObjectWriter(OS,
9639ae36337f87b1530c1680ae561c952c827d6e88Jack Carter      MCELFObjectTargetWriter::getOSABI(OSType), IsLittle, Is64Bit);
97e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka  }
984b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
99c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko  /// ApplyFixup - Apply the \p Value for given \p Fixup into the provided
1004b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// data fragment, at the offset specified by the fixup and following the
1014b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// fixup kind as appropriate.
102ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach  void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
1034b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka                  uint64_t Value) const {
104e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes    MCFixupKind Kind = Fixup.getKind();
105e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes    Value = adjustFixupValue((unsigned)Kind, Value);
10647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
1073ef7edc77ace78ba6382adb63c1ac03326d4a615Akira Hatanaka    if (!Value)
108e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes      return; // Doesn't change encoding.
10947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
110fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    // Where do we start in the object
11147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    unsigned Offset = Fixup.getOffset();
112fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    // Number of bytes we need to fixup
113fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    unsigned NumBytes = (getFixupKindInfo(Kind).TargetSize + 7) / 8;
114fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    // Used to point to big endian bytes
115fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    unsigned FullSize;
116fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka
1179be7c94ccd175c023c10ce3936a6dd374c7a952fCraig Topper    switch ((unsigned)Kind) {
118fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    case Mips::fixup_Mips_16:
119fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      FullSize = 2;
120fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      break;
121fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    case Mips::fixup_Mips_64:
122fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      FullSize = 8;
123fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      break;
124fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    default:
125fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      FullSize = 4;
126fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      break;
127fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    }
128e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes
129e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes    // Grab current value, if any, from bits.
130e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes    uint64_t CurVal = 0;
131e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes
132fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    for (unsigned i = 0; i != NumBytes; ++i) {
133fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      unsigned Idx = IsLittle ? i : (FullSize - 1 - i);
134fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      CurVal |= (uint64_t)((uint8_t)Data[Offset + Idx]) << (i*8);
135fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    }
136fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka
137864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka    uint64_t Mask = ((uint64_t)(-1) >>
138864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                     (64 - getFixupKindInfo(Kind).TargetSize));
1393ef7edc77ace78ba6382adb63c1ac03326d4a615Akira Hatanaka    CurVal |= Value & Mask;
140e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes
141fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka    // Write out the fixed up bytes back to the code/data bits.
142e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes    for (unsigned i = 0; i != NumBytes; ++i) {
143fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      unsigned Idx = IsLittle ? i : (FullSize - 1 - i);
144fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka      Data[Offset + Idx] = (uint8_t)((CurVal >> (i*8)) & 0xff);
14547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    }
146fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka  }
14747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
14847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  unsigned getNumFixupKinds() const { return Mips::NumTargetFixupKinds; }
14947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
15047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const {
15147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    const static MCFixupKindInfo Infos[Mips::NumTargetFixupKinds] = {
152e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes      // This table *must* be in same the order of fixup_* kinds in
15347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      // MipsFixupKinds.h.
15447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      //
15547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      // name                    offset  bits  flags
15647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_16",           0,     16,   0 },
15747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_32",           0,     32,   0 },
15847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_REL32",        0,     32,   0 },
15947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_26",           0,     26,   0 },
16047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_HI16",         0,     16,   0 },
16147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_LO16",         0,     16,   0 },
16247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_GPREL16",      0,     16,   0 },
16347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_LITERAL",      0,     16,   0 },
164e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes      { "fixup_Mips_GOT_Global",   0,     16,   0 },
165e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes      { "fixup_Mips_GOT_Local",    0,     16,   0 },
16647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_PC16",         0,     16,  MCFixupKindInfo::FKF_IsPCRel },
16747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_CALL16",       0,     16,   0 },
16847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_GPREL32",      0,     32,   0 },
16947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_SHIFT5",       6,      5,   0 },
17047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_SHIFT6",       6,      5,   0 },
17147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_64",           0,     64,   0 },
17247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_TLSGD",        0,     16,   0 },
17347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_GOTTPREL",     0,     16,   0 },
17447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_TPREL_HI",     0,     16,   0 },
17547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      { "fixup_Mips_TPREL_LO",     0,     16,   0 },
176bc24985c5ff01fc25336896c388bd8e4e02ffd95Akira Hatanaka      { "fixup_Mips_TLSLDM",       0,     16,   0 },
177bc24985c5ff01fc25336896c388bd8e4e02ffd95Akira Hatanaka      { "fixup_Mips_DTPREL_HI",    0,     16,   0 },
178bc24985c5ff01fc25336896c388bd8e4e02ffd95Akira Hatanaka      { "fixup_Mips_DTPREL_LO",    0,     16,   0 },
1790140e55393c4403ab240c386501cdc5e438dcc0eJack Carter      { "fixup_Mips_Branch_PCRel", 0,     16,  MCFixupKindInfo::FKF_IsPCRel },
1800140e55393c4403ab240c386501cdc5e438dcc0eJack Carter      { "fixup_Mips_GPOFF_HI",     0,     16,   0 },
1810140e55393c4403ab240c386501cdc5e438dcc0eJack Carter      { "fixup_Mips_GPOFF_LO",     0,     16,   0 },
1820140e55393c4403ab240c386501cdc5e438dcc0eJack Carter      { "fixup_Mips_GOT_PAGE",     0,     16,   0 },
183fd506efec628819f7e6fad8016a9dbb5d8612b8bJack Carter      { "fixup_Mips_GOT_OFST",     0,     16,   0 },
184fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter      { "fixup_Mips_GOT_DISP",     0,     16,   0 },
185fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter      { "fixup_Mips_HIGHER",       0,     16,   0 },
186198ad916d736047f8a439f19dee25cee917df8a9Jack Carter      { "fixup_Mips_HIGHEST",      0,     16,   0 },
187198ad916d736047f8a439f19dee25cee917df8a9Jack Carter      { "fixup_Mips_GOT_HI16",     0,     16,   0 },
188198ad916d736047f8a439f19dee25cee917df8a9Jack Carter      { "fixup_Mips_GOT_LO16",     0,     16,   0 },
189198ad916d736047f8a439f19dee25cee917df8a9Jack Carter      { "fixup_Mips_CALL_HI16",    0,     16,   0 },
190198ad916d736047f8a439f19dee25cee917df8a9Jack Carter      { "fixup_Mips_CALL_LO16",    0,     16,   0 }
19147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    };
19247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
19347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    if (Kind < FirstTargetFixupKind)
19447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes      return MCAsmBackend::getFixupKindInfo(Kind);
19547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
19647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() &&
19747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes           "Invalid kind!");
19847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    return Infos[Kind - FirstTargetFixupKind];
1994b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  }
2004b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
2014b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// @name Target Relaxation Interfaces
2024b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// @{
2034b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
2044b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// MayNeedRelaxation - Check whether the given instruction may need
2054b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// relaxation.
2064b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  ///
2074b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// \param Inst - The instruction to test.
208ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach  bool mayNeedRelaxation(const MCInst &Inst) const {
2094b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka    return false;
2104b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  }
2114b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
212370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach  /// fixupNeedsRelaxation - Target specific predicate for whether a given
213370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach  /// fixup requires the associated instruction to be relaxed.
214370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach  bool fixupNeedsRelaxation(const MCFixup &Fixup,
215370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach                            uint64_t Value,
216370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach                            const MCInstFragment *DF,
217370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach                            const MCAsmLayout &Layout) const {
218370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach    // FIXME.
219370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach    assert(0 && "RelaxInstruction() unimplemented");
2206482e9114954def43fc08e83aadec1aadfc64200NAKAMURA Takumi    return false;
221370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach  }
222370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach
22347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  /// RelaxInstruction - Relax the instruction in the given fragment
22447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  /// to the next wider instruction.
2254b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  ///
22647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  /// \param Inst - The instruction to relax, which may be the same
22747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  /// as the output.
22867c8978617c3bce9d07210f93f6c64c715f77695Dmitri Gribenko  /// \param [out] Res On return, the relaxed instruction.
229ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach  void relaxInstruction(const MCInst &Inst, MCInst &Res) const {
2304b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  }
231bb481f882093fb738d2bb15610c79364bada5496Jia Liu
2324b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// @}
2334b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
23447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  /// WriteNopData - Write an (optimal) nop sequence of Count bytes
23547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  /// to the given output. If the target cannot generate such a sequence,
23647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  /// it should return an error.
2374b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  ///
2384b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  /// \return - True on success.
239ec3433852dd11e8ff60c9610b4c84468e5935f2bJim Grosbach  bool writeNopData(uint64_t Count, MCObjectWriter *OW) const {
2401d82115042c81793cc3d807a8136f7f0f475f083Jack Carter    // Check for a less than instruction size number of bytes
2411d82115042c81793cc3d807a8136f7f0f475f083Jack Carter    // FIXME: 16 bit instructions are not handled yet here.
2421d82115042c81793cc3d807a8136f7f0f475f083Jack Carter    // We shouldn't be using a hard coded number for instruction size.
2431d82115042c81793cc3d807a8136f7f0f475f083Jack Carter    if (Count % 4) return false;
2441d82115042c81793cc3d807a8136f7f0f475f083Jack Carter
2451d82115042c81793cc3d807a8136f7f0f475f083Jack Carter    uint64_t NumNops = Count / 4;
2461d82115042c81793cc3d807a8136f7f0f475f083Jack Carter    for (uint64_t i = 0; i != NumNops; ++i)
2471d82115042c81793cc3d807a8136f7f0f475f083Jack Carter      OW->Write32(0);
24847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    return true;
2494b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  }
250a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka}; // class MipsAsmBackend
25182ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka
25247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes} // namespace
2534b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
254e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka// MCAsmBackend
255536a88ad5bf160232205192a7ce72e50bfadbdedRoman DivackyMCAsmBackend *llvm::createMipsAsmBackendEL32(const Target &T, StringRef TT,
256536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                             StringRef CPU) {
257e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka  return new MipsAsmBackend(T, Triple(TT).getOS(),
258a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka                            /*IsLittle*/true, /*Is64Bit*/false);
25929a17145ad4985df032785cc1b4716fd7875d47bRafael Espindola}
2604b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
261536a88ad5bf160232205192a7ce72e50bfadbdedRoman DivackyMCAsmBackend *llvm::createMipsAsmBackendEB32(const Target &T, StringRef TT,
262536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                             StringRef CPU) {
263e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka  return new MipsAsmBackend(T, Triple(TT).getOS(),
264a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka                            /*IsLittle*/false, /*Is64Bit*/false);
2654b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka}
266a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka
267536a88ad5bf160232205192a7ce72e50bfadbdedRoman DivackyMCAsmBackend *llvm::createMipsAsmBackendEL64(const Target &T, StringRef TT,
268536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                             StringRef CPU) {
269a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka  return new MipsAsmBackend(T, Triple(TT).getOS(),
270a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka                            /*IsLittle*/true, /*Is64Bit*/true);
271a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka}
272a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka
273536a88ad5bf160232205192a7ce72e50bfadbdedRoman DivackyMCAsmBackend *llvm::createMipsAsmBackendEB64(const Target &T, StringRef TT,
274536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky                                             StringRef CPU) {
275a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka  return new MipsAsmBackend(T, Triple(TT).getOS(),
276a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka                            /*IsLittle*/false, /*Is64Bit*/true);
277a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka}
278a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka
279