[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