[llvm] r228565 - MC: Calculate intra-section symbol differences correctly for COFF
David Majnemer
david.majnemer at gmail.com
Sun Feb 8 22:37:35 PST 2015
Hi Hans,
This is a 3.6 release blocker, please merge it into the branch.
On Sun, Feb 8, 2015 at 10:31 PM, David Majnemer <david.majnemer at gmail.com>
wrote:
> Author: majnemer
> Date: Mon Feb 9 00:31:31 2015
> New Revision: 228565
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228565&view=rev
> Log:
> MC: Calculate intra-section symbol differences correctly for COFF
>
> This fixes PR22060.
>
> Modified:
> llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
> llvm/trunk/test/MC/COFF/diff.s
>
> Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=228565&r1=228564&r2=228565&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original)
> +++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Mon Feb 9 00:31:31 2015
> @@ -706,17 +706,22 @@ void WinCOFFObjectWriter::RecordRelocati
> 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();
> }
>
> Modified: llvm/trunk/test/MC/COFF/diff.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/diff.s?rev=228565&r1=228564&r2=228565&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/COFF/diff.s (original)
> +++ llvm/trunk/test/MC/COFF/diff.s Mon Feb 9 00:31:31 2015
> @@ -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: )
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150208/5eb039f1/attachment.html>
More information about the llvm-commits
mailing list