1 //===- HexagonRelocationFunction.h ----------------------------------------===//
2 //
3 // The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 typedef struct {
10 const char *insnSyntax;
11 uint32_t insnMask;
12 uint32_t insnCmpMask;
13 uint32_t insnBitMask;
14 bool isDuplex;
15 } Instruction;
16
17 //===--------------------------------------------------------------------===//
18 // Relocation helper function
19 //===--------------------------------------------------------------------===//
20 template<typename T1, typename T2>
ApplyMask(T2 pMask,T1 pData)21 T1 ApplyMask(T2 pMask, T1 pData) {
22 T1 result = 0;
23 size_t off = 0;
24
25 for (size_t bit = 0; bit != sizeof (T1) * 8; ++bit) {
26 const bool valBit = (pData >> off) & 1;
27 const bool maskBit = (pMask >> bit) & 1;
28 if (maskBit) {
29 result |= static_cast<T1>(valBit) << bit;
30 ++off;
31 }
32 }
33 return result;
34 }
35
36 #define DECL_HEXAGON_APPLY_RELOC_FUNC(Name) \
37 static HexagonRelocator::Result Name (Relocation& pEntry, \
38 HexagonRelocator& pParent);
39
40 #define DECL_HEXAGON_APPLY_RELOC_FUNCS \
41 DECL_HEXAGON_APPLY_RELOC_FUNC(none) \
42 DECL_HEXAGON_APPLY_RELOC_FUNC(relocPCREL) \
43 DECL_HEXAGON_APPLY_RELOC_FUNC(relocGPREL) \
44 DECL_HEXAGON_APPLY_RELOC_FUNC(relocAbs) \
45 DECL_HEXAGON_APPLY_RELOC_FUNC(relocPLTB22PCREL) \
46 DECL_HEXAGON_APPLY_RELOC_FUNC(relocGOTREL) \
47 DECL_HEXAGON_APPLY_RELOC_FUNC(relocGOT) \
48 DECL_HEXAGON_APPLY_RELOC_FUNC(unsupport)
49
50 #define DECL_HEXAGON_APPLY_RELOC_FUNC_PTRS \
51 { &none, 0, "R_HEX_NONE" }, \
52 { &relocPCREL, 1, "R_HEX_B22_PCREL" }, \
53 { &relocPCREL, 2, "R_HEX_B15_PCREL" }, \
54 { &relocPCREL, 3, "R_HEX_B7_PCREL" }, \
55 { &relocAbs, 4, "R_HEX_LO16" }, \
56 { &relocAbs, 5, "R_HEX_HI16" }, \
57 { &relocAbs, 6, "R_HEX_32" }, \
58 { &relocAbs, 7, "R_HEX_16" }, \
59 { &relocAbs, 8, "R_HEX_8" }, \
60 { &relocGPREL, 9, "R_HEX_GPREL16_0" }, \
61 { &relocGPREL, 10, "R_HEX_GPREL16_1" }, \
62 { &relocGPREL, 11, "R_HEX_GPREL16_2" }, \
63 { &relocGPREL, 12, "R_HEX_GPREL16_3" }, \
64 { &unsupport, 13, "R_HEX_HL16" }, \
65 { &relocPCREL, 14, "R_HEX_B13_PCREL" }, \
66 { &relocPCREL, 15, "R_HEX_B9_PCREL" }, \
67 { &relocPCREL, 16, "R_HEX_B32_PCREL_X" }, \
68 { &relocAbs, 17, "R_HEX_32_6_X" }, \
69 { &relocPCREL, 18, "R_HEX_B22_PCREL_X" }, \
70 { &relocPCREL, 19, "R_HEX_B15_PCREL_X" }, \
71 { &relocPCREL, 20, "R_HEX_B13_PCREL_X" }, \
72 { &relocPCREL, 21, "R_HEX_B9_PCREL_X" }, \
73 { &relocPCREL, 22, "R_HEX_B7_PCREL_X" }, \
74 { &relocAbs, 23, "R_HEX_16_X" }, \
75 { &relocAbs, 24, "R_HEX_12_X" }, \
76 { &relocAbs, 25, "R_HEX_11_X" }, \
77 { &relocAbs, 26, "R_HEX_10_X" }, \
78 { &relocAbs, 27, "R_HEX_9_X" }, \
79 { &relocAbs, 28, "R_HEX_8_X" }, \
80 { &relocAbs, 29, "R_HEX_7_X" }, \
81 { &relocAbs, 30, "R_HEX_6_X" }, \
82 { &relocPCREL, 31, "R_HEX_32_PCREL" }, \
83 { &none, 32, "R_HEX_COPY" }, \
84 { &none, 33, "R_HEX_GLOB_DAT" }, \
85 { &none, 34, "R_HEX_JMP_SLOT" }, \
86 { &none, 35, "R_HEX_RELATIVE" }, \
87 { &relocPLTB22PCREL, 36, "R_HEX_PLT_B22_PCREL" }, \
88 { &relocGOTREL, 37, "R_HEX_GOTREL_LO16" }, \
89 { &relocGOTREL, 38, "R_HEX_GOTREL_HI16" }, \
90 { &relocGOTREL, 39, "R_HEX_GOTREL_32" }, \
91 { &relocGOT, 40, "R_HEX_GOT_LO16" }, \
92 { &relocGOT, 41, "R_HEX_GOT_HI16" }, \
93 { &relocGOT, 42, "R_HEX_GOT_32" }, \
94 { &relocGOT, 43, "R_HEX_GOT_16" }, \
95 { &unsupport, 44, "R_HEX_DTPMOD_32" }, \
96 { &unsupport, 45, "R_HEX_DTPREL_LO16" }, \
97 { &unsupport, 46, "R_HEX_DTPREL_HI16" }, \
98 { &unsupport, 47, "R_HEX_DTPREL_32" }, \
99 { &unsupport, 48, "R_HEX_DTPREL_16" }, \
100 { &unsupport, 49, "R_HEX_GD_PLT_B22_PCREL" }, \
101 { &unsupport, 50, "R_HEX_GD_GOT_LO16" }, \
102 { &unsupport, 51, "R_HEX_GD_GOT_HI16" }, \
103 { &unsupport, 52, "R_HEX_GD_GOT_32" }, \
104 { &unsupport, 53, "R_HEX_GD_GOT_16" }, \
105 { &unsupport, 54, "R_HEX_IE_LO16" }, \
106 { &unsupport, 55, "R_HEX_IE_HI16" }, \
107 { &unsupport, 56, "R_HEX_IE_32" }, \
108 { &unsupport, 57, "R_HEX_IE_GOT_LO16" }, \
109 { &unsupport, 58, "R_HEX_IE_GOT_HI16" }, \
110 { &unsupport, 59, "R_HEX_IE_GOT_32" }, \
111 { &unsupport, 60, "R_HEX_IE_GOT_16" }, \
112 { &unsupport, 61, "R_HEX_TPREL_LO16" }, \
113 { &unsupport, 62, "R_HEX_TPREL_HI16" }, \
114 { &unsupport, 63, "R_HEX_TPREL_32" }, \
115 { &unsupport, 64, "R_HEX_TPREL_16" }, \
116 { &relocPCREL, 65, "R_HEX_6_PCREL_X" }, \
117 { &relocGOTREL, 66, "R_HEX_GOTREL_32_6_X" }, \
118 { &relocGOTREL, 67, "R_HEX_GOTREL_16_X" }, \
119 { &relocGOTREL, 68, "R_HEX_GOTREL_11_X" }, \
120 { &relocGOT, 69, "R_HEX_GOT_32_6_X" }, \
121 { &relocGOT, 70, "R_HEX_GOT_16_X" }, \
122 { &relocGOT, 71, "R_HEX_GOT_11_X" }, \
123 { &unsupport, 72, "R_HEX_DTPREL_32_6_X" }, \
124 { &unsupport, 73, "R_HEX_DTPREL_16_X" }, \
125 { &unsupport, 74, "R_HEX_DTPREL_11_X" }, \
126 { &unsupport, 75, "R_HEX_GD_GOT_32_6_X" }, \
127 { &unsupport, 76, "R_HEX_GD_GOT_16_X" }, \
128 { &unsupport, 77, "R_HEX_GD_GOT_11_X" }, \
129 { &unsupport, 78, "R_HEX_IE_32_6_X" }, \
130 { &unsupport, 79, "R_HEX_IE_16_X" }, \
131 { &unsupport, 80, "R_HEX_IE_GOT_32_6_X" }, \
132 { &unsupport, 81, "R_HEX_IE_GOT_16_X" }, \
133 { &unsupport, 82, "R_HEX_IE_GOT_11_X" }, \
134 { &unsupport, 83, "R_HEX_TPREL_32_6_X" }, \
135 { &unsupport, 84, "R_HEX_TPREL_16_X" }, \
136 { &unsupport, 85, "R_HEX_TPREL_11_X" }
137