# RUN: ld64.lld -arch arm64 -r -print_atoms %s -o %t | FileCheck %s \
# RUN:  && ld64.lld -arch arm64 -r -print_atoms %t -o %t2 | FileCheck %s
#
# Test parsing and writing of arm64 text relocations.
#
# The first step tests if the supplied mach-o file is parsed into the correct
# set of references.  The second step verifies relocations can be round-tripped
# by writing to a new .o file, then parsing that file which should result in
# the same references.
#
#_test:


--- !mach-o
arch:            arm64
file-type:       MH_OBJECT
flags:           [  ]
has-UUID:        false
OS:              unknown
sections:
  - segment:         __TEXT
    section:         __text
    type:            S_REGULAR
    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
    address:         0x0000000000000000
    content:         [ 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94,
                       0x01, 0x00, 0x00, 0x90, 0x20, 0x00, 0x40, 0x39,
                       0x20, 0x00, 0x40, 0x79, 0x20, 0x00, 0x40, 0xB9,
                       0x20, 0x00, 0x40, 0xF9, 0x20, 0x00, 0xC0, 0x3D,
                       0x01, 0x00, 0x00, 0x90, 0x20, 0x00, 0x40, 0xB9,
                       0x01, 0x00, 0x00, 0x90, 0x20, 0x00, 0x40, 0xF9,
                       0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x40, 0xF9 ]
    relocations:
      - offset:          0x00000034
        type:            ARM64_RELOC_TLVP_LOAD_PAGEOFF12
        length:          2
        pc-rel:          false
        extern:          true
        symbol:          5
      - offset:          0x00000030
        type:            ARM64_RELOC_TLVP_LOAD_PAGE21
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          5
      - offset:          0x0000002C
        type:            ARM64_RELOC_GOT_LOAD_PAGEOFF12
        length:          2
        pc-rel:          false
        extern:          true
        symbol:          6
      - offset:          0x00000028
        type:            ARM64_RELOC_GOT_LOAD_PAGE21
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          6
      - offset:          0x00000024
        type:            ARM64_RELOC_ADDEND
        length:          2
        pc-rel:          false
        extern:          false
        symbol:          16
      - offset:          0x00000024
        type:            ARM64_RELOC_PAGEOFF12
        length:          2
        pc-rel:          false
        extern:          true
        symbol:          2
      - offset:          0x00000020
        type:            ARM64_RELOC_ADDEND
        length:          2
        pc-rel:          false
        extern:          false
        symbol:          16
      - offset:          0x00000020
        type:            ARM64_RELOC_PAGE21
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          2
      - offset:          0x0000001C
        type:            ARM64_RELOC_PAGEOFF12
        length:          2
        pc-rel:          false
        extern:          true
        symbol:          2
      - offset:          0x00000018
        type:            ARM64_RELOC_PAGEOFF12
        length:          2
        pc-rel:          false
        extern:          true
        symbol:          2
      - offset:          0x00000014
        type:            ARM64_RELOC_PAGEOFF12
        length:          2
        pc-rel:          false
        extern:          true
        symbol:          2
      - offset:          0x00000010
        type:            ARM64_RELOC_PAGEOFF12
        length:          2
        pc-rel:          false
        extern:          true
        symbol:          2
      - offset:          0x0000000C
        type:            ARM64_RELOC_PAGEOFF12
        length:          2
        pc-rel:          false
        extern:          true
        symbol:          2
      - offset:          0x00000008
        type:            ARM64_RELOC_PAGE21
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          2
      - offset:          0x00000004
        type:            ARM64_RELOC_ADDEND
        length:          2
        pc-rel:          false
        extern:          false
        symbol:          8
      - offset:          0x00000004
        type:            ARM64_RELOC_BRANCH26
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          4
      - offset:          0x00000000
        type:            ARM64_RELOC_BRANCH26
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          4
  - segment:         __DATA
    section:         __data
    type:            S_REGULAR
    attributes:      [  ]
    alignment:       2
    address:         0x0000000000000038
    content:         [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
local-symbols:
  - name:            ltmp0
    type:            N_SECT
    sect:            1
    value:           0x0000000000000000
  - name:            _func
    type:            N_SECT
    sect:            1
    value:           0x0000000000000000
  - name:            _v1
    type:            N_SECT
    sect:            2
    value:           0x0000000000000038
  - name:            ltmp1
    type:            N_SECT
    sect:            2
    value:           0x0000000000000038
undefined-symbols:
  - name:            _foo
    type:            N_UNDF
    scope:           [ N_EXT ]
    value:           0x0000000000000000
  - name:            _tlv
    type:            N_UNDF
    scope:           [ N_EXT ]
    value:           0x0000000000000000
  - name:            _v2
    type:            N_UNDF
    scope:           [ N_EXT ]
    value:           0x0000000000000000
...

# CHECK: defined-atoms:
# CHECK:   - name:            _v1
# CHECK:     type:            data
# CHECK:     content:         [ 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
# CHECK:                        00, 00, 00, 00 ]
# CHECK:   - name:            _func
# CHECK:     content:         [ 00, 00, 00, 94, 00, 00, 00, 94, 01, 00, 00, 90,
# CHECK:                        20, 00, 40, 39, 20, 00, 40, 79, 20, 00, 40, B9,
# CHECK:                        20, 00, 40, F9, 20, 00, C0, 3D, 01, 00, 00, 90,
# CHECK:                        20, 00, 40, B9, 01, 00, 00, 90, 20, 00, 40, F9,
# CHECK:                        00, 00, 00, 90, 00, 00, 40, F9 ]
# CHECK:     references:
# CHECK:       - kind:            branch26
# CHECK:         offset:          0
# CHECK:         target:          _foo
# CHECK:       - kind:            branch26
# CHECK:         offset:          4
# CHECK:         target:          _foo
# CHECK:         addend:          8
# CHECK:       - kind:            page21
# CHECK:         offset:          8
# CHECK:         target:          _v1
# CHECK:       - kind:            offset12
# CHECK:         offset:          12
# CHECK:         target:          _v1
# CHECK:       - kind:            offset12scale2
# CHECK:         offset:          16
# CHECK:         target:          _v1
# CHECK:       - kind:            offset12scale4
# CHECK:         offset:          20
# CHECK:         target:          _v1
# CHECK:       - kind:            offset12scale8
# CHECK:         offset:          24
# CHECK:         target:          _v1
# CHECK:       - kind:            offset12scale16
# CHECK:         offset:          28
# CHECK:         target:          _v1
# CHECK:       - kind:            page21
# CHECK:         offset:          32
# CHECK:         target:          _v1
# CHECK:         addend:          16
# CHECK:       - kind:            offset12scale4
# CHECK:         offset:          36
# CHECK:         target:          _v1
# CHECK:         addend:          16
# CHECK:       - kind:            gotPage21
# CHECK:         offset:          40
# CHECK:         target:          _v2
# CHECK:       - kind:            gotOffset12
# CHECK:         offset:          44
# CHECK:         target:          _v2
# CHECK:       - kind:            tlvPage21
# CHECK:         offset:          48
# CHECK:         target:          _tlv
# CHECK:       - kind:            tlvOffset12
# CHECK:         offset:          52
# CHECK:         target:          _tlv
# CHECK: undefined-atoms:
# CHECK:   - name:            _foo
# CHECK:   - name:            _tlv
# CHECK:   - name:            _v2

