summaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-arm/ifunc-10.s
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite/ld-arm/ifunc-10.s')
-rw-r--r--ld/testsuite/ld-arm/ifunc-10.s90
1 files changed, 90 insertions, 0 deletions
diff --git a/ld/testsuite/ld-arm/ifunc-10.s b/ld/testsuite/ld-arm/ifunc-10.s
new file mode 100644
index 0000000..5b1912f
--- /dev/null
+++ b/ld/testsuite/ld-arm/ifunc-10.s
@@ -0,0 +1,90 @@
+ .syntax unified
+ .arch armv6t2
+
+ .macro define,name,type
+ .type \name,%gnu_indirect_function
+ \type
+\name:
+ mov pc,lr
+ .size \name,.-\name
+ .endm
+
+ .macro define2,name
+ define aa\name,.arm
+ define at\name,.arm
+ define ab\name,.arm
+ define ta\name,.thumb_func
+ define tt\name,.thumb_func
+ define tb\name,.thumb_func
+ .endm
+
+ .macro test_relocs,name,width
+ bl \name(PLT)
+ b\width \name
+ beq\width \name
+ ldr r4,1f
+ ldr r4,2f
+1:
+ .word \name(GOT)
+2:
+ .word \name(GOT_PREL)
+ .endm
+
+ .macro test_relocs2,name,type,width
+ test_relocs a\type\name,\width
+ test_relocs t\type\name,\width
+ test_relocs ab\name,\width
+ test_relocs tb\name,\width
+ .endm
+
+ .macro diff,name
+ .word \name
+ .word \name-.
+ .endm
+
+ .macro alldirs,doit,name
+ \doit aa\name
+ \doit at\name
+ \doit ab\name
+ \doit ta\name
+ \doit tt\name
+ \doit tb\name
+ .endm
+
+ define2 f1
+ # f2 provided by ifunc-4.so
+ define2 f3
+ # f4 provided by ifunc-4.so
+
+ alldirs .globl,f3
+ alldirs .hidden,f3
+
+ .globl _start
+ .type _start,%function
+ .arm
+_start:
+ test_relocs foo
+ test_relocs2 f1,a,
+ test_relocs2 f2,a,
+ test_relocs2 f3,a,
+ test_relocs2 f4,a,
+ .size _start,.-_start
+
+ .globl _thumb
+ .type _thumb,%function
+ .thumb_func
+_thumb:
+ test_relocs foo
+ test_relocs2 f1,t,.w
+ test_relocs2 f2,t,.w
+ test_relocs2 f3,t,.w
+ test_relocs2 f4,t,.w
+ .size _thumb,.-_thumb
+
+ .data
+foo:
+ .word 0x11223344
+ alldirs diff,f1
+ alldirs diff,f2
+ alldirs diff,f3
+ alldirs diff,f4