<p dir="ltr">Thanks for confirming that it is a linker bug!</p>
<div class="gmail_quote">On May 18, 2015 6:11 PM, "Tim Northover" <<a href="mailto:tnorthover@apple.com">tnorthover@apple.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: tnorthover<br>
Date: Mon May 18 17:07:20 2015<br>
New Revision: 237621<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D237621-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Vus7NX16Ms7hd5E-hQ8Hbcwm3AoY3o-mwxYbDW29tYU&s=zk9VrYjQ_OlMvcYjKMeobR-KtPl_J_eZ3TKMro157g8&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=237621&view=rev</a><br>
Log:<br>
AArch64: work around ld64 bug more aggressively.<br>
<br>
ld64 currently mishandles internal pointer relocations (i.e.<br>
ARM64_RELOC_UNSIGNED referred to by section & offset rather than symbol). The<br>
existing __cfstring clause was an early discovery and workaround for this, but<br>
the problem is wider and we should avoid such relocations wherever possible for<br>
now.<br>
<br>
This code should be reverted to allowing internal relocations as soon as<br>
possible.<br>
<br>
PR23437.<br>
<br>
Added:<br>
    llvm/trunk/test/MC/MachO/AArch64/ld64-workaround.s<br>
      - copied, changed from r237620, llvm/trunk/test/MC/MachO/AArch64/mergeable.s<br>
Removed:<br>
    llvm/trunk/test/MC/MachO/AArch64/cfstring.s<br>
Modified:<br>
    llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp<br>
    llvm/trunk/test/MC/MachO/AArch64/mergeable.s<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_AArch64_MCTargetDesc_AArch64MachObjectWriter.cpp-3Frev-3D237621-26r1-3D237620-26r2-3D237621-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Vus7NX16Ms7hd5E-hQ8Hbcwm3AoY3o-mwxYbDW29tYU&s=LswhQFLL-QWpw1J8Ad03eDtOxe3pWmm0LIO0NeNxsXY&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp?rev=237621&r1=237620&r2=237621&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp Mon May 18 17:07:20 2015<br>
@@ -131,14 +131,13 @@ static bool canUseLocalRelocation(const<br>
     return false;<br>
<br>
   if (RefSec.getSegmentName() == "__DATA" &&<br>
-      RefSec.getSectionName() == "__cfstring")<br>
-    return false;<br>
-<br>
-  if (RefSec.getSegmentName() == "__DATA" &&<br>
       RefSec.getSectionName() == "__objc_classrefs")<br>
     return false;<br>
<br>
-  return true;<br>
+  // FIXME: ld64 currently handles internal pointer-sized relocations<br>
+  // incorrectly (applying the addend twice). We should be able to return true<br>
+  // unconditionally by this point when that's fixed.<br>
+  return false;<br>
 }<br>
<br>
 void AArch64MachObjectWriter::RecordRelocation(<br>
<br>
Removed: llvm/trunk/test/MC/MachO/AArch64/cfstring.s<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_MC_MachO_AArch64_cfstring.s-3Frev-3D237620-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Vus7NX16Ms7hd5E-hQ8Hbcwm3AoY3o-mwxYbDW29tYU&s=WHXEVSLz7lJnqW8Y56ErEp3ASTdUrommzHQdXWxYEZw&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/AArch64/cfstring.s?rev=237620&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/MC/MachO/AArch64/cfstring.s (original)<br>
+++ llvm/trunk/test/MC/MachO/AArch64/cfstring.s (removed)<br>
@@ -1,24 +0,0 @@<br>
-; RUN: llvm-mc -triple arm64-apple-darwin10 %s -filetype=obj -o - | llvm-readobj -r --expand-relocs | FileCheck %s<br>
-<br>
-; Test that we produce an external relocation. There is no apparent need for it, but<br>
-; ld64 (241.9) produces a corrupt output if we don't.<br>
-<br>
-// CHECK:      Relocations [<br>
-// CHECK-NEXT:   Section __data {<br>
-// CHECK-NEXT:     Relocation {<br>
-// CHECK-NEXT:       Offset: 0x0<br>
-// CHECK-NEXT:       PCRel: 0<br>
-// CHECK-NEXT:       Length: 3<br>
-// CHECK-NEXT:       Extern: 1<br>
-// CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)<br>
-// CHECK-NEXT:       Symbol: Lfoo<br>
-// CHECK-NEXT:       Scattered: 0<br>
-// CHECK-NEXT:     }<br>
-// CHECK-NEXT:   }<br>
-// CHECK-NEXT: ]<br>
-<br>
-        .section        __DATA,__cfstring<br>
-Lfoo:<br>
-<br>
-        .section        __DATA,__data<br>
-        .quad   Lfoo<br>
<br>
Copied: llvm/trunk/test/MC/MachO/AArch64/ld64-workaround.s (from r237620, llvm/trunk/test/MC/MachO/AArch64/mergeable.s)<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_MC_MachO_AArch64_ld64-2Dworkaround.s-3Fp2-3Dllvm_trunk_test_MC_MachO_AArch64_ld64-2Dworkaround.s-26p1-3Dllvm_trunk_test_MC_MachO_AArch64_mergeable.s-26r1-3D237620-26r2-3D237621-26rev-3D237621-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Vus7NX16Ms7hd5E-hQ8Hbcwm3AoY3o-mwxYbDW29tYU&s=NvvH_y9WZL2x0gstBeUx9XWYGJPxW7PiUjXj_zwY-g4&e=" target="_blank">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</a><br>
==============================================================================<br>
--- llvm/trunk/test/MC/MachO/AArch64/mergeable.s (original)<br>
+++ llvm/trunk/test/MC/MachO/AArch64/ld64-workaround.s Mon May 18 17:07:20 2015<br>
@@ -1,21 +1,8 @@<br>
-// RUN: llvm-mc -triple aarch64-apple-darwin14 %s -filetype=obj -o - | llvm-readobj -r --expand-relocs | FileCheck %s<br>
+; RUN: llvm-mc -triple arm64-apple-darwin10 %s -filetype=obj -o - | llvm-readobj -r --expand-relocs | FileCheck %s<br>
<br>
-// Test that we "S + K" produce a relocation with a symbol, but just S produces<br>
-// a relocation with the section.<br>
-<br>
-       .section        __TEXT,__literal4,4byte_literals<br>
-L0:<br>
-       .long   42<br>
-<br>
-       .section        __TEXT,__cstring,cstring_literals<br>
-L1:<br>
-       .asciz  "42"<br>
-<br>
-       .section        __DATA,__data<br>
-       .quad   L0<br>
-       .quad   L0 + 1<br>
-       .quad   L1<br>
-       .quad   L1 + 1<br>
+; Test that we produce an external relocation. This is a known and temporary bug<br>
+; in ld64, where it mishandles pointer-sized internal relocations. We should be<br>
+; able to remove this entirely soon.<br>
<br>
 // CHECK:      Relocations [<br>
 // CHECK-NEXT:   Section __data {<br>
@@ -25,7 +12,7 @@ L1:<br>
 // CHECK-NEXT:       Length: 3<br>
 // CHECK-NEXT:       Extern: 1<br>
 // CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)<br>
-// CHECK-NEXT:       Symbol: L1<br>
+// CHECK-NEXT:       Symbol: Llit16<br>
 // CHECK-NEXT:       Scattered: 0<br>
 // CHECK-NEXT:     }<br>
 // CHECK-NEXT:     Relocation {<br>
@@ -34,7 +21,7 @@ L1:<br>
 // CHECK-NEXT:       Length: 3<br>
 // CHECK-NEXT:       Extern: 1<br>
 // CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)<br>
-// CHECK-NEXT:       Symbol: L1<br>
+// CHECK-NEXT:       Symbol: Llit8<br>
 // CHECK-NEXT:       Scattered: 0<br>
 // CHECK-NEXT:     }<br>
 // CHECK-NEXT:     Relocation {<br>
@@ -43,17 +30,39 @@ L1:<br>
 // CHECK-NEXT:       Length: 3<br>
 // CHECK-NEXT:       Extern: 1<br>
 // CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)<br>
-// CHECK-NEXT:       Symbol: L0<br>
+// CHECK-NEXT:       Symbol: Llit4<br>
 // CHECK-NEXT:       Scattered: 0<br>
 // CHECK-NEXT:     }<br>
 // CHECK-NEXT:     Relocation {<br>
 // CHECK-NEXT:       Offset: 0x0<br>
 // CHECK-NEXT:       PCRel: 0<br>
 // CHECK-NEXT:       Length: 3<br>
-// CHECK-NEXT:       Extern: 0<br>
+// CHECK-NEXT:       Extern: 1<br>
 // CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)<br>
-// CHECK-NEXT:       Symbol: 0x2<br>
+// CHECK-NEXT:       Symbol: Lcfstring<br>
 // CHECK-NEXT:       Scattered: 0<br>
 // CHECK-NEXT:     }<br>
 // CHECK-NEXT:   }<br>
 // CHECK-NEXT: ]<br>
+<br>
+        .section        __DATA,__cfstring<br>
+Lcfstring:<br>
+<br>
+        .section        __DATA,__literal4,4byte_literals<br>
+Llit4:<br>
+        .word 42<br>
+<br>
+        .section        __DATA,__literal8,8byte_literals<br>
+Llit8:<br>
+        .quad 42<br>
+<br>
+        .section        __DATA,__literal16,16byte_literals<br>
+Llit16:<br>
+        .quad 42<br>
+        .quad 42<br>
+<br>
+        .section        __DATA,__data<br>
+        .quad   Lcfstring<br>
+        .quad   Llit4<br>
+        .quad   Llit8<br>
+        .quad   Llit16<br>
<br>
Modified: llvm/trunk/test/MC/MachO/AArch64/mergeable.s<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_MC_MachO_AArch64_mergeable.s-3Frev-3D237621-26r1-3D237620-26r2-3D237621-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=Vus7NX16Ms7hd5E-hQ8Hbcwm3AoY3o-mwxYbDW29tYU&s=eiXOPtF1_XcUCcPGPiZnZG0y5O1qAcM1TMwfywz34rA&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/AArch64/mergeable.s?rev=237621&r1=237620&r2=237621&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/MC/MachO/AArch64/mergeable.s (original)<br>
+++ llvm/trunk/test/MC/MachO/AArch64/mergeable.s Mon May 18 17:07:20 2015<br>
@@ -1,4 +1,6 @@<br>
 // RUN: llvm-mc -triple aarch64-apple-darwin14 %s -filetype=obj -o - | llvm-readobj -r --expand-relocs | FileCheck %s<br>
+// FIXME: the final relocation should be internal, but the linker doesn't<br>
+// currently handle the it correctly.<br>
<br>
 // Test that we "S + K" produce a relocation with a symbol, but just S produces<br>
 // a relocation with the section.<br>
@@ -50,9 +52,9 @@ L1:<br>
 // CHECK-NEXT:       Offset: 0x0<br>
 // CHECK-NEXT:       PCRel: 0<br>
 // CHECK-NEXT:       Length: 3<br>
-// CHECK-NEXT:       Extern: 0<br>
+// CHECK-NEXT:       Extern: 1<br>
 // CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)<br>
-// CHECK-NEXT:       Symbol: 0x2<br>
+// CHECK-NEXT:       Symbol: L0<br>
 // CHECK-NEXT:       Scattered: 0<br>
 // CHECK-NEXT:     }<br>
 // CHECK-NEXT:   }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>