diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2015-02-09 06:31:31 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2015-02-09 06:31:31 +0000 |
| commit | 1de3094d78700caf404928bf40dba1df972bb864 (patch) | |
| tree | d07c86732e814a5537e478ea4df5c8d3ed5753eb | |
| parent | a54d7de655191a7ed8ec23761db2ab19954250bf (diff) | |
| download | bcm5719-llvm-1de3094d78700caf404928bf40dba1df972bb864.tar.gz bcm5719-llvm-1de3094d78700caf404928bf40dba1df972bb864.zip | |
MC: Calculate intra-section symbol differences correctly for COFF
This fixes PR22060.
llvm-svn: 228565
| -rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 17 | ||||
| -rw-r--r-- | llvm/test/MC/COFF/diff.s | 25 |
2 files changed, 36 insertions, 6 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index bd750af5de4..e3985815e45 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -706,17 +706,22 @@ void WinCOFFObjectWriter::RecordRelocation( 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(); } diff --git a/llvm/test/MC/COFF/diff.s b/llvm/test/MC/COFF/diff.s index 820272a40bf..5111600c744 100644 --- a/llvm/test/MC/COFF/diff.s +++ b/llvm/test/MC/COFF/diff.s @@ -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: ) |

