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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_HEXAGON_HEXAGONRELOCATIONFUNCTIONS_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_HEXAGON_HEXAGONRELOCATIONFUNCTIONS_H_
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
12f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinestypedef struct {
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const char* insnSyntax;
14551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  uint32_t insnMask;
15551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  uint32_t insnCmpMask;
16551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  uint32_t insnBitMask;
17551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  bool isDuplex;
18f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} Instruction;
19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
20f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===--------------------------------------------------------------------===//
21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// Relocation helper function
22f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===--------------------------------------------------------------------===//
23f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinestemplate<typename T1, typename T2>
24f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesT1 ApplyMask(T2 pMask, T1 pData) {
25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  T1 result = 0;
26f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  size_t off = 0;
27f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  for (size_t bit = 0; bit != sizeof (T1) * 8; ++bit) {
29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    const bool valBit = (pData >> off) & 1;
30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    const bool maskBit = (pMask >> bit) & 1;
31f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    if (maskBit) {
32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      result |= static_cast<T1>(valBit) << bit;
33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      ++off;
34f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return result;
37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define DECL_HEXAGON_APPLY_RELOC_FUNC(Name)                \
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static HexagonRelocator::Result Name(Relocation& pEntry, \
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                       HexagonRelocator& pParent);
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define DECL_HEXAGON_APPLY_RELOC_FUNCS            \
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DECL_HEXAGON_APPLY_RELOC_FUNC(none)             \
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DECL_HEXAGON_APPLY_RELOC_FUNC(relocPCREL)       \
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DECL_HEXAGON_APPLY_RELOC_FUNC(relocGPREL)       \
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DECL_HEXAGON_APPLY_RELOC_FUNC(relocAbs)         \
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DECL_HEXAGON_APPLY_RELOC_FUNC(relocPLTB22PCREL) \
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DECL_HEXAGON_APPLY_RELOC_FUNC(relocGOTREL)      \
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DECL_HEXAGON_APPLY_RELOC_FUNC(relocGOT)         \
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DECL_HEXAGON_APPLY_RELOC_FUNC(unsupported)
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define DECL_HEXAGON_APPLY_RELOC_FUNC_PTRS             \
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &none,             0, "R_HEX_NONE"              }, \
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       1, "R_HEX_B22_PCREL"         }, \
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       2, "R_HEX_B15_PCREL"         }, \
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       3, "R_HEX_B7_PCREL"          }, \
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         4, "R_HEX_LO16"              }, \
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         5, "R_HEX_HI16"              }, \
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         6, "R_HEX_32"                }, \
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         7, "R_HEX_16"                }, \
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         8, "R_HEX_8"                 }, \
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGPREL,       9, "R_HEX_GPREL16_0"         }, \
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGPREL,       10, "R_HEX_GPREL16_1"        }, \
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGPREL,       11, "R_HEX_GPREL16_2"        }, \
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGPREL,       12, "R_HEX_GPREL16_3"        }, \
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      13, "R_HEX_HL16"             }, \
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       14, "R_HEX_B13_PCREL"        }, \
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       15, "R_HEX_B9_PCREL"         }, \
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       16, "R_HEX_B32_PCREL_X"      }, \
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         17, "R_HEX_32_6_X"           }, \
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       18, "R_HEX_B22_PCREL_X"      }, \
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       19, "R_HEX_B15_PCREL_X"      }, \
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       20, "R_HEX_B13_PCREL_X"      }, \
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       21, "R_HEX_B9_PCREL_X"       }, \
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       22, "R_HEX_B7_PCREL_X"       }, \
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         23, "R_HEX_16_X"             }, \
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         24, "R_HEX_12_X"             }, \
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         25, "R_HEX_11_X"             }, \
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         26, "R_HEX_10_X"             }, \
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         27, "R_HEX_9_X"              }, \
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         28, "R_HEX_8_X"              }, \
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         29, "R_HEX_7_X"              }, \
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocAbs,         30, "R_HEX_6_X"              }, \
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       31, "R_HEX_32_PCREL"         }, \
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &none,             32, "R_HEX_COPY"             }, \
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &none,             33, "R_HEX_GLOB_DAT"         }, \
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &none,             34, "R_HEX_JMP_SLOT"         }, \
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &none,             35, "R_HEX_RELATIVE"         }, \
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPLTB22PCREL, 36, "R_HEX_PLT_B22_PCREL"    }, \
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOTREL,      37, "R_HEX_GOTREL_LO16"      }, \
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOTREL,      38, "R_HEX_GOTREL_HI16"      }, \
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOTREL,      39, "R_HEX_GOTREL_32"        }, \
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOT,         40, "R_HEX_GOT_LO16"         }, \
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOT,         41, "R_HEX_GOT_HI16"         }, \
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOT,         42, "R_HEX_GOT_32"           }, \
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOT,         43, "R_HEX_GOT_16"           }, \
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      44, "R_HEX_DTPMOD_32"        }, \
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      45, "R_HEX_DTPREL_LO16"      }, \
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      46, "R_HEX_DTPREL_HI16"      }, \
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      47, "R_HEX_DTPREL_32"        }, \
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      48, "R_HEX_DTPREL_16"        }, \
10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      49, "R_HEX_GD_PLT_B22_PCREL" }, \
10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      50, "R_HEX_GD_GOT_LO16"      }, \
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      51, "R_HEX_GD_GOT_HI16"      }, \
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      52, "R_HEX_GD_GOT_32"        }, \
10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      53, "R_HEX_GD_GOT_16"        }, \
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      54, "R_HEX_IE_LO16"          }, \
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      55, "R_HEX_IE_HI16"          }, \
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      56, "R_HEX_IE_32"            }, \
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      57, "R_HEX_IE_GOT_LO16"      }, \
11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      58, "R_HEX_IE_GOT_HI16"      }, \
11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      59, "R_HEX_IE_GOT_32"        }, \
11437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      60, "R_HEX_IE_GOT_16"        }, \
11537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      61, "R_HEX_TPREL_LO16"       }, \
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      62, "R_HEX_TPREL_HI16"       }, \
11737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      63, "R_HEX_TPREL_32"         }, \
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      64, "R_HEX_TPREL_16"         }, \
11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocPCREL,       65, "R_HEX_6_PCREL_X"        }, \
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOTREL,      66, "R_HEX_GOTREL_32_6_X"    }, \
12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOTREL,      67, "R_HEX_GOTREL_16_X"      }, \
12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOTREL,      68, "R_HEX_GOTREL_11_X"      }, \
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOT,         69, "R_HEX_GOT_32_6_X"       }, \
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOT,         70, "R_HEX_GOT_16_X"         }, \
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &relocGOT,         71, "R_HEX_GOT_11_X"         }, \
12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      72, "R_HEX_DTPREL_32_6_X"    }, \
12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      73, "R_HEX_DTPREL_16_X"      }, \
12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      74, "R_HEX_DTPREL_11_X"      }, \
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      75, "R_HEX_GD_GOT_32_6_X"    }, \
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      76, "R_HEX_GD_GOT_16_X"      }, \
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      77, "R_HEX_GD_GOT_11_X"      }, \
13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      78, "R_HEX_IE_32_6_X"        }, \
13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      79, "R_HEX_IE_16_X"          }, \
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      80, "R_HEX_IE_GOT_32_6_X"    }, \
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      81, "R_HEX_IE_GOT_16_X"      }, \
13637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      82, "R_HEX_IE_GOT_11_X"      }, \
13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      83, "R_HEX_TPREL_32_6_X"     }, \
13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      84, "R_HEX_TPREL_16_X"       }, \
13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  { &unsupported,      85, "R_HEX_TPREL_11_X"       }
1406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
14137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // TARGET_HEXAGON_HEXAGONRELOCATIONFUNCTIONS_H_
142