[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