Fix relative relocations. This is sufficient for running the rust testsuite with
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 21 Apr 2011 18:36:50 +0000 (18:36 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 21 Apr 2011 18:36:50 +0000 (18:36 +0000)
MC :-)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129923 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/WinCOFFObjectWriter.cpp
test/MC/COFF/diff.s

index fe3342c886b7915a1d44a00e7a3af1ad15ad91a9..101237aabb02651730bcf904758cd6f3dd4b56a0 100644 (file)
@@ -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.
index b7db5097fd62ea466a370c8ba4f2c38e52a22d6d..aa683f26a7b131d3e5529f0ba454ebf0e91af913 100644 (file)
@@ -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:   }