Commit 8b2730d1 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r228565:

------------------------------------------------------------------------
r228565 | majnemer | 2015-02-08 22:31:31 -0800 (Sun, 08 Feb 2015) | 3 lines

MC: Calculate intra-section symbol differences correctly for COFF

This fixes PR22060.
------------------------------------------------------------------------

llvm-svn: 228667
parent 5e87af44
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -710,17 +710,22 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
    CrossSection = &Symbol.getSection() != &B->getSection();

    // Offset of the symbol in the section
    int64_t a = Layout.getSymbolOffset(&B_SD);
    int64_t OffsetOfB = Layout.getSymbolOffset(&B_SD);

    // Offset of the relocation in the section
    int64_t b = Layout.getFragmentOffset(Fragment) + Fixup.getOffset();

    FixedValue = b - a;
    // In the case where we have SymbA and SymB, we just need to store the delta
    // between the two symbols.  Update FixedValue to account for the delta, and
    // skip recording the relocation.
    if (!CrossSection)
    if (!CrossSection) {
      int64_t OffsetOfA = Layout.getSymbolOffset(&A_SD);
      FixedValue = (OffsetOfA - OffsetOfB) + Target.getConstant();
      return;
    }

    // Offset of the relocation in the section
    int64_t OffsetOfRelocation =
        Layout.getFragmentOffset(Fragment) + Fixup.getOffset();

    FixedValue = OffsetOfRelocation - OffsetOfB;
  } else {
    FixedValue = Target.getConstant();
  }
+25 −0
Original line number Diff line number Diff line
// RUN: llvm-mc -filetype=obj -triple i686-pc-mingw32 %s | llvm-readobj -s -sr -sd | FileCheck %s

.section baz, "xr"
	.def	X
	.scl	2;
	.type	32;
	.endef
	.globl	X
X:
	mov	Y-X+42,	%eax
	retl

	.def	Y
	.scl	2;
	.type	32;
	.endef
	.globl	Y
Y:
	retl

	.def	 _foobar;
	.scl	2;
	.type	32;
@@ -30,3 +48,10 @@ _rust_crate:
// CHECK:        SectionData (
// CHECK-NEXT:     0000: 00000000 00000000 1C000000 20000000
// CHECK-NEXT:   )

// CHECK:        Name: baz
// CHECK:        Relocations [
// CHECK-NEXT:   ]
// CHECK:        SectionData (
// CHECK-NEXT:     0000: A1300000 00C3C3
// CHECK-NEXT:   )