136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- 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//
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file implements the MipsAsmBackend class.
1147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//
1247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//===----------------------------------------------------------------------===//
1347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes//
1447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/MipsFixupKinds.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/MipsAsmBackend.h"
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "MCTargetDesc/MipsMCExpr.h"
1882ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "MCTargetDesc/MipsMCTargetDesc.h"
1947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes#include "llvm/MC/MCAsmBackend.h"
2082ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCAssembler.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCContext.h"
2282ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCDirectives.h"
2382ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCELFObjectWriter.h"
24f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include "llvm/MC/MCFixupKindInfo.h"
2582ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCObjectWriter.h"
2682ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/MC/MCSubtargetInfo.h"
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/MCValue.h"
2882ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/Support/ErrorHandling.h"
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Format.h"
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/MathExtras.h"
3182ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka#include "llvm/Support/raw_ostream.h"
32e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes
3382ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanakausing namespace llvm;
3482ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka
35e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes// Prepare value for the target space for it
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 MCContext *Ctx = nullptr) {
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned Kind = Fixup.getKind();
4047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
4147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  // Add/subtract and shift
4247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  switch (Kind) {
4347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  default:
44e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes    return 0;
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case FK_Data_2:
46e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes  case Mips::fixup_Mips_LO16:
474a50e53e53816076584c957741cb430899271726Jack Carter  case Mips::fixup_Mips_GPREL16:
480140e55393c4403ab240c386501cdc5e438dcc0eJack Carter  case Mips::fixup_Mips_GPOFF_HI:
490140e55393c4403ab240c386501cdc5e438dcc0eJack Carter  case Mips::fixup_Mips_GPOFF_LO:
500140e55393c4403ab240c386501cdc5e438dcc0eJack Carter  case Mips::fixup_Mips_GOT_PAGE:
510140e55393c4403ab240c386501cdc5e438dcc0eJack Carter  case Mips::fixup_Mips_GOT_OFST:
52fd506efec628819f7e6fad8016a9dbb5d8612b8bJack Carter  case Mips::fixup_Mips_GOT_DISP:
53198ad916d736047f8a439f19dee25cee917df8a9Jack Carter  case Mips::fixup_Mips_GOT_LO16:
54198ad916d736047f8a439f19dee25cee917df8a9Jack Carter  case Mips::fixup_Mips_CALL_LO16:
550082717cb537e2d1424f755a49510fa9f9e67071Zoran Jovanovic  case Mips::fixup_MICROMIPS_LO16:
560082717cb537e2d1424f755a49510fa9f9e67071Zoran Jovanovic  case Mips::fixup_MICROMIPS_GOT_PAGE:
570082717cb537e2d1424f755a49510fa9f9e67071Zoran Jovanovic  case Mips::fixup_MICROMIPS_GOT_OFST:
580082717cb537e2d1424f755a49510fa9f9e67071Zoran Jovanovic  case Mips::fixup_MICROMIPS_GOT_DISP:
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Mips::fixup_MIPS_PCLO16:
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value &= 0xffff;
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case FK_GPRel_4:
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case FK_Data_4:
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case FK_Data_8:
6547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    break;
6647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  case Mips::fixup_Mips_PC16:
6747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // The displacement is then divided by 4 to give us an 18 bit
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // address range. Forcing a signed division because Value can be negative.
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Value = (int64_t)Value / 4;
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // We now check if Value can be encoded as a 16-bit signed immediate.
71f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!isInt<16>(Value) && Ctx) {
72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC16 fixup");
73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return 0;
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
7547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    break;
76c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  case Mips::fixup_MIPS_PC19_S2:
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case Mips::fixup_MICROMIPS_PC19_S2:
78c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    // Forcing a signed division because Value can be negative.
79c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Value = (int64_t)Value / 4;
80c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    // We now check if Value can be encoded as a 19-bit signed immediate.
81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!isInt<19>(Value) && Ctx) {
82f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC19 fixup");
83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return 0;
84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
85c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    break;
8647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  case Mips::fixup_Mips_26:
8747b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // So far we are only using this type for jumps.
8847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // The displacement is then divided by 4 to give us an 28 bit
8947b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    // address range.
9047b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    Value >>= 2;
9147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes    break;
9284bfc2f090639f933df06cc675c4385511516befAkira Hatanaka  case Mips::fixup_Mips_HI16:
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case Mips::fixup_Mips_GOT:
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case Mips::fixup_MICROMIPS_GOT16:
95198ad916d736047f8a439f19dee25cee917df8a9Jack Carter  case Mips::fixup_Mips_GOT_HI16:
96198ad916d736047f8a439f19dee25cee917df8a9Jack Carter  case Mips::fixup_Mips_CALL_HI16:
970082717cb537e2d1424f755a49510fa9f9e67071Zoran Jovanovic  case Mips::fixup_MICROMIPS_HI16:
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Mips::fixup_MIPS_PCHI16:
99fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    // Get the 2nd 16-bits. Also add 1 if bit 15 is 1.
100bca9c25dabbf50923319339ae780d6f916f56bfbAkira Hatanaka    Value = ((Value + 0x8000) >> 16) & 0xffff;
10184bfc2f090639f933df06cc675c4385511516befAkira Hatanaka    break;
102fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter  case Mips::fixup_Mips_HIGHER:
103fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    // Get the 3rd 16-bits.
104fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    Value = ((Value + 0x80008000LL) >> 32) & 0xffff;
105fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    break;
106fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter  case Mips::fixup_Mips_HIGHEST:
107fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    // Get the 4th 16-bits.
108fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    Value = ((Value + 0x800080008000LL) >> 48) & 0xffff;
109fc54d9e47a1276650f14f38e7d037c9b58c8dc2dJack Carter    break;
1101aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic  case Mips::fixup_MICROMIPS_26_S1:
1111aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic    Value >>= 1;
1121aaf43c2a2ec0fd4c8dbfe56558237219c5f8af7Zoran Jovanovic    break;
113ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case Mips::fixup_MICROMIPS_PC7_S1:
114ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Value -= 4;
115ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Forcing a signed division because Value can be negative.
116ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Value = (int64_t) Value / 2;
117ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // We now check if Value can be encoded as a 7-bit signed immediate.
118f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!isInt<7>(Value) && Ctx) {
119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC7 fixup");
120f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return 0;
121f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case Mips::fixup_MICROMIPS_PC10_S1:
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Value -= 2;
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // Forcing a signed division because Value can be negative.
126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Value = (int64_t) Value / 2;
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    // We now check if Value can be encoded as a 10-bit signed immediate.
128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!isInt<10>(Value) && Ctx) {
129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC10 fixup");
130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return 0;
131f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
132ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
1335c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic  case Mips::fixup_MICROMIPS_PC16_S1:
1345c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic    Value -= 4;
13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Forcing a signed division because Value can be negative.
13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Value = (int64_t)Value / 2;
13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // We now check if Value can be encoded as a 16-bit signed immediate.
138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!isInt<16>(Value) && Ctx) {
139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC16 fixup");
140f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return 0;
141f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
1425c042162beb3c2dd556e00aab84c4278a69cd5b1Zoran Jovanovic    break;
143c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  case Mips::fixup_MIPS_PC18_S3:
144c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    // Forcing a signed division because Value can be negative.
145c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    Value = (int64_t)Value / 8;
146c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    // We now check if Value can be encoded as a 18-bit signed immediate.
147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!isInt<18>(Value) && Ctx) {
148f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC18 fixup");
149f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return 0;
150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
151c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    break;
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case Mips::fixup_MICROMIPS_PC18_S3:
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Check alignment.
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if ((Value & 7) && Ctx) {
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC18 fixup");
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Forcing a signed division because Value can be negative.
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = (int64_t)Value / 8;
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // We now check if Value can be encoded as a 18-bit signed immediate.
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!isInt<18>(Value) && Ctx) {
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC18 fixup");
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return 0;
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Mips::fixup_MIPS_PC21_S2:
166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Forcing a signed division because Value can be negative.
167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Value = (int64_t) Value / 4;
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // We now check if Value can be encoded as a 21-bit signed immediate.
169f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!isInt<21>(Value) && Ctx) {
170f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC21 fixup");
171f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return 0;
172f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  case Mips::fixup_MIPS_PC26_S2:
175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // Forcing a signed division because Value can be negative.
176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Value = (int64_t) Value / 4;
177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // We now check if Value can be encoded as a 26-bit signed immediate.
178f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (!isInt<26>(Value) && Ctx) {
179f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC26 fixup");
180f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return 0;
181f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
182dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    break;
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case Mips::fixup_MICROMIPS_PC26_S1:
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Forcing a signed division because Value can be negative.
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = (int64_t)Value / 2;
186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // We now check if Value can be encoded as a 26-bit signed immediate.
187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!isInt<26>(Value) && Ctx) {
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Ctx->reportFatalError(Fixup.getLoc(), "out of range PC26 fixup");
189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return 0;
190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case Mips::fixup_MICROMIPS_PC21_S1:
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Forcing a signed division because Value can be negative.
194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Value = (int64_t)Value / 2;
195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // We now check if Value can be encoded as a 21-bit signed immediate.
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!isInt<21>(Value) && Ctx) {
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Ctx->reportError(Fixup.getLoc(), "out of range PC21 fixup");
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return 0;
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
20147b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  }
20247b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
20347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes  return Value;
20447b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes}
20547b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
2060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarMCObjectWriter *
2070c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarMipsAsmBackend::createObjectWriter(raw_pwrite_stream &OS) const {
20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return createMipsELFObjectWriter(OS,
20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MCELFObjectTargetWriter::getOSABI(OSType), IsLittle, Is64Bit);
21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
211fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka
21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Little-endian fixup data byte ordering:
21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//   mips32r2:   a | b | x | x
21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//   microMIPS:  x | x | a | b
215e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes
21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic bool needsMMLEByteOrder(unsigned Kind) {
217ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return Kind != Mips::fixup_MICROMIPS_PC10_S1 &&
218ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines         Kind >= Mips::fixup_MICROMIPS_26_S1 &&
21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines         Kind < Mips::LastTargetFixupKind;
22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
221e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes
22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Calculate index for microMIPS specific little endian byte order
22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic unsigned calculateMMLEIndex(unsigned i) {
22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  assert(i <= 3 && "Index out of range!");
225fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka
22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return (1 - i / 2) * 2 + i % 2;
22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
228e3d3572e282733bd7aa5ac14115ed0804174e426Bruno Cardoso Lopes
22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// ApplyFixup - Apply the \p Value for given \p Fixup into the provided
23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// data fragment, at the offset specified by the fixup and following the
23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// fixup kind as appropriate.
23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MipsAsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                unsigned DataSize, uint64_t Value,
23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                bool IsPCRel) const {
23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MCFixupKind Kind = Fixup.getKind();
23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value = adjustFixupValue(Fixup, Value);
23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!Value)
23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return; // Doesn't change encoding.
24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Where do we start in the object
24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned Offset = Fixup.getOffset();
24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Number of bytes we need to fixup
24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned NumBytes = (getFixupKindInfo(Kind).TargetSize + 7) / 8;
24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Used to point to big endian bytes
24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned FullSize;
24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  switch ((unsigned)Kind) {
24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case FK_Data_2:
25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case Mips::fixup_Mips_16:
251ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case Mips::fixup_MICROMIPS_PC10_S1:
25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FullSize = 2;
25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    break;
25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case FK_Data_8:
25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case Mips::fixup_Mips_64:
25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FullSize = 8;
25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    break;
25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case FK_Data_4:
25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  default:
26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    FullSize = 4;
26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    break;
262fb54afbcb8f460c5c4cafa605259ba0dd77504dcAkira Hatanaka  }
26347b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Grab current value, if any, from bits.
26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t CurVal = 0;
26647b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool microMipsLEByteOrder = needsMMLEByteOrder((unsigned) Kind);
26847b92f3d8362518596d57269dc53d985bc13323aBruno Cardoso Lopes
26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (unsigned i = 0; i != NumBytes; ++i) {
27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned Idx = IsLittle ? (microMipsLEByteOrder ? calculateMMLEIndex(i)
27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                    : i)
27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                            : (FullSize - 1 - i);
27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    CurVal |= (uint64_t)((uint8_t)Data[Offset + Idx]) << (i*8);
2744b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  }
2754b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t Mask = ((uint64_t)(-1) >>
27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                    (64 - getFixupKindInfo(Kind).TargetSize));
27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  CurVal |= Value & Mask;
279370b78d795154899a22ca2b4674e890661ff1d59Jim Grosbach
28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Write out the fixed up bytes back to the code/data bits.
28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (unsigned i = 0; i != NumBytes; ++i) {
28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned Idx = IsLittle ? (microMipsLEByteOrder ? calculateMMLEIndex(i)
28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                    : i)
28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                            : (FullSize - 1 - i);
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Data[Offset + Idx] = (uint8_t)((CurVal >> (i*8)) & 0xff);
2864b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka  }
28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
288bb481f882093fb738d2bb15610c79364bada5496Jia Liu
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarOptional<MCFixupKind> MipsAsmBackend::getFixupKind(StringRef Name) const {
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return StringSwitch<Optional<MCFixupKind>>(Name)
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .Case("R_MIPS_NONE", (MCFixupKind)Mips::fixup_Mips_NONE)
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .Case("R_MIPS_32", FK_Data_4)
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .Default(MCAsmBackend::getFixupKind(Name));
294f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
295f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst MCFixupKindInfo &MipsAsmBackend::
29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesgetFixupKindInfo(MCFixupKind Kind) const {
298dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const static MCFixupKindInfo LittleEndianInfos[Mips::NumTargetFixupKinds] = {
29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // This table *must* be in same the order of fixup_* kinds in
30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // MipsFixupKinds.h.
30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    //
30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // name                    offset  bits  flags
303f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    { "fixup_Mips_NONE",         0,      0,   0 },
30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_16",           0,     16,   0 },
30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_32",           0,     32,   0 },
30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_REL32",        0,     32,   0 },
30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_26",           0,     26,   0 },
30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_HI16",         0,     16,   0 },
30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_LO16",         0,     16,   0 },
31036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GPREL16",      0,     16,   0 },
31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_LITERAL",      0,     16,   0 },
312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_Mips_GOT",          0,     16,   0 },
31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_PC16",         0,     16,  MCFixupKindInfo::FKF_IsPCRel },
31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_CALL16",       0,     16,   0 },
31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GPREL32",      0,     32,   0 },
31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_SHIFT5",       6,      5,   0 },
31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_SHIFT6",       6,      5,   0 },
31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_64",           0,     64,   0 },
31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_TLSGD",        0,     16,   0 },
32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GOTTPREL",     0,     16,   0 },
32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_TPREL_HI",     0,     16,   0 },
32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_TPREL_LO",     0,     16,   0 },
32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_TLSLDM",       0,     16,   0 },
32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_DTPREL_HI",    0,     16,   0 },
32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_DTPREL_LO",    0,     16,   0 },
32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_Branch_PCRel", 0,     16,  MCFixupKindInfo::FKF_IsPCRel },
32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GPOFF_HI",     0,     16,   0 },
32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GPOFF_LO",     0,     16,   0 },
32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GOT_PAGE",     0,     16,   0 },
33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GOT_OFST",     0,     16,   0 },
33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GOT_DISP",     0,     16,   0 },
33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_HIGHER",       0,     16,   0 },
33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_HIGHEST",      0,     16,   0 },
33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GOT_HI16",     0,     16,   0 },
33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_GOT_LO16",     0,     16,   0 },
33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_CALL_HI16",    0,     16,   0 },
33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_Mips_CALL_LO16",    0,     16,   0 },
338c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    { "fixup_Mips_PC18_S3",      0,     18,  MCFixupKindInfo::FKF_IsPCRel },
339c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    { "fixup_MIPS_PC19_S2",      0,     19,  MCFixupKindInfo::FKF_IsPCRel },
340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MIPS_PC21_S2",      0,     21,  MCFixupKindInfo::FKF_IsPCRel },
341dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MIPS_PC26_S2",      0,     26,  MCFixupKindInfo::FKF_IsPCRel },
342dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MIPS_PCHI16",       0,     16,  MCFixupKindInfo::FKF_IsPCRel },
343dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MIPS_PCLO16",       0,     16,  MCFixupKindInfo::FKF_IsPCRel },
34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_26_S1",   0,     26,   0 },
34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_HI16",    0,     16,   0 },
34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_LO16",    0,     16,   0 },
34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_GOT16",   0,     16,   0 },
348ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    { "fixup_MICROMIPS_PC7_S1",  0,      7,   MCFixupKindInfo::FKF_IsPCRel },
349ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    { "fixup_MICROMIPS_PC10_S1", 0,     10,   MCFixupKindInfo::FKF_IsPCRel },
35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_PC16_S1", 0,     16,   MCFixupKindInfo::FKF_IsPCRel },
351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_MICROMIPS_PC26_S1", 0,     26,   MCFixupKindInfo::FKF_IsPCRel },
352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_MICROMIPS_PC19_S2", 0,     19,   MCFixupKindInfo::FKF_IsPCRel },
353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_MICROMIPS_PC18_S3", 0,     18,   MCFixupKindInfo::FKF_IsPCRel },
354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_MICROMIPS_PC21_S1", 0,     21,   MCFixupKindInfo::FKF_IsPCRel },
35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_CALL16",  0,     16,   0 },
35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_GOT_DISP",        0,     16,   0 },
35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_GOT_PAGE",        0,     16,   0 },
35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_GOT_OFST",        0,     16,   0 },
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_TLS_GD",          0,     16,   0 },
36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_TLS_LDM",         0,     16,   0 },
36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_TLS_DTPREL_HI16", 0,     16,   0 },
36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_TLS_DTPREL_LO16", 0,     16,   0 },
36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_TLS_TPREL_HI16",  0,     16,   0 },
36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    { "fixup_MICROMIPS_TLS_TPREL_LO16",  0,     16,   0 }
36536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  };
36636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
367dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const static MCFixupKindInfo BigEndianInfos[Mips::NumTargetFixupKinds] = {
368dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // This table *must* be in same the order of fixup_* kinds in
369dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // MipsFixupKinds.h.
370dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    //
371dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    // name                    offset  bits  flags
372f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    { "fixup_Mips_NONE",         0,      0,   0 },
373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_16",          16,     16,   0 },
374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_32",           0,     32,   0 },
375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_REL32",        0,     32,   0 },
376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_26",           6,     26,   0 },
377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_HI16",        16,     16,   0 },
378dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_LO16",        16,     16,   0 },
379dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GPREL16",     16,     16,   0 },
380dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_LITERAL",     16,     16,   0 },
381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_Mips_GOT",         16,     16,   0 },
382dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_PC16",        16,     16,  MCFixupKindInfo::FKF_IsPCRel },
383dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_CALL16",      16,     16,   0 },
384dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GPREL32",      0,     32,   0 },
385dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_SHIFT5",      21,      5,   0 },
386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_SHIFT6",      21,      5,   0 },
387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_64",           0,     64,   0 },
388dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_TLSGD",       16,     16,   0 },
389dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GOTTPREL",    16,     16,   0 },
390dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_TPREL_HI",    16,     16,   0 },
391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_TPREL_LO",    16,     16,   0 },
392dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_TLSLDM",      16,     16,   0 },
393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_DTPREL_HI",   16,     16,   0 },
394dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_DTPREL_LO",   16,     16,   0 },
395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_Branch_PCRel",16,     16,  MCFixupKindInfo::FKF_IsPCRel },
396dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GPOFF_HI",    16,     16,   0 },
397dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GPOFF_LO",    16,     16,   0 },
398dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GOT_PAGE",    16,     16,   0 },
399dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GOT_OFST",    16,     16,   0 },
400dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GOT_DISP",    16,     16,   0 },
401dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_HIGHER",      16,     16,   0 },
402dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_HIGHEST",     16,     16,   0 },
403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GOT_HI16",    16,     16,   0 },
404dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_GOT_LO16",    16,     16,   0 },
405dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_CALL_HI16",   16,     16,   0 },
406dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_Mips_CALL_LO16",   16,     16,   0 },
407c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    { "fixup_Mips_PC18_S3",     14,     18,  MCFixupKindInfo::FKF_IsPCRel },
408c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    { "fixup_MIPS_PC19_S2",     13,     19,  MCFixupKindInfo::FKF_IsPCRel },
409dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MIPS_PC21_S2",     11,     21,  MCFixupKindInfo::FKF_IsPCRel },
410dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MIPS_PC26_S2",      6,     26,  MCFixupKindInfo::FKF_IsPCRel },
411dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MIPS_PCHI16",      16,     16,  MCFixupKindInfo::FKF_IsPCRel },
412dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MIPS_PCLO16",      16,     16,  MCFixupKindInfo::FKF_IsPCRel },
413dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_26_S1",   6,     26,   0 },
414dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_HI16",   16,     16,   0 },
415dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_LO16",   16,     16,   0 },
416dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_GOT16",  16,     16,   0 },
417ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    { "fixup_MICROMIPS_PC7_S1",  9,      7,   MCFixupKindInfo::FKF_IsPCRel },
418ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    { "fixup_MICROMIPS_PC10_S1", 6,     10,   MCFixupKindInfo::FKF_IsPCRel },
419dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_PC16_S1",16,     16,   MCFixupKindInfo::FKF_IsPCRel },
420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_MICROMIPS_PC26_S1", 6,     26,   MCFixupKindInfo::FKF_IsPCRel },
421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_MICROMIPS_PC19_S2",13,     19,   MCFixupKindInfo::FKF_IsPCRel },
422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_MICROMIPS_PC18_S3",14,     18,   MCFixupKindInfo::FKF_IsPCRel },
423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    { "fixup_MICROMIPS_PC21_S1",11,     21,   MCFixupKindInfo::FKF_IsPCRel },
424dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_CALL16", 16,     16,   0 },
425dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_GOT_DISP",        16,     16,   0 },
426dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_GOT_PAGE",        16,     16,   0 },
427dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_GOT_OFST",        16,     16,   0 },
428dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_TLS_GD",          16,     16,   0 },
429dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_TLS_LDM",         16,     16,   0 },
430dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_TLS_DTPREL_HI16", 16,     16,   0 },
431dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_TLS_DTPREL_LO16", 16,     16,   0 },
432dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_TLS_TPREL_HI16",  16,     16,   0 },
433dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    { "fixup_MICROMIPS_TLS_TPREL_LO16",  16,     16,   0 }
434dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  };
435dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Kind < FirstTargetFixupKind)
43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCAsmBackend::getFixupKindInfo(Kind);
43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() &&
44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          "Invalid kind!");
441dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
442dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (IsLittle)
443dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return LittleEndianInfos[Kind - FirstTargetFixupKind];
444dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return BigEndianInfos[Kind - FirstTargetFixupKind];
44536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
4461d82115042c81793cc3d807a8136f7f0f475f083Jack Carter
44736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// WriteNopData - Write an (optimal) nop sequence of Count bytes
44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// to the given output. If the target cannot generate such a sequence,
44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// it should return an error.
45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \return - True on success.
45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool MipsAsmBackend::writeNopData(uint64_t Count, MCObjectWriter *OW) const {
45336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Check for a less than instruction size number of bytes
45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // FIXME: 16 bit instructions are not handled yet here.
45536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // We shouldn't be using a hard coded number for instruction size.
45637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
45737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // If the count is not 4-byte aligned, we must be writing data into the text
45837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // section (otherwise we have unaligned instructions, and thus have far
45937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // bigger problems), so just write zeros instead.
4606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  OW->WriteZeros(Count);
46136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return true;
46236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
46382ea7314ca52c9df8e1b6600231fafb7ae722313Akira Hatanaka
46436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// processFixupValue - Target hook to process the literal value of a fixup
46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// if necessary.
46636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MipsAsmBackend::processFixupValue(const MCAssembler &Asm,
46736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       const MCAsmLayout &Layout,
46836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       const MCFixup &Fixup,
46936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       const MCFragment *DF,
47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       const MCValue &Target,
47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       uint64_t &Value,
47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                       bool &IsResolved) {
47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // At this point we'll ignore the value returned by adjustFixupValue as
47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // we are only checking if the fixup can be applied correctly. We have
47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // access to MCContext from here which allows us to report a fatal error
47636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // with *possibly* a source code location.
477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // The caller will also ignore any changes we make to Value
478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // (recordRelocation() overwrites it with it's own calculation).
47936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  (void)adjustFixupValue(Fixup, Value, &Asm.getContext());
48036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
4814b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
482e9e520f23ec3e5dc26e0801ac0d8b9e6899e2626Akira Hatanaka// MCAsmBackend
483c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill WendlingMCAsmBackend *llvm::createMipsAsmBackendEL32(const Target &T,
484c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                             const MCRegisterInfo &MRI,
4856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                             const Triple &TT, StringRef CPU) {
4866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return new MipsAsmBackend(T, TT.getOS(), /*IsLittle*/ true,
4876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            /*Is64Bit*/ false);
48829a17145ad4985df032785cc1b4716fd7875d47bRafael Espindola}
4894b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka
490c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill WendlingMCAsmBackend *llvm::createMipsAsmBackendEB32(const Target &T,
491c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                             const MCRegisterInfo &MRI,
4926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                             const Triple &TT, StringRef CPU) {
4936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return new MipsAsmBackend(T, TT.getOS(), /*IsLittle*/ false,
4946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            /*Is64Bit*/ false);
4954b6ee7a35213709c057cdd073fb27bda09fa3359Akira Hatanaka}
496a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka
497c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill WendlingMCAsmBackend *llvm::createMipsAsmBackendEL64(const Target &T,
498c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                             const MCRegisterInfo &MRI,
4996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                             const Triple &TT, StringRef CPU) {
5006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return new MipsAsmBackend(T, TT.getOS(), /*IsLittle*/ true, /*Is64Bit*/ true);
501a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka}
502a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka
503c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill WendlingMCAsmBackend *llvm::createMipsAsmBackendEB64(const Target &T,
504c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling                                             const MCRegisterInfo &MRI,
5056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                             const Triple &TT, StringRef CPU) {
5066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return new MipsAsmBackend(T, TT.getOS(), /*IsLittle*/ false,
5076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                            /*Is64Bit*/ true);
508a551a48402385cf3f4b754dc72264b2f0974b1a6Akira Hatanaka}
509