REQUIRES: aarch64, x86 RUN: split-file %s %t.dir && cd %t.dir RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-dllmain.s -o arm64ec-dllmain.obj RUN: llvm-mc -filetype=obj -triple=aarch64-windows arm64-dllmain.s -o arm64-dllmain.obj RUN: llvm-mc -filetype=obj -triple=x86_64-windows amd64-dllmain.s -o amd64-dllmain.obj RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64ec-func.s -o arm64ec-func.obj RUN: llvm-mc -filetype=obj -triple=aarch64-windows arm64-func.s -o arm64-func.obj RUN: llvm-mc -filetype=obj -triple=arm64ec-windows arm64-drectve.s -o arm64ec-drectve.obj RUN: llvm-mc -filetype=obj -triple=aarch64-windows arm64-drectve.s -o arm64-drectve.obj RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj RUN: llvm-mc -filetype=obj -triple=aarch64-windows %S/Inputs/loadconfig-arm64.s -o loadconfig-arm64.obj RUN: llvm-mc -filetype=obj -triple=arm64ec-windows loadconfig-min.s -o loadconfig-min.obj RUN: lld-link -machine:arm64x -dll -out:out.dll arm64ec-dllmain.obj arm64-dllmain.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj RUN: llvm-objdump -d out.dll | FileCheck --check-prefix=DISASM %s DISASM: Disassembly of section .text: DISASM-EMPTY: DISASM-NEXT: 0000000180001000 <.text>: DISASM-NEXT: 180001000: 52800020 mov w0, #0x1 // =1 DISASM-NEXT: 180001004: d65f03c0 ret DISASM-NEXT: ... DISASM-NEXT: 180002000: 52800040 mov w0, #0x2 // =2 DISASM-NEXT: 180002004: d65f03c0 ret DISASM-EMPTY: DISASM-NEXT: Disassembly of section .hexpthk: DISASM-EMPTY: DISASM-NEXT: 0000000180003000 <.hexpthk>: DISASM-NEXT: 180003000: 48 8b c4 movq %rsp, %rax DISASM-NEXT: 180003003: 48 89 58 20 movq %rbx, 0x20(%rax) DISASM-NEXT: 180003007: 55 pushq %rbp DISASM-NEXT: 180003008: 5d popq %rbp DISASM-NEXT: 180003009: e9 f2 ef ff ff jmp 0x180002000 <.text+0x1000> DISASM-NEXT: 18000300e: cc int3 DISASM-NEXT: 18000300f: cc int3 RUN: llvm-readobj --headers --coff-load-config out.dll | FileCheck --check-prefix=READOBJ %s READOBJ: AddressOfEntryPoint: 0x1000 READOBJ: AlternateEntryPoint: 0x2000 READOBJ: HybridObject { READOBJ: AddressOfEntryPoint: 0x3000 READOBJ: AlternateEntryPoint: 0x1000 READOBJ: } RUN: lld-link -machine:arm64x -dll -out:out2.dll arm64ec-func.obj arm64-func.obj \ RUN: arm64ec-drectve.obj loadconfig-arm64.obj loadconfig-arm64ec.obj RUN: llvm-objdump -d out2.dll | FileCheck --check-prefix=DISASM %s RUN: llvm-readobj --headers --coff-load-config out2.dll | FileCheck --check-prefix=READOBJ %s RUN: lld-link -machine:arm64x -dll -out:out3.dll arm64ec-func.obj arm64-func.obj \ RUN: arm64-drectve.obj loadconfig-arm64.obj loadconfig-arm64ec.obj RUN: llvm-objdump -d out3.dll | FileCheck --check-prefix=DISASM %s RUN: llvm-readobj --headers --coff-load-config out3.dll | FileCheck --check-prefix=READOBJ %s RUN: lld-link -machine:arm64x -dll -out:out4.dll arm64ec-func.obj arm64-func.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj -entry:func RUN: llvm-objdump -d out4.dll | FileCheck --check-prefix=DISASM %s RUN: llvm-readobj --headers --coff-load-config out4.dll | FileCheck --check-prefix=READOBJ %s RUN: lld-link -machine:arm64x -dll -out:out-x86.dll amd64-dllmain.obj arm64-dllmain.obj \ RUN: loadconfig-arm64.obj loadconfig-arm64ec.obj RUN: llvm-readobj --headers --coff-load-config out-x86.dll | FileCheck --check-prefix=READOBJ-X86 %s READOBJ-X86: AddressOfEntryPoint: 0x1000 READOBJ-X86: AlternateEntryPoint: 0x2000 READOBJ-X86: HybridObject { READOBJ-X86: AddressOfEntryPoint: 0x2000 READOBJ-X86: AlternateEntryPoint: 0x1000 READOBJ-X86: } RUN: lld-link -machine:arm64x -dll -out:out-warn.dll arm64ec-dllmain.obj arm64-dllmain.obj \ RUN: loadconfig-arm64.obj loadconfig-min.obj 2>&1 | FileCheck --check-prefix=WARN %s WARN: lld-link: warning: '__chpe_metadata' is missing for ARM64X target #--- arm64-dllmain.s .section .text,"xr",discard,_DllMainCRTStartup .globl _DllMainCRTStartup .p2align 2 _DllMainCRTStartup: mov w0, #1 ret #--- arm64ec-dllmain.s .section .text,"xr",discard,_DllMainCRTStartup .globl _DllMainCRTStartup .p2align 2 _DllMainCRTStartup: mov w0, #2 ret #--- arm64-func.s .section .text,"xr",discard,func .globl func .p2align 2 func: mov w0, #1 ret #--- arm64ec-func.s .section .text,"xr",discard,func .globl func .p2align 2 func: mov w0, #2 ret #--- amd64-dllmain.s .section .text,"xr",discard,_DllMainCRTStartup .globl _DllMainCRTStartup .p2align 2 _DllMainCRTStartup: movl $3, %eax retq #--- arm64-drectve.s .section .drectve .ascii "-entry:func" #--- loadconfig-min.s .section .rdata,"dr" .globl _load_config_used .p2align 3, 0 _load_config_used: .word 0x140 .fill 0xc4,1,0 .xword chpe_metadata .fill 0x70,1,0 .p2align 3, 0 chpe_metadata: .word 2 .rva __hybrid_code_map .word __hybrid_code_map_count .rva __x64_code_ranges_to_entry_points .rva __arm64x_redirection_metadata .word 0 // __os_arm64x_dispatch_call_no_redirect .word 0 // __os_arm64x_dispatch_ret .word 0 // __os_arm64x_check_call .word 0 // __os_arm64x_check_icall .word 0 // __os_arm64x_check_icall_cfg .rva __arm64x_native_entrypoint .rva __hybrid_auxiliary_iat .word __x64_code_ranges_to_entry_points_count .word __arm64x_redirection_metadata_count .word 0 // __os_arm64x_get_x64_information .word 0 // __os_arm64x_set_x64_information .rva __arm64x_extra_rfe_table .word __arm64x_extra_rfe_table_size .word 0 // __os_arm64x_dispatch_fptr .rva __hybrid_auxiliary_iat_copy .rva __hybrid_auxiliary_delayload_iat .rva __hybrid_auxiliary_delayload_iat_copy .word __hybrid_image_info_bitfield .word 0 // __os_arm64x_helper3 .word 0 // __os_arm64x_helper4 .word 0 // __os_arm64x_helper5 .word 0 // __os_arm64x_helper6 .word 0 // __os_arm64x_helper7 .word 0 // __os_arm64x_helper8