1 //===-- HexagonELFObjectWriter.cpp - Hexagon Target Descriptions ----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 #include "MCTargetDesc/HexagonFixupKinds.h"
12 #include "llvm/MC/MCAssembler.h"
13 #include "llvm/MC/MCELFObjectWriter.h"
14 #include "llvm/Support/Debug.h"
15 #include "llvm/Support/raw_ostream.h"
17 #define DEBUG_TYPE "hexagon-elf-writer"
20 using namespace Hexagon;
24 class HexagonELFObjectWriter : public MCELFObjectTargetWriter {
29 HexagonELFObjectWriter(uint8_t OSABI, StringRef C);
31 unsigned GetRelocType(MCValue const &Target, MCFixup const &Fixup,
32 bool IsPCRel) const override;
36 HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C)
37 : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON,
38 /*HasRelocationAddend*/ true),
41 unsigned HexagonELFObjectWriter::GetRelocType(MCValue const &/*Target*/,
44 // determine the type of the relocation
45 unsigned Type = (unsigned)ELF::R_HEX_NONE;
46 unsigned Kind = (unsigned)Fixup.getKind();
50 DEBUG(dbgs() << "unrecognized relocation " << Fixup.getKind() << "\n");
51 llvm_unreachable("Unimplemented Fixup kind!");
54 Type = (IsPCRel) ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
57 Type = ELF::R_HEX_32_PCREL;
65 case fixup_Hexagon_B22_PCREL:
66 Type = ELF::R_HEX_B22_PCREL;
68 case fixup_Hexagon_B15_PCREL:
69 Type = ELF::R_HEX_B15_PCREL;
71 case fixup_Hexagon_B7_PCREL:
72 Type = ELF::R_HEX_B7_PCREL;
74 case fixup_Hexagon_LO16:
75 Type = ELF::R_HEX_LO16;
77 case fixup_Hexagon_HI16:
78 Type = ELF::R_HEX_HI16;
80 case fixup_Hexagon_32:
83 case fixup_Hexagon_16:
89 case fixup_Hexagon_GPREL16_0:
90 Type = ELF::R_HEX_GPREL16_0;
92 case fixup_Hexagon_GPREL16_1:
93 Type = ELF::R_HEX_GPREL16_1;
95 case fixup_Hexagon_GPREL16_2:
96 Type = ELF::R_HEX_GPREL16_2;
98 case fixup_Hexagon_GPREL16_3:
99 Type = ELF::R_HEX_GPREL16_3;
101 case fixup_Hexagon_HL16:
102 Type = ELF::R_HEX_HL16;
104 case fixup_Hexagon_B13_PCREL:
105 Type = ELF::R_HEX_B13_PCREL;
107 case fixup_Hexagon_B9_PCREL:
108 Type = ELF::R_HEX_B9_PCREL;
110 case fixup_Hexagon_B32_PCREL_X:
111 Type = ELF::R_HEX_B32_PCREL_X;
113 case fixup_Hexagon_32_6_X:
114 Type = ELF::R_HEX_32_6_X;
116 case fixup_Hexagon_B22_PCREL_X:
117 Type = ELF::R_HEX_B22_PCREL_X;
119 case fixup_Hexagon_B15_PCREL_X:
120 Type = ELF::R_HEX_B15_PCREL_X;
122 case fixup_Hexagon_B13_PCREL_X:
123 Type = ELF::R_HEX_B13_PCREL_X;
125 case fixup_Hexagon_B9_PCREL_X:
126 Type = ELF::R_HEX_B9_PCREL_X;
128 case fixup_Hexagon_B7_PCREL_X:
129 Type = ELF::R_HEX_B7_PCREL_X;
131 case fixup_Hexagon_16_X:
132 Type = ELF::R_HEX_16_X;
134 case fixup_Hexagon_12_X:
135 Type = ELF::R_HEX_12_X;
137 case fixup_Hexagon_11_X:
138 Type = ELF::R_HEX_11_X;
140 case fixup_Hexagon_10_X:
141 Type = ELF::R_HEX_10_X;
143 case fixup_Hexagon_9_X:
144 Type = ELF::R_HEX_9_X;
146 case fixup_Hexagon_8_X:
147 Type = ELF::R_HEX_8_X;
149 case fixup_Hexagon_7_X:
150 Type = ELF::R_HEX_7_X;
152 case fixup_Hexagon_6_X:
153 Type = ELF::R_HEX_6_X;
155 case fixup_Hexagon_32_PCREL:
156 Type = ELF::R_HEX_32_PCREL;
158 case fixup_Hexagon_COPY:
159 Type = ELF::R_HEX_COPY;
161 case fixup_Hexagon_GLOB_DAT:
162 Type = ELF::R_HEX_GLOB_DAT;
164 case fixup_Hexagon_JMP_SLOT:
165 Type = ELF::R_HEX_JMP_SLOT;
167 case fixup_Hexagon_RELATIVE:
168 Type = ELF::R_HEX_RELATIVE;
170 case fixup_Hexagon_PLT_B22_PCREL:
171 Type = ELF::R_HEX_PLT_B22_PCREL;
173 case fixup_Hexagon_GOTREL_LO16:
174 Type = ELF::R_HEX_GOTREL_LO16;
176 case fixup_Hexagon_GOTREL_HI16:
177 Type = ELF::R_HEX_GOTREL_HI16;
179 case fixup_Hexagon_GOTREL_32:
180 Type = ELF::R_HEX_GOTREL_32;
182 case fixup_Hexagon_GOT_LO16:
183 Type = ELF::R_HEX_GOT_LO16;
185 case fixup_Hexagon_GOT_HI16:
186 Type = ELF::R_HEX_GOT_HI16;
188 case fixup_Hexagon_GOT_32:
189 Type = ELF::R_HEX_GOT_32;
191 case fixup_Hexagon_GOT_16:
192 Type = ELF::R_HEX_GOT_16;
194 case fixup_Hexagon_DTPMOD_32:
195 Type = ELF::R_HEX_DTPMOD_32;
197 case fixup_Hexagon_DTPREL_LO16:
198 Type = ELF::R_HEX_DTPREL_LO16;
200 case fixup_Hexagon_DTPREL_HI16:
201 Type = ELF::R_HEX_DTPREL_HI16;
203 case fixup_Hexagon_DTPREL_32:
204 Type = ELF::R_HEX_DTPREL_32;
206 case fixup_Hexagon_DTPREL_16:
207 Type = ELF::R_HEX_DTPREL_16;
209 case fixup_Hexagon_GD_PLT_B22_PCREL:
210 Type = ELF::R_HEX_GD_PLT_B22_PCREL;
212 case fixup_Hexagon_LD_PLT_B22_PCREL:
213 Type = ELF::R_HEX_LD_PLT_B22_PCREL;
215 case fixup_Hexagon_GD_GOT_LO16:
216 Type = ELF::R_HEX_GD_GOT_LO16;
218 case fixup_Hexagon_GD_GOT_HI16:
219 Type = ELF::R_HEX_GD_GOT_HI16;
221 case fixup_Hexagon_GD_GOT_32:
222 Type = ELF::R_HEX_GD_GOT_32;
224 case fixup_Hexagon_GD_GOT_16:
225 Type = ELF::R_HEX_GD_GOT_16;
227 case fixup_Hexagon_LD_GOT_LO16:
228 Type = ELF::R_HEX_LD_GOT_LO16;
230 case fixup_Hexagon_LD_GOT_HI16:
231 Type = ELF::R_HEX_LD_GOT_HI16;
233 case fixup_Hexagon_LD_GOT_32:
234 Type = ELF::R_HEX_LD_GOT_32;
236 case fixup_Hexagon_LD_GOT_16:
237 Type = ELF::R_HEX_LD_GOT_16;
239 case fixup_Hexagon_IE_LO16:
240 Type = ELF::R_HEX_IE_LO16;
242 case fixup_Hexagon_IE_HI16:
243 Type = ELF::R_HEX_IE_HI16;
245 case fixup_Hexagon_IE_32:
246 Type = ELF::R_HEX_IE_32;
248 case fixup_Hexagon_IE_GOT_LO16:
249 Type = ELF::R_HEX_IE_GOT_LO16;
251 case fixup_Hexagon_IE_GOT_HI16:
252 Type = ELF::R_HEX_IE_GOT_HI16;
254 case fixup_Hexagon_IE_GOT_32:
255 Type = ELF::R_HEX_IE_GOT_32;
257 case fixup_Hexagon_IE_GOT_16:
258 Type = ELF::R_HEX_IE_GOT_16;
260 case fixup_Hexagon_TPREL_LO16:
261 Type = ELF::R_HEX_TPREL_LO16;
263 case fixup_Hexagon_TPREL_HI16:
264 Type = ELF::R_HEX_TPREL_HI16;
266 case fixup_Hexagon_TPREL_32:
267 Type = ELF::R_HEX_TPREL_32;
269 case fixup_Hexagon_TPREL_16:
270 Type = ELF::R_HEX_TPREL_16;
272 case fixup_Hexagon_6_PCREL_X:
273 Type = ELF::R_HEX_6_PCREL_X;
275 case fixup_Hexagon_GOTREL_32_6_X:
276 Type = ELF::R_HEX_GOTREL_32_6_X;
278 case fixup_Hexagon_GOTREL_16_X:
279 Type = ELF::R_HEX_GOTREL_16_X;
281 case fixup_Hexagon_GOTREL_11_X:
282 Type = ELF::R_HEX_GOTREL_11_X;
284 case fixup_Hexagon_GOT_32_6_X:
285 Type = ELF::R_HEX_GOT_32_6_X;
287 case fixup_Hexagon_GOT_16_X:
288 Type = ELF::R_HEX_GOT_16_X;
290 case fixup_Hexagon_GOT_11_X:
291 Type = ELF::R_HEX_GOT_11_X;
293 case fixup_Hexagon_DTPREL_32_6_X:
294 Type = ELF::R_HEX_DTPREL_32_6_X;
296 case fixup_Hexagon_DTPREL_16_X:
297 Type = ELF::R_HEX_DTPREL_16_X;
299 case fixup_Hexagon_DTPREL_11_X:
300 Type = ELF::R_HEX_DTPREL_11_X;
302 case fixup_Hexagon_GD_GOT_32_6_X:
303 Type = ELF::R_HEX_GD_GOT_32_6_X;
305 case fixup_Hexagon_GD_GOT_16_X:
306 Type = ELF::R_HEX_GD_GOT_16_X;
308 case fixup_Hexagon_GD_GOT_11_X:
309 Type = ELF::R_HEX_GD_GOT_11_X;
311 case fixup_Hexagon_LD_GOT_32_6_X:
312 Type = ELF::R_HEX_LD_GOT_32_6_X;
314 case fixup_Hexagon_LD_GOT_16_X:
315 Type = ELF::R_HEX_LD_GOT_16_X;
317 case fixup_Hexagon_LD_GOT_11_X:
318 Type = ELF::R_HEX_LD_GOT_11_X;
320 case fixup_Hexagon_IE_32_6_X:
321 Type = ELF::R_HEX_IE_32_6_X;
323 case fixup_Hexagon_IE_16_X:
324 Type = ELF::R_HEX_IE_16_X;
326 case fixup_Hexagon_IE_GOT_32_6_X:
327 Type = ELF::R_HEX_IE_GOT_32_6_X;
329 case fixup_Hexagon_IE_GOT_16_X:
330 Type = ELF::R_HEX_IE_GOT_16_X;
332 case fixup_Hexagon_IE_GOT_11_X:
333 Type = ELF::R_HEX_IE_GOT_11_X;
335 case fixup_Hexagon_TPREL_32_6_X:
336 Type = ELF::R_HEX_TPREL_32_6_X;
338 case fixup_Hexagon_TPREL_16_X:
339 Type = ELF::R_HEX_TPREL_16_X;
341 case fixup_Hexagon_TPREL_11_X:
342 Type = ELF::R_HEX_TPREL_11_X;
348 MCObjectWriter *llvm::createHexagonELFObjectWriter(raw_pwrite_stream &OS,
351 MCELFObjectTargetWriter *MOTW = new HexagonELFObjectWriter(OSABI, CPU);
352 return createELFObjectWriter(MOTW, OS, /*IsLittleEndian*/ true);