# 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 --section-data %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