forked from OSchip/llvm-project
[RuntimeDyld][AArch64] Add support for the MachO ARM64_RELOC_SUBTRACTOR reloc.
llvm-svn: 258438
This commit is contained in:
parent
8b1f80779b
commit
3db630b5e7
|
@ -270,6 +270,9 @@ public:
|
|||
RelInfo = Obj.getRelocation(RelI->getRawDataRefImpl());
|
||||
}
|
||||
|
||||
if (Obj.getAnyRelocationType(RelInfo) == MachO::ARM64_RELOC_SUBTRACTOR)
|
||||
return processSubtractRelocation(SectionID, RelI, Obj, ObjSectionToID);
|
||||
|
||||
RelocationEntry RE(getRelocationEntry(SectionID, Obj, RelI));
|
||||
RE.Addend = decodeAddend(RE);
|
||||
|
||||
|
@ -349,7 +352,15 @@ public:
|
|||
encodeAddend(LocalAddress, /*Size=*/4, RelType, Value);
|
||||
break;
|
||||
}
|
||||
case MachO::ARM64_RELOC_SUBTRACTOR:
|
||||
case MachO::ARM64_RELOC_SUBTRACTOR: {
|
||||
uint64_t SectionABase = Sections[RE.Sections.SectionA].getLoadAddress();
|
||||
uint64_t SectionBBase = Sections[RE.Sections.SectionB].getLoadAddress();
|
||||
assert((Value == SectionABase || Value == SectionBBase) &&
|
||||
"Unexpected SUBTRACTOR relocation value.");
|
||||
Value = SectionABase - SectionBBase + RE.Addend;
|
||||
writeBytesUnaligned(Value, LocalAddress, 1 << RE.Size);
|
||||
break;
|
||||
}
|
||||
case MachO::ARM64_RELOC_POINTER_TO_GOT:
|
||||
case MachO::ARM64_RELOC_TLVP_LOAD_PAGE21:
|
||||
case MachO::ARM64_RELOC_TLVP_LOAD_PAGEOFF12:
|
||||
|
@ -398,6 +409,47 @@ private:
|
|||
RE.IsPCRel, RE.Size);
|
||||
addRelocationForSection(TargetRE, RE.SectionID);
|
||||
}
|
||||
|
||||
relocation_iterator
|
||||
processSubtractRelocation(unsigned SectionID, relocation_iterator RelI,
|
||||
const ObjectFile &BaseObjT,
|
||||
ObjSectionToIDMap &ObjSectionToID) {
|
||||
const MachOObjectFile &Obj =
|
||||
static_cast<const MachOObjectFile&>(BaseObjT);
|
||||
MachO::any_relocation_info RE =
|
||||
Obj.getRelocation(RelI->getRawDataRefImpl());
|
||||
|
||||
unsigned Size = Obj.getAnyRelocationLength(RE);
|
||||
uint64_t Offset = RelI->getOffset();
|
||||
uint8_t *LocalAddress = Sections[SectionID].getAddressWithOffset(Offset);
|
||||
unsigned NumBytes = 1 << Size;
|
||||
|
||||
ErrorOr<StringRef> SubtrahendNameOrErr = RelI->getSymbol()->getName();
|
||||
if (auto EC = SubtrahendNameOrErr.getError())
|
||||
report_fatal_error(EC.message());
|
||||
auto SubtrahendI = GlobalSymbolTable.find(*SubtrahendNameOrErr);
|
||||
unsigned SectionBID = SubtrahendI->second.getSectionID();
|
||||
uint64_t SectionBOffset = SubtrahendI->second.getOffset();
|
||||
int64_t Addend =
|
||||
SignExtend64(readBytesUnaligned(LocalAddress, NumBytes), NumBytes * 8);
|
||||
|
||||
++RelI;
|
||||
ErrorOr<StringRef> MinuendNameOrErr = RelI->getSymbol()->getName();
|
||||
if (auto EC = MinuendNameOrErr.getError())
|
||||
report_fatal_error(EC.message());
|
||||
auto MinuendI = GlobalSymbolTable.find(*MinuendNameOrErr);
|
||||
unsigned SectionAID = MinuendI->second.getSectionID();
|
||||
uint64_t SectionAOffset = MinuendI->second.getOffset();
|
||||
|
||||
RelocationEntry R(SectionID, Offset, MachO::ARM64_RELOC_SUBTRACTOR, (uint64_t)Addend,
|
||||
SectionAID, SectionAOffset, SectionBID, SectionBOffset,
|
||||
false, Size);
|
||||
|
||||
addRelocationForSection(R, SectionAID);
|
||||
|
||||
return ++RelI;
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -77,3 +77,8 @@ tgt:
|
|||
.fill 4096, 1, 0
|
||||
_ptr:
|
||||
.quad _foo
|
||||
|
||||
# Test ARM64_RELOC_SUBTRACTOR.
|
||||
# rtdyld-check: *{8}_subtractor_result = _test_branch_reloc - _foo
|
||||
_subtractor_result:
|
||||
.quad _test_branch_reloc - _foo
|
||||
|
|
Loading…
Reference in New Issue