summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorJiong Wang <jiong.wang@arm.com>2015-09-09 14:19:28 +0100
committerJiong Wang <jiong.wang@arm.com>2015-09-09 14:19:28 +0100
commit259364adb8ced6dc0e3ae5bec2c6f76ec3faf955 (patch)
tree627eebda6b2a1f5890f871f441fcba76315ac9a4 /ld
parentd660d56578248bf3bb56150295cecc763f112061 (diff)
downloadbinutils-gdb-259364adb8ced6dc0e3ae5bec2c6f76ec3faf955.tar.gz
[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/ChangeLog8
-rw-r--r--ld/testsuite/ld-aarch64/aarch64-elf.exp2
-rw-r--r--ld/testsuite/ld-aarch64/tls-relax-ld-le-small.d13
-rw-r--r--ld/testsuite/ld-aarch64/tls-relax-ld-le-small.s27
-rw-r--r--ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.d12
-rw-r--r--ld/testsuite/ld-aarch64/tls-relax-ld-le-tiny.s26
6 files changed, 88 insertions, 0 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index c92d1e4538b..ce7f8b711e6 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 cbbe6a91477..955484e1f59 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 00000000000..fa648291fdb
--- /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 00000000000..ea58500b748
--- /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 00000000000..db226775346
--- /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 00000000000..2336f691d39
--- /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