1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

Collect the Addend for external relocs.

This fixes 2013-04-04-RelocAddend.ll. We don't have a testcase for non external
relocs with an Addend. I will try to write one.

llvm-svn: 180767
This commit is contained in:
Rafael Espindola 2013-04-30 01:29:57 +00:00
parent 8054d1e2f8
commit c3bc22082f
2 changed files with 12 additions and 6 deletions

View File

@ -230,7 +230,14 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
bool isExtern = MachO->getPlainRelocationExternal(RE);
bool IsPCRel = MachO->getAnyRelocationPCRel(RE);
unsigned Size = MachO->getAnyRelocationLength(RE);
uint64_t Offset;
RelI.getOffset(Offset);
if (isExtern) {
uint8_t *LocalAddress = Section.Address + Offset;
unsigned NumBytes = 1 << Size;
uint64_t Addend = 0;
memcpy(&Addend, LocalAddress, NumBytes);
// Obtain the symbol name which is referenced in the relocation
SymbolRef Symbol;
RelI.getSymbol(Symbol);
@ -240,15 +247,17 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
SymbolTableMap::const_iterator lsi = Symbols.find(TargetName.data());
if (lsi != Symbols.end()) {
Value.SectionID = lsi->second.first;
Value.Addend = lsi->second.second;
Value.Addend = lsi->second.second + Addend;
} else {
// Search for the symbol in the global symbol table
SymbolTableMap::const_iterator gsi = GlobalSymbolTable.find(TargetName.data());
if (gsi != GlobalSymbolTable.end()) {
Value.SectionID = gsi->second.first;
Value.Addend = gsi->second.second;
} else
Value.Addend = gsi->second.second + Addend;
} else {
Value.SymbolName = TargetName.data();
Value.Addend = Addend;
}
}
} else {
error_code err;
@ -276,8 +285,6 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
}
}
uint64_t Offset;
RelI.getOffset(Offset);
if (Arch == Triple::arm && (RelType & 0xf) == macho::RIT_ARM_Branch24Bit) {
// This is an ARM branch relocation, need to use a stub function.

View File

@ -1,5 +1,4 @@
; RUN: %lli_mcjit %s
; XFAIL: darwin
;
; Verify relocations to global symbols with addend work correctly.
;