LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AArch64ELFObjectWriter.cpp
Go to the documentation of this file.
1 //===-- AArch64ELFObjectWriter.cpp - AArch64 ELF Writer -------------------===//
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 // This file handles ELF-specific object emission, converting LLVM's internal
11 // fixups into the appropriate relocations.
12 //
13 //===----------------------------------------------------------------------===//
14 
18 #include "llvm/MC/MCValue.h"
20 
21 using namespace llvm;
22 
23 namespace {
24 class AArch64ELFObjectWriter : public MCELFObjectTargetWriter {
25 public:
26  AArch64ELFObjectWriter(uint8_t OSABI);
27 
28  virtual ~AArch64ELFObjectWriter();
29 
30 protected:
31  virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
32  bool IsPCRel, bool IsRelocWithSymbol,
33  int64_t Addend) const;
34 private:
35 };
36 }
37 
38 AArch64ELFObjectWriter::AArch64ELFObjectWriter(uint8_t OSABI)
39  : MCELFObjectTargetWriter(/*Is64Bit*/ true, OSABI, ELF::EM_AARCH64,
40  /*HasRelocationAddend*/ true)
41 {}
42 
43 AArch64ELFObjectWriter::~AArch64ELFObjectWriter()
44 {}
45 
46 unsigned AArch64ELFObjectWriter::GetRelocType(const MCValue &Target,
47  const MCFixup &Fixup,
48  bool IsPCRel,
49  bool IsRelocWithSymbol,
50  int64_t Addend) const {
51  unsigned Type;
52  if (IsPCRel) {
53  switch ((unsigned)Fixup.getKind()) {
54  default:
55  llvm_unreachable("Unimplemented fixup -> relocation");
56  case FK_Data_8:
57  return ELF::R_AARCH64_PREL64;
58  case FK_Data_4:
59  return ELF::R_AARCH64_PREL32;
60  case FK_Data_2:
61  return ELF::R_AARCH64_PREL16;
64  break;
67  break;
70  break;
73  break;
76  break;
79  break;
81  Type = ELF::R_AARCH64_JUMP26;
82  break;
84  Type = ELF::R_AARCH64_CALL26;
85  break;
88  break;
91  break;
94  break;
95  }
96  } else {
97  switch ((unsigned)Fixup.getKind()) {
98  default:
99  llvm_unreachable("Unimplemented fixup -> relocation");
100  case FK_Data_8:
101  return ELF::R_AARCH64_ABS64;
102  case FK_Data_4:
103  return ELF::R_AARCH64_ABS32;
104  case FK_Data_2:
105  return ELF::R_AARCH64_ABS16;
108  break;
111  break;
114  break;
117  break;
120  break;
123  break;
126  break;
129  break;
132  break;
135  break;
138  break;
141  break;
144  break;
147  break;
150  break;
153  break;
156  break;
157 
158  // TLS Local-dynamic block
161  break;
164  break;
167  break;
170  break;
173  break;
176  break;
179  break;
182  break;
185  break;
188  break;
191  break;
194  break;
197  break;
200  break;
203  break;
206  break;
207 
208  // TLS initial-exec block
211  break;
214  break;
217  break;
218 
219  // TLS local-exec block
222  break;
225  break;
228  break;
231  break;
234  break;
237  break;
240  break;
243  break;
246  break;
249  break;
252  break;
255  break;
258  break;
261  break;
264  break;
267  break;
268 
269  // TLS general-dynamic block
272  break;
275  break;
278  break;
281  break;
282  }
283  }
284 
285  return Type;
286 }
287 
289  uint8_t OSABI) {
290  MCELFObjectTargetWriter *MOTW = new AArch64ELFObjectWriter(OSABI);
291  return createELFObjectWriter(MOTW, OS, /*IsLittleEndian=*/true);
292 }
COFF::RelocationTypeX86 Type
Definition: COFFYAML.cpp:227
MCObjectWriter * createAArch64ELFObjectWriter(raw_ostream &OS, uint8_t OSABI)
#define llvm_unreachable(msg)
A four-byte fixup.
Definition: MCFixup.h:25
#define true
Definition: ConvertUTF.c:65
MCFixupKind getKind() const
Definition: MCFixup.h:88
MCObjectWriter * createELFObjectWriter(MCELFObjectTargetWriter *MOTW, raw_ostream &OS, bool IsLittleEndian)
Construct a new ELF writer instance.
A eight-byte fixup.
Definition: MCFixup.h:26
A two-byte fixup.
Definition: MCFixup.h:24