| # RUN: ld64.lld -arch armv7 -r -print_atoms %s \ |
| # RUN: %p/Inputs/arm-interworking.yaml -o %t | FileCheck %s \ |
| # RUN: && ld64.lld -arch armv7 -dylib -print_atoms \ |
| # RUN: %p/Inputs/armv7/libSystem.yaml %t -o %t2 | FileCheck %s \ |
| # RUN: && llvm-readobj -s -sd %t2 | FileCheck -check-prefix=CODE %s |
| # |
| # Test thumb and arm branches round trip through -r. |
| # Test bl/blx instructions are fixed up properly. |
| # |
| # |
| |
| --- !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: [ 0xFF, 0xF7, 0xFE, 0xFF, 0xC0, 0x46, 0xFF, 0xF7, |
| 0xFC, 0xEF, 0xC0, 0x46, 0xFF, 0xF7, 0xF8, 0xEF, |
| 0xFF, 0xF7, 0xF6, 0xFF, 0xC0, 0x46, 0xFF, 0xF7, |
| 0xF3, 0xFF, 0xC0, 0x46, 0x00, 0xF0, 0x06, 0xE8, |
| 0xC0, 0x46, 0x00, 0xF0, 0x03, 0xF8, 0x00, 0xF0, |
| 0x02, 0xF8, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47 ] |
| relocations: |
| - offset: 0x00000026 |
| type: ARM_THUMB_RELOC_BR22 |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 1 |
| - offset: 0x00000022 |
| type: ARM_THUMB_RELOC_BR22 |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 1 |
| - offset: 0x0000001C |
| type: ARM_THUMB_RELOC_BR22 |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 1 |
| - offset: 0x00000016 |
| type: ARM_THUMB_RELOC_BR22 |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 1 |
| - offset: 0x00000010 |
| type: ARM_THUMB_RELOC_BR22 |
| length: 2 |
| pc-rel: true |
| extern: false |
| symbol: 1 |
| - offset: 0x0000000C |
| type: ARM_THUMB_RELOC_BR22 |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 5 |
| - offset: 0x00000006 |
| type: ARM_THUMB_RELOC_BR22 |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 5 |
| - offset: 0x00000000 |
| type: ARM_THUMB_RELOC_BR22 |
| length: 2 |
| pc-rel: true |
| extern: true |
| symbol: 4 |
| - segment: __DATA |
| section: __data |
| type: S_REGULAR |
| attributes: [ ] |
| address: 0x0000000000000030 |
| content: [ 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] |
| relocations: |
| - offset: 0x00000004 |
| type: ARM_RELOC_VANILLA |
| length: 2 |
| pc-rel: false |
| extern: true |
| symbol: 4 |
| - offset: 0x00000000 |
| type: ARM_RELOC_VANILLA |
| length: 2 |
| pc-rel: false |
| extern: false |
| symbol: 1 |
| local-symbols: |
| - name: _t3 |
| type: N_SECT |
| sect: 1 |
| desc: [ N_ARM_THUMB_DEF ] |
| value: 0x000000000000002E |
| - name: _d1 |
| type: N_SECT |
| sect: 2 |
| value: 0x0000000000000030 |
| global-symbols: |
| - name: _t1 |
| type: N_SECT |
| scope: [ N_EXT ] |
| sect: 1 |
| desc: [ N_ARM_THUMB_DEF ] |
| value: 0x0000000000000000 |
| - name: _t2 |
| type: N_SECT |
| scope: [ N_EXT ] |
| sect: 1 |
| desc: [ N_ARM_THUMB_DEF ] |
| value: 0x000000000000002C |
| undefined-symbols: |
| - name: _a1 |
| type: N_UNDF |
| scope: [ N_EXT ] |
| value: 0x0000000000000000 |
| - name: _a2 |
| type: N_UNDF |
| scope: [ N_EXT ] |
| value: 0x0000000000000000 |
| |
| ... |
| |
| |
| # CHECK: defined-atoms: |
| # CHECK: - name: _d1 |
| # CHECK: type: data |
| # CHECK: references: |
| # CHECK: - kind: pointer32 |
| # CHECK: offset: 0 |
| # CHECK: target: _t2 |
| # CHECK: - kind: pointer32 |
| # CHECK: offset: 4 |
| # CHECK: target: _a1 |
| # CHECK: - name: _d2 |
| # CHECK: type: data |
| # CHECK: references: |
| # CHECK: - kind: pointer32 |
| # CHECK: offset: 0 |
| # CHECK: target: _t1 |
| # CHECK: - kind: pointer32 |
| # CHECK: offset: 4 |
| # CHECK: target: _a1 |
| # CHECK: - name: _t1 |
| # CHECK: scope: global |
| # CHECK: references: |
| # CHECK: - kind: modeThumbCode |
| # CHECK: offset: 0 |
| # CHECK: target: _t1 |
| # CHECK: - kind: thumb_bl22 |
| # CHECK: offset: 0 |
| # CHECK: target: _a1 |
| # CHECK: - kind: thumb_bl22 |
| # CHECK: offset: 6 |
| # CHECK: target: _a2 |
| # CHECK: - kind: thumb_bl22 |
| # CHECK: offset: 12 |
| # CHECK: target: _a2 |
| # CHECK: - kind: thumb_bl22 |
| # CHECK: offset: 16 |
| # CHECK: target: _t1 |
| # CHECK: - kind: thumb_bl22 |
| # CHECK: offset: 22 |
| # CHECK: target: _t1 |
| # CHECK: - kind: thumb_bl22 |
| # CHECK: offset: 28 |
| # CHECK: target: _t2 |
| # CHECK: - kind: thumb_bl22 |
| # CHECK: offset: 34 |
| # CHECK: target: _t2 |
| # CHECK: - kind: thumb_bl22 |
| # CHECK: offset: 38 |
| # CHECK: target: _t3 |
| # CHECK: - name: _t2 |
| # CHECK: scope: global |
| # CHECK: content: [ 70, 47 ] |
| # CHECK: references: |
| # CHECK: - kind: modeThumbCode |
| # CHECK: offset: 0 |
| # CHECK: target: _t2 |
| # CHECK: - name: _t3 |
| # CHECK: content: [ 70, 47 ] |
| # CHECK: references: |
| # CHECK: - kind: modeThumbCode |
| # CHECK: offset: 0 |
| # CHECK: target: _t3 |
| # CHECK: - name: _a1 |
| # CHECK: scope: global |
| # CHECK: references: |
| # CHECK: - kind: arm_bl24 |
| # CHECK: offset: 0 |
| # CHECK: target: _a1 |
| # CHECK: - kind: arm_bl24 |
| # CHECK: offset: 4 |
| # CHECK: target: _a2 |
| # CHECK: - kind: arm_bl24 |
| # CHECK: offset: 8 |
| # CHECK: target: _t1 |
| # CHECK: - kind: arm_bl24 |
| # CHECK: offset: 12 |
| # CHECK: target: _t2 |
| # CHECK: - name: _a2 |
| # CHECK: scope: global |
| |
| # CODE: Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00) |
| # CODE: Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00) |
| # CODE: SectionData ( |
| # CODE: 0000: 00F016E8 C04600F0 1EE8C046 00F01AE8 |
| # CODE: 0010: FFF7F6FF C046FFF7 F3FFC046 00F006F8 |
| # CODE: 0020: C04600F0 03F800F0 02F87047 70477047 |
| # CODE: 0030: FEFFFFEB 020000EB F0FFFFFA FAFFFFFA |
| # CODE: 0040: 1EFF2FE1 1EFF2FE1 |
| # CODE: ) |
| |
| # CODE: Name: __data (5F 5F 64 61 74 61 00 00 00 00 00 00 00 00 00 00) |
| # CODE: Segment: __DATA (5F 5F 44 41 54 41 00 00 00 00 00 00 00 00 00 00) |
| # CODE: SectionData ( |
| # CODE: 0000: E50F0000 E80F0000 B90F0000 E80F0000 |
| # CODE: ) |
| |
| # When we get a good mach-o disassembler the above __text section content check can be change to be symbolic. |
| # Verify the low (thumb) bit is set on the first and third pointers but not the second and fourth. |
| |
| |
| |
| # Input file one: |
| # |
| # .align 2 |
| # .code 16 |
| # .globl _t1 |
| # .thumb_func _t1 |
| #_t1: |
| # bl _a1 |
| # nop |
| # blx _a2 |
| # nop |
| # blx _a2 |
| # bl _t1 |
| # nop |
| # bl _t1 |
| # nop |
| # blx _t2 |
| # nop |
| # blx _t2 |
| # bx lr |
| # |
| # .globl _t2 |
| # .thumb_func _t2 |
| #_t2: |
| # bx lr |
| # |
| # .data |
| #_d1: .long _t2 |
| # .long _a1 |
| |
| |
| |
| # Input file two: |
| # |
| # .align 2 |
| # .code 32 |
| # .globl _a1 |
| #_a1: |
| # bl _a1 |
| # blx _a2 |
| # bl _t1 |
| # blx _t2 |
| # bx lr |
| # |
| # .globl _a2 |
| #_a2: |
| # bx lr |
| # |
| # .data |
| #_d2: .long _t1 |
| # .long _a1 |
| |
| |
| |
| |