16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- HexagonRelocationFunction.h ----------------------------------------===// 26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// The MCLinker Project 46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source 66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details. 76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 9f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinestypedef struct { 10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const char *insnSyntax; 11551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint32_t insnMask; 12551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint32_t insnCmpMask; 13551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint32_t insnBitMask; 14551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines bool isDuplex; 15f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} Instruction; 16f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===--------------------------------------------------------------------===// 18f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// Relocation helper function 19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===--------------------------------------------------------------------===// 20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinestemplate<typename T1, typename T2> 21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesT1 ApplyMask(T2 pMask, T1 pData) { 22f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines T1 result = 0; 23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines size_t off = 0; 24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (size_t bit = 0; bit != sizeof (T1) * 8; ++bit) { 26f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const bool valBit = (pData >> off) & 1; 27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const bool maskBit = (pMask >> bit) & 1; 28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maskBit) { 29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines result |= static_cast<T1>(valBit) << bit; 30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++off; 31f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return result; 34f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_HEXAGON_APPLY_RELOC_FUNC(Name) \ 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstatic HexagonRelocator::Result Name (Relocation& pEntry, \ 386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonRelocator& pParent); 396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_HEXAGON_APPLY_RELOC_FUNCS \ 41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesDECL_HEXAGON_APPLY_RELOC_FUNC(none) \ 4287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesDECL_HEXAGON_APPLY_RELOC_FUNC(relocPCREL) \ 4387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesDECL_HEXAGON_APPLY_RELOC_FUNC(relocGPREL) \ 4487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesDECL_HEXAGON_APPLY_RELOC_FUNC(relocAbs) \ 45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesDECL_HEXAGON_APPLY_RELOC_FUNC(relocPLTB22PCREL) \ 4687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesDECL_HEXAGON_APPLY_RELOC_FUNC(relocGOTREL) \ 4787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesDECL_HEXAGON_APPLY_RELOC_FUNC(relocGOT) \ 486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_HEXAGON_APPLY_RELOC_FUNC(unsupport) 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_HEXAGON_APPLY_RELOC_FUNC_PTRS \ 516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &none, 0, "R_HEX_NONE" }, \ 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 1, "R_HEX_B22_PCREL" }, \ 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 2, "R_HEX_B15_PCREL" }, \ 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 3, "R_HEX_B7_PCREL" }, \ 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 4, "R_HEX_LO16" }, \ 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 5, "R_HEX_HI16" }, \ 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 6, "R_HEX_32" }, \ 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 7, "R_HEX_16" }, \ 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 8, "R_HEX_8" }, \ 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGPREL, 9, "R_HEX_GPREL16_0" }, \ 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGPREL, 10, "R_HEX_GPREL16_1" }, \ 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGPREL, 11, "R_HEX_GPREL16_2" }, \ 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGPREL, 12, "R_HEX_GPREL16_3" }, \ 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 13, "R_HEX_HL16" }, \ 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 14, "R_HEX_B13_PCREL" }, \ 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 15, "R_HEX_B9_PCREL" }, \ 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 16, "R_HEX_B32_PCREL_X" }, \ 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 17, "R_HEX_32_6_X" }, \ 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 18, "R_HEX_B22_PCREL_X" }, \ 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 19, "R_HEX_B15_PCREL_X" }, \ 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 20, "R_HEX_B13_PCREL_X" }, \ 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 21, "R_HEX_B9_PCREL_X" }, \ 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 22, "R_HEX_B7_PCREL_X" }, \ 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 23, "R_HEX_16_X" }, \ 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 24, "R_HEX_12_X" }, \ 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 25, "R_HEX_11_X" }, \ 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 26, "R_HEX_10_X" }, \ 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 27, "R_HEX_9_X" }, \ 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 28, "R_HEX_8_X" }, \ 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 29, "R_HEX_7_X" }, \ 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocAbs, 30, "R_HEX_6_X" }, \ 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 31, "R_HEX_32_PCREL" }, \ 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &none, 32, "R_HEX_COPY" }, \ 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &none, 33, "R_HEX_GLOB_DAT" }, \ 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &none, 34, "R_HEX_JMP_SLOT" }, \ 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &none, 35, "R_HEX_RELATIVE" }, \ 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { &relocPLTB22PCREL, 36, "R_HEX_PLT_B22_PCREL" }, \ 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOTREL, 37, "R_HEX_GOTREL_LO16" }, \ 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOTREL, 38, "R_HEX_GOTREL_HI16" }, \ 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOTREL, 39, "R_HEX_GOTREL_32" }, \ 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOT, 40, "R_HEX_GOT_LO16" }, \ 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOT, 41, "R_HEX_GOT_HI16" }, \ 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOT, 42, "R_HEX_GOT_32" }, \ 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOT, 43, "R_HEX_GOT_16" }, \ 956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 44, "R_HEX_DTPMOD_32" }, \ 966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 45, "R_HEX_DTPREL_LO16" }, \ 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 46, "R_HEX_DTPREL_HI16" }, \ 986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 47, "R_HEX_DTPREL_32" }, \ 996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 48, "R_HEX_DTPREL_16" }, \ 1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 49, "R_HEX_GD_PLT_B22_PCREL" }, \ 1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 50, "R_HEX_GD_GOT_LO16" }, \ 1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 51, "R_HEX_GD_GOT_HI16" }, \ 1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 52, "R_HEX_GD_GOT_32" }, \ 1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 53, "R_HEX_GD_GOT_16" }, \ 1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 54, "R_HEX_IE_LO16" }, \ 1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 55, "R_HEX_IE_HI16" }, \ 1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 56, "R_HEX_IE_32" }, \ 1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 57, "R_HEX_IE_GOT_LO16" }, \ 1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 58, "R_HEX_IE_GOT_HI16" }, \ 1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 59, "R_HEX_IE_GOT_32" }, \ 1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 60, "R_HEX_IE_GOT_16" }, \ 1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 61, "R_HEX_TPREL_LO16" }, \ 1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 62, "R_HEX_TPREL_HI16" }, \ 1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 63, "R_HEX_TPREL_32" }, \ 1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 64, "R_HEX_TPREL_16" }, \ 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocPCREL, 65, "R_HEX_6_PCREL_X" }, \ 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOTREL, 66, "R_HEX_GOTREL_32_6_X" }, \ 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOTREL, 67, "R_HEX_GOTREL_16_X" }, \ 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOTREL, 68, "R_HEX_GOTREL_11_X" }, \ 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOT, 69, "R_HEX_GOT_32_6_X" }, \ 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOT, 70, "R_HEX_GOT_16_X" }, \ 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { &relocGOT, 71, "R_HEX_GOT_11_X" }, \ 1236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 72, "R_HEX_DTPREL_32_6_X" }, \ 1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 73, "R_HEX_DTPREL_16_X" }, \ 1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 74, "R_HEX_DTPREL_11_X" }, \ 1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 75, "R_HEX_GD_GOT_32_6_X" }, \ 1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 76, "R_HEX_GD_GOT_16_X" }, \ 1286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 77, "R_HEX_GD_GOT_11_X" }, \ 1296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 78, "R_HEX_IE_32_6_X" }, \ 1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 79, "R_HEX_IE_16_X" }, \ 1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 80, "R_HEX_IE_GOT_32_6_X" }, \ 1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 81, "R_HEX_IE_GOT_16_X" }, \ 1336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 82, "R_HEX_IE_GOT_11_X" }, \ 1346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 83, "R_HEX_TPREL_32_6_X" }, \ 1356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 84, "R_HEX_TPREL_16_X" }, \ 1366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines { &unsupport, 85, "R_HEX_TPREL_11_X" } 137