xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonELFObjectWriter.cpp (revision 1ed2ef42e01771f5d8ca9be61e07dcf0fd47feba)
1 //===-- HexagonELFObjectWriter.cpp - Hexagon Target Descriptions ----------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "MCTargetDesc/HexagonFixupKinds.h"
10 #include "MCTargetDesc/HexagonMCExpr.h"
11 #include "MCTargetDesc/HexagonMCTargetDesc.h"
12 #include "llvm/MC/MCAssembler.h"
13 #include "llvm/MC/MCELFObjectWriter.h"
14 #include "llvm/MC/MCObjectWriter.h"
15 #include "llvm/MC/MCValue.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(const MCFixup &, const MCValue &,
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(const MCFixup &Fixup,
42                                               const MCValue &Target,
43                                               bool IsPCRel) const {
44   auto Variant = HexagonMCExpr::VariantKind(Target.getSpecifier());
45   switch (Variant) {
46   case HexagonMCExpr::VK_GD_GOT:
47   case HexagonMCExpr::VK_LD_GOT:
48   case HexagonMCExpr::VK_GD_PLT:
49   case HexagonMCExpr::VK_LD_PLT:
50   case HexagonMCExpr::VK_IE:
51   case HexagonMCExpr::VK_IE_GOT:
52   case HexagonMCExpr::VK_TPREL:
53     if (auto *SA = Target.getAddSym())
54       cast<MCSymbolELF>(SA)->setType(ELF::STT_TLS);
55     break;
56   default:
57     break;
58   }
59   switch (Fixup.getKind()) {
60   default:
61     report_fatal_error("Unrecognized relocation type");
62     break;
63   case FK_Data_4:
64     switch (Variant) {
65     case HexagonMCExpr::VK_DTPREL:
66       return ELF::R_HEX_DTPREL_32;
67     case HexagonMCExpr::VK_GOT:
68       return ELF::R_HEX_GOT_32;
69     case HexagonMCExpr::VK_GOTREL:
70       return ELF::R_HEX_GOTREL_32;
71     case HexagonMCExpr::VK_GD_GOT:
72       return ELF::R_HEX_GD_GOT_32;
73     case HexagonMCExpr::VK_IE:
74       return ELF::R_HEX_IE_32;
75     case HexagonMCExpr::VK_IE_GOT:
76       return ELF::R_HEX_IE_GOT_32;
77     case HexagonMCExpr::VK_LD_GOT:
78       return ELF::R_HEX_LD_GOT_32;
79     case HexagonMCExpr::VK_PCREL:
80       return ELF::R_HEX_32_PCREL;
81     case HexagonMCExpr::VK_TPREL:
82       return ELF::R_HEX_TPREL_32;
83     case HexagonMCExpr::VK_None:
84       return IsPCRel ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
85     default:
86       report_fatal_error("Unrecognized variant type");
87     };
88   case FK_Data_2:
89     switch(Variant) {
90     case HexagonMCExpr::VK_DTPREL:
91       return ELF::R_HEX_DTPREL_16;
92     case HexagonMCExpr::VK_GOT:
93       return ELF::R_HEX_GOT_16;
94     case HexagonMCExpr::VK_GD_GOT:
95       return ELF::R_HEX_GD_GOT_16;
96     case HexagonMCExpr::VK_IE_GOT:
97       return ELF::R_HEX_IE_GOT_16;
98     case HexagonMCExpr::VK_LD_GOT:
99       return ELF::R_HEX_LD_GOT_16;
100     case HexagonMCExpr::VK_TPREL:
101       return ELF::R_HEX_TPREL_16;
102     case HexagonMCExpr::VK_None:
103       return ELF::R_HEX_16;
104     default:
105       report_fatal_error("Unrecognized variant type");
106     };
107   case FK_Data_1:
108     return ELF::R_HEX_8;
109   case fixup_Hexagon_B22_PCREL:
110     return ELF::R_HEX_B22_PCREL;
111   case fixup_Hexagon_B15_PCREL:
112     return ELF::R_HEX_B15_PCREL;
113   case fixup_Hexagon_B7_PCREL:
114     return ELF::R_HEX_B7_PCREL;
115   case fixup_Hexagon_LO16:
116     return ELF::R_HEX_LO16;
117   case fixup_Hexagon_HI16:
118     return ELF::R_HEX_HI16;
119   case fixup_Hexagon_32:
120     return ELF::R_HEX_32;
121   case fixup_Hexagon_16:
122     return ELF::R_HEX_16;
123   case fixup_Hexagon_8:
124     return ELF::R_HEX_8;
125   case fixup_Hexagon_GPREL16_0:
126     return ELF::R_HEX_GPREL16_0;
127   case fixup_Hexagon_GPREL16_1:
128     return ELF::R_HEX_GPREL16_1;
129   case fixup_Hexagon_GPREL16_2:
130     return ELF::R_HEX_GPREL16_2;
131   case fixup_Hexagon_GPREL16_3:
132     return ELF::R_HEX_GPREL16_3;
133   case fixup_Hexagon_HL16:
134     return ELF::R_HEX_HL16;
135   case fixup_Hexagon_B13_PCREL:
136     return ELF::R_HEX_B13_PCREL;
137   case fixup_Hexagon_B9_PCREL:
138     return ELF::R_HEX_B9_PCREL;
139   case fixup_Hexagon_B32_PCREL_X:
140     return ELF::R_HEX_B32_PCREL_X;
141   case fixup_Hexagon_32_6_X:
142     return ELF::R_HEX_32_6_X;
143   case fixup_Hexagon_B22_PCREL_X:
144     return ELF::R_HEX_B22_PCREL_X;
145   case fixup_Hexagon_B15_PCREL_X:
146     return ELF::R_HEX_B15_PCREL_X;
147   case fixup_Hexagon_B13_PCREL_X:
148     return ELF::R_HEX_B13_PCREL_X;
149   case fixup_Hexagon_B9_PCREL_X:
150     return ELF::R_HEX_B9_PCREL_X;
151   case fixup_Hexagon_B7_PCREL_X:
152     return ELF::R_HEX_B7_PCREL_X;
153   case fixup_Hexagon_16_X:
154     return ELF::R_HEX_16_X;
155   case fixup_Hexagon_12_X:
156     return ELF::R_HEX_12_X;
157   case fixup_Hexagon_11_X:
158     return ELF::R_HEX_11_X;
159   case fixup_Hexagon_10_X:
160     return ELF::R_HEX_10_X;
161   case fixup_Hexagon_9_X:
162     return ELF::R_HEX_9_X;
163   case fixup_Hexagon_8_X:
164     return ELF::R_HEX_8_X;
165   case fixup_Hexagon_7_X:
166     return ELF::R_HEX_7_X;
167   case fixup_Hexagon_6_X:
168     return ELF::R_HEX_6_X;
169   case fixup_Hexagon_32_PCREL:
170     return ELF::R_HEX_32_PCREL;
171   case fixup_Hexagon_COPY:
172     return ELF::R_HEX_COPY;
173   case fixup_Hexagon_GLOB_DAT:
174     return ELF::R_HEX_GLOB_DAT;
175   case fixup_Hexagon_JMP_SLOT:
176     return ELF::R_HEX_JMP_SLOT;
177   case fixup_Hexagon_RELATIVE:
178     return ELF::R_HEX_RELATIVE;
179   case fixup_Hexagon_PLT_B22_PCREL:
180     return ELF::R_HEX_PLT_B22_PCREL;
181   case fixup_Hexagon_GOTREL_LO16:
182     return ELF::R_HEX_GOTREL_LO16;
183   case fixup_Hexagon_GOTREL_HI16:
184     return ELF::R_HEX_GOTREL_HI16;
185   case fixup_Hexagon_GOTREL_32:
186     return ELF::R_HEX_GOTREL_32;
187   case fixup_Hexagon_GOT_LO16:
188     return ELF::R_HEX_GOT_LO16;
189   case fixup_Hexagon_GOT_HI16:
190     return ELF::R_HEX_GOT_HI16;
191   case fixup_Hexagon_GOT_32:
192     return ELF::R_HEX_GOT_32;
193   case fixup_Hexagon_GOT_16:
194     return ELF::R_HEX_GOT_16;
195   case fixup_Hexagon_DTPMOD_32:
196     return ELF::R_HEX_DTPMOD_32;
197   case fixup_Hexagon_DTPREL_LO16:
198     return ELF::R_HEX_DTPREL_LO16;
199   case fixup_Hexagon_DTPREL_HI16:
200     return ELF::R_HEX_DTPREL_HI16;
201   case fixup_Hexagon_DTPREL_32:
202     return ELF::R_HEX_DTPREL_32;
203   case fixup_Hexagon_DTPREL_16:
204     return ELF::R_HEX_DTPREL_16;
205   case fixup_Hexagon_GD_PLT_B22_PCREL:
206     return ELF::R_HEX_GD_PLT_B22_PCREL;
207   case fixup_Hexagon_LD_PLT_B22_PCREL:
208     return ELF::R_HEX_LD_PLT_B22_PCREL;
209   case fixup_Hexagon_GD_GOT_LO16:
210     return ELF::R_HEX_GD_GOT_LO16;
211   case fixup_Hexagon_GD_GOT_HI16:
212     return ELF::R_HEX_GD_GOT_HI16;
213   case fixup_Hexagon_GD_GOT_32:
214     return ELF::R_HEX_GD_GOT_32;
215   case fixup_Hexagon_GD_GOT_16:
216     return ELF::R_HEX_GD_GOT_16;
217   case fixup_Hexagon_LD_GOT_LO16:
218     return ELF::R_HEX_LD_GOT_LO16;
219   case fixup_Hexagon_LD_GOT_HI16:
220     return ELF::R_HEX_LD_GOT_HI16;
221   case fixup_Hexagon_LD_GOT_32:
222     return ELF::R_HEX_LD_GOT_32;
223   case fixup_Hexagon_LD_GOT_16:
224     return ELF::R_HEX_LD_GOT_16;
225   case fixup_Hexagon_IE_LO16:
226     return ELF::R_HEX_IE_LO16;
227   case fixup_Hexagon_IE_HI16:
228     return ELF::R_HEX_IE_HI16;
229   case fixup_Hexagon_IE_32:
230     return ELF::R_HEX_IE_32;
231   case fixup_Hexagon_IE_GOT_LO16:
232     return ELF::R_HEX_IE_GOT_LO16;
233   case fixup_Hexagon_IE_GOT_HI16:
234     return ELF::R_HEX_IE_GOT_HI16;
235   case fixup_Hexagon_IE_GOT_32:
236     return ELF::R_HEX_IE_GOT_32;
237   case fixup_Hexagon_IE_GOT_16:
238     return ELF::R_HEX_IE_GOT_16;
239   case fixup_Hexagon_TPREL_LO16:
240     return ELF::R_HEX_TPREL_LO16;
241   case fixup_Hexagon_TPREL_HI16:
242     return ELF::R_HEX_TPREL_HI16;
243   case fixup_Hexagon_TPREL_32:
244     return ELF::R_HEX_TPREL_32;
245   case fixup_Hexagon_TPREL_16:
246     return ELF::R_HEX_TPREL_16;
247   case fixup_Hexagon_6_PCREL_X:
248     return ELF::R_HEX_6_PCREL_X;
249   case fixup_Hexagon_GOTREL_32_6_X:
250     return ELF::R_HEX_GOTREL_32_6_X;
251   case fixup_Hexagon_GOTREL_16_X:
252     return ELF::R_HEX_GOTREL_16_X;
253   case fixup_Hexagon_GOTREL_11_X:
254     return ELF::R_HEX_GOTREL_11_X;
255   case fixup_Hexagon_GOT_32_6_X:
256     return ELF::R_HEX_GOT_32_6_X;
257   case fixup_Hexagon_GOT_16_X:
258     return ELF::R_HEX_GOT_16_X;
259   case fixup_Hexagon_GOT_11_X:
260     return ELF::R_HEX_GOT_11_X;
261   case fixup_Hexagon_DTPREL_32_6_X:
262     return ELF::R_HEX_DTPREL_32_6_X;
263   case fixup_Hexagon_DTPREL_16_X:
264     return ELF::R_HEX_DTPREL_16_X;
265   case fixup_Hexagon_DTPREL_11_X:
266     return ELF::R_HEX_DTPREL_11_X;
267   case fixup_Hexagon_GD_GOT_32_6_X:
268     return ELF::R_HEX_GD_GOT_32_6_X;
269   case fixup_Hexagon_GD_GOT_16_X:
270     return ELF::R_HEX_GD_GOT_16_X;
271   case fixup_Hexagon_GD_GOT_11_X:
272     return ELF::R_HEX_GD_GOT_11_X;
273   case fixup_Hexagon_LD_GOT_32_6_X:
274     return ELF::R_HEX_LD_GOT_32_6_X;
275   case fixup_Hexagon_LD_GOT_16_X:
276     return ELF::R_HEX_LD_GOT_16_X;
277   case fixup_Hexagon_LD_GOT_11_X:
278     return ELF::R_HEX_LD_GOT_11_X;
279   case fixup_Hexagon_IE_32_6_X:
280     return ELF::R_HEX_IE_32_6_X;
281   case fixup_Hexagon_IE_16_X:
282     return ELF::R_HEX_IE_16_X;
283   case fixup_Hexagon_IE_GOT_32_6_X:
284     return ELF::R_HEX_IE_GOT_32_6_X;
285   case fixup_Hexagon_IE_GOT_16_X:
286     return ELF::R_HEX_IE_GOT_16_X;
287   case fixup_Hexagon_IE_GOT_11_X:
288     return ELF::R_HEX_IE_GOT_11_X;
289   case fixup_Hexagon_TPREL_32_6_X:
290     return ELF::R_HEX_TPREL_32_6_X;
291   case fixup_Hexagon_TPREL_16_X:
292     return ELF::R_HEX_TPREL_16_X;
293   case fixup_Hexagon_TPREL_11_X:
294     return ELF::R_HEX_TPREL_11_X;
295   case fixup_Hexagon_23_REG:
296     return ELF::R_HEX_23_REG;
297   case fixup_Hexagon_27_REG:
298     return ELF::R_HEX_27_REG;
299   case fixup_Hexagon_GD_PLT_B22_PCREL_X:
300     return ELF::R_HEX_GD_PLT_B22_PCREL_X;
301   case fixup_Hexagon_GD_PLT_B32_PCREL_X:
302     return ELF::R_HEX_GD_PLT_B32_PCREL_X;
303   case fixup_Hexagon_LD_PLT_B22_PCREL_X:
304     return ELF::R_HEX_LD_PLT_B22_PCREL_X;
305   case fixup_Hexagon_LD_PLT_B32_PCREL_X:
306     return ELF::R_HEX_LD_PLT_B32_PCREL_X;
307   }
308 }
309 
310 std::unique_ptr<MCObjectTargetWriter>
311 llvm::createHexagonELFObjectWriter(uint8_t OSABI, StringRef CPU) {
312   return std::make_unique<HexagonELFObjectWriter>(OSABI, CPU);
313 }
314