29 enum { DefaultEABIVersion = 0x05000000U };
35 ARMELFObjectWriter(uint8_t OSABI);
37 ~ARMELFObjectWriter()
override =
default;
43 unsigned Type)
const override;
50ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI)
55bool ARMELFObjectWriter::needsRelocateWithSymbol(
const MCValue &,
57 unsigned Type)
const {
65 case ELF::R_ARM_PREL31:
66 case ELF::R_ARM_ABS32:
77 return GetRelocTypeInner(
Target,
Fixup, IsPCRel, Ctx);
80unsigned ARMELFObjectWriter::GetRelocTypeInner(
const MCValue &
Target,
93 " only supported in FDPIC mode");
98 switch (
Fixup.getTargetKind()) {
101 return ELF::R_ARM_NONE;
106 "invalid fixup for 4-byte pc-relative data relocation");
107 return ELF::R_ARM_NONE;
112 if (SymRef->getSymbol().getName() ==
"_GLOBAL_OFFSET_TABLE_")
113 return ELF::R_ARM_BASE_PREL;
115 return ELF::R_ARM_REL32;
118 return ELF::R_ARM_TLS_IE32;
120 return ELF::R_ARM_GOT_PREL;
122 return ELF::R_ARM_PREL31;
128 return ELF::R_ARM_CALL;
130 return ELF::R_ARM_TLS_CALL;
132 return ELF::R_ARM_CALL;
137 return ELF::R_ARM_JUMP24;
139 return ELF::R_ARM_THM_JUMP19;
141 return ELF::R_ARM_THM_JUMP24;
143 return ELF::R_ARM_MOVT_PREL;
145 return ELF::R_ARM_MOVW_PREL_NC;
147 return ELF::R_ARM_THM_MOVT_PREL;
149 return ELF::R_ARM_THM_MOVW_PREL_NC;
151 return ELF::R_ARM_THM_ALU_ABS_G3;
153 return ELF::R_ARM_THM_ALU_ABS_G2_NC;
155 return ELF::R_ARM_THM_ALU_ABS_G1_NC;
157 return ELF::R_ARM_THM_ALU_ABS_G0_NC;
159 return ELF::R_ARM_THM_JUMP11;
161 return ELF::R_ARM_THM_JUMP8;
166 return ELF::R_ARM_THM_TLS_CALL;
168 return ELF::R_ARM_THM_CALL;
171 return ELF::R_ARM_LDR_PC_G0;
173 return ELF::R_ARM_LDRS_PC_G0;
175 return ELF::R_ARM_THM_PC12;
177 return ELF::R_ARM_ALU_PC_G0;
179 return ELF::R_ARM_THM_PC8;
181 return ELF::R_ARM_THM_ALU_PREL_11_0;
183 return ELF::R_ARM_THM_BF16;
185 return ELF::R_ARM_THM_BF12;
187 return ELF::R_ARM_THM_BF18;
193 return ELF::R_ARM_NONE;
198 "invalid fixup for 1-byte data relocation");
199 return ELF::R_ARM_NONE;
201 return ELF::R_ARM_ABS8;
207 "invalid fixup for 2-byte data relocation");
208 return ELF::R_ARM_NONE;
210 return ELF::R_ARM_ABS16;
216 "invalid fixup for 4-byte data relocation");
217 return ELF::R_ARM_NONE;
219 return ELF::R_ARM_NONE;
221 return ELF::R_ARM_GOT_BREL;
223 return ELF::R_ARM_TLS_GD32;
225 return ELF::R_ARM_TLS_LE32;
227 return ELF::R_ARM_TLS_IE32;
229 return ELF::R_ARM_ABS32;
231 return ELF::R_ARM_GOTOFF32;
233 return ELF::R_ARM_GOT_PREL;
235 return ELF::R_ARM_TARGET1;
237 return ELF::R_ARM_TARGET2;
239 return ELF::R_ARM_PREL31;
241 return ELF::R_ARM_SBREL32;
243 return ELF::R_ARM_TLS_LDO32;
245 return ELF::R_ARM_TLS_CALL;
247 return ELF::R_ARM_TLS_GOTDESC;
249 return ELF::R_ARM_TLS_LDM32;
251 return ELF::R_ARM_TLS_DESCSEQ;
253 return CheckFDPIC(ELF::R_ARM_FUNCDESC);
255 return CheckFDPIC(ELF::R_ARM_GOTFUNCDESC);
257 return CheckFDPIC(ELF::R_ARM_GOTOFFFUNCDESC);
259 return CheckFDPIC(ELF::R_ARM_TLS_GD32_FDPIC);
261 return CheckFDPIC(ELF::R_ARM_TLS_LDM32_FDPIC);
263 return CheckFDPIC(ELF::R_ARM_TLS_IE32_FDPIC);
267 return ELF::R_ARM_JUMP24;
272 return ELF::R_ARM_NONE;
274 return ELF::R_ARM_MOVT_ABS;
276 return ELF::R_ARM_MOVT_BREL;
282 return ELF::R_ARM_NONE;
284 return ELF::R_ARM_MOVW_ABS_NC;
286 return ELF::R_ARM_MOVW_BREL_NC;
292 "invalid fixup for Thumb MOVT instruction");
293 return ELF::R_ARM_NONE;
295 return ELF::R_ARM_THM_MOVT_ABS;
297 return ELF::R_ARM_THM_MOVT_BREL;
303 "invalid fixup for Thumb MOVW instruction");
304 return ELF::R_ARM_NONE;
306 return ELF::R_ARM_THM_MOVW_ABS_NC;
308 return ELF::R_ARM_THM_MOVW_BREL_NC;
312 return ELF::R_ARM_THM_ALU_ABS_G3;
314 return ELF::R_ARM_THM_ALU_ABS_G2_NC;
316 return ELF::R_ARM_THM_ALU_ABS_G1_NC;
318 return ELF::R_ARM_THM_ALU_ABS_G0_NC;
322void ARMELFObjectWriter::addTargetSectionFlags(
MCContext &Ctx,
333 if (
auto *
DF = dyn_cast<MCDataFragment>(&
F))
334 if (!
DF->getContents().empty())
340std::unique_ptr<MCObjectTargetWriter>
342 return std::make_unique<ARMELFObjectWriter>(OSABI);
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
PowerPC TLS Dynamic Call Fixup
Context object for machine code objects.
const MCObjectFileInfo * getObjectFileInfo() const
void reportError(SMLoc L, const Twine &Msg)
virtual bool needsRelocateWithSymbol(const MCValue &Val, const MCSymbol &Sym, unsigned Type) const
virtual unsigned getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const =0
virtual void addTargetSectionFlags(MCContext &Ctx, MCSectionELF &Sec)
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
MCSection * getTextSection() const
This represents a section on linux, lots of unix variants and some bare metal systems.
unsigned getFlags() const
void setFlags(unsigned F)
MCSection::FragmentListType & getFragmentList()
bool hasInstructions() const
SectionKind getKind() const
Represent a reference to a symbol from inside an expression.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
This represents an "assembler immediate".
bool isExecuteOnly() const
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
@ fixup_thumb_adr_pcrel_10
@ fixup_arm_thumb_upper_8_15
@ fixup_arm_thumb_lower_0_7
@ fixup_arm_pcrel_10_unscaled
@ fixup_arm_thumb_upper_0_7
@ fixup_arm_ldst_pcrel_12
@ fixup_arm_thumb_lower_8_15
StringRef getELFRelocationTypeName(uint32_t Machine, uint32_t Type)
This is an optimization pass for GlobalISel generic memory operations.
@ FirstLiteralRelocationKind
The range [FirstLiteralRelocationKind, MaxTargetFixupKind) is used for relocations coming from ....
@ FK_Data_1
A one-byte fixup.
@ FK_Data_4
A four-byte fixup.
@ FK_Data_2
A two-byte fixup.
std::unique_ptr< MCObjectTargetWriter > createARMELFObjectWriter(uint8_t OSABI)
Construct an ELF Mach-O object writer.