]> granicus.if.org Git - llvm/commitdiff
Change creation of relative relocations on COFF.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 22 Jun 2017 21:57:04 +0000 (21:57 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 22 Jun 2017 21:57:04 +0000 (21:57 +0000)
For whatever reason, when processing

  .globl foo
foo:
  .data
bar:
  .long foo-bar

llvm-mc creates a relocation with the section:

0x0 IMAGE_REL_I386_REL32 .text

This is different than when the relocation is relative from the
beginning. For example, a file with

call foo

produces

0x0 IMAGE_REL_I386_REL32 foo

I would like to refactor the logic for converting "foo - ." into a
relative relocation so that it is shared with ELF. This is the first
step and just changes the coff implementation to match what ELF (and
COFF in the case of calls) does.

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

lib/MC/WinCOFFObjectWriter.cpp
test/MC/COFF/cross-section-relative.s
test/MC/COFF/diff.s

index ec1fa0801a0f8dc425c37fefbafa2804defe4743..08b349c7c68fab02dee248c65d6f357785c5144b 100644 (file)
@@ -775,7 +775,7 @@ void WinCOFFObjectWriter::recordRelocation(
   Reloc.Data.VirtualAddress = Layout.getFragmentOffset(Fragment);
 
   // Turn relocations for temporary symbols into section relocations.
-  if (A.isTemporary() || SymB) {
+  if (A.isTemporary()) {
     MCSection *TargetSection = &A.getSection();
     assert(
         SectionMap.find(TargetSection) != SectionMap.end() &&
index dd94b0a5e83abcf9455852a4e86f190df4fd368e..b47b7f4201e374205c9f8abac85177ea232ab802 100644 (file)
@@ -77,10 +77,10 @@ t6:
 // READOBJ:      IMAGE_SCN_MEM_WRITE (0x80000000)
 // READOBJ:    ]
 // READOBJ:    SectionData (
-// READOBJ:      0000: 10000000 00000000 0C000000 00000000  |................|
-// READOBJ:      0010: 08000000 00000000 0C000000 00000000  |................|
+// READOBJ:      0000: 08000000 00000000 04000000 00000000  |................|
+// READOBJ:      0010: 00000000 00000000 04000000 00000000  |................|
 // READOBJ:      0020: 01020000 00000000 00010000 00000000  |................|
-// READOBJ:      0030: 0C000000 00000000                    |........|
+// READOBJ:      0030: 04000000 00000000                    |........|
 // READOBJ:    )
 // READOBJ:  }
 // READOBJ:  ]
@@ -89,22 +89,22 @@ t6:
 // READOBJ:    Relocation {
 // READOBJ:      Offset: 0x0
 // READOBJ:      Type: IMAGE_REL_AMD64_REL32 (4)
-// READOBJ:      Symbol: .rdata
+// READOBJ:      Symbol: g3
 // READOBJ:    }
 // READOBJ:    Relocation {
 // READOBJ:      Offset: 0x8
 // READOBJ:      Type: IMAGE_REL_AMD64_REL32 (4)
-// READOBJ:      Symbol: .rdata
+// READOBJ:      Symbol: g3
 // READOBJ:    }
 // READOBJ:    Relocation {
 // READOBJ:      Offset: 0x10
 // READOBJ:      Type: IMAGE_REL_AMD64_REL32 (4)
-// READOBJ:      Symbol: .rdata
+// READOBJ:      Symbol: g3
 // READOBJ:    }
 // READOBJ:    Relocation {
 // READOBJ:      Offset: 0x18
 // READOBJ:      Type: IMAGE_REL_AMD64_REL32 (4)
-// READOBJ:      Symbol: .rdata
+// READOBJ:      Symbol: g3
 // READOBJ:    }
 // READOBJ:    Relocation {
 // READOBJ:      Offset: 0x1C
@@ -114,5 +114,5 @@ t6:
 // READOBJ:    Relocation {
 // READOBJ:      Offset: 0x30
 // READOBJ:      Type: IMAGE_REL_AMD64_REL32 (4)
-// READOBJ:      Symbol: .rdata
+// READOBJ:      Symbol: g3
 // READOBJ:    }
index 5111600c7449b7998ca31ce83f205e36b0f5247e..58cc7fe532bee8eab3493c0340d49c896d16b252 100644 (file)
@@ -42,11 +42,11 @@ _rust_crate:
 // CHECK:        Name: .data
 // CHECK:        Relocations [
 // CHECK-NEXT:     0x4 IMAGE_REL_I386_DIR32 _foobar
-// CHECK-NEXT:     0x8 IMAGE_REL_I386_REL32 .text
-// CHECK-NEXT:     0xC IMAGE_REL_I386_REL32 .text
+// CHECK-NEXT:     0x8 IMAGE_REL_I386_REL32 _foobar
+// CHECK-NEXT:     0xC IMAGE_REL_I386_REL32 _foobar
 // CHECK-NEXT:   ]
 // CHECK:        SectionData (
-// CHECK-NEXT:     0000: 00000000 00000000 1C000000 20000000
+// CHECK-NEXT:     0000: 00000000 00000000 0C000000 10000000
 // CHECK-NEXT:   )
 
 // CHECK:        Name: baz