summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2011-04-21 18:36:50 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2011-04-21 18:36:50 +0000
commit1ac7fe0f4dae8a9266fa6ff31ea4939ec64a3e5e (patch)
treeffc630d5cc68b37abc761f73f31f00f28c33e13e
parent64d3d12f372fe88cbff7bbac63ea148df678d9b6 (diff)
downloadllvm-1ac7fe0f4dae8a9266fa6ff31ea4939ec64a3e5e.tar.gz
llvm-1ac7fe0f4dae8a9266fa6ff31ea4939ec64a3e5e.tar.bz2
llvm-1ac7fe0f4dae8a9266fa6ff31ea4939ec64a3e5e.tar.xz
Fix relative relocations. This is sufficient for running the rust testsuite with
MC :-) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129923 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/WinCOFFObjectWriter.cpp7
-rw-r--r--test/MC/COFF/diff.s24
2 files changed, 27 insertions, 4 deletions
diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp
index fe3342c886..101237aabb 100644
--- a/lib/MC/WinCOFFObjectWriter.cpp
+++ b/lib/MC/WinCOFFObjectWriter.cpp
@@ -656,8 +656,13 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
const MCSymbol *B = &Target.getSymB()->getSymbol();
MCSymbolData &B_SD = Asm.getSymbolData(*B);
- FixedValue = Layout.getSymbolOffset(&A_SD) - Layout.getSymbolOffset(&B_SD);
+ // Offset of the symbol in the section
+ int64_t a = Layout.getSymbolOffset(&B_SD);
+ // Ofeset 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.
diff --git a/test/MC/COFF/diff.s b/test/MC/COFF/diff.s
index b7db5097fd..aa683f26a7 100644
--- a/test/MC/COFF/diff.s
+++ b/test/MC/COFF/diff.s
@@ -5,6 +5,7 @@
.type 32;
.endef
.text
+ .long 0
.globl _foobar
.align 16, 0x90
_foobar: # @foobar
@@ -15,13 +16,30 @@ _foobar: # @foobar
.globl _rust_crate # @rust_crate
.align 4
_rust_crate:
+ .long 0
+ .long _foobar
+ .long _foobar-_rust_crate
.long _foobar-_rust_crate
-
-// CHECK: Relocations = [
+// CHECK: Name = .data
+// CHECK: SectionData =
+// CHECK-NEXT: 00 00 00 00 00 00 00 00 - 1C 00 00 00 20 00 00 00 |............ ...|
+// CHECK: Relocations = [
// CHECK-NEXT: 0 = {
-// CHECK-NEXT: VirtualAddress = 0x0
+// CHECK-NEXT: VirtualAddress = 0x4
// CHECK-NEXT: SymbolTableIndex =
+// CHECK-NEXT: Type = IMAGE_REL_I386_DIR32 (6)
+// CHECK-NEXT: SymbolName = _foobar
+// CHECK-NEXT: }
+// CHECK-NEXT: 1 = {
+// CHECK-NEXT: VirtualAddress = 0x8
+// CHECK-NEXT: SymbolTableIndex = 0
+// CHECK-NEXT: Type = IMAGE_REL_I386_REL32 (20)
+// CHECK-NEXT: SymbolName = .text
+// CHECK-NEXT: }
+// CHECK-NEXT: 2 = {
+// CHECK-NEXT: VirtualAddress = 0xC
+// CHECK-NEXT: SymbolTableIndex = 0
// CHECK-NEXT: Type = IMAGE_REL_I386_REL32 (20)
// CHECK-NEXT: SymbolName = .text
// CHECK-NEXT: }