mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 21:00:29 +00:00
[RuntimeDyld] Support non-zero addends for the MachO X86_64 SUBTRACTOR reloc.
This functionality was accidentally left out of r247119. llvm-svn: 247336
This commit is contained in:
parent
e9379e3fac
commit
4707066140
@ -154,12 +154,17 @@ private:
|
||||
|
||||
unsigned Size = Obj.getAnyRelocationLength(RE);
|
||||
uint64_t Offset = RelI->getOffset();
|
||||
uint8_t *LocalAddress = Sections[SectionID].Address + 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();
|
||||
@ -169,8 +174,7 @@ private:
|
||||
unsigned SectionAID = MinuendI->second.getSectionID();
|
||||
uint64_t SectionAOffset = MinuendI->second.getOffset();
|
||||
|
||||
uint64_t Addend = SectionAOffset - SectionBOffset;
|
||||
RelocationEntry R(SectionID, Offset, MachO::X86_64_RELOC_SUBTRACTOR, Addend,
|
||||
RelocationEntry R(SectionID, Offset, MachO::X86_64_RELOC_SUBTRACTOR, (uint64_t)Addend,
|
||||
SectionAID, SectionAOffset, SectionBID, SectionBOffset,
|
||||
false, Size);
|
||||
|
||||
|
@ -58,9 +58,9 @@ z2:
|
||||
.quad ds2
|
||||
|
||||
# Test subtractor relocations.
|
||||
# rtdyld-check: *{8}z3 = z4 - z5
|
||||
# rtdyld-check: *{8}z3 = z4 - z5 + 4
|
||||
z3:
|
||||
.quad z4 - z5
|
||||
.quad z4 - z5 + 4
|
||||
|
||||
.section __DATA,_tmp1
|
||||
z4:
|
||||
|
Loading…
Reference in New Issue
Block a user