[llvm] r228565 - MC: Calculate intra-section symbol differences correctly for COFF
David Majnemer
david.majnemer at gmail.com
Sun Feb 8 22:31:32 PST 2015
Author: majnemer
Date: Mon Feb 9 00:31:31 2015
New Revision: 228565
URL: http://llvm.org/viewvc/llvm-project?rev=228565&view=rev
Log:
MC: Calculate intra-section symbol differences correctly for COFF
This fixes PR22060.
Modified:
llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
llvm/trunk/test/MC/COFF/diff.s
Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=228565&r1=228564&r2=228565&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Mon Feb 9 00:31:31 2015
@@ -706,17 +706,22 @@ void WinCOFFObjectWriter::RecordRelocati
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();
}
Modified: llvm/trunk/test/MC/COFF/diff.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/diff.s?rev=228565&r1=228564&r2=228565&view=diff
==============================================================================
--- llvm/trunk/test/MC/COFF/diff.s (original)
+++ llvm/trunk/test/MC/COFF/diff.s Mon Feb 9 00:31:31 2015
@@ -1,5 +1,23 @@
// 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: )
More information about the llvm-commits
mailing list