28 enum { DefaultEABIVersion = 0x05000000U };
34 ARMELFObjectWriter(uint8_t OSABI);
36 ~ARMELFObjectWriter()
override =
default;
39 const MCFixup &Fixup,
bool IsPCRel)
const override;
41 bool needsRelocateWithSymbol(
const MCSymbol &Sym,
42 unsigned Type)
const override;
49 ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI)
54 bool ARMELFObjectWriter::needsRelocateWithSymbol(
const MCSymbol &Sym,
55 unsigned Type)
const {
63 case ELF::R_ARM_PREL31:
64 case ELF::R_ARM_ABS32:
75 return GetRelocTypeInner(
Target,
Fixup, IsPCRel, Ctx);
78 unsigned ARMELFObjectWriter::GetRelocTypeInner(
const MCValue &
Target,
88 switch (
Fixup.getTargetKind()) {
91 return ELF::R_ARM_NONE;
96 "invalid fixup for 4-byte pc-relative data relocation");
97 return ELF::R_ARM_NONE;
98 case MCSymbolRefExpr::VK_None: {
102 if (SymRef->getSymbol().getName() ==
"_GLOBAL_OFFSET_TABLE_")
103 return ELF::R_ARM_BASE_PREL;
105 return ELF::R_ARM_REL32;
107 case MCSymbolRefExpr::VK_GOTTPOFF:
108 return ELF::R_ARM_TLS_IE32;
109 case MCSymbolRefExpr::VK_ARM_GOT_PREL:
110 return ELF::R_ARM_GOT_PREL;
111 case MCSymbolRefExpr::VK_ARM_PREL31:
112 return ELF::R_ARM_PREL31;
117 case MCSymbolRefExpr::VK_PLT:
118 return ELF::R_ARM_CALL;
119 case MCSymbolRefExpr::VK_TLSCALL:
120 return ELF::R_ARM_TLS_CALL;
122 return ELF::R_ARM_CALL;
127 return ELF::R_ARM_JUMP24;
129 return ELF::R_ARM_THM_JUMP19;
131 return ELF::R_ARM_THM_JUMP24;
133 return ELF::R_ARM_MOVT_PREL;
135 return ELF::R_ARM_MOVW_PREL_NC;
137 return ELF::R_ARM_THM_MOVT_PREL;
139 return ELF::R_ARM_THM_MOVW_PREL_NC;
141 return ELF::R_ARM_THM_JUMP11;
143 return ELF::R_ARM_THM_JUMP8;
147 case MCSymbolRefExpr::VK_TLSCALL:
148 return ELF::R_ARM_THM_TLS_CALL;
150 return ELF::R_ARM_THM_CALL;
153 return ELF::R_ARM_THM_BF16;
155 return ELF::R_ARM_THM_BF12;
157 return ELF::R_ARM_THM_BF18;
163 return ELF::R_ARM_NONE;
168 "invalid fixup for 1-byte data relocation");
169 return ELF::R_ARM_NONE;
170 case MCSymbolRefExpr::VK_None:
171 return ELF::R_ARM_ABS8;
177 "invalid fixup for 2-byte data relocation");
178 return ELF::R_ARM_NONE;
179 case MCSymbolRefExpr::VK_None:
180 return ELF::R_ARM_ABS16;
186 "invalid fixup for 4-byte data relocation");
187 return ELF::R_ARM_NONE;
188 case MCSymbolRefExpr::VK_ARM_NONE:
189 return ELF::R_ARM_NONE;
190 case MCSymbolRefExpr::VK_GOT:
191 return ELF::R_ARM_GOT_BREL;
192 case MCSymbolRefExpr::VK_TLSGD:
193 return ELF::R_ARM_TLS_GD32;
194 case MCSymbolRefExpr::VK_TPOFF:
195 return ELF::R_ARM_TLS_LE32;
196 case MCSymbolRefExpr::VK_GOTTPOFF:
197 return ELF::R_ARM_TLS_IE32;
198 case MCSymbolRefExpr::VK_None:
199 return ELF::R_ARM_ABS32;
200 case MCSymbolRefExpr::VK_GOTOFF:
201 return ELF::R_ARM_GOTOFF32;
202 case MCSymbolRefExpr::VK_ARM_GOT_PREL:
203 return ELF::R_ARM_GOT_PREL;
204 case MCSymbolRefExpr::VK_ARM_TARGET1:
205 return ELF::R_ARM_TARGET1;
206 case MCSymbolRefExpr::VK_ARM_TARGET2:
207 return ELF::R_ARM_TARGET2;
208 case MCSymbolRefExpr::VK_ARM_PREL31:
209 return ELF::R_ARM_PREL31;
210 case MCSymbolRefExpr::VK_ARM_SBREL:
211 return ELF::R_ARM_SBREL32;
212 case MCSymbolRefExpr::VK_ARM_TLSLDO:
213 return ELF::R_ARM_TLS_LDO32;
214 case MCSymbolRefExpr::VK_TLSCALL:
215 return ELF::R_ARM_TLS_CALL;
216 case MCSymbolRefExpr::VK_TLSDESC:
217 return ELF::R_ARM_TLS_GOTDESC;
218 case MCSymbolRefExpr::VK_TLSLDM:
219 return ELF::R_ARM_TLS_LDM32;
220 case MCSymbolRefExpr::VK_ARM_TLSDESCSEQ:
221 return ELF::R_ARM_TLS_DESCSEQ;
225 return ELF::R_ARM_JUMP24;
230 return ELF::R_ARM_NONE;
231 case MCSymbolRefExpr::VK_None:
232 return ELF::R_ARM_MOVT_ABS;
233 case MCSymbolRefExpr::VK_ARM_SBREL:
234 return ELF::R_ARM_MOVT_BREL;
240 return ELF::R_ARM_NONE;
241 case MCSymbolRefExpr::VK_None:
242 return ELF::R_ARM_MOVW_ABS_NC;
243 case MCSymbolRefExpr::VK_ARM_SBREL:
244 return ELF::R_ARM_MOVW_BREL_NC;
250 "invalid fixup for Thumb MOVT instruction");
251 return ELF::R_ARM_NONE;
252 case MCSymbolRefExpr::VK_None:
253 return ELF::R_ARM_THM_MOVT_ABS;
254 case MCSymbolRefExpr::VK_ARM_SBREL:
255 return ELF::R_ARM_THM_MOVT_BREL;
261 "invalid fixup for Thumb MOVW instruction");
262 return ELF::R_ARM_NONE;
263 case MCSymbolRefExpr::VK_None:
264 return ELF::R_ARM_THM_MOVW_ABS_NC;
265 case MCSymbolRefExpr::VK_ARM_SBREL:
266 return ELF::R_ARM_THM_MOVW_BREL_NC;
271 void ARMELFObjectWriter::addTargetSectionFlags(
MCContext &Ctx,
282 if (
auto *
DF = dyn_cast<MCDataFragment>(&
F))
283 if (!
DF->getContents().empty())
289 std::unique_ptr<MCObjectTargetWriter>
291 return std::make_unique<ARMELFObjectWriter>(OSABI);