diff options
Diffstat (limited to 'ld/testsuite/ld-sh/tlsbinpic.s')
-rw-r--r-- | ld/testsuite/ld-sh/tlsbinpic.s | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/ld/testsuite/ld-sh/tlsbinpic.s b/ld/testsuite/ld-sh/tlsbinpic.s new file mode 100644 index 0000000..cb8b361 --- /dev/null +++ b/ld/testsuite/ld-sh/tlsbinpic.s @@ -0,0 +1,206 @@ + ! Force .got aligned to 4K, so it very likely gets at 0x413000 + .data + .balign 4096 + .section ".tdata", "awT", @progbits + .globl sg1, sg2 + .globl sh1, sh2 + .hidden sh1, sh2 +sg1: .long 17 +sg2: .long 18 +sl1: .long 65 +sl2: .long 66 +sh1: .long 257 +sh2: .long 258 + ! Force .text aligned to 4K, so it very likely gets at 0x401000. + .text + .balign 4096 + .globl fn2 + .type fn2,@function +fn2: + mov.l r12,@-r15 + mov.l r14,@-r15 + sts.l pr,@-r15 + mova .L3,r0 + mov.l .L3,r12 + add r0,r12 + mov r15,r14 + nop;nop;nop;nop + + ! GD -> IE because variable is not defined in executable + mov.l 1f,r4 + mova 2f,r0 + mov.l 2f,r1 + add r0,r1 + jsr @r1 + add r12,r4 + bra 3f + nop + .align 2 +1: .long sG1@TLSGD +2: .long __tls_get_addr@PLT +3: + nop;nop;nop;nop + + ! GD -> IE because variable is not defined in executable where + ! the variable is referenced through @gottpoff too + mov.l 1f,r4 + mova 2f,r0 + mov.l 2f,r1 + add r0,r1 + jsr @r1 + add r12,r4 + bra 3f + nop + .align 2 +1: .long sG2@TLSGD +2: .long __tls_get_addr@PLT +3: + nop;nop;nop;nop + + ! GD -> LE with global variable defined in executable + mov.l 1f,r4 + mova 2f,r0 + mov.l 2f,r1 + add r0,r1 + jsr @r1 + add r12,r4 + bra 3f + nop + .align 2 +1: .long sg1@TLSGD +2: .long __tls_get_addr@PLT +3: + nop;nop;nop;nop + + ! GD -> LE with local variable defined in executable + mov.l 1f,r4 + mova 2f,r0 + mov.l 2f,r1 + add r0,r1 + jsr @r1 + add r12,r4 + bra 3f + nop + .align 2 +1: .long sl1@TLSGD +2: .long __tls_get_addr@PLT +3: + nop;nop;nop;nop + + ! GD -> LE with hidden variable defined in executable + mov.l 1f,r4 + mova 2f,r0 + mov.l 2f,r1 + add r0,r1 + jsr @r1 + add r12,r4 + bra 3f + nop + .align 2 +1: .long sh1@TLSGD +2: .long __tls_get_addr@PLT +3: + nop;nop;nop;nop + + ! LD -> LE with local variable defined in executable + mov.l 1f,r4 + mova 2f,r0 + mov.l 2f,r1 + add r0,r1 + jsr @r1 + add r12,r4 + bra 3f + nop + .align 2 +1: .long sl1@TLSLDM +2: .long __tls_get_addr@PLT +3: + nop;nop + mov.l .L4,r1 + add r0,r1 + nop;nop + mov.l .L5,r2 + add r0,r2 + nop;nop;nop;nop + + ! LD -> LE against hidden variables + mov.l 1f,r4 + mova 2f,r0 + mov.l 2f,r1 + add r0,r1 + jsr @r1 + add r12,r4 + bra 3f + nop + .align 2 +1: .long sh1@TLSLDM +2: .long __tls_get_addr@PLT +3: + nop;nop + mov.l .L6,r1 + add r0,r1 + nop;nop + mov.l .L7,r2 + add r0,r2 + nop;nop;nop;nop + + ! @GOTTPOFF IE against global var + mov.l 1f,r0 + stc gbr,r1 + mov.l @(r0,r12),r0 + bra 2f + add r0,r1 + .align 2 +1: .long sG2@GOTTPOFF +2: + nop;nop;nop;nop + + ! @GOTTPOFF IE against global var + mov.l 1f,r0 + stc gbr,r1 + mov.l @(r0,r12),r0 + bra 2f + add r1,r0 + .align 2 +1: .long sG4@GOTTPOFF +2: + nop;nop;nop;nop + + ! @GOTTPOFF IE -> LE against global var defined in exec + mov.l 1f,r0 + stc gbr,r1 + mov.l @(r0,r12),r0 + bra 2f + add r0,r1 + .align 2 +1: .long sg1@GOTTPOFF +2: + nop;nop;nop;nop + + ! @GOTTPOFF IE -> LE against hidden var + mov.l 1f,r0 + stc gbr,r1 + mov.l @(r0,r12),r0 + bra 2f + add r0,r1 + .align 2 +1: .long sh1@GOTTPOFF +2: + nop;nop;nop;nop + + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + rts + mov.l @r15+,r12 + + .align 2 +.L3: .long _GLOBAL_OFFSET_TABLE_ +.L4: .long sl1@DTPOFF +.L5: .long sl2@DTPOFF +.L6: .long sh1@DTPOFF +.L7: .long sh2@DTPOFF + ! Fill page with 0. + .space .L8-. + .balign 4096 +.L8: |