LLVM  9.0.0svn
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 
9 #include "Hexagon.h"
11 #include "llvm/MC/MCAssembler.h"
13 #include "llvm/MC/MCObjectWriter.h"
14 #include "llvm/MC/MCValue.h"
15 #include "llvm/Support/Debug.h"
17 
18 #define DEBUG_TYPE "hexagon-elf-writer"
19 
20 using namespace llvm;
21 using namespace Hexagon;
22 
23 namespace {
24 
25 class HexagonELFObjectWriter : public MCELFObjectTargetWriter {
26 private:
27  StringRef CPU;
28 
29 public:
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 
37 HexagonELFObjectWriter::HexagonELFObjectWriter(uint8_t OSABI, StringRef C)
38  : MCELFObjectTargetWriter(/*Is64bit*/ false, OSABI, ELF::EM_HEXAGON,
39  /*HasRelocationAddend*/ true),
40  CPU(C) {}
41 
43  MCValue const &Target,
44  MCFixup const &Fixup,
45  bool IsPCRel) const {
47  switch ((unsigned)Fixup.getKind()) {
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_Hexagon_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;
105  case fixup_Hexagon_LO16:
106  return ELF::R_HEX_LO16;
107  case fixup_Hexagon_HI16:
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;
123  case fixup_Hexagon_HL16:
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;
143  case fixup_Hexagon_16_X:
144  return ELF::R_HEX_16_X;
145  case fixup_Hexagon_12_X:
146  return ELF::R_HEX_12_X;
147  case fixup_Hexagon_11_X:
148  return ELF::R_HEX_11_X;
149  case fixup_Hexagon_10_X:
150  return ELF::R_HEX_10_X;
151  case fixup_Hexagon_9_X:
152  return ELF::R_HEX_9_X;
153  case fixup_Hexagon_8_X:
154  return ELF::R_HEX_8_X;
155  case fixup_Hexagon_7_X:
156  return ELF::R_HEX_7_X;
157  case fixup_Hexagon_6_X:
158  return ELF::R_HEX_6_X;
160  return ELF::R_HEX_32_PCREL;
161  case fixup_Hexagon_COPY:
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;
219  case fixup_Hexagon_IE_32:
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 
300 std::unique_ptr<MCObjectTargetWriter>
302  return llvm::make_unique<HexagonELFObjectWriter>(OSABI, CPU);
303 }
uint64_t CallInst * C
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:139
This class represents lattice values for constants.
Definition: AllocatorList.h:23
This represents an "assembler immediate".
Definition: MCValue.h:39
MCSymbolRefExpr::VariantKind getAccessVariant() const
Definition: MCValue.cpp:46
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:73
static unsigned getRelocType(const MCValue &Target, const MCFixupKind FixupKind, const bool IsPCRel)
Translates generic PPC fixup kind to Mach-O/PPC relocation type enum.
A four-byte fixup.
Definition: MCFixup.h:25
Context object for machine code objects.
Definition: MCContext.h:62
A one-byte fixup.
Definition: MCFixup.h:23
PowerPC TLS Dynamic Call Fixup
A four-byte pc relative fixup.
Definition: MCFixup.h:29
std::unique_ptr< MCObjectTargetWriter > createHexagonELFObjectWriter(uint8_t OSABI, StringRef CPU)
Target - Wrapper for Target specific information.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
A two-byte fixup.
Definition: MCFixup.h:24
MCFixupKind getKind() const
Definition: MCFixup.h:122