# RUN: ld64.lld -arch x86_64 -r -print_atoms %s -o %t | FileCheck %s \
# RUN:  && ld64.lld -arch x86_64 -r -print_atoms %t -o %t2 | FileCheck %s
#
# Test parsing and writing of x86_64 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:
#  call  _foo
#  call  _foo+4
#  movq  _foo@GOTPCREL(%rip), %rax
#  pushq _foo@GOTPCREL(%rip)
#  movl  _foo(%rip), %eax
#  movl  _foo+4(%rip), %eax
#  movb  $0x12, _foo(%rip)
#  movw  $0x1234, _foo(%rip)
#  movl  $0x12345678, _foo(%rip)
#  movl  L2(%rip), %eax
#  movb  $0x12, L2(%rip)
#  movw  $0x1234, L2(%rip)
#  movl  $0x12345678, L2(%rip)
#
#  .data
#L2: .long 0


--- !mach-o
arch:            x86_64
file-type:       MH_OBJECT
flags:           [  ]
sections:
  - segment:         __TEXT
    section:         __text
    type:            S_REGULAR
    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
    address:         0x0000000000000000
    content:         [ 0xE8, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x04, 0x00,
                       0x00, 0x00, 0x48, 0x8B, 0x05, 0x04, 0x00, 0x00,
                       0x00, 0xFF, 0x35, 0x04, 0x00, 0x00, 0x00, 0x8B,
                       0x05, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x05, 0x04,
                       0x00, 0x00, 0x00, 0xC6, 0x05, 0xFF, 0xFF, 0xFF,
                       0xFF, 0x12, 0x66, 0xC7, 0x05, 0xFE, 0xFF, 0xFF,
                       0xFF, 0x34, 0x12, 0xC7, 0x05, 0xFC, 0xFF, 0xFF,
                       0xFF, 0x78, 0x56, 0x34, 0x12, 0x8B, 0x05, 0x1A,
                       0x00, 0x00, 0x00, 0xc6, 0x05, 0x13, 0x00, 0x00,
		       0x00, 0x12, 0x66, 0xc7, 0x05, 0x0a, 0x00, 0x00,
		       0x00, 0x34, 0x12, 0xc7, 0x05, 0x00, 0x00, 0x00,
		       0x00, 0x78, 0x56, 0x34, 0x12 ]
    relocations:
      - offset:          0x00000055
        type:            X86_64_RELOC_SIGNED_4
        length:          2
        pc-rel:          true
        extern:          false
        symbol:          2
      - offset:          0x0000004d
        type:            X86_64_RELOC_SIGNED_2
        length:          2
        pc-rel:          true
        extern:          false
        symbol:          2
      - offset:          0x00000045
        type:            X86_64_RELOC_SIGNED_1
        length:          2
        pc-rel:          true
        extern:          false
        symbol:          2
      - offset:          0x0000003F
        type:            X86_64_RELOC_SIGNED
        length:          2
        pc-rel:          true
        extern:          false
        symbol:          2
      - offset:          0x00000035
        type:            X86_64_RELOC_SIGNED_4
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
      - offset:          0x0000002D
        type:            X86_64_RELOC_SIGNED_2
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
      - offset:          0x00000025
        type:            X86_64_RELOC_SIGNED_1
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
      - offset:          0x0000001F
        type:            X86_64_RELOC_SIGNED
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
      - offset:          0x00000019
        type:            X86_64_RELOC_SIGNED
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
      - offset:          0x00000013
        type:            X86_64_RELOC_GOT
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
      - offset:          0x0000000D
        type:            X86_64_RELOC_GOT_LOAD
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
      - offset:          0x00000006
        type:            X86_64_RELOC_BRANCH
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
      - offset:          0x00000001
        type:            X86_64_RELOC_BRANCH
        length:          2
        pc-rel:          true
        extern:          true
        symbol:          1
  - segment:         __DATA
    section:         __data
    type:            S_REGULAR
    attributes:      [  ]
    address:         0x000000000000005D
    content:         [ 0x00, 0x00, 0x00, 0x00 ]
local-symbols:
  - name:            _test
    type:            N_SECT
    sect:            1
    value:           0x0000000000000000
undefined-symbols:
  - name:            _foo
    type:            N_UNDF
    scope:           [ N_EXT ]
    value:           0x0000000000000000
...

# CHECK: defined-atoms:
# CHECK:   - ref-name:        [[LABEL:L[0-9]+]]
# CHECK:     type:            data
# CHECK:     content:         [ 00, 00, 00, 00 ]
# CHECK:  - name:            _test
# CHECK:    references:
# CHECK:      - kind:            branch32
# CHECK:        offset:          1
# CHECK:        target:          _foo
# CHECK:      - kind:            branch32
# CHECK:        offset:          6
# CHECK:        target:          _foo
# CHECK:        addend:          4
# CHECK:      - kind:            ripRel32GotLoad
# CHECK:        offset:          13
# CHECK:        target:          _foo
# CHECK:        addend:          4
# CHECK:      - kind:            ripRel32Got
# CHECK:        offset:          19
# CHECK:        target:          _foo
# CHECK:        addend:          4
# CHECK:      - kind:            ripRel32
# CHECK:        offset:          25
# CHECK:        target:          _foo
# CHECK:      - kind:            ripRel32
# CHECK:        offset:          31
# CHECK:        target:          _foo
# CHECK:        addend:          4
# CHECK:      - kind:            ripRel32Minus1
# CHECK:        offset:          37
# CHECK:        target:          _foo
# CHECK-NOT:    addend:
# CHECK:      - kind:            ripRel32Minus2
# CHECK:        offset:          45
# CHECK:        target:          _foo
# CHECK-NOT:    addend:
# CHECK:      - kind:            ripRel32Minus4
# CHECK:        offset:          53
# CHECK:        target:          _foo
# CHECK-NOT:    addend:
# CHECK:      - kind:            ripRel32Anon
# CHECK:        offset:          63
# CHECK:        target:          [[LABEL]]
# CHECK-NOT:    addend:
# CHECK:      - kind:            ripRel32Minus1Anon
# CHECK:        offset:          69
# CHECK:        target:          [[LABEL]]
# CHECK-NOT:    addend:
# CHECK:      - kind:            ripRel32Minus2Anon
# CHECK:        offset:          77
# CHECK:        target:          [[LABEL]]
# CHECK-NOT:    addend:
# CHECK:      - kind:            ripRel32Minus4Anon
# CHECK:        offset:          85
# CHECK:        target:          [[LABEL]]
# CHECK-NOT:    addend:
