diff options
author | Jiong Wang <jiong.wang@arm.com> | 2015-09-09 14:19:28 +0100 |
---|---|---|
committer | Jiong Wang <jiong.wang@arm.com> | 2015-09-09 14:19:28 +0100 |
commit | 259364adb8ced6dc0e3ae5bec2c6f76ec3faf955 (patch) | |
tree | 627eebda6b2a1f5890f871f441fcba76315ac9a4 /ld | |
parent | d660d56578248bf3bb56150295cecc763f112061 (diff) | |
download | binutils-259364adb8ced6dc0e3ae5bec2c6f76ec3faf955.zip binutils-259364adb8ced6dc0e3ae5bec2c6f76ec3faf955.tar.gz binutils-259364adb8ced6dc0e3ae5bec2c6f76ec3faf955.tar.bz2 |
[AArch64] Relax TLS local dynamic traditional into local executable
The linker relaxation logic will be:
Code sequence I (tiny):
0x00 adr x0, :tlsldm:x
0x04 bl __tls_get_addr
|
V
0x00 mrs x0, tpidr_el0
0x04 add x0, x0, TCB_SIZE
Code sequence II (small):
0x00 adrp a0, :tlsldm:x
0x04 add a0, #:tlsldm_lo12:x
0x08 bl __tls_get_addr
|
V
0x00 mrs x0, tpidr_el0
0x04 add x0, x0, TCB_SIZE
0x08 nop
2015-09-09 Jiong Wang <jiong.wang@arm.com>
bfd/
* elfnn-aarch64.c (aarch64_tls_transition_without_check): Support
three TLS local dynamic traditional relocations types.
(elfNN_aarch64_tls_relax): Support TLS local dynamic traditional to
local executable relaxation.
ld/testsuite/
* ld-aarch64/tls-relax-ld-le-tiny.s: New testcase.
* ld-aarch64/tls-relax-ld-le-small.s: Likewise.
* ld-aarch64/tls-relax-ld-le-tiny.d: New expectation file.
* ld-aarch64/tls-relax-ld-le-small.d: Likewise.
* ld-aarch64/aarch64-elf.exp: Run new testcases.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/aarch64-elf.exp | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/tls-relax-ld-le-small.d | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/tls-relax-ld-le-small.s | 27 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.d | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.s | 26 |
6 files changed, 88 insertions, 0 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index c92d1e4..ce7f8b7 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-09-09 Jiong Wang <jiong.wang@arm.com> + + * ld-aarch64/tls-relax-ld-le-tiny.s: New testcase. + * ld-aarch64/tls-relax-ld-le-small.s: Likewise. + * ld-aarch64/tls-relax-ld-le-tiny.d: New expectation file. + * ld-aarch64/tls-relax-ld-le-small.d: Likewise. + * ld-aarch64/aarch64-elf.exp: Run new testcases. + 2015-09-07 Andrew Burgess <andrew.burgess@embecosm.com> * ld-elf/orphan-7.map: Allow for other discarded sections. diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index cbbe6a9..955484e 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -178,6 +178,8 @@ run_dump_test "tls-relax-gdesc-le" run_dump_test "tls-relax-gd-ie" run_dump_test "tls-relax-gdesc-ie" run_dump_test "tls-relax-ie-le" +run_dump_test "tls-relax-ld-le-small" +run_dump_test "tls-relax-ld-le-tiny" run_dump_test "tls-desc-ie" run_dump_test "tls-relax-gdesc-ie-2" run_dump_test "tls-relax-gdesc-le-2" diff --git a/ld/testsuite/ld-aarch64/tls-relax-ld-le-small.d b/ld/testsuite/ld-aarch64/tls-relax-ld-le-small.d new file mode 100644 index 0000000..fa64829 --- /dev/null +++ b/ld/testsuite/ld-aarch64/tls-relax-ld-le-small.d @@ -0,0 +1,13 @@ +#source: tls-relax-ld-le-small.s +#ld: -T relocs.ld -e0 +#objdump: -dr +#... + +10000: 910003fd mov x29, sp + +10004: d53bd040 mrs x0, tpidr_el0 + +10008: 91004000 add x0, x0, #0x10 + +1000c: d503201f nop + +10010: d503201f nop + +10014: 91400001 add x1, x0, #0x0, lsl #12 + +10018: 91000021 add x1, x1, #0x0 + +1001c: 90000000 adrp x0, 10000 <.*> + +10020: d65f03c0 ret diff --git a/ld/testsuite/ld-aarch64/tls-relax-ld-le-small.s b/ld/testsuite/ld-aarch64/tls-relax-ld-le-small.s new file mode 100644 index 0000000..ea58500 --- /dev/null +++ b/ld/testsuite/ld-aarch64/tls-relax-ld-le-small.s @@ -0,0 +1,27 @@ + .cpu generic+fp+simd + .section .text.startup,"ax",%progbits + .align 2 + .p2align 3,,7 + .global main + .type main, %function +main: + add x29, sp, 0 + adrp x0, :tlsldm:global_a0 + add x0, x0, #:tlsldm_lo12_nc:global_a0 + bl __tls_get_addr + nop + add x1, x0, #:dtprel_hi12:global_a0, lsl #12 + add x1, x1, #:dtprel_lo12_nc:global_a0 + adrp x0, .LC0 + ret + .size main, .-main + .section .rodata.str1.8,"aMS",%progbits,1 + .align 3 +.LC0: + .string "Hello world %d\n" + .section .tdata,"awT",%progbits + .align 2 + .type global_a0, %object + .size global_a0, 4 +global_a0: + .word 16 diff --git a/ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.d b/ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.d new file mode 100644 index 0000000..db22677 --- /dev/null +++ b/ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.d @@ -0,0 +1,12 @@ +#source: tls-relax-ld-le-tiny.s +#ld: -T relocs.ld -e0 +#objdump: -dr +#... + +10000: 910003fd mov x29, sp + +10004: d53bd040 mrs x0, tpidr_el0 + +10008: 91004000 add x0, x0, #0x10 + +1000c: d503201f nop + +10010: 91400001 add x1, x0, #0x0, lsl #12 + +10014: 91000021 add x1, x1, #0x0 + +10018: 90000000 adrp x0, 10000 <main> + +1001c: d65f03c0 ret diff --git a/ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.s b/ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.s new file mode 100644 index 0000000..2336f69 --- /dev/null +++ b/ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.s @@ -0,0 +1,26 @@ + .cpu generic+fp+simd + .section .text.startup,"ax",%progbits + .align 2 + .p2align 3,,7 + .global main + .type main, %function +main: + add x29, sp, 0 + adr x0, :tlsldm:global_a0 + bl __tls_get_addr + nop + add x1, x0, #:dtprel_hi12:global_a0, lsl #12 + add x1, x1, #:dtprel_lo12_nc:global_a0 + adrp x0, .LC0 + ret + .size main, .-main + .section .rodata.str1.8,"aMS",%progbits,1 + .align 3 +.LC0: + .string "Hello world %d\n" + .section .tdata,"awT",%progbits + .align 2 + .type global_a0, %object + .size global_a0, 4 +global_a0: + .word 16 |