LLVM 23.0.0git
HexagonELFObjectWriter.cpp
Go to the documentation of this file.
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
12#include "llvm/MC/MCAssembler.h"
15#include "llvm/MC/MCValue.h"
16
17#define DEBUG_TYPE "hexagon-elf-writer"
18
19using namespace llvm;
20using namespace Hexagon;
21
22namespace {
23
24class HexagonELFObjectWriter : public MCELFObjectTargetWriter {
25private:
26 StringRef CPU;
27
28public:
29 HexagonELFObjectWriter(uint8_t OSABI, StringRef C);
30
31 unsigned getRelocType(const MCFixup &, const MCValue &,
32 bool IsPCRel) const override;
33};
34}
35
36HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C)
37 : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON,
38 /*HasRelocationAddend*/ true),
39 CPU(C) {}
40
41unsigned HexagonELFObjectWriter::getRelocType(const MCFixup &Fixup,
42 const MCValue &Target,
43 bool IsPCRel) const {
44 auto Variant = HexagonMCExpr::VariantKind(Target.getSpecifier());
45 switch (Variant) {
53 if (auto *SA = const_cast<MCSymbol *>(Target.getAddSym()))
54 static_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, fixup kind=" +
62 Twine(Fixup.getKind()));
63 break;
64 case FK_Data_8:
65 // Hexagon is a 32-bit target with no native 64-bit relocation.
66 // Handle 8-byte data fixups as 32-bit relocations -- on a
67 // little-endian 32-bit platform, addresses occupy the low 4 bytes
68 // and the high 4 bytes are zero.
69 switch (Variant) {
71 return IsPCRel ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
72 default:
73 report_fatal_error("Unrecognized variant type for FK_Data_8");
74 };
75 case FK_Data_4:
76 switch (Variant) {
78 return ELF::R_HEX_DTPREL_32;
80 return ELF::R_HEX_GOT_32;
82 return ELF::R_HEX_GOTREL_32;
84 return ELF::R_HEX_GD_GOT_32;
86 return ELF::R_HEX_IE_32;
88 return ELF::R_HEX_IE_GOT_32;
90 return ELF::R_HEX_LD_GOT_32;
92 return ELF::R_HEX_32_PCREL;
94 return ELF::R_HEX_TPREL_32;
96 return IsPCRel ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
97 default:
98 report_fatal_error("Unrecognized variant type");
99 };
100 case FK_Data_2:
101 switch(Variant) {
103 return ELF::R_HEX_DTPREL_16;
105 return ELF::R_HEX_GOT_16;
107 return ELF::R_HEX_GD_GOT_16;
109 return ELF::R_HEX_IE_GOT_16;
111 return ELF::R_HEX_LD_GOT_16;
113 return ELF::R_HEX_TPREL_16;
115 return ELF::R_HEX_16;
116 default:
117 report_fatal_error("Unrecognized variant type");
118 };
119 case FK_Data_1:
120 return ELF::R_HEX_8;
122 return ELF::R_HEX_B22_PCREL;
124 return ELF::R_HEX_B15_PCREL;
126 return ELF::R_HEX_B7_PCREL;
128 return ELF::R_HEX_LO16;
130 return ELF::R_HEX_HI16;
131 case fixup_Hexagon_32:
132 return ELF::R_HEX_32;
133 case fixup_Hexagon_16:
134 return ELF::R_HEX_16;
135 case fixup_Hexagon_8:
136 return ELF::R_HEX_8;
138 return ELF::R_HEX_GPREL16_0;
140 return ELF::R_HEX_GPREL16_1;
142 return ELF::R_HEX_GPREL16_2;
144 return ELF::R_HEX_GPREL16_3;
146 return ELF::R_HEX_HL16;
148 return ELF::R_HEX_B13_PCREL;
150 return ELF::R_HEX_B9_PCREL;
152 return ELF::R_HEX_B32_PCREL_X;
154 return ELF::R_HEX_32_6_X;
156 return ELF::R_HEX_B22_PCREL_X;
158 return ELF::R_HEX_B15_PCREL_X;
160 return ELF::R_HEX_B13_PCREL_X;
162 return ELF::R_HEX_B9_PCREL_X;
164 return ELF::R_HEX_B7_PCREL_X;
166 return ELF::R_HEX_16_X;
168 return ELF::R_HEX_12_X;
170 return ELF::R_HEX_11_X;
172 return ELF::R_HEX_10_X;
174 return ELF::R_HEX_9_X;
176 return ELF::R_HEX_8_X;
178 return ELF::R_HEX_7_X;
180 return ELF::R_HEX_6_X;
182 return ELF::R_HEX_32_PCREL;
184 return ELF::R_HEX_COPY;
186 return ELF::R_HEX_GLOB_DAT;
188 return ELF::R_HEX_JMP_SLOT;
190 return ELF::R_HEX_RELATIVE;
192 return ELF::R_HEX_PLT_B22_PCREL;
194 return ELF::R_HEX_GOTREL_LO16;
196 return ELF::R_HEX_GOTREL_HI16;
198 return ELF::R_HEX_GOTREL_32;
200 return ELF::R_HEX_GOT_LO16;
202 return ELF::R_HEX_GOT_HI16;
204 return ELF::R_HEX_GOT_32;
206 return ELF::R_HEX_GOT_16;
208 return ELF::R_HEX_DTPMOD_32;
210 return ELF::R_HEX_DTPREL_LO16;
212 return ELF::R_HEX_DTPREL_HI16;
214 return ELF::R_HEX_DTPREL_32;
216 return ELF::R_HEX_DTPREL_16;
218 return ELF::R_HEX_GD_PLT_B22_PCREL;
220 return ELF::R_HEX_LD_PLT_B22_PCREL;
222 return ELF::R_HEX_GD_GOT_LO16;
224 return ELF::R_HEX_GD_GOT_HI16;
226 return ELF::R_HEX_GD_GOT_32;
228 return ELF::R_HEX_GD_GOT_16;
230 return ELF::R_HEX_LD_GOT_LO16;
232 return ELF::R_HEX_LD_GOT_HI16;
234 return ELF::R_HEX_LD_GOT_32;
236 return ELF::R_HEX_LD_GOT_16;
238 return ELF::R_HEX_IE_LO16;
240 return ELF::R_HEX_IE_HI16;
242 return ELF::R_HEX_IE_32;
244 return ELF::R_HEX_IE_GOT_LO16;
246 return ELF::R_HEX_IE_GOT_HI16;
248 return ELF::R_HEX_IE_GOT_32;
250 return ELF::R_HEX_IE_GOT_16;
252 return ELF::R_HEX_TPREL_LO16;
254 return ELF::R_HEX_TPREL_HI16;
256 return ELF::R_HEX_TPREL_32;
258 return ELF::R_HEX_TPREL_16;
260 return ELF::R_HEX_6_PCREL_X;
262 return ELF::R_HEX_GOTREL_32_6_X;
264 return ELF::R_HEX_GOTREL_16_X;
266 return ELF::R_HEX_GOTREL_11_X;
268 return ELF::R_HEX_GOT_32_6_X;
270 return ELF::R_HEX_GOT_16_X;
272 return ELF::R_HEX_GOT_11_X;
274 return ELF::R_HEX_DTPREL_32_6_X;
276 return ELF::R_HEX_DTPREL_16_X;
278 return ELF::R_HEX_DTPREL_11_X;
280 return ELF::R_HEX_GD_GOT_32_6_X;
282 return ELF::R_HEX_GD_GOT_16_X;
284 return ELF::R_HEX_GD_GOT_11_X;
286 return ELF::R_HEX_LD_GOT_32_6_X;
288 return ELF::R_HEX_LD_GOT_16_X;
290 return ELF::R_HEX_LD_GOT_11_X;
292 return ELF::R_HEX_IE_32_6_X;
294 return ELF::R_HEX_IE_16_X;
296 return ELF::R_HEX_IE_GOT_32_6_X;
298 return ELF::R_HEX_IE_GOT_16_X;
300 return ELF::R_HEX_IE_GOT_11_X;
302 return ELF::R_HEX_TPREL_32_6_X;
304 return ELF::R_HEX_TPREL_16_X;
306 return ELF::R_HEX_TPREL_11_X;
308 return ELF::R_HEX_23_REG;
310 return ELF::R_HEX_27_REG;
312 return ELF::R_HEX_GD_PLT_B22_PCREL_X;
314 return ELF::R_HEX_GD_PLT_B32_PCREL_X;
316 return ELF::R_HEX_LD_PLT_B22_PCREL_X;
318 return ELF::R_HEX_LD_PLT_B32_PCREL_X;
319 }
320}
321
322std::unique_ptr<MCObjectTargetWriter>
324 return std::make_unique<HexagonELFObjectWriter>(OSABI, CPU);
325}
PowerPC TLS Dynamic Call Fixup
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition MCFixup.h:61
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Target - Wrapper for Target specific information.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ EM_HEXAGON
Definition ELF.h:262
@ STT_TLS
Definition ELF.h:1423
std::variant< std::monostate, Loc::Single, Loc::Multi, Loc::MMI, Loc::EntryValue > Variant
Alias for the std::variant specialization base class of DbgVariable.
Definition DwarfDebug.h:190
This is an optimization pass for GlobalISel generic memory operations.
std::unique_ptr< MCObjectTargetWriter > createHexagonELFObjectWriter(uint8_t OSABI, StringRef CPU)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
@ FK_Data_8
A eight-byte fixup.
Definition MCFixup.h:37
@ FK_Data_1
A one-byte fixup.
Definition MCFixup.h:34
@ FK_Data_4
A four-byte fixup.
Definition MCFixup.h:36
@ FK_Data_2
A two-byte fixup.
Definition MCFixup.h:35