[PATCH] D34530: Change creation of relative relocations on COFF

Rafael Ávila de Espíndola via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 22 14:02:19 PDT 2017


rafael created this revision.

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.


https://reviews.llvm.org/D34530

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


Index: test/MC/COFF/diff.s
===================================================================
--- test/MC/COFF/diff.s
+++ test/MC/COFF/diff.s
@@ -42,11 +42,11 @@
 // 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
Index: test/MC/COFF/cross-section-relative.s
===================================================================
--- test/MC/COFF/cross-section-relative.s
+++ test/MC/COFF/cross-section-relative.s
@@ -77,34 +77,34 @@
 // 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:  ]
 // READOBJ:  Relocations [
 // READOBJ:  Section (5) .fix {
 // 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 @@
 // READOBJ:    Relocation {
 // READOBJ:      Offset: 0x30
 // READOBJ:      Type: IMAGE_REL_AMD64_REL32 (4)
-// READOBJ:      Symbol: .rdata
+// READOBJ:      Symbol: g3
 // READOBJ:    }
Index: lib/MC/WinCOFFObjectWriter.cpp
===================================================================
--- lib/MC/WinCOFFObjectWriter.cpp
+++ lib/MC/WinCOFFObjectWriter.cpp
@@ -775,7 +775,7 @@
   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() &&


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34530.103630.patch
Type: text/x-patch
Size: 3232 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170622/ca95aede/attachment.bin>


More information about the llvm-commits mailing list