| # REQUIRES: arm |
| # RUN: ld64.lld -arch armv7 -r -print_atoms %s -o %t | FileCheck %s |
| # RUN: ld64.lld -arch armv7 -dylib -print_atoms %t -o %t2 \ |
| # RUN: %p/Inputs/armv7/libSystem.yaml -sectalign __TEXT __text 0x1000 | FileCheck %s |
| # RUN: llvm-objdump -d -macho -no-symbolic-operands %t2 | FileCheck -check-prefix=CODE %s |
| # |
| # Test thumb and arm branches round trip through -r. |
| # Test movw/movt pairs have low bit set properly for thumb vs arm. |
| # |
| # |
| |
| --- !mach-o |
| arch: armv7 |
| file-type: MH_OBJECT |
| flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ] |
| sections: |
| - segment: __TEXT |
| section: __text |
| type: S_REGULAR |
| attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ] |
| alignment: 2 |
| address: 0x0000000000000000 |
| content: [ 0x40, 0xF2, 0x25, 0x00, 0xC0, 0xF2, 0x00, 0x00, |
| 0x40, 0xF2, 0x01, 0x01, 0xC0, 0xF2, 0x00, 0x01, |
| 0x40, 0xF2, 0x4E, 0x02, 0xC0, 0xF2, 0x00, 0x02, |
| 0x40, 0xF2, 0x2A, 0x03, 0xC0, 0xF2, 0x00, 0x03, |
| 0x78, 0x44, 0x70, 0x47, 0x70, 0x47, 0x25, 0x00, |
| 0x00, 0xE3, 0x00, 0x00, 0x40, 0xE3, 0xD7, 0x1F, |
| 0x0F, 0xE3, 0xFF, 0x1F, 0x4F, 0xE3, 0x4E, 0x20, |
| 0x00, 0xE3, 0x00, 0x20, 0x40, 0xE3, 0x00, 0x30, |
| 0x00, 0xE3, 0x00, 0x30, 0x40, 0xE3, 0x0F, 0x00, |
| 0x80, 0xE0, 0x1E, 0xFF, 0x2F, 0xE1, 0x1E, 0xFF, |
| 0x2F, 0xE1 ] |
| relocations: |
| - offset: 0x00000042 |
| scattered: true |
| type: ARM_RELOC_HALF_SECTDIFF |
| length: 1 |
| pc-rel: false |
| value: 0x0000004E |
| - offset: 0x00000000 |
| scattered: true |
| type: ARM_RELOC_PAIR |
| length: 1 |
| pc-rel: false |
| value: 0x00000046 |
| - offset: 0x0000003E |
| scattered: true |
| type: ARM_RELOC_HALF_SECTDIFF |
| length: 0 |
| pc-rel: false |
| value: 0x0000004E |
| - offset: 0x00000000 |
| scattered: true |
| type: ARM_RELOC_PAIR |
| length: 0 |
| pc-rel: false |
| value: 0x00000046 |
| - offset: 0x0000003A |
| type: ARM_RELOC_HALF |
| length: 1 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| - offset: 0x0000004E |
| type: ARM_RELOC_PAIR |
| length: 1 |
| pc-rel: false |
| extern: false |
| symbol: 16777215 |
| - offset: 0x00000036 |
| type: ARM_RELOC_HALF |
| length: 0 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| - offset: 0x00000000 |
| type: ARM_RELOC_PAIR |
| length: 0 |
| pc-rel: false |
| extern: false |
| symbol: 16777215 |
| - offset: 0x00000032 |
| scattered: true |
| type: ARM_RELOC_HALF_SECTDIFF |
| length: 1 |
| pc-rel: false |
| value: 0x00000024 |
| - offset: 0x0000FFD6 |
| scattered: true |
| type: ARM_RELOC_PAIR |
| length: 1 |
| pc-rel: false |
| value: 0x00000046 |
| - offset: 0x0000002E |
| scattered: true |
| type: ARM_RELOC_HALF_SECTDIFF |
| length: 0 |
| pc-rel: false |
| value: 0x00000024 |
| - offset: 0x0000FFFF |
| scattered: true |
| type: ARM_RELOC_PAIR |
| length: 0 |
| pc-rel: false |
| value: 0x00000046 |
| - offset: 0x0000002A |
| type: ARM_RELOC_HALF |
| length: 1 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| - offset: 0x00000025 |
| type: ARM_RELOC_PAIR |
| length: 1 |
| pc-rel: false |
| extern: false |
| symbol: 16777215 |
| - offset: 0x00000026 |
| type: ARM_RELOC_HALF |
| length: 0 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| - offset: 0x00000000 |
| type: ARM_RELOC_PAIR |
| length: 0 |
| pc-rel: false |
| extern: false |
| symbol: 16777215 |
| - offset: 0x0000001C |
| scattered: true |
| type: ARM_RELOC_HALF_SECTDIFF |
| length: 3 |
| pc-rel: false |
| value: 0x0000004E |
| - offset: 0x0000002A |
| scattered: true |
| type: ARM_RELOC_PAIR |
| length: 3 |
| pc-rel: false |
| value: 0x00000020 |
| - offset: 0x00000018 |
| scattered: true |
| type: ARM_RELOC_HALF_SECTDIFF |
| length: 2 |
| pc-rel: false |
| value: 0x0000004E |
| - offset: 0x00000000 |
| scattered: true |
| type: ARM_RELOC_PAIR |
| length: 2 |
| pc-rel: false |
| value: 0x00000020 |
| - offset: 0x00000014 |
| type: ARM_RELOC_HALF |
| length: 3 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| - offset: 0x0000004E |
| type: ARM_RELOC_PAIR |
| length: 3 |
| pc-rel: false |
| extern: false |
| symbol: 16777215 |
| - offset: 0x00000010 |
| type: ARM_RELOC_HALF |
| length: 2 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| - offset: 0x00000000 |
| type: ARM_RELOC_PAIR |
| length: 2 |
| pc-rel: false |
| extern: false |
| symbol: 16777215 |
| - offset: 0x0000000C |
| scattered: true |
| type: ARM_RELOC_HALF_SECTDIFF |
| length: 3 |
| pc-rel: false |
| value: 0x00000024 |
| - offset: 0x00000000 |
| scattered: true |
| type: ARM_RELOC_PAIR |
| length: 3 |
| pc-rel: false |
| value: 0x00000020 |
| - offset: 0x00000008 |
| scattered: true |
| type: ARM_RELOC_HALF_SECTDIFF |
| length: 2 |
| pc-rel: false |
| value: 0x00000024 |
| - offset: 0x00000000 |
| scattered: true |
| type: ARM_RELOC_PAIR |
| length: 2 |
| pc-rel: false |
| value: 0x00000020 |
| - offset: 0x00000004 |
| type: ARM_RELOC_HALF |
| length: 3 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| - offset: 0x00000025 |
| type: ARM_RELOC_PAIR |
| length: 3 |
| pc-rel: false |
| extern: false |
| symbol: 16777215 |
| - offset: 0x00000000 |
| type: ARM_RELOC_HALF |
| length: 2 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| - offset: 0x00000000 |
| type: ARM_RELOC_PAIR |
| length: 2 |
| pc-rel: false |
| extern: false |
| symbol: 16777215 |
| local-symbols: |
| - name: _t1 |
| type: N_SECT |
| sect: 1 |
| desc: [ N_ARM_THUMB_DEF ] |
| value: 0x0000000000000000 |
| - name: _t2 |
| type: N_SECT |
| sect: 1 |
| desc: [ N_ARM_THUMB_DEF ] |
| value: 0x0000000000000024 |
| - name: _a2 |
| type: N_SECT |
| sect: 1 |
| value: 0x000000000000004E |
| - name: _a1 |
| type: N_SECT |
| sect: 1 |
| value: 0x0000000000000026 |
| ... |
| |
| # CHECK: defined-atoms: |
| # CHECK: - name: _t1 |
| # CHECK: references: |
| # CHECK: - kind: modeThumbCode |
| # CHECK: offset: 0 |
| # CHECK: target: _t1 |
| # CHECK: - kind: thumb_movw |
| # CHECK: offset: 0 |
| # CHECK: target: _t2 |
| # CHECK-NOT: addend: |
| # CHECK: - kind: thumb_movt |
| # CHECK: offset: 4 |
| # CHECK: target: _t2 |
| # CHECK-NOT: addend: |
| # CHECK: - kind: thumb_movw_funcRel |
| # CHECK: offset: 8 |
| # CHECK: target: _t2 |
| # CHECK: addend: -36 |
| # CHECK: - kind: thumb_movt_funcRel |
| # CHECK: offset: 12 |
| # CHECK: target: _t2 |
| # CHECK: addend: -36 |
| # CHECK: - kind: thumb_movw |
| # CHECK: offset: 16 |
| # CHECK: target: _a2 |
| # CHECK-NOT: addend: |
| # CHECK: - kind: thumb_movt |
| # CHECK: offset: 20 |
| # CHECK: target: _a2 |
| # CHECK-NOT: addend: |
| # CHECK: - kind: thumb_movw_funcRel |
| # CHECK: offset: 24 |
| # CHECK: target: _a2 |
| # CHECK: addend: -36 |
| # CHECK: - kind: thumb_movt_funcRel |
| # CHECK: offset: 28 |
| # CHECK: target: _a2 |
| # CHECK: addend: -36 |
| # CHECK: - name: _t2 |
| # CHECK: references: |
| # CHECK: - kind: modeThumbCode |
| # CHECK: offset: 0 |
| # CHECK: target: _t2 |
| # CHECK: - name: _a1 |
| # CHECK: references: |
| # CHECK: - kind: arm_movw |
| # CHECK: offset: 0 |
| # CHECK: target: _t2 |
| # CHECK-NOT: addend: |
| # CHECK: - kind: arm_movt |
| # CHECK: offset: 4 |
| # CHECK: target: _t2 |
| # CHECK-NOT: addend: |
| # CHECK: - kind: arm_movw_funcRel |
| # CHECK: offset: 8 |
| # CHECK: target: _t2 |
| # CHECK: addend: -40 |
| # CHECK: - kind: arm_movt_funcRel |
| # CHECK: offset: 12 |
| # CHECK: target: _t2 |
| # CHECK: addend: -40 |
| # CHECK: - kind: arm_movw |
| # CHECK: offset: 16 |
| # CHECK: target: _a2 |
| # CHECK-NOT: addend: |
| # CHECK: - kind: arm_movt |
| # CHECK: offset: 20 |
| # CHECK: target: _a2 |
| # CHECK-NOT: addend: |
| # CHECK: - kind: arm_movw_funcRel |
| # CHECK: offset: 24 |
| # CHECK: target: _a2 |
| # CHECK: addend: -40 |
| # CHECK: - kind: arm_movt_funcRel |
| # CHECK: offset: 28 |
| # CHECK: target: _a2 |
| # CHECK: addend: -40 |
| # CHECK: - name: _a2 |
| |
| |
| # CODE: _t1: |
| # CODE-NEXT: movw r0, #4133 |
| # CODE-NEXT: movt r0, #0 |
| # CODE-NEXT: movw r1, #1 |
| # CODE-NEXT: movt r1, #0 |
| # CODE-NEXT: movw r2, #4174 |
| # CODE-NEXT: movt r2, #0 |
| # CODE-NEXT: movw r3, #42 |
| # CODE-NEXT: movt r3, #0 |
| |
| |
| # CODE: _a1: |
| # CODE-NEXT: movw r0, #4133 |
| # CODE-NEXT: movt r0, #0 |
| # CODE-NEXT: movw r1, #65495 |
| # CODE-NEXT: movt r1, #65535 |
| # CODE-NEXT: movw r2, #4174 |
| # CODE-NEXT: movt r2, #0 |
| # CODE-NEXT: movw r3, #0 |
| # CODE-NEXT: movt r3, #0 |
| |
| |
| |
| # .syntax unified |
| # .align 2 |
| # |
| # .code 16 |
| # .thumb_func _t1 |
| #_t1: |
| # movw r0, :lower16:(_t2) |
| # movt r0, :upper16:(_t2) |
| # movw r1, :lower16:(_t2-(L0+4)) |
| # movt r1, :upper16:(_t2-(L0+4)) |
| # movw r2, :lower16:(_a2) |
| # movt r2, :upper16:(_a2) |
| # movw r3, :lower16:(_a2-(L0+4)) |
| # movt r3, :upper16:(_a2-(L0+4)) |
| #L0: |
| # add r0, pc |
| # bx lr |
| # |
| # |
| # .code 16 |
| # .thumb_func _t2 |
| #_t2: |
| # bx lr |
| # |
| # |
| # |
| # .code 32 |
| #_a1: |
| # movw r0, :lower16:(_t2) |
| # movt r0, :upper16:(_t2) |
| # movw r1, :lower16:(_t2-(L1+8)) |
| # movt r1, :upper16:(_t2-(L1+8)) |
| # movw r2, :lower16:(_a2) |
| # movt r2, :upper16:(_a2) |
| # movw r3, :lower16:(_a2-(L1+8)) |
| # movt r3, :upper16:(_a2-(L1+8)) |
| #L1: |
| # add r0, pc |
| # bx lr |
| # |
| #_a2: |
| # bx lr |
| |