LLVM  3.7.0
HexagonELFObjectWriter.cpp
Go to the documentation of this file.
1 //===-- HexagonELFObjectWriter.cpp - Hexagon Target Descriptions ----------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "Hexagon.h"
12 #include "llvm/MC/MCAssembler.h"
14 #include "llvm/Support/Debug.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(MCValue const &Target, MCFixup const &Fixup,
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(MCValue const & /*Target*/,
42  MCFixup const &Fixup,
43  bool IsPCRel) const {
44  switch ((unsigned)Fixup.getKind()) {
45  default:
46  DEBUG(dbgs() << "unrecognized relocation " << Fixup.getKind() << "\n");
47  llvm_unreachable("Unimplemented Fixup kind!");
48  return ELF::R_HEX_NONE;
49  case FK_Data_4:
50  return (IsPCRel) ? ELF::R_HEX_32_PCREL : ELF::R_HEX_32;
51  case FK_PCRel_4:
52  return ELF::R_HEX_32_PCREL;
53  case FK_Data_2:
54  return ELF::R_HEX_16;
55  case FK_Data_1:
56  return ELF::R_HEX_8;
58  return ELF::R_HEX_B22_PCREL;
60  return ELF::R_HEX_B15_PCREL;
62  return ELF::R_HEX_B7_PCREL;
63  case fixup_Hexagon_LO16:
64  return ELF::R_HEX_LO16;
65  case fixup_Hexagon_HI16:
66  return ELF::R_HEX_HI16;
67  case fixup_Hexagon_32:
68  return ELF::R_HEX_32;
69  case fixup_Hexagon_16:
70  return ELF::R_HEX_16;
71  case fixup_Hexagon_8:
72  return ELF::R_HEX_8;
74  return ELF::R_HEX_GPREL16_0;
76  return ELF::R_HEX_GPREL16_1;
78  return ELF::R_HEX_GPREL16_2;
80  return ELF::R_HEX_GPREL16_3;
81  case fixup_Hexagon_HL16:
82  return ELF::R_HEX_HL16;
84  return ELF::R_HEX_B13_PCREL;
86  return ELF::R_HEX_B9_PCREL;
88  return ELF::R_HEX_B32_PCREL_X;
90  return ELF::R_HEX_32_6_X;
92  return ELF::R_HEX_B22_PCREL_X;
94  return ELF::R_HEX_B15_PCREL_X;
96  return ELF::R_HEX_B13_PCREL_X;
98  return ELF::R_HEX_B9_PCREL_X;
100  return ELF::R_HEX_B7_PCREL_X;
101  case fixup_Hexagon_16_X:
102  return ELF::R_HEX_16_X;
103  case fixup_Hexagon_12_X:
104  return ELF::R_HEX_12_X;
105  case fixup_Hexagon_11_X:
106  return ELF::R_HEX_11_X;
107  case fixup_Hexagon_10_X:
108  return ELF::R_HEX_10_X;
109  case fixup_Hexagon_9_X:
110  return ELF::R_HEX_9_X;
111  case fixup_Hexagon_8_X:
112  return ELF::R_HEX_8_X;
113  case fixup_Hexagon_7_X:
114  return ELF::R_HEX_7_X;
115  case fixup_Hexagon_6_X:
116  return ELF::R_HEX_6_X;
118  return ELF::R_HEX_32_PCREL;
119  case fixup_Hexagon_COPY:
120  return ELF::R_HEX_COPY;
122  return ELF::R_HEX_GLOB_DAT;
124  return ELF::R_HEX_JMP_SLOT;
126  return ELF::R_HEX_RELATIVE;
128  return ELF::R_HEX_PLT_B22_PCREL;
130  return ELF::R_HEX_GOTREL_LO16;
132  return ELF::R_HEX_GOTREL_HI16;
134  return ELF::R_HEX_GOTREL_32;
136  return ELF::R_HEX_GOT_LO16;
138  return ELF::R_HEX_GOT_HI16;
140  return ELF::R_HEX_GOT_32;
142  return ELF::R_HEX_GOT_16;
144  return ELF::R_HEX_DTPMOD_32;
146  return ELF::R_HEX_DTPREL_LO16;
148  return ELF::R_HEX_DTPREL_HI16;
150  return ELF::R_HEX_DTPREL_32;
152  return ELF::R_HEX_DTPREL_16;
154  return ELF::R_HEX_GD_PLT_B22_PCREL;
156  return ELF::R_HEX_LD_PLT_B22_PCREL;
158  return ELF::R_HEX_GD_GOT_LO16;
160  return ELF::R_HEX_GD_GOT_HI16;
162  return ELF::R_HEX_GD_GOT_32;
164  return ELF::R_HEX_GD_GOT_16;
166  return ELF::R_HEX_LD_GOT_LO16;
168  return ELF::R_HEX_LD_GOT_HI16;
170  return ELF::R_HEX_LD_GOT_32;
172  return ELF::R_HEX_LD_GOT_16;
174  return ELF::R_HEX_IE_LO16;
176  return ELF::R_HEX_IE_HI16;
177  case fixup_Hexagon_IE_32:
178  return ELF::R_HEX_IE_32;
180  return ELF::R_HEX_IE_GOT_LO16;
182  return ELF::R_HEX_IE_GOT_HI16;
184  return ELF::R_HEX_IE_GOT_32;
186  return ELF::R_HEX_IE_GOT_16;
188  return ELF::R_HEX_TPREL_LO16;
190  return ELF::R_HEX_TPREL_HI16;
192  return ELF::R_HEX_TPREL_32;
194  return ELF::R_HEX_TPREL_16;
196  return ELF::R_HEX_6_PCREL_X;
198  return ELF::R_HEX_GOTREL_32_6_X;
200  return ELF::R_HEX_GOTREL_16_X;
202  return ELF::R_HEX_GOTREL_11_X;
204  return ELF::R_HEX_GOT_32_6_X;
206  return ELF::R_HEX_GOT_16_X;
208  return ELF::R_HEX_GOT_11_X;
210  return ELF::R_HEX_DTPREL_32_6_X;
212  return ELF::R_HEX_DTPREL_16_X;
214  return ELF::R_HEX_DTPREL_11_X;
216  return ELF::R_HEX_GD_GOT_32_6_X;
218  return ELF::R_HEX_GD_GOT_16_X;
220  return ELF::R_HEX_GD_GOT_11_X;
222  return ELF::R_HEX_LD_GOT_32_6_X;
224  return ELF::R_HEX_LD_GOT_16_X;
226  return ELF::R_HEX_LD_GOT_11_X;
228  return ELF::R_HEX_IE_32_6_X;
230  return ELF::R_HEX_IE_16_X;
232  return ELF::R_HEX_IE_GOT_32_6_X;
234  return ELF::R_HEX_IE_GOT_16_X;
236  return ELF::R_HEX_IE_GOT_11_X;
238  return ELF::R_HEX_TPREL_32_6_X;
240  return ELF::R_HEX_TPREL_16_X;
242  return ELF::R_HEX_TPREL_11_X;
243  }
244 }
245 
247  uint8_t OSABI,
248  StringRef CPU) {
249  MCELFObjectTargetWriter *MOTW = new HexagonELFObjectWriter(OSABI, CPU);
250  return createELFObjectWriter(MOTW, OS, /*IsLittleEndian*/ true);
251 }
This represents an "assembler immediate".
Definition: MCValue.h:44
Defines the object file and target independent interfaces used by the assembler backend to write nati...
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:62
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition: ErrorHandling.h:98
#define false
Definition: ConvertUTF.c:65
A four-byte fixup.
Definition: MCFixup.h:26
MCObjectWriter * createHexagonELFObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI, StringRef CPU)
#define true
Definition: ConvertUTF.c:66
MCFixupKind getKind() const
Definition: MCFixup.h:89
A one-byte fixup.
Definition: MCFixup.h:24
PowerPC TLS Dynamic Call Fixup
A four-byte pc relative fixup.
Definition: MCFixup.h:30
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:123
Target - Wrapper for Target specific information.
MCObjectWriter * createELFObjectWriter(MCELFObjectTargetWriter *MOTW, raw_pwrite_stream &OS, bool IsLittleEndian)
Construct a new ELF writer instance.
An abstract base class for streams implementations that also support a pwrite operation.
Definition: raw_ostream.h:321
#define DEBUG(X)
Definition: Debug.h:92
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:40
A two-byte fixup.
Definition: MCFixup.h:25