mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[RuntimeDyld] MachO: Add support for ARM scattered vanilla relocations.
llvm-svn: 243126
This commit is contained in:
parent
5694297a85
commit
ef2cc7c5fb
@ -50,6 +50,42 @@ int64_t RuntimeDyldMachO::memcpyAddend(const RelocationEntry &RE) const {
|
||||
return static_cast<int64_t>(readBytesUnaligned(Src, NumBytes));
|
||||
}
|
||||
|
||||
relocation_iterator RuntimeDyldMachO::processScatteredVANILLA(
|
||||
unsigned SectionID, relocation_iterator RelI,
|
||||
const ObjectFile &BaseObjT,
|
||||
RuntimeDyldMachO::ObjSectionToIDMap &ObjSectionToID) {
|
||||
const MachOObjectFile &Obj =
|
||||
static_cast<const MachOObjectFile&>(BaseObjT);
|
||||
MachO::any_relocation_info RE =
|
||||
Obj.getRelocation(RelI->getRawDataRefImpl());
|
||||
|
||||
SectionEntry &Section = Sections[SectionID];
|
||||
uint32_t RelocType = Obj.getAnyRelocationType(RE);
|
||||
bool IsPCRel = Obj.getAnyRelocationPCRel(RE);
|
||||
unsigned Size = Obj.getAnyRelocationLength(RE);
|
||||
uint64_t Offset = RelI->getOffset();
|
||||
uint8_t *LocalAddress = Section.Address + Offset;
|
||||
unsigned NumBytes = 1 << Size;
|
||||
int64_t Addend = readBytesUnaligned(LocalAddress, NumBytes);
|
||||
|
||||
unsigned SymbolBaseAddr = Obj.getScatteredRelocationValue(RE);
|
||||
section_iterator TargetSI = getSectionByAddress(Obj, SymbolBaseAddr);
|
||||
assert(TargetSI != Obj.section_end() && "Can't find section for symbol");
|
||||
uint64_t SectionBaseAddr = TargetSI->getAddress();
|
||||
SectionRef TargetSection = *TargetSI;
|
||||
bool IsCode = TargetSection.isText();
|
||||
uint32_t TargetSectionID =
|
||||
findOrEmitSection(Obj, TargetSection, IsCode, ObjSectionToID);
|
||||
|
||||
Addend -= SectionBaseAddr;
|
||||
RelocationEntry R(SectionID, Offset, RelocType, Addend, IsPCRel, Size);
|
||||
|
||||
addRelocationForSection(R, TargetSectionID);
|
||||
|
||||
return ++RelI;
|
||||
}
|
||||
|
||||
|
||||
RelocationValueRef RuntimeDyldMachO::getRelocationValueRef(
|
||||
const ObjectFile &BaseTObj, const relocation_iterator &RI,
|
||||
const RelocationEntry &RE, ObjSectionToIDMap &ObjSectionToID) {
|
||||
|
@ -79,6 +79,12 @@ protected:
|
||||
return RelocationEntry(SectionID, Offset, RelType, 0, IsPCRel, Size);
|
||||
}
|
||||
|
||||
/// Process a scattered vanilla relocation.
|
||||
relocation_iterator processScatteredVANILLA(
|
||||
unsigned SectionID, relocation_iterator RelI,
|
||||
const ObjectFile &BaseObjT,
|
||||
RuntimeDyldMachO::ObjSectionToIDMap &ObjSectionToID);
|
||||
|
||||
/// Construct a RelocationValueRef representing the relocation target.
|
||||
/// For Symbols in known sections, this will return a RelocationValueRef
|
||||
/// representing a (SectionID, Offset) pair.
|
||||
|
@ -64,8 +64,10 @@ public:
|
||||
if (RelType == MachO::ARM_RELOC_HALF_SECTDIFF)
|
||||
return processHALFSECTDIFFRelocation(SectionID, RelI, Obj,
|
||||
ObjSectionToID);
|
||||
else if (RelType == MachO::GENERIC_RELOC_VANILLA)
|
||||
return processScatteredVANILLA(SectionID, RelI, Obj, ObjSectionToID);
|
||||
else
|
||||
return ++++RelI;
|
||||
return ++RelI;
|
||||
}
|
||||
|
||||
RelocationEntry RE(getRelocationEntry(SectionID, Obj, RelI));
|
||||
|
@ -47,8 +47,7 @@ public:
|
||||
return processSECTDIFFRelocation(SectionID, RelI, Obj,
|
||||
ObjSectionToID);
|
||||
else if (RelType == MachO::GENERIC_RELOC_VANILLA)
|
||||
return processI386ScatteredVANILLA(SectionID, RelI, Obj,
|
||||
ObjSectionToID);
|
||||
return processScatteredVANILLA(SectionID, RelI, Obj, ObjSectionToID);
|
||||
llvm_unreachable("Unhandled scattered relocation.");
|
||||
}
|
||||
|
||||
@ -183,41 +182,6 @@ private:
|
||||
return ++RelI;
|
||||
}
|
||||
|
||||
relocation_iterator processI386ScatteredVANILLA(
|
||||
unsigned SectionID, relocation_iterator RelI,
|
||||
const ObjectFile &BaseObjT,
|
||||
RuntimeDyldMachO::ObjSectionToIDMap &ObjSectionToID) {
|
||||
const MachOObjectFile &Obj =
|
||||
static_cast<const MachOObjectFile&>(BaseObjT);
|
||||
MachO::any_relocation_info RE =
|
||||
Obj.getRelocation(RelI->getRawDataRefImpl());
|
||||
|
||||
SectionEntry &Section = Sections[SectionID];
|
||||
uint32_t RelocType = Obj.getAnyRelocationType(RE);
|
||||
bool IsPCRel = Obj.getAnyRelocationPCRel(RE);
|
||||
unsigned Size = Obj.getAnyRelocationLength(RE);
|
||||
uint64_t Offset = RelI->getOffset();
|
||||
uint8_t *LocalAddress = Section.Address + Offset;
|
||||
unsigned NumBytes = 1 << Size;
|
||||
int64_t Addend = readBytesUnaligned(LocalAddress, NumBytes);
|
||||
|
||||
unsigned SymbolBaseAddr = Obj.getScatteredRelocationValue(RE);
|
||||
section_iterator TargetSI = getSectionByAddress(Obj, SymbolBaseAddr);
|
||||
assert(TargetSI != Obj.section_end() && "Can't find section for symbol");
|
||||
uint64_t SectionBaseAddr = TargetSI->getAddress();
|
||||
SectionRef TargetSection = *TargetSI;
|
||||
bool IsCode = TargetSection.isText();
|
||||
uint32_t TargetSectionID =
|
||||
findOrEmitSection(Obj, TargetSection, IsCode, ObjSectionToID);
|
||||
|
||||
Addend -= SectionBaseAddr;
|
||||
RelocationEntry R(SectionID, Offset, RelocType, Addend, IsPCRel, Size);
|
||||
|
||||
addRelocationForSection(R, TargetSectionID);
|
||||
|
||||
return ++RelI;
|
||||
}
|
||||
|
||||
// Populate stubs in __jump_table section.
|
||||
void populateJumpTable(const MachOObjectFile &Obj, const SectionRef &JTSection,
|
||||
unsigned JTSectionID) {
|
||||
|
@ -40,6 +40,13 @@ insn4:
|
||||
.comm baz, 4, 2
|
||||
.comm foo, 4, 2
|
||||
|
||||
.section __DATA,__data
|
||||
.globl _a
|
||||
.align 2
|
||||
# rtdyld-check: *{4}bar_ofs = bar + 4
|
||||
bar_ofs:
|
||||
.long bar + 4
|
||||
|
||||
# Check that the symbol pointer section entries are fixed up properly:
|
||||
# rtdyld-check: *{4}foo$non_lazy_ptr = foo
|
||||
.section __DATA,__nl_symbol_ptr,non_lazy_symbol_pointers
|
||||
|
Loading…
x
Reference in New Issue
Block a user