[llvm] r228565 - MC: Calculate intra-section symbol differences correctly for COFF

Hans Wennborg hans at chromium.org
Mon Feb 9 19:54:37 PST 2015


Merged in r228667.

Thanks,
Hans

On Sun, Feb 8, 2015 at 10:37 PM, David Majnemer
<david.majnemer at gmail.com> wrote:
> 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
>
>



More information about the llvm-commits mailing list