From 8cc212a07e6fc1918c1d9ada10f972830bf5a907 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Wed, 27 May 2015 20:50:01 +0000 Subject: [PATCH] [RuntimeDyld] Fix MachO i386 SECTDIFF relocation to support non-zero addends. Previously, relocations of the form 'A - B + C' would fail on i386 when C was non-zero. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238356 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../RuntimeDyld/Targets/RuntimeDyldMachOI386.h | 11 +++++------ .../RuntimeDyld/X86/MachO_i386_DynNoPIC_relocations.s | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOI386.h b/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOI386.h index 053f90ce05a..dd454ae54f2 100644 --- a/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOI386.h +++ b/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOI386.h @@ -167,20 +167,19 @@ private: uint32_t SectionBID = findOrEmitSection(Obj, SectionB, IsCode, ObjSectionToID); - if (Addend != AddrA - AddrB) - Error("Unexpected SECTDIFF relocation addend."); + // Compute the addend 'C' from the original expression 'A - B + C'. + Addend -= AddrA - AddrB; DEBUG(dbgs() << "Found SECTDIFF: AddrA: " << AddrA << ", AddrB: " << AddrB << ", Addend: " << Addend << ", SectionA ID: " << SectionAID << ", SectionAOffset: " << SectionAOffset << ", SectionB ID: " << SectionBID << ", SectionBOffset: " << SectionBOffset << "\n"); - RelocationEntry R(SectionID, Offset, RelocType, 0, SectionAID, - SectionAOffset, SectionBID, SectionBOffset, IsPCRel, - Size); + RelocationEntry R(SectionID, Offset, RelocType, Addend, SectionAID, + SectionAOffset, SectionBID, SectionBOffset, + IsPCRel, Size); addRelocationForSection(R, SectionAID); - addRelocationForSection(R, SectionBID); return ++RelI; } diff --git a/test/ExecutionEngine/RuntimeDyld/X86/MachO_i386_DynNoPIC_relocations.s b/test/ExecutionEngine/RuntimeDyld/X86/MachO_i386_DynNoPIC_relocations.s index f427b985b58..6b2fe9532c2 100644 --- a/test/ExecutionEngine/RuntimeDyld/X86/MachO_i386_DynNoPIC_relocations.s +++ b/test/ExecutionEngine/RuntimeDyld/X86/MachO_i386_DynNoPIC_relocations.s @@ -9,9 +9,9 @@ bar: tmp0$pb: popl %eax # Test section difference relocation to non-lazy ptr section. -# rtdyld-check: decode_operand(inst1, 4) = x$non_lazy_ptr - tmp0$pb +# rtdyld-check: decode_operand(inst1, 4) = x$non_lazy_ptr - tmp0$pb + 8 inst1: - movl x$non_lazy_ptr-tmp0$pb(%eax), %eax + movl (x$non_lazy_ptr-tmp0$pb)+8(%eax), %eax movl (%eax), %ebx # Test VANILLA relocation to jump table. -- 2.34.1