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