+
+
+#if __arm__
+ .text
+ .align 2
+
+ .globl _test_loads
+_test_loads:
+ @ PIC load of a
+ ldr r0, L100
+L0:
+ ldr r0, [pc, r0]
+
+ @ PIC load of c
+ ldr r0, L100+4
+L1:
+ ldr r0, [pc, r0]
+
+ @ sorta-absolute load of a
+ ldr r0, L100+8
+ ldr r0, [r0, #0]
+
+ @ sorta-absolute load of c
+ ldr r0, L100+12
+ ldr r0, [r0, #0]
+
+ @ sorta-absolute load of external
+ ldr r0, L100+16
+ ldr r0, [r0, #0]
+
+ @ PIC load of a + addend ??
+ bx lr
+
+L100:
+ .long _a-(L0+8)
+ .long _c-(L1+8)
+ .long _a
+ .long _c
+ .long _ax
+
+_test_calls:
+ @ call internal
+ bl _test_branches
+
+ @ call internal + addend
+ bl _test_branches+0x19000
+
+ @ call external
+ bl _external
+
+ @ call external + addend
+ bl _external+0x19000
+
+
+_test_branches:
+ @ call internal
+ bne _test_calls
+
+ @ call internal + addend
+ bne _test_calls+16
+
+ @ call internal - addend
+ bne _test_calls-16
+
+ @ call external
+ bne _external
+
+ @ call external + addend
+ bne _external+16
+
+ nop
+ bl 1f
+1: nop
+
+
+ .globl _test_weak
+ .weak_definition _test_weak
+_test_weak:
+ nop
+ nop
+
+ .globl _test_hidden_weak
+ .private_extern _test_hidden_weak
+ .weak_definition _test_hidden_weak
+_test_hidden_weak:
+ nop
+ nop
+
+
+_test_weak_call:
+ bl _test_weak
+ bl _test_weak+4
+
+
+_test_weak_hidden_pointer_call:
+ ldr r12,L3
+ add r12, pc, r12
+ nop
+ bx r12
+L101:
+ .long _test_hidden_weak - L101
+
+
+ .text
+_pointer_diffs:
+ .long _foo-1b
+ .long _foo+10-1b
+ .long _test_branches-1b
+ .long _test_branches+3-1b
+ .long (_test_branches - _test_loads) + -2097152
+ .long (_test_calls - _test_loads) + -2097152
+
+
+ .text
+ .code 32
+_arm1:
+ bx lr
+_arm2:
+ bx lr
+ .weak_definition _arm3
+ .globl _arm3
+ .private_extern _arm3
+_arm3:
+ bx lr
+ .weak_definition _arm4
+ .globl _arm4
+ .private_extern _arm4
+_arm4:
+ bx lr
+
+ .code 16
+ .thumb_func _thumb1
+_thumb1:
+ bx lr
+ .thumb_func _thumb2
+_thumb2:
+ bx lr
+ .weak_definition _thumb3
+ .globl _thumb3
+ .private_extern _thumb3
+ .thumb_func _thumb3
+_thumb3:
+ bx lr
+ .weak_definition _thumb4
+ .globl _thumb4
+ .private_extern _thumb4
+ .thumb_func _thumb4
+_thumb4:
+ bx lr
+
+ .thumb_func _thumb_func_ref_test
+_thumb_func_ref_test:
+ push {r7, lr}
+ add r7, sp, #0
+ ldr r3, L6
+L2: add r3, pc
+ ldr r3, L7
+L3: add r3, pc
+ ldr r3, L8
+L4: add r3, pc
+ ldr r3, L9
+L5: add r3, pc
+ pop {r7, pc}
+ .align 2
+L6: .long _thumb1-(L2+4)
+L7: .long _thumb2-(L3+4)
+L7a:.long _thumb3-(L3+4)
+L7b:.long _thumb4-(L3+4)
+L8: .long _arm1-(L4+4)
+L9: .long _arm2-(L5+4)
+L9a:.long _arm3-(L5+4)
+L9b:.long _arm4-(L5+4)
+
+ .code 32
+ .align 2
+_arm_func_ref_test:
+ push {r7, lr}
+ add r7, sp, #0
+ ldr r3, L16
+L12:add r3, pc
+ ldr r3, L17
+L13:add r3, pc
+ ldr r3, L18
+L14:add r3, pc
+ ldr r3, L19
+L15:add r3, pc
+ pop {r7, pc}
+ .align 2
+L16: .long _thumb1-(L12+8)
+L17: .long _thumb2-(L13+8)
+L17a: .long _thumb3-(L13+8)
+L17b: .long _thumb4-(L13+8)
+L18: .long _arm1-(L14+8)
+L19: .long _arm2-(L15+8)
+L19a: .long _arm3-(L15+8)
+L19b: .long _arm4-(L15+8)
+
+ .section __DATA,__const
+_myVTable:
+ .long _thumb1
+ .long _thumb2
+ .long _thumb3
+ .long _arm1
+ .long _arm2
+
+#if __ARM_ARCH_7A__
+ .text
+ .align 2
+_arm16tests:
+ movw r0, :lower16:_datahilo16
+ movt r0, :upper16:_datahilo16
+ movw r0, :lower16:_datahilo16+4
+ movt r0, :upper16:_datahilo16+4
+ movw r0, :lower16:_datahilo16alt
+ movt r0, :upper16:_datahilo16alt
+ movw r0, :lower16:_datahilo16alt+61440
+ movt r0, :upper16:_datahilo16alt+61440
+ movw r0, :lower16:_datahilo16alt+2048
+ movt r0, :upper16:_datahilo16alt+2048
+ movw r0, :lower16:_datahilo16alt+1792
+ movt r0, :upper16:_datahilo16alt+1792
+ movw r0, :lower16:_datahilo16alt+165
+ movt r0, :upper16:_datahilo16alt+165
+Lpicbase:
+ movw r0, :lower16:_datahilo16 - Lpicbase
+ movt r0, :upper16:_datahilo16 - Lpicbase
+ movw r0, :lower16:_datahilo16+4 - Lpicbase
+ movt r0, :upper16:_datahilo16+4 - Lpicbase
+ movw r0, :lower16:_datahilo16alt - Lpicbase
+ movt r0, :upper16:_datahilo16alt - Lpicbase
+ movw r0, :lower16:_datahilo16alt+61440 - Lpicbase
+ movt r0, :upper16:_datahilo16alt+61440 - Lpicbase
+ movw r0, :lower16:_datahilo16alt+2048 - Lpicbase
+ movt r0, :upper16:_datahilo16alt+2048 - Lpicbase
+ movw r0, :lower16:_datahilo16alt+1792 - Lpicbase
+ movt r0, :upper16:_datahilo16alt+1792 - Lpicbase
+ movw r0, :lower16:_datahilo16alt+165 - Lpicbase
+ movt r0, :upper16:_datahilo16alt+165 - Lpicbase
+ bx lr
+
+ .code 16
+ .thumb_func _thumb16tests
+_thumb16tests:
+ movw r0, :lower16:_datahilo16
+ movt r0, :upper16:_datahilo16
+ movw r0, :lower16:_datahilo16+4
+ movt r0, :upper16:_datahilo16+4
+ movw r0, :lower16:_datahilo16alt
+ movt r0, :upper16:_datahilo16alt
+ movw r0, :lower16:_datahilo16alt+61440
+ movt r0, :upper16:_datahilo16alt+61440
+ movw r0, :lower16:_datahilo16alt+2048
+ movt r0, :upper16:_datahilo16alt+2048
+ movw r0, :lower16:_datahilo16alt+1792
+ movt r0, :upper16:_datahilo16alt+1792
+ movw r0, :lower16:_datahilo16alt+165
+ movt r0, :upper16:_datahilo16alt+165
+Lpicbase2:
+ movw r0, :lower16:_datahilo16 - Lpicbase2
+ movt r0, :upper16:_datahilo16 - Lpicbase2
+ movw r0, :lower16:_datahilo16+4 - Lpicbase2
+ movt r0, :upper16:_datahilo16+4 - Lpicbase2
+ movw r0, :lower16:_datahilo16alt - Lpicbase2
+ movt r0, :upper16:_datahilo16alt - Lpicbase2
+ movw r0, :lower16:_datahilo16alt+61440 - Lpicbase2
+ movt r0, :upper16:_datahilo16alt+61440 - Lpicbase2
+ movw r0, :lower16:_datahilo16alt+2048 - Lpicbase2
+ movt r0, :upper16:_datahilo16alt+2048 - Lpicbase2
+ movw r0, :lower16:_datahilo16alt+1792 - Lpicbase2
+ movt r0, :upper16:_datahilo16alt+1792 - Lpicbase2
+ movw r0, :lower16:_datahilo16alt+165 - Lpicbase2
+ movt r0, :upper16:_datahilo16alt+165 - Lpicbase2
+ bx lr
+
+ .data
+_datahilo16: .long 0
+_datahilo16alt: .long 0
+
+#endif
+
+#endif
+