From 63d37b932278724d51e7f8bd1f2574c7b45f85f0 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 26 Aug 2010 17:23:02 +0000 Subject: [PATCH] MCELF: Compensate for the addend on i386. Patch by Roman Divacky, with some cleanups. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112197 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/ELFObjectWriter.cpp | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 79bb52871d4..e71d546616a 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -460,24 +460,17 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue) { - unsigned IsPCRel = isFixupKindX86PCRel(Fixup.getKind()); - - uint64_t FixupOffset = - Layout.getFragmentOffset(Fragment) + Fixup.getOffset(); - int64_t Value; int64_t Addend = 0; unsigned Index = 0; - unsigned Type; - - Value = Target.getConstant(); if (!Target.isAbsolute()) { const MCSymbol *Symbol = &Target.getSymA()->getSymbol(); MCSymbolData &SD = Asm.getSymbolData(*Symbol); const MCSymbolData *Base = Asm.getAtom(Layout, &SD); + MCFragment *F = SD.getFragment(); + int64_t Value = Target.getConstant(); if (Base) { - MCFragment *F = SD.getFragment(); if (F && (!Symbol->isInSection() || SD.isCommon())) { Index = F->getParent()->getOrdinal() + LocalSymbolData.size() + 1; Value += Layout.getSymbolAddress(&SD); @@ -486,9 +479,9 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, if (Base != &SD) Value += Layout.getSymbolAddress(&SD) - Layout.getSymbolAddress(Base); Addend = Value; - Value = 0; + // Compensate for the addend on i386. + FixedValue = Is64Bit ? 0 : Value; } else { - MCFragment *F = SD.getFragment(); if (F) { // Index of the section in .symtab against this symbol // is being relocated + 2 (empty section + abs. symbols). @@ -505,6 +498,8 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, } // determine the type of the relocation + bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind()); + unsigned Type; if (Is64Bit) { if (IsPCRel) { Type = ELF::R_X86_64_PC32; @@ -540,8 +535,6 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, } } - FixedValue = Value; - ELFRelocationEntry ERE; if (Is64Bit) { @@ -554,7 +547,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, ERE.r_info = ERE32.r_info; } - ERE.r_offset = FixupOffset; + ERE.r_offset = Layout.getFragmentOffset(Fragment) + Fixup.getOffset(); if (HasRelocationAddend) ERE.r_addend = Addend; -- 2.34.1