1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

Fix Addend computation for non external relocations on Macho.

llvm-svn: 180790
This commit is contained in:
Rafael Espindola 2013-04-30 15:40:54 +00:00
parent 25352bd54f
commit 58fcd9bdde
4 changed files with 33 additions and 28 deletions

View File

@ -130,6 +130,7 @@ public:
unsigned getAnyRelocationPCRel(const macho::RelocationEntry &RE) const;
unsigned getAnyRelocationLength(const macho::RelocationEntry &RE) const;
unsigned getAnyRelocationType(const macho::RelocationEntry &RE) const;
SectionRef getRelocationSection(const macho::RelocationEntry &RE) const;
// Walk load commands.
LoadCommandInfo getFirstLoadCommandInfo() const;

View File

@ -232,12 +232,12 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
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);
uint8_t *LocalAddress = Section.Address + Offset;
unsigned NumBytes = 1 << Size;
uint64_t Addend = 0;
memcpy(&Addend, LocalAddress, NumBytes);
if (isExtern) {
// Obtain the symbol name which is referenced in the relocation
SymbolRef Symbol;
RelI.getSymbol(Symbol);
@ -260,29 +260,11 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
}
}
} else {
error_code err;
uint8_t sectionIndex = static_cast<uint8_t>(RelType & 0xFF);
section_iterator si = Obj.begin_sections(),
se = Obj.end_sections();
for (uint8_t i = 1; i < sectionIndex; i++) {
error_code err;
si.increment(err);
if (si == se)
break;
}
assert(si != se && "No section containing relocation!");
Value.SectionID = findOrEmitSection(Obj, *si, true, ObjSectionToID);
Value.Addend = 0;
// FIXME: The size and type of the relocation determines if we can
// encode an Addend in the target location itself, and if so, how many
// bytes we should read in order to get it. We don't yet support doing
// that, and just assuming it's sizeof(intptr_t) is blatantly wrong.
//Value.Addend = *(const intptr_t *)Target;
if (Value.Addend) {
// The MachO addend is an offset from the current section. We need it
// to be an offset from the destination section
Value.Addend += Section.ObjAddress - Sections[Value.SectionID].ObjAddress;
}
SectionRef Sec = MachO->getRelocationSection(RE);
Value.SectionID = findOrEmitSection(Obj, Sec, true, ObjSectionToID);
uint64_t Addr;
Sec.getAddress(Addr);
Value.Addend = Addend - Addr;
}
if (Arch == Triple::arm && (RelType & 0xf) == macho::RIT_ARM_Branch24Bit) {

View File

@ -1414,6 +1414,16 @@ MachOObjectFile::getAnyRelocationType(const macho::RelocationEntry &RE) const {
return getPlainRelocationType(this, RE);
}
SectionRef
MachOObjectFile::getRelocationSection(const macho::RelocationEntry &RE) const {
if (isRelocationScattered(RE) || getPlainRelocationExternal(RE))
return *end_sections();
unsigned SecNum = getPlainRelocationSymbolNum(RE) - 1;
DataRefImpl DRI;
DRI.d.a = SecNum;
return SectionRef(DRI, this);
}
MachOObjectFile::LoadCommandInfo
MachOObjectFile::getFirstLoadCommandInfo() const {
MachOObjectFile::LoadCommandInfo Load;

View File

@ -0,0 +1,12 @@
; RUN: %lli_mcjit %s > /dev/null
define i32 @foo(i32 %X, i32 %Y, double %A) {
%cond212 = fcmp ueq double %A, 2.000000e+00 ; <i1> [#uses=1]
%cast110 = zext i1 %cond212 to i32 ; <i32> [#uses=1]
ret i32 %cast110
}
define i32 @main() {
%reg212 = call i32 @foo( i32 0, i32 1, double 1.000000e+00 ) ; <i32> [#uses=1]
ret i32 %reg212
}