# 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




