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