[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