mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
8b05307ee4
More MachO madness for everyone. MachO relocations are only 32-bits, which means the ARM64_RELOC_ADDEND one only actually has 24 (signed) bits for the actual addend. This is a problem when calculating the address of a basic block; because it has no symbol of its own, the sequence adrp x0, Ltmp0@PAGE add x0, x0, x0 Ltmp0@PAGEOFF is represented by relocation with an addend that contains the offset from the function start to Ltmp, and so the largest function where this is guaranteed to work is 8MB. That's not quite big enough that we can call it user error (IMO). So this patch puts the any blockaddress into a constant-pool, where the addend is instead stored in the (x)word being relocated, which is obviously big enough for any function.
34 lines
1.2 KiB
LLVM
34 lines
1.2 KiB
LLVM
; RUN: llc < %s -mtriple=arm64-apple-ios | FileCheck %s --check-prefix=CHECK-IOS
|
|
; RUN: llc < %s -mtriple=arm64-apple-ios -global-isel | FileCheck %s --check-prefix=CHECK-IOS
|
|
; RUN: llc < %s -mtriple=arm64-linux-gnu | FileCheck %s --check-prefix=CHECK-LINUX
|
|
; RUN: llc < %s -mtriple=arm64-linux-gnu -code-model=large| FileCheck %s --check-prefix=CHECK-LARGE
|
|
|
|
; rdar://9188695
|
|
|
|
define i64 @t() nounwind ssp {
|
|
entry:
|
|
; CHECK-IOS: lCPI0_0:
|
|
; CHECK-IOS: .quad Ltmp0
|
|
; CHECK-IOS-LABEL: _t:
|
|
; CHECK-IOS: adrp x[[TMP:[0-9]+]], lCPI0_0@PAGE
|
|
; CHECK-IOS: ldr {{x[0-9]+}}, [x[[TMP]], lCPI0_0@PAGEOFF]
|
|
|
|
; CHECK-LINUX-LABEL: t:
|
|
; CHECK-LINUX: adrp [[REG:x[0-9]+]], .Ltmp0
|
|
; CHECK-LINUX: add {{x[0-9]+}}, [[REG]], :lo12:.Ltmp0
|
|
|
|
; CHECK-LARGE-LABEL: t:
|
|
; CHECK-LARGE: movz [[ADDR_REG:x[0-9]+]], #:abs_g0_nc:[[DEST_LBL:.Ltmp[0-9]+]]
|
|
; CHECK-LARGE: movk [[ADDR_REG]], #:abs_g1_nc:[[DEST_LBL]]
|
|
; CHECK-LARGE: movk [[ADDR_REG]], #:abs_g2_nc:[[DEST_LBL]]
|
|
; CHECK-LARGE: movk [[ADDR_REG]], #:abs_g3:[[DEST_LBL]]
|
|
|
|
%recover = alloca i64, align 8
|
|
store volatile i64 ptrtoint (i8* blockaddress(@t, %mylabel) to i64), i64* %recover, align 8
|
|
br label %mylabel
|
|
|
|
mylabel:
|
|
%tmp = load volatile i64, i64* %recover, align 8
|
|
ret i64 %tmp
|
|
}
|