enum EdgeKind_aarch32 : Edge::Kind {
///
- /// Relocations of class Data
+ /// Relocations of class Data respect target endianness (unless otherwise
+ /// specified)
///
FirstDataRelocation = Edge::FirstRelocation,
- /// Plain 32-bit value relocation in target endianness
+ /// Relative 32-bit value relocation
Data_Delta32 = FirstDataRelocation,
- LastDataRelocation = Data_Delta32,
+ /// Absolute 32-bit value relocation
+ Data_Pointer32,
+
+ LastDataRelocation = Data_Pointer32,
///
/// Relocations of class Arm (covers fixed-width 4-byte instruction subset)
/// Translate from ELF relocation type to JITLink-internal edge kind.
Expected<aarch32::EdgeKind_aarch32> getJITLinkEdgeKind(uint32_t ELFType) {
switch (ELFType) {
+ case ELF::R_ARM_ABS32:
+ return aarch32::Data_Pointer32;
case ELF::R_ARM_REL32:
return aarch32::Data_Delta32;
case ELF::R_ARM_CALL:
switch (static_cast<aarch32::EdgeKind_aarch32>(Kind)) {
case aarch32::Data_Delta32:
return ELF::R_ARM_REL32;
+ case aarch32::Data_Pointer32:
+ return ELF::R_ARM_ABS32;
case aarch32::Arm_Call:
return ELF::R_ARM_CALL;
case aarch32::Thumb_Call:
switch (Kind) {
case Data_Delta32:
+ case Data_Pointer32:
return SignExtend64<32>(support::endian::read32(FixupPtr, Endian));
default:
return make_error<JITLinkError>(
Write32(Value);
return Error::success();
}
+ case Data_Pointer32: {
+ int64_t Value = TargetAddress + Addend;
+ if (!isInt<32>(Value))
+ return makeTargetOutOfRangeError(G, B, E);
+ Write32(Value);
+ return Error::success();
+ }
default:
return make_error<JITLinkError>(
"In graph " + G.getName() + ", section " + B.getSection().getName() +