[llvm] r237621 - AArch64: work around ld64 bug more aggressively.
Rafael EspĂndola
rafael.espindola at gmail.com
Sat May 30 06:51:07 PDT 2015
Thanks for confirming that it is a linker bug!
On May 18, 2015 6:11 PM, "Tim Northover" <tnorthover at apple.com> wrote:
> Author: tnorthover
> Date: Mon May 18 17:07:20 2015
> New Revision: 237621
>
> URL: http://llvm.org/viewvc/llvm-project?rev=237621&view=rev
> Log:
> AArch64: work around ld64 bug more aggressively.
>
> ld64 currently mishandles internal pointer relocations (i.e.
> ARM64_RELOC_UNSIGNED referred to by section & offset rather than symbol).
> The
> existing __cfstring clause was an early discovery and workaround for this,
> but
> the problem is wider and we should avoid such relocations wherever
> possible for
> now.
>
> This code should be reverted to allowing internal relocations as soon as
> possible.
>
> PR23437.
>
> Added:
> llvm/trunk/test/MC/MachO/AArch64/ld64-workaround.s
> - copied, changed from r237620,
> llvm/trunk/test/MC/MachO/AArch64/mergeable.s
> Removed:
> llvm/trunk/test/MC/MachO/AArch64/cfstring.s
> Modified:
> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
> llvm/trunk/test/MC/MachO/AArch64/mergeable.s
>
> Modified:
> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp?rev=237621&r1=237620&r2=237621&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
> (original)
> +++ llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
> Mon May 18 17:07:20 2015
> @@ -131,14 +131,13 @@ static bool canUseLocalRelocation(const
> return false;
>
> if (RefSec.getSegmentName() == "__DATA" &&
> - RefSec.getSectionName() == "__cfstring")
> - return false;
> -
> - if (RefSec.getSegmentName() == "__DATA" &&
> RefSec.getSectionName() == "__objc_classrefs")
> return false;
>
> - return true;
> + // FIXME: ld64 currently handles internal pointer-sized relocations
> + // incorrectly (applying the addend twice). We should be able to return
> true
> + // unconditionally by this point when that's fixed.
> + return false;
> }
>
> void AArch64MachObjectWriter::RecordRelocation(
>
> Removed: llvm/trunk/test/MC/MachO/AArch64/cfstring.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/AArch64/cfstring.s?rev=237620&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/MC/MachO/AArch64/cfstring.s (original)
> +++ llvm/trunk/test/MC/MachO/AArch64/cfstring.s (removed)
> @@ -1,24 +0,0 @@
> -; RUN: llvm-mc -triple arm64-apple-darwin10 %s -filetype=obj -o - |
> llvm-readobj -r --expand-relocs | FileCheck %s
> -
> -; Test that we produce an external relocation. There is no apparent need
> for it, but
> -; ld64 (241.9) produces a corrupt output if we don't.
> -
> -// CHECK: Relocations [
> -// CHECK-NEXT: Section __data {
> -// CHECK-NEXT: Relocation {
> -// CHECK-NEXT: Offset: 0x0
> -// CHECK-NEXT: PCRel: 0
> -// CHECK-NEXT: Length: 3
> -// CHECK-NEXT: Extern: 1
> -// CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
> -// CHECK-NEXT: Symbol: Lfoo
> -// CHECK-NEXT: Scattered: 0
> -// CHECK-NEXT: }
> -// CHECK-NEXT: }
> -// CHECK-NEXT: ]
> -
> - .section __DATA,__cfstring
> -Lfoo:
> -
> - .section __DATA,__data
> - .quad Lfoo
>
> Copied: llvm/trunk/test/MC/MachO/AArch64/ld64-workaround.s (from r237620,
> llvm/trunk/test/MC/MachO/AArch64/mergeable.s)
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/AArch64/ld64-workaround.s?p2=llvm/trunk/test/MC/MachO/AArch64/ld64-workaround.s&p1=llvm/trunk/test/MC/MachO/AArch64/mergeable.s&r1=237620&r2=237621&rev=237621&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/MachO/AArch64/mergeable.s (original)
> +++ llvm/trunk/test/MC/MachO/AArch64/ld64-workaround.s Mon May 18 17:07:20
> 2015
> @@ -1,21 +1,8 @@
> -// RUN: llvm-mc -triple aarch64-apple-darwin14 %s -filetype=obj -o - |
> llvm-readobj -r --expand-relocs | FileCheck %s
> +; RUN: llvm-mc -triple arm64-apple-darwin10 %s -filetype=obj -o - |
> llvm-readobj -r --expand-relocs | FileCheck %s
>
> -// Test that we "S + K" produce a relocation with a symbol, but just S
> produces
> -// a relocation with the section.
> -
> - .section __TEXT,__literal4,4byte_literals
> -L0:
> - .long 42
> -
> - .section __TEXT,__cstring,cstring_literals
> -L1:
> - .asciz "42"
> -
> - .section __DATA,__data
> - .quad L0
> - .quad L0 + 1
> - .quad L1
> - .quad L1 + 1
> +; Test that we produce an external relocation. This is a known and
> temporary bug
> +; in ld64, where it mishandles pointer-sized internal relocations. We
> should be
> +; able to remove this entirely soon.
>
> // CHECK: Relocations [
> // CHECK-NEXT: Section __data {
> @@ -25,7 +12,7 @@ L1:
> // CHECK-NEXT: Length: 3
> // CHECK-NEXT: Extern: 1
> // CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
> -// CHECK-NEXT: Symbol: L1
> +// CHECK-NEXT: Symbol: Llit16
> // CHECK-NEXT: Scattered: 0
> // CHECK-NEXT: }
> // CHECK-NEXT: Relocation {
> @@ -34,7 +21,7 @@ L1:
> // CHECK-NEXT: Length: 3
> // CHECK-NEXT: Extern: 1
> // CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
> -// CHECK-NEXT: Symbol: L1
> +// CHECK-NEXT: Symbol: Llit8
> // CHECK-NEXT: Scattered: 0
> // CHECK-NEXT: }
> // CHECK-NEXT: Relocation {
> @@ -43,17 +30,39 @@ L1:
> // CHECK-NEXT: Length: 3
> // CHECK-NEXT: Extern: 1
> // CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
> -// CHECK-NEXT: Symbol: L0
> +// CHECK-NEXT: Symbol: Llit4
> // CHECK-NEXT: Scattered: 0
> // CHECK-NEXT: }
> // CHECK-NEXT: Relocation {
> // CHECK-NEXT: Offset: 0x0
> // CHECK-NEXT: PCRel: 0
> // CHECK-NEXT: Length: 3
> -// CHECK-NEXT: Extern: 0
> +// CHECK-NEXT: Extern: 1
> // CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
> -// CHECK-NEXT: Symbol: 0x2
> +// CHECK-NEXT: Symbol: Lcfstring
> // CHECK-NEXT: Scattered: 0
> // CHECK-NEXT: }
> // CHECK-NEXT: }
> // CHECK-NEXT: ]
> +
> + .section __DATA,__cfstring
> +Lcfstring:
> +
> + .section __DATA,__literal4,4byte_literals
> +Llit4:
> + .word 42
> +
> + .section __DATA,__literal8,8byte_literals
> +Llit8:
> + .quad 42
> +
> + .section __DATA,__literal16,16byte_literals
> +Llit16:
> + .quad 42
> + .quad 42
> +
> + .section __DATA,__data
> + .quad Lcfstring
> + .quad Llit4
> + .quad Llit8
> + .quad Llit16
>
> Modified: llvm/trunk/test/MC/MachO/AArch64/mergeable.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/AArch64/mergeable.s?rev=237621&r1=237620&r2=237621&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/MachO/AArch64/mergeable.s (original)
> +++ llvm/trunk/test/MC/MachO/AArch64/mergeable.s Mon May 18 17:07:20 2015
> @@ -1,4 +1,6 @@
> // RUN: llvm-mc -triple aarch64-apple-darwin14 %s -filetype=obj -o - |
> llvm-readobj -r --expand-relocs | FileCheck %s
> +// FIXME: the final relocation should be internal, but the linker doesn't
> +// currently handle the it correctly.
>
> // Test that we "S + K" produce a relocation with a symbol, but just S
> produces
> // a relocation with the section.
> @@ -50,9 +52,9 @@ L1:
> // CHECK-NEXT: Offset: 0x0
> // CHECK-NEXT: PCRel: 0
> // CHECK-NEXT: Length: 3
> -// CHECK-NEXT: Extern: 0
> +// CHECK-NEXT: Extern: 1
> // CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
> -// CHECK-NEXT: Symbol: 0x2
> +// CHECK-NEXT: Symbol: L0
> // CHECK-NEXT: Scattered: 0
> // CHECK-NEXT: }
> // 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/20150530/e1c1a816/attachment.html>
More information about the llvm-commits
mailing list