llvm/lld/test/COFF/arm64ec-codemap.test

REQUIRES: aarch64, x86
RUN: split-file %s %t.dir && cd %t.dir

RUN: llvm-mc -filetype=obj -triple=arm64-windows arm64-func-sym.s -o arm64-func-sym.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func-sym.s -o arm64ec-func-sym.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func-sym2.s -o arm64ec-func-sym2.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows data-sec.s -o data-sec.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows data-sec2.s -o data-sec2.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows empty-sec.s -o arm64ec-empty-sec.obj
RUN: llvm-mc -filetype=obj -triple=x86_64-windows x86_64-func-sym.s -o x86_64-func-sym.obj
RUN: llvm-mc -filetype=obj -triple=x86_64-windows empty-sec.s -o x86_64-empty-sec.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj

Link ARM64EC DLL and verify that the code is arranged as expected.

RUN: lld-link -out:test.dll -machine:arm64ec arm64ec-func-sym.obj x86_64-func-sym.obj \
RUN:          loadconfig-arm64ec.obj -dll -noentry

RUN: llvm-readobj --coff-load-config test.dll | FileCheck -check-prefix=CODEMAP %s
CODEMAP:       CodeMap [
CODEMAP-NEXT:    0x1000 - 0x1008  ARM64EC
CODEMAP-NEXT:    0x2000 - 0x2006  X64
CODEMAP-NEXT:    0x5000 - 0x5008  ARM64EC
CODEMAP-NEXT:    0x6000 - 0x6006  X64
CODEMAP-NEXT:  ]

RUN: llvm-objdump -d test.dll | FileCheck -check-prefix=DISASM %s
DISASM:      Disassembly of section .text:
DISASM-EMPTY:
DISASM-NEXT: 0000000180001000 <.text>:
DISASM-NEXT: 180001000: 52800040     mov     w0, #0x2
DISASM-NEXT: 180001004: d65f03c0     ret
DISASM-NEXT:                 ...
DISASM-NEXT: 180002000: b8 03 00 00 00               movl    $0x3, %eax
DISASM-NEXT: 180002005: c3                           retq
DISASM-EMPTY:
DISASM-NEXT: Disassembly of section test:
DISASM-EMPTY:
DISASM-NEXT: 0000000180005000 <test>:
DISASM-NEXT: 180005000: 528000a0     mov     w0, #0x5
DISASM-NEXT: 180005004: d65f03c0     ret
DISASM-NEXT:                 ...
DISASM-NEXT: 180006000: b8 06 00 00 00               movl    $0x6, %eax
DISASM-NEXT: 180006005: c3                           retq

Order of arguments doesn't matter in this case, chunks are sorted by target type anyway.

RUN: lld-link -out:test2.dll -machine:arm64ec x86_64-func-sym.obj arm64ec-func-sym.obj \
RUN:          loadconfig-arm64ec.obj -dll -noentry
RUN: llvm-readobj --coff-load-config test2.dll | FileCheck -check-prefix=CODEMAP %s
RUN: llvm-objdump -d test2.dll | FileCheck -check-prefix=DISASM %s

RUN: lld-link -out:testx.dll -machine:arm64x arm64-func-sym.obj arm64ec-func-sym.obj \
RUN:          x86_64-func-sym.obj loadconfig-arm64ec.obj -dll -noentry

Adding empty chunks does not affect code map ranges.

RUN: lld-link -out:test3.dll -machine:arm64ec x86_64-empty-sec.obj arm64ec-empty-sec.obj \
RUN:          arm64ec-func-sym.obj  x86_64-func-sym.obj loadconfig-arm64ec.obj -dll -noentry
RUN: llvm-readobj --coff-load-config test3.dll | FileCheck -check-prefix=CODEMAP %s

Do the same with ARM64X target.

RUN: llvm-readobj --coff-load-config testx.dll | FileCheck -check-prefix=CODEMAPX %s
CODEMAPX:       CodeMap [
CODEMAPX-NEXT:    0x1000 - 0x1008  ARM64
CODEMAPX-NEXT:    0x2000 - 0x2008  ARM64EC
CODEMAPX-NEXT:    0x3000 - 0x3006  X64
CODEMAPX-NEXT:    0x6000 - 0x6008  ARM64EC
CODEMAPX-NEXT:    0x7000 - 0x7006  X64
CODEMAPX-NEXT:  ]

RUN: llvm-objdump -d testx.dll | FileCheck -check-prefix=DISASMX %s
DISASMX:      Disassembly of section .text:
DISASMX-EMPTY:
DISASMX-NEXT: 0000000180001000 <.text>:
DISASMX-NEXT: 180001000: 528000e0     mov     w0, #0x7
DISASMX-NEXT: 180001004: d65f03c0     ret
DISASMX-NEXT:                 ...
DISASMX-NEXT: 180002000: 52800040     mov     w0, #0x2
DISASMX-NEXT: 180002004: d65f03c0     ret
DISASMX-NEXT:                 ...
DISASMX-NEXT: 180003000: b8 03 00 00 00               movl    $0x3, %eax
DISASMX-NEXT: 180003005: c3                           retq
DISASMX-EMPTY:
DISASMX-NEXT: Disassembly of section test:
DISASMX-EMPTY:
DISASMX-NEXT: 0000000180006000 <test>:
DISASMX-NEXT: 180006000: 528000a0     mov     w0, #0x5
DISASMX-NEXT: 180006004: d65f03c0     ret
DISASMX-NEXT:                 ...
DISASMX-NEXT: 180007000: b8 06 00 00 00               movl    $0x6, %eax
DISASMX-NEXT: 180007005: c3                           retq

Test merged sections.

RUN: lld-link -out:testm.dll -machine:arm64ec arm64ec-func-sym.obj x86_64-func-sym.obj \
RUN:          loadconfig-arm64ec.obj -dll -noentry -merge:test=.text

RUN: llvm-readobj --coff-load-config testm.dll | FileCheck -check-prefix=CODEMAPM %s
CODEMAPM:      CodeMap [
CODEMAPM-NEXT:   0x1000 - 0x1010  ARM64EC
CODEMAPM-NEXT:   0x2000 - 0x200E  X64
CODEMAPM-NEXT: ]

RUN: llvm-objdump -d testm.dll | FileCheck -check-prefix=DISASMM %s
DISASMM:      Disassembly of section .text:
DISASMM-EMPTY:
DISASMM-NEXT: 0000000180001000 <.text>:
DISASMM-NEXT: 180001000: 52800040     mov     w0, #0x2
DISASMM-NEXT: 180001004: d65f03c0     ret
DISASMM-NEXT: 180001008: 528000a0     mov     w0, #0x5
DISASMM-NEXT: 18000100c: d65f03c0     ret
DISASMM-NEXT:                 ...
DISASMM-NEXT: 180002000: b8 03 00 00 00               movl    $0x3, %eax
DISASMM-NEXT: 180002005: c3                           retq
DISASMM-NEXT: 180002006: 00 00                        addb    %al, (%rax)
DISASMM-NEXT: 180002008: b8 06 00 00 00               movl    $0x6, %eax
DISASMM-NEXT: 18000200d: c3                           retq

Merging data sections into code sections causes data to be separated from the code when sorting chunks.

RUN: lld-link -out:testdm.dll -machine:arm64ec arm64ec-func-sym.obj x86_64-func-sym.obj data-sec.obj \
RUN:          data-sec2.obj loadconfig-arm64ec.obj -dll -noentry -merge:.testdata=.text -merge:.rdata=test

RUN: llvm-readobj --coff-load-config testdm.dll | FileCheck -check-prefix=CODEMAPDM %s
CODEMAPDM:      CodeMap [
CODEMAPDM-NEXT:     0x2000 - 0x2008  ARM64EC
CODEMAPDM-NEXT:     0x3000 - 0x3006  X64
CODEMAPDM-NEXT:     0x6000 - 0x6008  ARM64EC
CODEMAPDM-NEXT:     0x7000 - 0x7006  X64
CODEMAPDM-NEXT: ]

RUN: llvm-objdump -d testdm.dll | FileCheck -check-prefix=DISASMDM %s
DISASMDM:      Disassembly of section .text:
DISASMDM-EMPTY:
DISASMDM-NEXT: 0000000180001000 <.text>:
DISASMDM-NEXT: 180001000: 00000001     udf     #0x1
DISASMDM-NEXT: 180001004: 00000000     udf     #0x0
DISASMDM-NEXT: 180001008: 00000002     udf     #0x2
DISASMDM-NEXT:                 ...
DISASMDM-NEXT: 180002000: 52800040     mov     w0, #0x2
DISASMDM-NEXT: 180002004: d65f03c0     ret
DISASMDM-NEXT:                 ...
DISASMDM-NEXT: 180003000: b8 03 00 00 00               movl    $0x3, %eax
DISASMDM-NEXT: 180003005: c3                           retq
DISASMDM-EMPTY:
DISASMDM-NEXT: Disassembly of section test:
DISASMDM-EMPTY:
DISASMDM-NEXT: 0000000180005000 <test>:
DISASMDM:      180006000: 528000a0     mov     w0, #0x5
DISASMDM-NEXT: 180006004: d65f03c0     ret
DISASMDM-NEXT:                 ...
DISASMDM-NEXT: 180007000: b8 06 00 00 00               movl    $0x6, %eax
DISASMDM-NEXT: 180007005: c3                           retq

Merging a code section into data section produces a valid code map.

RUN: lld-link -out:testcm.dll -machine:arm64ec x86_64-func-sym.obj data-sec.obj \
RUN:          loadconfig-arm64ec.obj -dll -noentry -merge:test=.testdata -merge:.text=.testdata

RUN: llvm-readobj --coff-load-config testcm.dll | FileCheck -check-prefix=CODEMAPCM %s
CODEMAPCM:      CodeMap [
CODEMAPCM-NEXT:     0x3008 - 0x3016  X64
CODEMAPCM-NEXT: ]

RUN: llvm-objdump -d testcm.dll | FileCheck -check-prefix=DISASMCM %s
DISASMCM:      Disassembly of section .testdat:
DISASMCM-EMPTY:
DISASMCM-NEXT: 0000000180003000 <.testdat>:
DISASMCM-NEXT: 180003000: 00000001     udf     #0x1
DISASMCM-NEXT: 180003004: 00000000     udf     #0x0
DISASMCM-NEXT: 180003008: b8 03 00 00 00               movl    $0x3, %eax
DISASMCM-NEXT: 18000300d: c3                           retq
DISASMCM-NEXT: 18000300e: 00 00                        addb    %al, (%rax)
DISASMCM-NEXT: 180003010: b8 06 00 00 00               movl    $0x6, %eax
DISASMCM-NEXT: 180003015: c3

Test code map range entry spanning over multiple sections.

RUN: lld-link -out:testms.dll -machine:arm64ec arm64ec-func-sym.obj arm64ec-func-sym2.obj \
RUN:          loadconfig-arm64ec.obj -dll -noentry

RUN: llvm-readobj --coff-load-config testms.dll | FileCheck -check-prefix=CODEMAPMS %s
CODEMAPMS:      CodeMap [
CODEMAPMS-NEXT:     0x1000 - 0x1008  ARM64EC
CODEMAPMS-NEXT:     0x4000 - 0x5008  ARM64EC
CODEMAPMS-NEXT: ]

RUN: llvm-objdump -d testms.dll | FileCheck -check-prefix=DISASMMS %s
DISASMMS:      Disassembly of section .text:
DISASMMS-EMPTY:
DISASMMS-NEXT: 0000000180001000 <.text>:
DISASMMS-NEXT: 180001000: 52800040     mov     w0, #0x2                // =2
DISASMMS-NEXT: 180001004: d65f03c0     ret
DISASMMS-EMPTY:
DISASMMS-NEXT: Disassembly of section test:
DISASMMS-EMPTY:
DISASMMS-NEXT: 0000000180004000 <test>:
DISASMMS-NEXT: 180004000: 528000a0     mov     w0, #0x5                // =5
DISASMMS-NEXT: 180004004: d65f03c0     ret
DISASMMS-EMPTY:
DISASMMS-NEXT: Disassembly of section test2:
DISASMMS-EMPTY:
DISASMMS-NEXT: 0000000180005000 <test2>:
DISASMMS-NEXT: 180005000: 528000a0     mov     w0, #0x5                // =5
DISASMMS-NEXT: 180005004: d65f03c0     ret


#--- arm64-func-sym.s
    .text
    .globl arm64_func_sym
    .p2align 2, 0x0
arm64_func_sym:
    mov w0, #7
    ret

#--- arm64ec-func-sym.s
    .text
    .globl arm64ec_func_sym
    .p2align 2, 0x0
arm64ec_func_sym:
    mov w0, #2
    ret

    .section test, "xr"
    .globl arm64ec_func_sym2
    .p2align 2, 0x0
arm64ec_func_sym2:
    mov w0, #5
    ret

#--- arm64ec-func-sym2.s
    .section test2, "xr"
    .globl arm64ec_func_sym3
    .p2align 2, 0x0
arm64ec_func_sym3:
    mov w0, #5
    ret

#--- x86_64-func-sym.s
    .text
    .globl x86_64_func_sym
    .p2align 2, 0x0
x86_64_func_sym:
    movl $3, %eax
    retq

    .section test, "xr"
    .globl x86_64_func_sym2
    .p2align 2, 0x0
x86_64_func_sym2:
    movl $6, %eax
    retq

#--- data-sec.s
    .section .testdata, "rd"
    .xword 1

#--- data-sec2.s
    .section .testdata, "rd"
    .xword 2

#--- empty-sec.s
    .section .empty1, "xr"
    .section .empty2, "xr"
    .section .empty3, "xr"