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