]> git.saurik.com Git - apple/ld64.git/blobdiff - unit-tests/test-cases/relocs-asm/relocs-asm.s
ld64-351.8.tar.gz
[apple/ld64.git] / unit-tests / test-cases / relocs-asm / relocs-asm.s
old mode 100755 (executable)
new mode 100644 (file)
index 06e10e8..67ff5e5
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2005-2010 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -21,6 +21,8 @@
  * @APPLE_LICENSE_HEADER_END@
  */
 
+               
+               
 #if __arm__
        .text
        .align 2
        .globl _test_loads
 _test_loads:
     @ PIC load of a
-    ldr r0, L6
+    ldr r0, L100
 L0:
     ldr r0, [pc, r0]
 
     @ PIC load of c
-    ldr r0, L6+4
+    ldr r0, L100+4
 L1:
     ldr r0, [pc, r0]
 
        @ sorta-absolute load of a
-       ldr r0, L6+8
+       ldr r0, L100+8
        ldr r0, [r0, #0]
        
        @ sorta-absolute load of c
-       ldr r0, L6+12
+       ldr r0, L100+12
        ldr r0, [r0, #0]
 
        @ sorta-absolute load of external
-       ldr r0, L6+16
+       ldr r0, L100+16
        ldr r0, [r0, #0]
 
        @ PIC load of a + addend ??
     bx lr
 
-L6:
+L100:
     .long _a-(L0+8)
     .long _c-(L1+8)
     .long _a
@@ -80,11 +82,249 @@ _test_branches:
        @ 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:
+1:     .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
+       movw    r0, :lower16:_thumbTarget
+       movt    r0, :upper16:_thumbTarget
+       movw    r0, :lower16:_externalTarget
+       movt    r0, :upper16:_externalTarget
+       movw    r0, :lower16:_externalTarget+61447
+       movt    r0, :upper16:_externalTarget+61447
+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
+       movw    r0, :lower16:_thumbTarget - Lpicbase
+       movt    r0, :upper16:_thumbTarget - 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
+       movw    r0, :lower16:_thumbTarget
+       movt    r0, :upper16:_thumbTarget
+       movw    r0, :lower16:_externalTarget
+       movt    r0, :upper16:_externalTarget
+       movw    r0, :lower16:_externalTarget+61447
+       movt    r0, :upper16:_externalTarget+61447
+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
+       movw    r0, :lower16:_thumbTarget - Lpicbase2
+       movt    r0, :upper16:_thumbTarget - Lpicbase2
+       bx      lr
+
+       .code 16
+       .thumb_func _thumbTarget
+_thumbTarget:
+        nop
+        bx  lr
+
+       .data
+_datahilo16:   .long 0
+_datahilo16alt:        .long 0
+
+
+
+#endif
+       
 #endif
 
 #if __ppc__ || __ppc64__
@@ -201,6 +441,17 @@ _test_branches:
        
        ; call external + addend
        bne     _external+16
+
+       .globl  _test_weak
+       .weak_definition _test_weak
+_test_weak:
+       nop
+       nop
+       
+_test_weak_call:
+       bl      _test_weak
+       bl      _test_weak+4
+
 #endif
 
 
@@ -208,7 +459,12 @@ _test_branches:
 #if __i386__
        .text
        .align 2
-       
+
+Ltest_data:
+       .long   1
+       .long   2
+       .long   3
+
        .globl _test_loads
 _test_loads:
        pushl   %ebp
@@ -239,6 +495,10 @@ Lpicbase:
        # absolute lea of external + addend
        leal    _ax+0x1900, %eax
 
+       # absolute load of _test_data with negative addend and local label
+       movl    Ltest_data-16(%edi),%eax
+       movq    Ltest_data-16(%edi),%mm4
+       
        ret
 
 
@@ -249,6 +509,12 @@ _test_calls:
        # call internal + addend
        call    _test_branches+0x19000
 
+       # 16-bit call internal
+       callw   _test_branches
+       
+       # 16-bit call internal + addend
+       callw   _test_branches+13
+
        # call external
        call    _external
        
@@ -276,6 +542,9 @@ _pointer_diffs:
        movl _foo+10-1b(%eax),%esi
        movl _test_branches-1b(%eax),%esi
        movl _test_branches+3-1b(%eax),%esi
+       cmpl $(( (_test_branches - _test_loads) + -2097152 )),(%esp)
+       cmpl $(( (_test_calls - _test_loads) + -2097152 )),(%esp)
+
        
 _word_relocs:
        callw   _pointer_diffs
@@ -289,6 +558,16 @@ c_2:
     sub          $(1), %ecx
     jcxz         c_2
 
+       .globl  _test_weak
+       .weak_definition _test_weak
+_test_weak:
+       nop
+       nop
+
+_test_weak_call:
+       call    _test_weak
+       call    _test_weak+1
+       
 #endif
 
 
@@ -366,19 +645,30 @@ _test_branches:
        jne     _external+16
        
 _byte_relocs:
+       # nonsense loop that creates byte branch relocation
     mov          $100, %ecx 
-c_1:  
+c_1:
     loop         _byte_relocs
     nop
 
+       .globl  _test_weak
+       .weak_definition _test_weak
+_test_weak:
+       nop
+       nop
+
+_test_weak_call:
+       call    _test_weak
+       call    _test_weak+1
+
 #endif
 
 
 
        # test that pointer-diff relocs are preserved
        .text
-_test_diffs:
        .align 2
+_test_diffs:
 Llocal2:
        .long 0
        .long Llocal2-_test_branches
@@ -387,11 +677,14 @@ Llocal2:
        .long _test_branches - .
        .long _test_branches - . + 8
        .long _test_branches - . - 8
+       .long 0
+       .long 0
 #if __ppc64__
        .quad Llocal2-_test_branches
 #endif
 
 _foo: nop
+Lfoo: nop
 
        .align 2        
 _distance_from_foo:
@@ -409,6 +702,10 @@ _distance_to_here:
        .long   _foo - _distance_to_here
        .long   _foo - _distance_to_here - 4 
        .long   _foo - _distance_to_here - 12 
+       .long   Lfoo - _distance_to_here
+Ltohere:
+       .long   Lfoo - Ltohere
+       .long   Lfoo - Ltohere - 4
        .long   0
 
 
@@ -426,6 +723,10 @@ L1:        .quad _test_branches - _test_diffs
        .quad _test_branches - .
        .quad _test_branches - L1
        .quad L1 - _prev                        
+       .quad _prev+100 - _test_branches
+ #tests support for 32-bit absolute pointers
+       .long _prev
+       .long L1
 
 # the following generates: _foo cannot be undefined in a subtraction expression
 # but it should be ok (it will be a linker error if _foo and _bar are not in same linkage unit)
@@ -448,11 +749,21 @@ _b:
        .long   _test_calls+16
        .long   _external
        .long   _external+16
+       .long   _test_weak
+       .long   _test_weak+16
+       .long   Lother - . + 0x4000000
+Lother: 
+       .long    0
 #elif __ppc64__ || __x86_64__
        .quad   _test_calls
        .quad   _test_calls+16
        .quad   _external
        .quad   _external+16
+       .quad   _test_weak
+       .quad   _test_weak+16
+       .quad   Lother - . + 0x4000000
+Lother: 
+       .quad    0
 #endif
 
        # test that reloc sizes are the same