mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-12 22:17:47 +00:00
1beb39086c
The SystemZ linkers provide an optimization to transform a general- or local-dynamic TLS sequence into an initial-exec sequence if possible. Do do that, the compiler generates a function call to __tls_get_offset, which is a brasl instruction annotated with *two* relocations: - a R_390_PLT32DBL to install __tls_get_offset as branch target - a R_390_TLS_GDCALL / R_390_TLS_LDCALL to inform the linker that the TLS optimization should be performed if possible If the optimization is performed, the brasl is replaced by an ld load instruction. However, *both* relocs are processed independently by the linker. Therefore it is crucial that the R_390_PLT32DBL is processed *first* (installing the branch target for the brasl) and the R_390_TLS_GDCALL is processed *second* (replacing the whole brasl with an ld). If the relocs are swapped, the linker will first replace the brasl with an ld, and *then* install the __tls_get_offset branch target offset. Since ld has a different layout than brasl, this may even result in a completely different (or invalid) instruction; in any case, the resulting code is corrupted. Unfortunately, the way the MC common code sorts relocations causes these two to *always* end up the wrong way around, resulting in wrong code generation by the linker and crashes. This patch overrides the sortRelocs routine to detect this particular pair of relocs and enforce the required order. llvm-svn: 255787
120 lines
5.3 KiB
ArmAsm
120 lines
5.3 KiB
ArmAsm
|
|
# RUN: llvm-mc -triple s390x-unknown-unknown --show-encoding %s | FileCheck %s
|
|
|
|
# RUN: llvm-mc -triple s390x-unknown-unknown -filetype=obj %s | \
|
|
# RUN: llvm-readobj -r | FileCheck %s -check-prefix=CHECK-REL
|
|
|
|
# CHECK: larl %r14, target # encoding: [0xc0,0xe0,A,A,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target+2, kind: FK_390_PC32DBL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PC32DBL target 0x2
|
|
.align 16
|
|
larl %r14, target
|
|
|
|
# CHECK: larl %r14, target@GOT # encoding: [0xc0,0xe0,A,A,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target@GOT+2, kind: FK_390_PC32DBL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_GOTENT target 0x2
|
|
.align 16
|
|
larl %r14, target@got
|
|
|
|
# CHECK: larl %r14, target@INDNTPOFF # encoding: [0xc0,0xe0,A,A,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target@INDNTPOFF+2, kind: FK_390_PC32DBL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_TLS_IEENT target 0x2
|
|
.align 16
|
|
larl %r14, target@indntpoff
|
|
|
|
# CHECK: brasl %r14, target # encoding: [0xc0,0xe5,A,A,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target+2, kind: FK_390_PC32DBL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PC32DBL target 0x2
|
|
.align 16
|
|
brasl %r14, target
|
|
|
|
# CHECK: brasl %r14, target@PLT # encoding: [0xc0,0xe5,A,A,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target@PLT+2, kind: FK_390_PC32DBL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PLT32DBL target 0x2
|
|
.align 16
|
|
brasl %r14, target@plt
|
|
|
|
# CHECK: brasl %r14, target@PLT:tls_gdcall:sym # encoding: [0xc0,0xe5,A,A,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target@PLT+2, kind: FK_390_PC32DBL
|
|
# CHECK-NEXT: # fixup B - offset: 0, value: sym@TLSGD, kind: FK_390_TLS_CALL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PLT32DBL target 0x2
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_GDCALL sym 0x0
|
|
.align 16
|
|
brasl %r14, target@plt:tls_gdcall:sym
|
|
|
|
# CHECK: brasl %r14, target@PLT:tls_ldcall:sym # encoding: [0xc0,0xe5,A,A,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target@PLT+2, kind: FK_390_PC32DBL
|
|
# CHECK-NEXT: # fixup B - offset: 0, value: sym@TLSLDM, kind: FK_390_TLS_CALL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PLT32DBL target 0x2
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_LDCALL sym 0x0
|
|
.align 16
|
|
brasl %r14, target@plt:tls_ldcall:sym
|
|
|
|
# CHECK: bras %r14, target # encoding: [0xa7,0xe5,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target+2, kind: FK_390_PC16DBL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PC16DBL target 0x2
|
|
.align 16
|
|
bras %r14, target
|
|
|
|
# CHECK: bras %r14, target@PLT # encoding: [0xa7,0xe5,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target@PLT+2, kind: FK_390_PC16DBL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PLT16DBL target 0x2
|
|
.align 16
|
|
bras %r14, target@plt
|
|
|
|
# CHECK: bras %r14, target@PLT:tls_gdcall:sym # encoding: [0xa7,0xe5,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target@PLT+2, kind: FK_390_PC16DBL
|
|
# CHECK-NEXT: # fixup B - offset: 0, value: sym@TLSGD, kind: FK_390_TLS_CALL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PLT16DBL target 0x2
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_GDCALL sym 0x0
|
|
.align 16
|
|
bras %r14, target@plt:tls_gdcall:sym
|
|
|
|
# CHECK: bras %r14, target@PLT:tls_ldcall:sym # encoding: [0xa7,0xe5,A,A]
|
|
# CHECK-NEXT: # fixup A - offset: 2, value: target@PLT+2, kind: FK_390_PC16DBL
|
|
# CHECK-NEXT: # fixup B - offset: 0, value: sym@TLSLDM, kind: FK_390_TLS_CALL
|
|
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_PLT16DBL target 0x2
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_LDCALL sym 0x0
|
|
.align 16
|
|
bras %r14, target@plt:tls_ldcall:sym
|
|
|
|
|
|
# Data relocs
|
|
# llvm-mc does not show any "encoding" string for data, so we just check the relocs
|
|
|
|
# CHECK-REL: .rela.data
|
|
.data
|
|
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_LE64 target 0x0
|
|
.align 16
|
|
.quad target@ntpoff
|
|
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_LDO64 target 0x0
|
|
.align 16
|
|
.quad target@dtpoff
|
|
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_LDM64 target 0x0
|
|
.align 16
|
|
.quad target@tlsldm
|
|
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_GD64 target 0x0
|
|
.align 16
|
|
.quad target@tlsgd
|
|
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_LE32 target 0x0
|
|
.align 16
|
|
.long target@ntpoff
|
|
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_LDO32 target 0x0
|
|
.align 16
|
|
.long target@dtpoff
|
|
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_LDM32 target 0x0
|
|
.align 16
|
|
.long target@tlsldm
|
|
|
|
# CHECK-REL: 0x{{[0-9A-F]*0}} R_390_TLS_GD32 target 0x0
|
|
.align 16
|
|
.long target@tlsgd
|
|
|