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 : 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 : 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 : 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 : 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 : 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"