	.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
	define2	f2
	define2	f3
	define2	f4

	alldirs	.globl,f2

	alldirs	.globl,f3
	alldirs .hidden,f3

	alldirs	.globl,f4
	alldirs .protected,f4

	.globl	arm
	.type	arm,%function
	.arm
arm:
	test_relocs foo
	test_relocs2 f1,a,
	test_relocs2 f2,a,
	test_relocs2 f3,a,
	test_relocs2 f4,a,
	.size	arm,.-arm

	.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
