[Hexagon] Adding basic ELF relocation generation and testing advanced relaxation...
[oota-llvm.git] / lib / Target / Hexagon / MCTargetDesc / HexagonELFObjectWriter.cpp
1 //===-- 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"
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"
16
17 #define DEBUG_TYPE "hexagon-elf-writer"
18
19 using namespace llvm;
20 using namespace Hexagon;
21
22 namespace {
23
24 class HexagonELFObjectWriter : public MCELFObjectTargetWriter {
25 private:
26   StringRef CPU;
27
28 public:
29   HexagonELFObjectWriter(uint8_t OSABI, StringRef C);
30
31   unsigned GetRelocType(MCValue const &Target, MCFixup const &Fixup,
32                         bool IsPCRel) const override;
33 };
34 }
35
36 HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C)
37     : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON,
38                               /*HasRelocationAddend*/ true),
39       CPU(C) {}
40
41 unsigned HexagonELFObjectWriter::GetRelocType(MCValue const &/*Target*/,
42                                               MCFixup const &Fixup,
43                                               bool IsPCRel) const {
44   // determine the type of the relocation
45   unsigned Type = (unsigned)ELF::R_HEX_NONE;
46   unsigned Kind = (unsigned)Fixup.getKind();
47
48   switch (Kind) {
49     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;
344   }
345   return Type;
346 }
347
348 MCObjectWriter *llvm::createHexagonELFObjectWriter(raw_pwrite_stream &OS,
349                                                    uint8_t OSABI,
350                                                    StringRef CPU) {
351   MCELFObjectTargetWriter *MOTW = new HexagonELFObjectWriter(OSABI, CPU);
352   return createELFObjectWriter(MOTW, OS, /*IsLittleEndian*/ true);
353 }