LLVM 22.0.0git
M68kELFObjectWriter.cpp
Go to the documentation of this file.
1//===-- M68kELFObjectWriter.cpp - M68k ELF Writer ---------------*- C++ -*-===//
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/// \file
10/// This file contains definitions for M68k ELF Writers
11///
12//===----------------------------------------------------------------------===//
13
17
19#include "llvm/MC/MCAsmInfo.h"
20#include "llvm/MC/MCContext.h"
22#include "llvm/MC/MCExpr.h"
23#include "llvm/MC/MCValue.h"
25
26using namespace llvm;
27
28namespace {
29class M68kELFObjectWriter : public MCELFObjectTargetWriter {
30public:
31 M68kELFObjectWriter(uint8_t OSABI);
32
33 ~M68kELFObjectWriter() override;
34
35protected:
36 unsigned getRelocType(const MCFixup &, const MCValue &,
37 bool IsPCRel) const override;
38};
39} // namespace
40
41M68kELFObjectWriter::M68kELFObjectWriter(uint8_t OSABI)
42 : MCELFObjectTargetWriter(false, OSABI, ELF::EM_68K, /* RELA */ true) {}
43
44M68kELFObjectWriter::~M68kELFObjectWriter() {}
45
47
48static M68kRelType getType(unsigned Kind, M68k::Specifier &Modifier,
49 bool &IsPCRel) {
50 switch (Kind) {
51 case FK_Data_4:
52 return RT_32;
53 case FK_Data_2:
54 return RT_16;
55 case FK_Data_1:
56 return RT_8;
57 }
58 llvm_unreachable("Unimplemented");
59}
60
61unsigned M68kELFObjectWriter::getRelocType(const MCFixup &Fixup,
62 const MCValue &Target,
63 bool IsPCRel) const {
64 auto Specifier = M68k::Specifier(Target.getSpecifier());
65 unsigned Kind = Fixup.getKind();
66 M68kRelType Type = getType(Kind, Specifier, IsPCRel);
67 switch (Specifier) {
69 case M68k::S_TLSGD:
70 case M68k::S_TLSLD:
71 case M68k::S_TLSLDM:
72 case M68k::S_TPOFF:
73 if (auto *SA = const_cast<MCSymbol *>(Target.getAddSym()))
74 static_cast<MCSymbolELF *>(SA)->setType(ELF::STT_TLS);
75 break;
76 default:
77 break;
78 }
79
80 switch (Specifier) {
81 default:
82 llvm_unreachable("Unimplemented");
83
84 case M68k::S_TLSGD:
85 switch (Type) {
86 case RT_32:
87 return ELF::R_68K_TLS_GD32;
88 case RT_16:
89 return ELF::R_68K_TLS_GD16;
90 case RT_8:
91 return ELF::R_68K_TLS_GD8;
92 }
93 llvm_unreachable("Unrecognized size");
94 case M68k::S_TLSLDM:
95 switch (Type) {
96 case RT_32:
97 return ELF::R_68K_TLS_LDM32;
98 case RT_16:
99 return ELF::R_68K_TLS_LDM16;
100 case RT_8:
101 return ELF::R_68K_TLS_LDM8;
102 }
103 llvm_unreachable("Unrecognized size");
104 case M68k::S_TLSLD:
105 switch (Type) {
106 case RT_32:
107 return ELF::R_68K_TLS_LDO32;
108 case RT_16:
109 return ELF::R_68K_TLS_LDO16;
110 case RT_8:
111 return ELF::R_68K_TLS_LDO8;
112 }
113 llvm_unreachable("Unrecognized size");
114 case M68k::S_GOTTPOFF:
115 switch (Type) {
116 case RT_32:
117 return ELF::R_68K_TLS_IE32;
118 case RT_16:
119 return ELF::R_68K_TLS_IE16;
120 case RT_8:
121 return ELF::R_68K_TLS_IE8;
122 }
123 llvm_unreachable("Unrecognized size");
124 case M68k::S_TPOFF:
125 switch (Type) {
126 case RT_32:
127 return ELF::R_68K_TLS_LE32;
128 case RT_16:
129 return ELF::R_68K_TLS_LE16;
130 case RT_8:
131 return ELF::R_68K_TLS_LE8;
132 }
133 llvm_unreachable("Unrecognized size");
134 case M68k::S_None:
135 switch (Type) {
136 case RT_32:
137 return IsPCRel ? ELF::R_68K_PC32 : ELF::R_68K_32;
138 case RT_16:
139 return IsPCRel ? ELF::R_68K_PC16 : ELF::R_68K_16;
140 case RT_8:
141 return IsPCRel ? ELF::R_68K_PC8 : ELF::R_68K_8;
142 }
143 llvm_unreachable("Unrecognized size");
144 case M68k::S_GOTPCREL:
145 switch (Type) {
146 case RT_32:
147 return ELF::R_68K_GOTPCREL32;
148 case RT_16:
149 return ELF::R_68K_GOTPCREL16;
150 case RT_8:
151 return ELF::R_68K_GOTPCREL8;
152 }
153 llvm_unreachable("Unrecognized size");
154 case M68k::S_GOTOFF:
155 assert(!IsPCRel);
156 switch (Type) {
157 case RT_32:
158 return ELF::R_68K_GOTOFF32;
159 case RT_16:
160 return ELF::R_68K_GOTOFF16;
161 case RT_8:
162 return ELF::R_68K_GOTOFF8;
163 }
164 llvm_unreachable("Unrecognized size");
165 case M68k::S_PLT:
166 switch (Type) {
167 case RT_32:
168 return ELF::R_68K_PLT32;
169 case RT_16:
170 return ELF::R_68K_PLT16;
171 case RT_8:
172 return ELF::R_68K_PLT8;
173 }
174 llvm_unreachable("Unrecognized size");
175 }
176}
177
178std::unique_ptr<MCObjectTargetWriter>
180 return std::make_unique<M68kELFObjectWriter>(OSABI);
181}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static M68kRelType getType(unsigned Kind, M68k::Specifier &Modifier, bool &IsPCRel)
This file contains M68k specific fixup entries.
This file contains the declarations of the M68k MCAsmInfo properties.
This file provides M68k specific target descriptions.
PowerPC TLS Dynamic Call Fixup
virtual unsigned getRelocType(const MCFixup &Fixup, const MCValue &Target, bool IsPCRel) const =0
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:61
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:42
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ EM_68K
Definition: ELF.h:142
@ STT_TLS
Definition: ELF.h:1414
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ 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
std::unique_ptr< MCObjectTargetWriter > createM68kELFObjectWriter(uint8_t OSABI)
Construct an M68k ELF object writer.