[llvm] r237621 - AArch64: work around ld64 bug more aggressively.

Tim Northover tnorthover at apple.com
Mon May 18 15:07:20 PDT 2015


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:   }





More information about the llvm-commits mailing list