blob: 843072302b21f5fb3c3b4eb5936f29b61d07c3b2 [file] [log] [blame]
Colin LeMahieu2c769202014-11-06 17:05:51 +00001//===-- HexagonELFObjectWriter.cpp - Hexagon Target Descriptions ----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Hexagon.h"
Colin LeMahieua6750772015-06-03 17:34:16 +000011#include "MCTargetDesc/HexagonFixupKinds.h"
Colin LeMahieu2c769202014-11-06 17:05:51 +000012#include "llvm/MC/MCAssembler.h"
13#include "llvm/MC/MCELFObjectWriter.h"
14#include "llvm/Support/Debug.h"
Benjamin Kramer799003b2015-03-23 19:32:43 +000015#include "llvm/Support/raw_ostream.h"
Colin LeMahieu2c769202014-11-06 17:05:51 +000016
17#define DEBUG_TYPE "hexagon-elf-writer"
18
19using namespace llvm;
20using namespace Hexagon;
21
22namespace {
23
24class HexagonELFObjectWriter : public MCELFObjectTargetWriter {
25private:
Colin LeMahieub6bbeee2014-11-13 16:36:30 +000026 StringRef CPU;
Colin LeMahieu2c769202014-11-06 17:05:51 +000027
28public:
Colin LeMahieub6bbeee2014-11-13 16:36:30 +000029 HexagonELFObjectWriter(uint8_t OSABI, StringRef C);
Colin LeMahieu2c769202014-11-06 17:05:51 +000030
Alexander Kornienkof817c1c2015-04-11 02:11:45 +000031 unsigned GetRelocType(MCValue const &Target, MCFixup const &Fixup,
32 bool IsPCRel) const override;
Colin LeMahieu2c769202014-11-06 17:05:51 +000033};
34}
35
Colin LeMahieub6bbeee2014-11-13 16:36:30 +000036HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C)
Colin LeMahieu2c769202014-11-06 17:05:51 +000037 : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON,
38 /*HasRelocationAddend*/ true),
Colin LeMahieub6bbeee2014-11-13 16:36:30 +000039 CPU(C) {}
Colin LeMahieu2c769202014-11-06 17:05:51 +000040
41unsigned HexagonELFObjectWriter::GetRelocType(MCValue const &/*Target*/,
42 MCFixup const &Fixup,
43 bool IsPCRel) const {
Colin LeMahieua6750772015-06-03 17:34:16 +000044 // determine the type of the relocation
Colin LeMahieu2c769202014-11-06 17:05:51 +000045 unsigned Type = (unsigned)ELF::R_HEX_NONE;
Colin LeMahieua6750772015-06-03 17:34:16 +000046 unsigned Kind = (unsigned)Fixup.getKind();
Colin LeMahieu2c769202014-11-06 17:05:51 +000047
48 switch (Kind) {
Colin LeMahieua6750772015-06-03 17:34:16 +000049 default:
50 DEBUG(dbgs() << "unrecognized relocation " << Fixup.getKind() << "\n");
51 llvm_unreachable("Unimplemented Fixup kind!");
52 break;
53 case FK_Data_4:
54 Type = (IsPCRel) ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
55 break;
56 case FK_PCRel_4:
57 Type = ELF::R_HEX_32_PCREL;
58 break;
59 case FK_Data_2:
60 Type = ELF::R_HEX_16;
61 break;
62 case FK_Data_1:
63 Type = ELF::R_HEX_8;
64 break;
65 case fixup_Hexagon_B22_PCREL:
66 Type = ELF::R_HEX_B22_PCREL;
67 break;
68 case fixup_Hexagon_B15_PCREL:
69 Type = ELF::R_HEX_B15_PCREL;
70 break;
71 case fixup_Hexagon_B7_PCREL:
72 Type = ELF::R_HEX_B7_PCREL;
73 break;
74 case fixup_Hexagon_LO16:
75 Type = ELF::R_HEX_LO16;
76 break;
77 case fixup_Hexagon_HI16:
78 Type = ELF::R_HEX_HI16;
79 break;
80 case fixup_Hexagon_32:
81 Type = ELF::R_HEX_32;
82 break;
83 case fixup_Hexagon_16:
84 Type = ELF::R_HEX_16;
85 break;
86 case fixup_Hexagon_8:
87 Type = ELF::R_HEX_8;
88 break;
89 case fixup_Hexagon_GPREL16_0:
90 Type = ELF::R_HEX_GPREL16_0;
91 break;
92 case fixup_Hexagon_GPREL16_1:
93 Type = ELF::R_HEX_GPREL16_1;
94 break;
95 case fixup_Hexagon_GPREL16_2:
96 Type = ELF::R_HEX_GPREL16_2;
97 break;
98 case fixup_Hexagon_GPREL16_3:
99 Type = ELF::R_HEX_GPREL16_3;
100 break;
101 case fixup_Hexagon_HL16:
102 Type = ELF::R_HEX_HL16;
103 break;
104 case fixup_Hexagon_B13_PCREL:
105 Type = ELF::R_HEX_B13_PCREL;
106 break;
107 case fixup_Hexagon_B9_PCREL:
108 Type = ELF::R_HEX_B9_PCREL;
109 break;
110 case fixup_Hexagon_B32_PCREL_X:
111 Type = ELF::R_HEX_B32_PCREL_X;
112 break;
113 case fixup_Hexagon_32_6_X:
114 Type = ELF::R_HEX_32_6_X;
115 break;
116 case fixup_Hexagon_B22_PCREL_X:
117 Type = ELF::R_HEX_B22_PCREL_X;
118 break;
119 case fixup_Hexagon_B15_PCREL_X:
120 Type = ELF::R_HEX_B15_PCREL_X;
121 break;
122 case fixup_Hexagon_B13_PCREL_X:
123 Type = ELF::R_HEX_B13_PCREL_X;
124 break;
125 case fixup_Hexagon_B9_PCREL_X:
126 Type = ELF::R_HEX_B9_PCREL_X;
127 break;
128 case fixup_Hexagon_B7_PCREL_X:
129 Type = ELF::R_HEX_B7_PCREL_X;
130 break;
131 case fixup_Hexagon_16_X:
132 Type = ELF::R_HEX_16_X;
133 break;
134 case fixup_Hexagon_12_X:
135 Type = ELF::R_HEX_12_X;
136 break;
137 case fixup_Hexagon_11_X:
138 Type = ELF::R_HEX_11_X;
139 break;
140 case fixup_Hexagon_10_X:
141 Type = ELF::R_HEX_10_X;
142 break;
143 case fixup_Hexagon_9_X:
144 Type = ELF::R_HEX_9_X;
145 break;
146 case fixup_Hexagon_8_X:
147 Type = ELF::R_HEX_8_X;
148 break;
149 case fixup_Hexagon_7_X:
150 Type = ELF::R_HEX_7_X;
151 break;
152 case fixup_Hexagon_6_X:
153 Type = ELF::R_HEX_6_X;
154 break;
155 case fixup_Hexagon_32_PCREL:
156 Type = ELF::R_HEX_32_PCREL;
157 break;
158 case fixup_Hexagon_COPY:
159 Type = ELF::R_HEX_COPY;
160 break;
161 case fixup_Hexagon_GLOB_DAT:
162 Type = ELF::R_HEX_GLOB_DAT;
163 break;
164 case fixup_Hexagon_JMP_SLOT:
165 Type = ELF::R_HEX_JMP_SLOT;
166 break;
167 case fixup_Hexagon_RELATIVE:
168 Type = ELF::R_HEX_RELATIVE;
169 break;
170 case fixup_Hexagon_PLT_B22_PCREL:
171 Type = ELF::R_HEX_PLT_B22_PCREL;
172 break;
173 case fixup_Hexagon_GOTREL_LO16:
174 Type = ELF::R_HEX_GOTREL_LO16;
175 break;
176 case fixup_Hexagon_GOTREL_HI16:
177 Type = ELF::R_HEX_GOTREL_HI16;
178 break;
179 case fixup_Hexagon_GOTREL_32:
180 Type = ELF::R_HEX_GOTREL_32;
181 break;
182 case fixup_Hexagon_GOT_LO16:
183 Type = ELF::R_HEX_GOT_LO16;
184 break;
185 case fixup_Hexagon_GOT_HI16:
186 Type = ELF::R_HEX_GOT_HI16;
187 break;
188 case fixup_Hexagon_GOT_32:
189 Type = ELF::R_HEX_GOT_32;
190 break;
191 case fixup_Hexagon_GOT_16:
192 Type = ELF::R_HEX_GOT_16;
193 break;
194 case fixup_Hexagon_DTPMOD_32:
195 Type = ELF::R_HEX_DTPMOD_32;
196 break;
197 case fixup_Hexagon_DTPREL_LO16:
198 Type = ELF::R_HEX_DTPREL_LO16;
199 break;
200 case fixup_Hexagon_DTPREL_HI16:
201 Type = ELF::R_HEX_DTPREL_HI16;
202 break;
203 case fixup_Hexagon_DTPREL_32:
204 Type = ELF::R_HEX_DTPREL_32;
205 break;
206 case fixup_Hexagon_DTPREL_16:
207 Type = ELF::R_HEX_DTPREL_16;
208 break;
209 case fixup_Hexagon_GD_PLT_B22_PCREL:
210 Type = ELF::R_HEX_GD_PLT_B22_PCREL;
211 break;
212 case fixup_Hexagon_LD_PLT_B22_PCREL:
213 Type = ELF::R_HEX_LD_PLT_B22_PCREL;
214 break;
215 case fixup_Hexagon_GD_GOT_LO16:
216 Type = ELF::R_HEX_GD_GOT_LO16;
217 break;
218 case fixup_Hexagon_GD_GOT_HI16:
219 Type = ELF::R_HEX_GD_GOT_HI16;
220 break;
221 case fixup_Hexagon_GD_GOT_32:
222 Type = ELF::R_HEX_GD_GOT_32;
223 break;
224 case fixup_Hexagon_GD_GOT_16:
225 Type = ELF::R_HEX_GD_GOT_16;
226 break;
227 case fixup_Hexagon_LD_GOT_LO16:
228 Type = ELF::R_HEX_LD_GOT_LO16;
229 break;
230 case fixup_Hexagon_LD_GOT_HI16:
231 Type = ELF::R_HEX_LD_GOT_HI16;
232 break;
233 case fixup_Hexagon_LD_GOT_32:
234 Type = ELF::R_HEX_LD_GOT_32;
235 break;
236 case fixup_Hexagon_LD_GOT_16:
237 Type = ELF::R_HEX_LD_GOT_16;
238 break;
239 case fixup_Hexagon_IE_LO16:
240 Type = ELF::R_HEX_IE_LO16;
241 break;
242 case fixup_Hexagon_IE_HI16:
243 Type = ELF::R_HEX_IE_HI16;
244 break;
245 case fixup_Hexagon_IE_32:
246 Type = ELF::R_HEX_IE_32;
247 break;
248 case fixup_Hexagon_IE_GOT_LO16:
249 Type = ELF::R_HEX_IE_GOT_LO16;
250 break;
251 case fixup_Hexagon_IE_GOT_HI16:
252 Type = ELF::R_HEX_IE_GOT_HI16;
253 break;
254 case fixup_Hexagon_IE_GOT_32:
255 Type = ELF::R_HEX_IE_GOT_32;
256 break;
257 case fixup_Hexagon_IE_GOT_16:
258 Type = ELF::R_HEX_IE_GOT_16;
259 break;
260 case fixup_Hexagon_TPREL_LO16:
261 Type = ELF::R_HEX_TPREL_LO16;
262 break;
263 case fixup_Hexagon_TPREL_HI16:
264 Type = ELF::R_HEX_TPREL_HI16;
265 break;
266 case fixup_Hexagon_TPREL_32:
267 Type = ELF::R_HEX_TPREL_32;
268 break;
269 case fixup_Hexagon_TPREL_16:
270 Type = ELF::R_HEX_TPREL_16;
271 break;
272 case fixup_Hexagon_6_PCREL_X:
273 Type = ELF::R_HEX_6_PCREL_X;
274 break;
275 case fixup_Hexagon_GOTREL_32_6_X:
276 Type = ELF::R_HEX_GOTREL_32_6_X;
277 break;
278 case fixup_Hexagon_GOTREL_16_X:
279 Type = ELF::R_HEX_GOTREL_16_X;
280 break;
281 case fixup_Hexagon_GOTREL_11_X:
282 Type = ELF::R_HEX_GOTREL_11_X;
283 break;
284 case fixup_Hexagon_GOT_32_6_X:
285 Type = ELF::R_HEX_GOT_32_6_X;
286 break;
287 case fixup_Hexagon_GOT_16_X:
288 Type = ELF::R_HEX_GOT_16_X;
289 break;
290 case fixup_Hexagon_GOT_11_X:
291 Type = ELF::R_HEX_GOT_11_X;
292 break;
293 case fixup_Hexagon_DTPREL_32_6_X:
294 Type = ELF::R_HEX_DTPREL_32_6_X;
295 break;
296 case fixup_Hexagon_DTPREL_16_X:
297 Type = ELF::R_HEX_DTPREL_16_X;
298 break;
299 case fixup_Hexagon_DTPREL_11_X:
300 Type = ELF::R_HEX_DTPREL_11_X;
301 break;
302 case fixup_Hexagon_GD_GOT_32_6_X:
303 Type = ELF::R_HEX_GD_GOT_32_6_X;
304 break;
305 case fixup_Hexagon_GD_GOT_16_X:
306 Type = ELF::R_HEX_GD_GOT_16_X;
307 break;
308 case fixup_Hexagon_GD_GOT_11_X:
309 Type = ELF::R_HEX_GD_GOT_11_X;
310 break;
311 case fixup_Hexagon_LD_GOT_32_6_X:
312 Type = ELF::R_HEX_LD_GOT_32_6_X;
313 break;
314 case fixup_Hexagon_LD_GOT_16_X:
315 Type = ELF::R_HEX_LD_GOT_16_X;
316 break;
317 case fixup_Hexagon_LD_GOT_11_X:
318 Type = ELF::R_HEX_LD_GOT_11_X;
319 break;
320 case fixup_Hexagon_IE_32_6_X:
321 Type = ELF::R_HEX_IE_32_6_X;
322 break;
323 case fixup_Hexagon_IE_16_X:
324 Type = ELF::R_HEX_IE_16_X;
325 break;
326 case fixup_Hexagon_IE_GOT_32_6_X:
327 Type = ELF::R_HEX_IE_GOT_32_6_X;
328 break;
329 case fixup_Hexagon_IE_GOT_16_X:
330 Type = ELF::R_HEX_IE_GOT_16_X;
331 break;
332 case fixup_Hexagon_IE_GOT_11_X:
333 Type = ELF::R_HEX_IE_GOT_11_X;
334 break;
335 case fixup_Hexagon_TPREL_32_6_X:
336 Type = ELF::R_HEX_TPREL_32_6_X;
337 break;
338 case fixup_Hexagon_TPREL_16_X:
339 Type = ELF::R_HEX_TPREL_16_X;
340 break;
341 case fixup_Hexagon_TPREL_11_X:
342 Type = ELF::R_HEX_TPREL_11_X;
343 break;
Colin LeMahieu2c769202014-11-06 17:05:51 +0000344 }
345 return Type;
346}
347
Rafael Espindola5560a4c2015-04-14 22:14:34 +0000348MCObjectWriter *llvm::createHexagonELFObjectWriter(raw_pwrite_stream &OS,
Colin LeMahieu2c769202014-11-06 17:05:51 +0000349 uint8_t OSABI,
350 StringRef CPU) {
351 MCELFObjectTargetWriter *MOTW = new HexagonELFObjectWriter(OSABI, CPU);
352 return createELFObjectWriter(MOTW, OS, /*IsLittleEndian*/ true);
Rafael Espindoladf7305a2015-04-09 17:10:57 +0000353}