28 enum { DefaultEABIVersion = 0x05000000U };
34 ARMELFObjectWriter(uint8_t OSABI);
36 ~ARMELFObjectWriter()
override =
default;
42 unsigned Type)
const override;
49ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI)
54bool ARMELFObjectWriter::needsRelocateWithSymbol(
const MCValue &,
56 unsigned Type)
const {
64 case ELF::R_ARM_PREL31:
65 case ELF::R_ARM_ABS32:
76 return GetRelocTypeInner(
Target,
Fixup, IsPCRel, Ctx);
79unsigned ARMELFObjectWriter::GetRelocTypeInner(
const MCValue &
Target,
89 switch (
Fixup.getTargetKind()) {
92 return ELF::R_ARM_NONE;
97 "invalid fixup for 4-byte pc-relative data relocation");
98 return ELF::R_ARM_NONE;
103 if (SymRef->getSymbol().getName() ==
"_GLOBAL_OFFSET_TABLE_")
104 return ELF::R_ARM_BASE_PREL;
106 return ELF::R_ARM_REL32;
109 return ELF::R_ARM_TLS_IE32;
111 return ELF::R_ARM_GOT_PREL;
113 return ELF::R_ARM_PREL31;
119 return ELF::R_ARM_CALL;
121 return ELF::R_ARM_TLS_CALL;
123 return ELF::R_ARM_CALL;
128 return ELF::R_ARM_JUMP24;
130 return ELF::R_ARM_THM_JUMP19;
132 return ELF::R_ARM_THM_JUMP24;
134 return ELF::R_ARM_MOVT_PREL;
136 return ELF::R_ARM_MOVW_PREL_NC;
138 return ELF::R_ARM_THM_MOVT_PREL;
140 return ELF::R_ARM_THM_MOVW_PREL_NC;
142 return ELF::R_ARM_THM_ALU_ABS_G3;
144 return ELF::R_ARM_THM_ALU_ABS_G2_NC;
146 return ELF::R_ARM_THM_ALU_ABS_G1_NC;
148 return ELF::R_ARM_THM_ALU_ABS_G0_NC;
150 return ELF::R_ARM_THM_JUMP11;
152 return ELF::R_ARM_THM_JUMP8;
157 return ELF::R_ARM_THM_TLS_CALL;
159 return ELF::R_ARM_THM_CALL;
162 return ELF::R_ARM_LDR_PC_G0;
164 return ELF::R_ARM_LDRS_PC_G0;
166 return ELF::R_ARM_THM_PC12;
168 return ELF::R_ARM_ALU_PC_G0;
170 return ELF::R_ARM_THM_PC8;
172 return ELF::R_ARM_THM_ALU_PREL_11_0;
174 return ELF::R_ARM_THM_BF16;
176 return ELF::R_ARM_THM_BF12;
178 return ELF::R_ARM_THM_BF18;
184 return ELF::R_ARM_NONE;
189 "invalid fixup for 1-byte data relocation");
190 return ELF::R_ARM_NONE;
192 return ELF::R_ARM_ABS8;
198 "invalid fixup for 2-byte data relocation");
199 return ELF::R_ARM_NONE;
201 return ELF::R_ARM_ABS16;
207 "invalid fixup for 4-byte data relocation");
208 return ELF::R_ARM_NONE;
210 return ELF::R_ARM_NONE;
212 return ELF::R_ARM_GOT_BREL;
214 return ELF::R_ARM_TLS_GD32;
216 return ELF::R_ARM_TLS_LE32;
218 return ELF::R_ARM_TLS_IE32;
220 return ELF::R_ARM_ABS32;
222 return ELF::R_ARM_GOTOFF32;
224 return ELF::R_ARM_GOT_PREL;
226 return ELF::R_ARM_TARGET1;
228 return ELF::R_ARM_TARGET2;
230 return ELF::R_ARM_PREL31;
232 return ELF::R_ARM_SBREL32;
234 return ELF::R_ARM_TLS_LDO32;
236 return ELF::R_ARM_TLS_CALL;
238 return ELF::R_ARM_TLS_GOTDESC;
240 return ELF::R_ARM_TLS_LDM32;
242 return ELF::R_ARM_TLS_DESCSEQ;
246 return ELF::R_ARM_JUMP24;
251 return ELF::R_ARM_NONE;
253 return ELF::R_ARM_MOVT_ABS;
255 return ELF::R_ARM_MOVT_BREL;
261 return ELF::R_ARM_NONE;
263 return ELF::R_ARM_MOVW_ABS_NC;
265 return ELF::R_ARM_MOVW_BREL_NC;
271 "invalid fixup for Thumb MOVT instruction");
272 return ELF::R_ARM_NONE;
274 return ELF::R_ARM_THM_MOVT_ABS;
276 return ELF::R_ARM_THM_MOVT_BREL;
282 "invalid fixup for Thumb MOVW instruction");
283 return ELF::R_ARM_NONE;
285 return ELF::R_ARM_THM_MOVW_ABS_NC;
287 return ELF::R_ARM_THM_MOVW_BREL_NC;
291 return ELF::R_ARM_THM_ALU_ABS_G3;
293 return ELF::R_ARM_THM_ALU_ABS_G2_NC;
295 return ELF::R_ARM_THM_ALU_ABS_G1_NC;
297 return ELF::R_ARM_THM_ALU_ABS_G0_NC;
301void ARMELFObjectWriter::addTargetSectionFlags(
MCContext &Ctx,
312 if (
auto *
DF = dyn_cast<MCDataFragment>(&
F))
313 if (!
DF->getContents().empty())
319std::unique_ptr<MCObjectTargetWriter>
321 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
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.