LLVM 20.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
11#include "llvm/MC/MCAssembler.h"
14#include "llvm/MC/MCValue.h"
15#include "llvm/Support/Debug.h"
17
18#define DEBUG_TYPE "hexagon-elf-writer"
19
20using namespace llvm;
21using namespace Hexagon;
22
23namespace {
24
25class HexagonELFObjectWriter : public MCELFObjectTargetWriter {
26private:
27 StringRef CPU;
28
29public:
30 HexagonELFObjectWriter(uint8_t OSABI, StringRef C);
31
32 unsigned getRelocType(MCContext &Ctx, MCValue const &Target,
33 MCFixup const &Fixup, bool IsPCRel) const override;
34};
35}
36
37HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C)
38 : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON,
39 /*HasRelocationAddend*/ true),
40 CPU(C) {}
41
42unsigned HexagonELFObjectWriter::getRelocType(MCContext &Ctx,
43 MCValue const &Target,
44 MCFixup const &Fixup,
45 bool IsPCRel) const {
46 MCSymbolRefExpr::VariantKind Variant = Target.getAccessVariant();
47 switch (Fixup.getTargetKind()) {
48 default:
49 report_fatal_error("Unrecognized relocation type");
50 break;
51 case FK_Data_4:
52 switch(Variant) {
53 case MCSymbolRefExpr::VariantKind::VK_DTPREL:
54 return ELF::R_HEX_DTPREL_32;
55 case MCSymbolRefExpr::VariantKind::VK_GOT:
56 return ELF::R_HEX_GOT_32;
57 case MCSymbolRefExpr::VariantKind::VK_GOTREL:
58 return ELF::R_HEX_GOTREL_32;
59 case MCSymbolRefExpr::VariantKind::VK_Hexagon_GD_GOT:
60 return ELF::R_HEX_GD_GOT_32;
61 case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE:
62 return ELF::R_HEX_IE_32;
63 case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE_GOT:
64 return ELF::R_HEX_IE_GOT_32;
65 case MCSymbolRefExpr::VariantKind::VK_Hexagon_LD_GOT:
66 return ELF::R_HEX_LD_GOT_32;
67 case MCSymbolRefExpr::VariantKind::VK_PCREL:
68 return ELF::R_HEX_32_PCREL;
69 case MCSymbolRefExpr::VariantKind::VK_TPREL:
70 return ELF::R_HEX_TPREL_32;
71 case MCSymbolRefExpr::VariantKind::VK_None:
72 return IsPCRel ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
73 default:
74 report_fatal_error("Unrecognized variant type");
75 };
76 case FK_PCRel_4:
77 return ELF::R_HEX_32_PCREL;
78 case FK_Data_2:
79 switch(Variant) {
80 case MCSymbolRefExpr::VariantKind::VK_DTPREL:
81 return ELF::R_HEX_DTPREL_16;
82 case MCSymbolRefExpr::VariantKind::VK_GOT:
83 return ELF::R_HEX_GOT_16;
84 case MCSymbolRefExpr::VariantKind::VK_Hexagon_GD_GOT:
85 return ELF::R_HEX_GD_GOT_16;
86 case MCSymbolRefExpr::VariantKind::VK_Hexagon_IE_GOT:
87 return ELF::R_HEX_IE_GOT_16;
88 case MCSymbolRefExpr::VariantKind::VK_Hexagon_LD_GOT:
89 return ELF::R_HEX_LD_GOT_16;
90 case MCSymbolRefExpr::VariantKind::VK_TPREL:
91 return ELF::R_HEX_TPREL_16;
92 case MCSymbolRefExpr::VariantKind::VK_None:
93 return ELF::R_HEX_16;
94 default:
95 report_fatal_error("Unrecognized variant type");
96 };
97 case FK_Data_1:
98 return ELF::R_HEX_8;
100 return ELF::R_HEX_B22_PCREL;
102 return ELF::R_HEX_B15_PCREL;
104 return ELF::R_HEX_B7_PCREL;
106 return ELF::R_HEX_LO16;
108 return ELF::R_HEX_HI16;
109 case fixup_Hexagon_32:
110 return ELF::R_HEX_32;
111 case fixup_Hexagon_16:
112 return ELF::R_HEX_16;
113 case fixup_Hexagon_8:
114 return ELF::R_HEX_8;
116 return ELF::R_HEX_GPREL16_0;
118 return ELF::R_HEX_GPREL16_1;
120 return ELF::R_HEX_GPREL16_2;
122 return ELF::R_HEX_GPREL16_3;
124 return ELF::R_HEX_HL16;
126 return ELF::R_HEX_B13_PCREL;
128 return ELF::R_HEX_B9_PCREL;
130 return ELF::R_HEX_B32_PCREL_X;
132 return ELF::R_HEX_32_6_X;
134 return ELF::R_HEX_B22_PCREL_X;
136 return ELF::R_HEX_B15_PCREL_X;
138 return ELF::R_HEX_B13_PCREL_X;
140 return ELF::R_HEX_B9_PCREL_X;
142 return ELF::R_HEX_B7_PCREL_X;
144 return ELF::R_HEX_16_X;
146 return ELF::R_HEX_12_X;
148 return ELF::R_HEX_11_X;
150 return ELF::R_HEX_10_X;
152 return ELF::R_HEX_9_X;
154 return ELF::R_HEX_8_X;
156 return ELF::R_HEX_7_X;
158 return ELF::R_HEX_6_X;
160 return ELF::R_HEX_32_PCREL;
162 return ELF::R_HEX_COPY;
164 return ELF::R_HEX_GLOB_DAT;
166 return ELF::R_HEX_JMP_SLOT;
168 return ELF::R_HEX_RELATIVE;
170 return ELF::R_HEX_PLT_B22_PCREL;
172 return ELF::R_HEX_GOTREL_LO16;
174 return ELF::R_HEX_GOTREL_HI16;
176 return ELF::R_HEX_GOTREL_32;
178 return ELF::R_HEX_GOT_LO16;
180 return ELF::R_HEX_GOT_HI16;
182 return ELF::R_HEX_GOT_32;
184 return ELF::R_HEX_GOT_16;
186 return ELF::R_HEX_DTPMOD_32;
188 return ELF::R_HEX_DTPREL_LO16;
190 return ELF::R_HEX_DTPREL_HI16;
192 return ELF::R_HEX_DTPREL_32;
194 return ELF::R_HEX_DTPREL_16;
196 return ELF::R_HEX_GD_PLT_B22_PCREL;
198 return ELF::R_HEX_LD_PLT_B22_PCREL;
200 return ELF::R_HEX_GD_GOT_LO16;
202 return ELF::R_HEX_GD_GOT_HI16;
204 return ELF::R_HEX_GD_GOT_32;
206 return ELF::R_HEX_GD_GOT_16;
208 return ELF::R_HEX_LD_GOT_LO16;
210 return ELF::R_HEX_LD_GOT_HI16;
212 return ELF::R_HEX_LD_GOT_32;
214 return ELF::R_HEX_LD_GOT_16;
216 return ELF::R_HEX_IE_LO16;
218 return ELF::R_HEX_IE_HI16;
220 return ELF::R_HEX_IE_32;
222 return ELF::R_HEX_IE_GOT_LO16;
224 return ELF::R_HEX_IE_GOT_HI16;
226 return ELF::R_HEX_IE_GOT_32;
228 return ELF::R_HEX_IE_GOT_16;
230 return ELF::R_HEX_TPREL_LO16;
232 return ELF::R_HEX_TPREL_HI16;
234 return ELF::R_HEX_TPREL_32;
236 return ELF::R_HEX_TPREL_16;
238 return ELF::R_HEX_6_PCREL_X;
240 return ELF::R_HEX_GOTREL_32_6_X;
242 return ELF::R_HEX_GOTREL_16_X;
244 return ELF::R_HEX_GOTREL_11_X;
246 return ELF::R_HEX_GOT_32_6_X;
248 return ELF::R_HEX_GOT_16_X;
250 return ELF::R_HEX_GOT_11_X;
252 return ELF::R_HEX_DTPREL_32_6_X;
254 return ELF::R_HEX_DTPREL_16_X;
256 return ELF::R_HEX_DTPREL_11_X;
258 return ELF::R_HEX_GD_GOT_32_6_X;
260 return ELF::R_HEX_GD_GOT_16_X;
262 return ELF::R_HEX_GD_GOT_11_X;
264 return ELF::R_HEX_LD_GOT_32_6_X;
266 return ELF::R_HEX_LD_GOT_16_X;
268 return ELF::R_HEX_LD_GOT_11_X;
270 return ELF::R_HEX_IE_32_6_X;
272 return ELF::R_HEX_IE_16_X;
274 return ELF::R_HEX_IE_GOT_32_6_X;
276 return ELF::R_HEX_IE_GOT_16_X;
278 return ELF::R_HEX_IE_GOT_11_X;
280 return ELF::R_HEX_TPREL_32_6_X;
282 return ELF::R_HEX_TPREL_16_X;
284 return ELF::R_HEX_TPREL_11_X;
286 return ELF::R_HEX_23_REG;
288 return ELF::R_HEX_27_REG;
290 return ELF::R_HEX_GD_PLT_B22_PCREL_X;
292 return ELF::R_HEX_GD_PLT_B32_PCREL_X;
294 return ELF::R_HEX_LD_PLT_B22_PCREL_X;
296 return ELF::R_HEX_LD_PLT_B32_PCREL_X;
297 }
298}
299
300std::unique_ptr<MCObjectTargetWriter>
302 return std::make_unique<HexagonELFObjectWriter>(OSABI, CPU);
303}
basic Basic Alias true
PowerPC TLS Dynamic Call Fixup
Context object for machine code objects.
Definition: MCContext.h:83
virtual unsigned getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const =0
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:71
This represents an "assembler immediate".
Definition: MCValue.h:36
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
Target - Wrapper for Target specific information.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ EM_HEXAGON
Definition: ELF.h:258
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.
Definition: AddressRanges.h:18
std::unique_ptr< MCObjectTargetWriter > createHexagonELFObjectWriter(uint8_t OSABI, StringRef CPU)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
@ FK_PCRel_4
A four-byte pc relative fixup.
Definition: MCFixup.h:30
@ FK_Data_1
A one-byte fixup.
Definition: MCFixup.h:23
@ FK_Data_4
A four-byte fixup.
Definition: MCFixup.h:25
@ FK_Data_2
A two-byte fixup.
Definition: MCFixup.h:24