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.

llvm-svn: 237621
This commit is contained in:
Tim Northover 2015-05-18 22:07:20 +00:00
parent 7a4d1090bc
commit d6223a2471
4 changed files with 76 additions and 31 deletions

View File

@ -130,15 +130,14 @@ static bool canUseLocalRelocation(const MCSectionMachO &Section,
if (RefSec.getType() == MachO::S_CSTRING_LITERALS) if (RefSec.getType() == MachO::S_CSTRING_LITERALS)
return false; return false;
if (RefSec.getSegmentName() == "__DATA" &&
RefSec.getSectionName() == "__cfstring")
return false;
if (RefSec.getSegmentName() == "__DATA" && if (RefSec.getSegmentName() == "__DATA" &&
RefSec.getSectionName() == "__objc_classrefs") RefSec.getSectionName() == "__objc_classrefs")
return false; 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( void AArch64MachObjectWriter::RecordRelocation(

View File

@ -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

View File

@ -0,0 +1,68 @@
; 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. 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 {
// CHECK-NEXT: Relocation {
// CHECK-NEXT: Offset: 0x18
// CHECK-NEXT: PCRel: 0
// CHECK-NEXT: Length: 3
// CHECK-NEXT: Extern: 1
// CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
// CHECK-NEXT: Symbol: Llit16
// CHECK-NEXT: Scattered: 0
// CHECK-NEXT: }
// CHECK-NEXT: Relocation {
// CHECK-NEXT: Offset: 0x10
// CHECK-NEXT: PCRel: 0
// CHECK-NEXT: Length: 3
// CHECK-NEXT: Extern: 1
// CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
// CHECK-NEXT: Symbol: Llit8
// CHECK-NEXT: Scattered: 0
// CHECK-NEXT: }
// CHECK-NEXT: Relocation {
// CHECK-NEXT: Offset: 0x8
// CHECK-NEXT: PCRel: 0
// CHECK-NEXT: Length: 3
// CHECK-NEXT: Extern: 1
// CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
// 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: 1
// CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
// 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

View File

@ -1,4 +1,6 @@
// RUN: llvm-mc -triple aarch64-apple-darwin14 %s -filetype=obj -o - | llvm-readobj -r --expand-relocs | FileCheck %s // 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 // Test that we "S + K" produce a relocation with a symbol, but just S produces
// a relocation with the section. // a relocation with the section.
@ -50,9 +52,9 @@ L1:
// CHECK-NEXT: Offset: 0x0 // CHECK-NEXT: Offset: 0x0
// CHECK-NEXT: PCRel: 0 // CHECK-NEXT: PCRel: 0
// CHECK-NEXT: Length: 3 // CHECK-NEXT: Length: 3
// CHECK-NEXT: Extern: 0 // CHECK-NEXT: Extern: 1
// CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0) // CHECK-NEXT: Type: ARM64_RELOC_UNSIGNED (0)
// CHECK-NEXT: Symbol: 0x2 // CHECK-NEXT: Symbol: L0
// CHECK-NEXT: Scattered: 0 // CHECK-NEXT: Scattered: 0
// CHECK-NEXT: } // CHECK-NEXT: }
// CHECK-NEXT: } // CHECK-NEXT: }