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