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

RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func12-thunks-arm64ec.s -o func12-thunks-arm64ec.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows func12-thunks-arm64.s -o func12-thunks-arm64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func12-arm64ec.s -o func12-arm64ec.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows func123-arm64.s -o func123-arm64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func123-arm64ec.s -o func123-arm64ec.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows func12-arm64.s -o func12-arm64.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows func234-arm64.s -o func234-arm64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func12o-arm64ec.s -o func12o-arm64ec.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows func34-arm64.s -o func34-arm64.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows func34o-arm64.s -o func34o-arm64.obj
RUN: llvm-mc -filetype=obj -triple=aarch64-windows funco-arm64.s -o funco-arm64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows icall.s -o icall.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-lib -machine:arm64ec -def:imp.def -out:imp-arm64ec.lib
RUN: llvm-lib -machine:arm64 -def:imp.def -out:imp-arm64.lib
RUN: llvm-lib -machine:arm64x -def:imp.def -defArm64Native:imp.def -out:imp-arm64x.lib
RUN: llvm-lib -machine:arm64x -def:imp-ord10.def -defArm64Native:imp.def -out:imp-ecord.lib
RUN: llvm-lib -machine:arm64x -def:imp-ord10.def -defArm64Native:imp-ord20.def -out:imp-ecord.lib
RUN: llvm-lib -machine:arm64x -def:imp2.def -defArm64Native:imp2.def -out:imp2.lib
RUN: llvm-lib -machine:arm64x -def:noname-ec.def -defArm64Native:noname-native.def -out:noname.lib
RUN: llvm-lib -machine:arm64x -def:dup-ec.def -defArm64Native:dup-native.def -out:dup.lib


# Link to the imported func1, func2, and func1's thunks from both native and EC code.

RUN: lld-link -machine:arm64x -dll -noentry -out:test-12-thunks.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12-thunks-arm64ec.obj func12-thunks-arm64.obj imp-arm64ec.lib imp-arm64.lib

RUN: llvm-objdump -d test-12-thunks.dll | FileCheck --check-prefix=DISASM-12T %s
DISASM-12T:      0000000180001000 <.text>:
DISASM-12T-NEXT: 180001000: f0000010     adrp    x16, 0x180004000
DISASM-12T-NEXT: 180001004: f9400610     ldr     x16, [x16, #0x8]
DISASM-12T-NEXT: 180001008: d61f0200     br      x16
DISASM-12T-NEXT:                 ...
DISASM-12T-NEXT: 180002000: 52800040     mov     w0, #0x2                // =2
DISASM-12T-NEXT: 180002004: d65f03c0     ret
DISASM-12T-NEXT: 180002008: 90000030     adrp    x16, 0x180006000
DISASM-12T-NEXT: 18000200c: f9400210     ldr     x16, [x16]
DISASM-12T-NEXT: 180002010: d61f0200     br      x16
DISASM-12T-NEXT: 180002014: d000000b     adrp    x11, 0x180004000
DISASM-12T-NEXT: 180002018: f940016b     ldr     x11, [x11]
DISASM-12T-NEXT: 18000201c: 9000000a     adrp    x10, 0x180002000 <.text+0x1000>
DISASM-12T-NEXT: 180002020: 9100f14a     add     x10, x10, #0x3c
DISASM-12T-NEXT: 180002024: 17fffff7     b       0x180002000 <.text+0x1000>
DISASM-12T-NEXT: 180002028: d000000b     adrp    x11, 0x180004000
DISASM-12T-NEXT: 18000202c: f940056b     ldr     x11, [x11, #0x8]
DISASM-12T-NEXT: 180002030: d0ffffea     adrp    x10, 0x180000000
DISASM-12T-NEXT: 180002034: 9100014a     add     x10, x10, #0x0
DISASM-12T-NEXT: 180002038: 17fffff2     b       0x180002000 <.text+0x1000>
DISASM-12T-NEXT: 18000203c: 52800060     mov     w0, #0x3                // =3
DISASM-12T-NEXT: 180002040: d65f03c0     ret
DISASM-12T-NEXT:                 ...
DISASM-12T-NEXT: 180003000: ff 25 fa 0f 00 00            jmpq    *0xffa(%rip)            # 0x180004000

RUN: llvm-readobj --coff-imports test-12-thunks.dll | FileCheck --check-prefixes=IMPORTS-12,IMPORTS-12-EC %s
IMPORTS-12:      Import {
IMPORTS-12-NEXT:   Name: test.dll
IMPORTS-12-NEXT:   ImportLookupTableRVA: 0x5348
IMPORTS-12-NEXT:   ImportAddressTableRVA: 0x4000
IMPORTS-12-NEXT:   Symbol: func1 (0)
IMPORTS-12-NEXT:   Symbol: func2 (0)
IMPORTS-12-NEXT: }
IMPORTS-12-NEXT: HybridObject {
IMPORTS-12-EC:     Import {
IMPORTS-12-EC-NEXT:  Name: test.dll
IMPORTS-12-EC-NEXT:  ImportLookupTableRVA: 0x5348
IMPORTS-12-EC-NEXT:  ImportAddressTableRVA: 0x4000
IMPORTS-12-EC-NEXT:  Symbol: func1 (0)
IMPORTS-12-EC-NEXT:  Symbol: func2 (0)
IMPORTS-12-EC-NEXT:}
IMPORTS-12-NEXT: }

RUN: llvm-readobj --hex-dump=.test test-12-thunks.dll | FileCheck --check-prefix=FUNC-12-THUNKS %s
FUNC-12-THUNKS:      0x180009000 00600000 00400000 00300000 08200000
FUNC-12-THUNKS-NEXT: 0x180009010 08600000 08400000

RUN: llvm-readobj --hex-dump=.testa test-12-thunks.dll | FileCheck --check-prefix=FUNC-12-THUNKSA %s
FUNC-12-THUNKSA: 0x18000a000 00400000 08400000 00100000

RUN: lld-link -machine:arm64ec -dll -noentry -out:test-12-thunks-ec.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12-thunks-arm64ec.obj func12-thunks-arm64.obj imp-arm64ec.lib imp-arm64.lib
RUN: llvm-objdump -d test-12-thunks-ec.dll | FileCheck --check-prefix=DISASM-12T %s
RUN: llvm-readobj --hex-dump=.test test-12-thunks-ec.dll | FileCheck --check-prefix=FUNC-12-THUNKS %s
RUN: llvm-readobj --hex-dump=.testa test-12-thunks-ec.dll | FileCheck --check-prefix=FUNC-12-THUNKSA %s
RUN: llvm-readobj --coff-imports test-12-thunks-ec.dll | FileCheck --check-prefix=IMPORTS-12-EC %s


# If the ordinals of named imports don't match, use the EC value.

RUN: lld-link -machine:arm64x -dll -noentry -out:test-12-thunks-ord.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12-thunks-arm64ec.obj func12-thunks-arm64.obj imp-ecord.lib
RUN: llvm-readobj --coff-imports test-12-thunks-ord.dll | FileCheck --check-prefix=IMPORTS-ORD %s

IMPORTS-ORD:      Format: COFF-ARM64X
IMPORTS-ORD-NEXT: Arch: aarch64
IMPORTS-ORD-NEXT: AddressSize: 64bit
IMPORTS-ORD-NEXT: Import {
IMPORTS-ORD-NEXT:   Name: test.dll
IMPORTS-ORD-NEXT:   ImportLookupTableRVA: 0x5348
IMPORTS-ORD-NEXT:   ImportAddressTableRVA: 0x4000
IMPORTS-ORD-NEXT:   Symbol: func1 (11)
IMPORTS-ORD-NEXT:   Symbol: func2 (12)
IMPORTS-ORD-NEXT: }
IMPORTS-ORD-NEXT: HybridObject {
IMPORTS-ORD-NEXT:   Format: COFF-ARM64EC
IMPORTS-ORD-NEXT:   Arch: aarch64
IMPORTS-ORD-NEXT:   AddressSize: 64bit
IMPORTS-ORD-NEXT:   Import {
IMPORTS-ORD-NEXT:     Name: test.dll
IMPORTS-ORD-NEXT:     ImportLookupTableRVA: 0x5348
IMPORTS-ORD-NEXT:     ImportAddressTableRVA: 0x4000
IMPORTS-ORD-NEXT:     Symbol: func1 (11)
IMPORTS-ORD-NEXT:     Symbol: func2 (12)
IMPORTS-ORD-NEXT:   }
IMPORTS-ORD-NEXT: }


# Link to NONAME imports.

RUN: lld-link -machine:arm64x -dll -noentry -out:test-noname.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12-thunks-arm64ec.obj func12-thunks-arm64.obj noname.lib
RUN: llvm-readobj --coff-imports test-noname.dll | FileCheck --check-prefix=IMPORTS-ORD2 %s

IMPORTS-ORD2:      Format: COFF-ARM64X
IMPORTS-ORD2-NEXT: Arch: aarch64
IMPORTS-ORD2-NEXT: AddressSize: 64bit
IMPORTS-ORD2-NEXT: Import {
IMPORTS-ORD2-NEXT:   Name: test.dll
IMPORTS-ORD2-NEXT:   ImportLookupTableRVA: 0x5348
IMPORTS-ORD2-NEXT:   ImportAddressTableRVA: 0x4000
IMPORTS-ORD2-NEXT:   Symbol:  (12)
IMPORTS-ORD2-NEXT:   Symbol:  (11)
IMPORTS-ORD2-NEXT: }
IMPORTS-ORD2-NEXT: HybridObject {
IMPORTS-ORD2-NEXT:   Format: COFF-ARM64EC
IMPORTS-ORD2-NEXT:   Arch: aarch64
IMPORTS-ORD2-NEXT:   AddressSize: 64bit
IMPORTS-ORD2-NEXT:   Import {
IMPORTS-ORD2-NEXT:     Name: test.dll
IMPORTS-ORD2-NEXT:     ImportLookupTableRVA: 0x5350
IMPORTS-ORD2-NEXT:     ImportAddressTableRVA: 0x4008
IMPORTS-ORD2-NEXT:     Symbol:  (11)
IMPORTS-ORD2-NEXT:     Symbol:  (10)
IMPORTS-ORD2-NEXT:   }
IMPORTS-ORD2-NEXT: }

# Link to the imported func1 and func2 from both native and EC code, and func3 from native code.

RUN: lld-link -machine:arm64x -dll -noentry -out:test2.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12-arm64ec.obj func123-arm64.obj imp-arm64x.lib

RUN: llvm-readobj --coff-imports test2.dll | FileCheck --check-prefixes=IMPORTS-123-12,IMPORTS-123-12-EC %s
IMPORTS-123-12:      Import {
IMPORTS-123-12-NEXT:   Name: test.dll
IMPORTS-123-12-NEXT:   ImportLookupTableRVA: 0x3338
IMPORTS-123-12-NEXT:   ImportAddressTableRVA: 0x2000
IMPORTS-123-12-NEXT:   Symbol: func3 (0)
IMPORTS-123-12-NEXT:   Symbol: func1 (0)
IMPORTS-123-12-NEXT:   Symbol: func2 (0)
IMPORTS-123-12-NEXT: }
IMPORTS-123-12-NEXT: HybridObject {
IMPORTS-123-12-EC:     Import {
IMPORTS-123-12-EC-NEXT:  Name: test.dll
IMPORTS-123-12-EC-NEXT:  ImportLookupTableRVA: 0x3340
IMPORTS-123-12-EC-NEXT:  ImportAddressTableRVA: 0x2008
IMPORTS-123-12-EC-NEXT:  Symbol: func1 (0)
IMPORTS-123-12-EC-NEXT:  Symbol: func2 (0)
IMPORTS-123-12-EC-NEXT:}
IMPORTS-123-12-NEXT: }

RUN: llvm-readobj --hex-dump=.test test2.dll | FileCheck --check-prefix=TEST-123-12 %s
TEST-123-12: 0x180007000 08400000 08200000 10400000 10200000

RUN: llvm-readobj --hex-dump=.testa test2.dll | FileCheck --check-prefix=TEST-123-12A %s
TEST-123-12A: 0x180008000 08200000 10200000 00200000

RUN: llvm-readobj --hex-dump=.rdata test2.dll | FileCheck --check-prefix=TEST-123-12AUX %s
TEST-123-12AUX:      0x180004000 00000000 00000000 08100080 01000000
TEST-123-12AUX-NEXT: 0x180004010 1c100080 01000000 00000000 00000000

RUN: lld-link -machine:arm64ec -dll -noentry -out:test2-ec.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12-arm64ec.obj func123-arm64.obj imp-arm64x.lib
RUN: llvm-readobj --coff-imports test2-ec.dll | FileCheck --check-prefix=IMPORTS-123-12-EC %s
RUN: llvm-readobj --hex-dump=.test test2-ec.dll | FileCheck --check-prefix=TEST-123-12 %s
RUN: llvm-readobj --hex-dump=.testa test2-ec.dll | FileCheck --check-prefix=TEST-123-12A %s
RUN: llvm-readobj --hex-dump=.rdata test2-ec.dll | FileCheck --check-prefix=TEST-123-12AUX %s


# Link to the imported func1 and func2 from both native and EC code, and func3 from EC code.

RUN: lld-link -machine:arm64x -dll -noentry -out:func-12-123.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func123-arm64ec.obj func12-arm64.obj imp-arm64x.lib

RUN: llvm-readobj --coff-imports func-12-123.dll | FileCheck --check-prefixes=IMPORTS-12-123,IMPORTS-12-123-EC %s
IMPORTS-12-123:      Import {
IMPORTS-12-123-NEXT:   Name: test.dll
IMPORTS-12-123-NEXT:   ImportLookupTableRVA: 0x3338
IMPORTS-12-123-NEXT:   ImportAddressTableRVA: 0x2000
IMPORTS-12-123-NEXT:   Symbol: func1 (0)
IMPORTS-12-123-NEXT:   Symbol: func2 (0)
IMPORTS-12-123-NEXT: }
IMPORTS-12-123-NEXT: HybridObject {
IMPORTS-12-123-EC:     Import {
IMPORTS-12-123-EC-NEXT:  Name: test.dll
IMPORTS-12-123-EC-NEXT:  ImportLookupTableRVA: 0x3338
IMPORTS-12-123-EC-NEXT:  ImportAddressTableRVA: 0x2000
IMPORTS-12-123-EC-NEXT:  Symbol: func1 (0)
IMPORTS-12-123-EC-NEXT:  Symbol: func2 (0)
IMPORTS-12-123-EC-NEXT:  Symbol: func3 (0)
IMPORTS-12-123-EC-NEXT:}
IMPORTS-12-123-NEXT: }

RUN: llvm-readobj --hex-dump=.test func-12-123.dll | FileCheck --check-prefix=TEST-12-123 %s
TEST-12-123:      0x180007000 00400000 00200000 08400000 08200000
TEST-12-123-NEXT: 0x180007010 10400000 10200000

RUN: llvm-readobj --hex-dump=.testa func-12-123.dll | FileCheck --check-prefix=TEST-12-123A %s
TEST-12-123A: 0x180008000 00200000 08200000

RUN: llvm-readobj --hex-dump=.rdata func-12-123.dll | FileCheck --check-prefix=TEST-12-123AUX %s
TEST-12-123AUX:      0x180004000 08100080 01000000 1c100080 01000000
TEST-12-123AUX-NEXT: 0x180004010 30100080 01000000 00000000 00000000

RUN: lld-link -machine:arm64ec -dll -noentry -out:func-12-123-ec.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func123-arm64ec.obj func12-arm64.obj imp-arm64x.lib
RUN: llvm-readobj --coff-imports func-12-123-ec.dll | FileCheck --check-prefix=IMPORTS-12-123-EC %s
RUN: llvm-readobj --hex-dump=.test func-12-123-ec.dll | FileCheck --check-prefix=TEST-12-123 %s
RUN: llvm-readobj --hex-dump=.testa func-12-123-ec.dll | FileCheck --check-prefix=TEST-12-123A %s
RUN: llvm-readobj --hex-dump=.rdata func-12-123-ec.dll | FileCheck --check-prefix=TEST-12-123AUX %s

# Link to the imported func2 and func3 from both native and EC code, func4 from native code,
# and func1 from EC code.

RUN: lld-link -machine:arm64x -dll -noentry -out:test-234-123.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func123-arm64ec.obj func234-arm64.obj imp-arm64x.lib

RUN: llvm-readobj --coff-imports test-234-123.dll | FileCheck --check-prefixes=IMPORTS-234-123,IMPORTS-234-123-EC %s
IMPORTS-234-123:      Import {
IMPORTS-234-123-NEXT:   Name: test.dll
IMPORTS-234-123-NEXT:   ImportLookupTableRVA: 0x3338
IMPORTS-234-123-NEXT:   ImportAddressTableRVA: 0x2000
IMPORTS-234-123-NEXT:   Symbol: func4 (0)
IMPORTS-234-123-NEXT:   Symbol: func2 (0)
IMPORTS-234-123-NEXT:   Symbol: func3 (0)
IMPORTS-234-123-NEXT: }
IMPORTS-234-123-NEXT: HybridObject {
IMPORTS-234-123-EC:     Import {
IMPORTS-234-123-EC-NEXT:  Name: test.dll
IMPORTS-234-123-EC-NEXT:  ImportLookupTableRVA: 0x3340
IMPORTS-234-123-EC-NEXT:  ImportAddressTableRVA: 0x2008
IMPORTS-234-123-EC-NEXT:  Symbol: func2 (0)
IMPORTS-234-123-EC-NEXT:  Symbol: func3 (0)
IMPORTS-234-123-EC-NEXT:  Symbol: func1 (0)
IMPORTS-234-123-EC-NEXT:}
IMPORTS-234-123-NEXT: }

RUN: llvm-readobj --hex-dump=.test test-234-123.dll | FileCheck --check-prefix=TEST-234-123 %s
TEST-234-123:      0x180007000 18400000 18200000 08400000 08200000
TEST-234-123-NEXT: 0x180007010 10400000 1020000

RUN: llvm-readobj --hex-dump=.testa test-234-123.dll | FileCheck --check-prefix=TEST-234-123A %s
TEST-234-123A: 0x180008000 08200000 10200000 00200000

RUN: lld-link -machine:arm64ec -dll -noentry -out:test-234-123-ec.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func123-arm64ec.obj func234-arm64.obj imp-arm64x.lib
RUN: llvm-readobj --coff-imports test-234-123-ec.dll | FileCheck --check-prefix=IMPORTS-234-123-EC %s
RUN: llvm-readobj --hex-dump=.test test-234-123-ec.dll | FileCheck --check-prefix=TEST-234-123 %s
RUN: llvm-readobj --hex-dump=.testa test-234-123-ec.dll | FileCheck --check-prefix=TEST-234-123A %s


# Link to the imported func3 and func4 from native code, and func1 and func2 from EC code.

RUN: lld-link -machine:arm64x -dll -noentry -out:test-34-12.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12o-arm64ec.obj func34o-arm64.obj imp-arm64x.lib imp2.lib

RUN: llvm-readobj --coff-imports test-34-12.dll | FileCheck --check-prefixes=IMPORTS-34-12,IMPORTS-34-12-EC %s
IMPORTS-34-12:      Import {
IMPORTS-34-12-NEXT:   Name: test.dll
IMPORTS-34-12-NEXT:   ImportLookupTableRVA: 0x3350
IMPORTS-34-12-NEXT:   ImportAddressTableRVA: 0x2000
IMPORTS-34-12-NEXT:   Symbol: func3 (0)
IMPORTS-34-12-NEXT:   Symbol: func4 (0)
IMPORTS-34-12-NEXT: }
IMPORTS-34-12-NEXT: Import {
IMPORTS-34-12-NEXT:   Name: test2.dll
IMPORTS-34-12-NEXT:   ImportLookupTableRVA: 0x3378
IMPORTS-34-12-NEXT:   ImportAddressTableRVA: 0x2028
IMPORTS-34-12-NEXT:   Symbol: otherfunc (0)
IMPORTS-34-12-NEXT: }
IMPORTS-34-12-NEXT: HybridObject {
IMPORTS-34-12-EC:     Import {
IMPORTS-34-12-EC-NEXT:  Name: test.dll
IMPORTS-34-12-EC-NEXT:  ImportLookupTableRVA: 0x3360
IMPORTS-34-12-EC-NEXT:  ImportAddressTableRVA: 0x2010
IMPORTS-34-12-EC-NEXT:  Symbol: func1 (0)
IMPORTS-34-12-EC-NEXT:  Symbol: func2 (0)
IMPORTS-34-12-EC-NEXT:}
IMPORTS-34-12-EC-NEXT:Import {
IMPORTS-34-12-EC-NEXT:  Name: test2.dll
IMPORTS-34-12-EC-NEXT:  ImportLookupTableRVA: 0x3378
IMPORTS-34-12-EC-NEXT:  ImportAddressTableRVA: 0x2028
IMPORTS-34-12-EC-NEXT:  Symbol: otherfunc (0)
IMPORTS-34-12-EC-NEXT:}
IMPORTS-34-12-NEXT: }

RUN: llvm-readobj --hex-dump=.test test-34-12.dll | FileCheck --check-prefix=TEST-23-12 %s
TEST-23-12:      0x180007000 10400000 10200000 18400000 18200000
TEST-23-12-NEXT: 0x180007010 28400000 28200000

RUN: llvm-readobj --hex-dump=.testa test-34-12.dll | FileCheck --check-prefix=TEST-23-12A %s
TEST-23-12A: 0x180008000 00200000 08200000 28200000

RUN: lld-link -machine:arm64ec -dll -noentry -out:test-34-12-ec.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12o-arm64ec.obj func34o-arm64.obj imp-arm64x.lib imp2.lib
RUN: llvm-readobj --coff-imports test-34-12-ec.dll | FileCheck --check-prefix=IMPORTS-34-12-EC %s
RUN: llvm-readobj --hex-dump=.test test-34-12-ec.dll | FileCheck --check-prefix=TEST-23-12 %s
RUN: llvm-readobj --hex-dump=.testa test-34-12-ec.dll | FileCheck --check-prefix=TEST-23-12A %s


# Link only to imported EC functions, with no native imports.

RUN: lld-link -machine:arm64x -dll -noentry -out:test-ec12.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          icall.obj func12-arm64ec.obj funco-arm64.obj imp-arm64x.lib imp2.lib

RUN: llvm-readobj --coff-imports test-ec12.dll | FileCheck --check-prefix=IMPORTS-EC12 %s

IMPORTS-EC12:      File: test-ec12.dll
IMPORTS-EC12-NEXT: Format: COFF-ARM64X
IMPORTS-EC12-NEXT: Arch: aarch64
IMPORTS-EC12-NEXT: AddressSize: 64bit
IMPORTS-EC12-NEXT: Import {
IMPORTS-EC12-NEXT:   Name: test.dll
IMPORTS-EC12-NEXT:   ImportLookupTableRVA: 0x3350
IMPORTS-EC12-NEXT:   ImportAddressTableRVA: 0x2000
IMPORTS-EC12-NEXT: }
IMPORTS-EC12-NEXT: Import {
IMPORTS-EC12-NEXT:   Name: test2.dll
IMPORTS-EC12-NEXT:   ImportLookupTableRVA: 0x3368
IMPORTS-EC12-NEXT:   ImportAddressTableRVA: 0x2018
IMPORTS-EC12-NEXT:   Symbol: otherfunc (0)
IMPORTS-EC12-NEXT: }
IMPORTS-EC12-NEXT: HybridObject {
IMPORTS-EC12-NEXT:   Format: COFF-ARM64EC
IMPORTS-EC12-NEXT:   Arch: aarch64
IMPORTS-EC12-NEXT:   AddressSize: 64bit
IMPORTS-EC12-NEXT:   Import {
IMPORTS-EC12-NEXT:     Name: test.dll
IMPORTS-EC12-NEXT:     ImportLookupTableRVA: 0x3350
IMPORTS-EC12-NEXT:     ImportAddressTableRVA: 0x2000
IMPORTS-EC12-NEXT:     Symbol: func1 (0)
IMPORTS-EC12-NEXT:     Symbol: func2 (0)
IMPORTS-EC12-NEXT:   }
IMPORTS-EC12-NEXT:   Import {
IMPORTS-EC12-NEXT:     Name: test2.dll
IMPORTS-EC12-NEXT:     ImportLookupTableRVA: 0x3370
IMPORTS-EC12-NEXT:     ImportAddressTableRVA: 0x2020
IMPORTS-EC12-NEXT:   }
IMPORTS-EC12-NEXT: }


# Link only to imported native functions, with no EC imports.

RUN: lld-link -machine:arm64x -dll -noentry -out:test-n12.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          func12-arm64.obj imp-arm64x.lib

RUN: llvm-readobj --coff-imports test-n12.dll | FileCheck --check-prefixes=IMPORTS-N12,IMPORTS-N12-EC %s

IMPORTS-N12:      Arch: aarch64
IMPORTS-N12-NEXT: AddressSize: 64bit
IMPORTS-N12-NEXT: Import {
IMPORTS-N12-NEXT:   Name: test.dll
IMPORTS-N12-NEXT:   ImportLookupTableRVA: 0x2330
IMPORTS-N12-NEXT:   ImportAddressTableRVA: 0x1000
IMPORTS-N12-NEXT:   Symbol: func1 (0)
IMPORTS-N12-NEXT:   Symbol: func2 (0)
IMPORTS-N12-NEXT: }
IMPORTS-N12-NEXT: HybridObject {
IMPORTS-N12-EC:      Format: COFF-ARM64EC
IMPORTS-N12-EC-NEXT: Arch: aarch64
IMPORTS-N12-EC-NEXT: AddressSize: 64bit
IMPORTS-N12-EC-NEXT: Import {
IMPORTS-N12-EC-NEXT:   Name: test.dll
IMPORTS-N12-EC-NEXT:   ImportLookupTableRVA: 0x2340
IMPORTS-N12-EC-NEXT:   ImportAddressTableRVA: 0x1010
IMPORTS-N12-EC-NEXT: }
IMPORTS-N12-NEXT: }

RUN: lld-link -machine:arm64ec -dll -noentry -out:test-n12-ec.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
RUN:          func12-arm64.obj imp-arm64x.lib
RUN: llvm-readobj --coff-imports test-n12-ec.dll | FileCheck --check-prefix=IMPORTS-N12-EC %s


RUN: lld-link -machine:arm64x -dll -noentry -out:test-dup.dll loadconfig-arm64.obj loadconfig-arm64ec.obj icall.obj \
RUN:          func12-arm64ec.obj func34-arm64.obj dup.lib

RUN: llvm-readobj --coff-imports test-dup.dll | FileCheck --check-prefix=IMPORTS-DUP %s
IMPORTS-DUP:      Format: COFF-ARM64X
IMPORTS-DUP-NEXT: Arch: aarch64
IMPORTS-DUP-NEXT: AddressSize: 64bit
IMPORTS-DUP-NEXT: Import {
IMPORTS-DUP-NEXT:   Name: test.dll
IMPORTS-DUP-NEXT:   ImportLookupTableRVA: 0x3338
IMPORTS-DUP-NEXT:   ImportAddressTableRVA: 0x2000
IMPORTS-DUP-NEXT:   Symbol: func4 (0)
IMPORTS-DUP-NEXT:   Symbol: func4 (0)
IMPORTS-DUP-NEXT: }
IMPORTS-DUP-NEXT: HybridObject {
IMPORTS-DUP-NEXT:   Format: COFF-ARM64EC
IMPORTS-DUP-NEXT:   Arch: aarch64
IMPORTS-DUP-NEXT:   AddressSize: 64bit
IMPORTS-DUP-NEXT:   Import {
IMPORTS-DUP-NEXT:     Name: test.dll
IMPORTS-DUP-NEXT:     ImportLookupTableRVA: 0x3348
IMPORTS-DUP-NEXT:     ImportAddressTableRVA: 0x2010
IMPORTS-DUP-NEXT:     Symbol: func1 (0)
IMPORTS-DUP-NEXT:     Symbol: func1 (0)
IMPORTS-DUP-NEXT:   }
IMPORTS-DUP-NEXT: }

#--- func12-thunks-arm64ec.s
    .section .test, "r"
    .rva __imp_func1
    .rva __imp_aux_func1
    .rva func1
    .rva "#func1"
    .rva __imp_func2
    .rva __imp_aux_func2

#--- func12-thunks-arm64.s
    .section .testa, "r"
    .rva __imp_func1
    .rva __imp_func2
    .rva func2

#--- func12-arm64ec.s
    .section .test, "r"
    .rva __imp_func1
    .rva __imp_aux_func1
    .rva __imp_func2
    .rva __imp_aux_func2

#--- func123-arm64.s
    .section .testa, "r"
    .rva __imp_func1
    .rva __imp_func2
    .rva __imp_func3

#--- func123-arm64ec.s
    .section .test, "r"
    .rva __imp_func1
    .rva __imp_aux_func1
    .rva __imp_func2
    .rva __imp_aux_func2
    .rva __imp_func3
    .rva __imp_aux_func3

#--- func12-arm64.s
    .section .testa, "r"
    .rva __imp_func1
    .rva __imp_func2

#--- func234-arm64.s
    .section .testa, "r"
    .rva __imp_func2
    .rva __imp_func3
    .rva __imp_func4

#--- func12o-arm64ec.s
    .section .test, "r"
    .rva __imp_func1
    .rva __imp_aux_func1
    .rva __imp_func2
    .rva __imp_aux_func2
    .rva __imp_otherfunc
    .rva __imp_aux_otherfunc

#--- func34-arm64.s
    .section .testa, "r"
    .rva __imp_func3
    .rva __imp_func4

#--- func34o-arm64.s
    .section .testa, "r"
    .rva __imp_func3
    .rva __imp_func4
    .rva __imp_otherfunc

#--- funco-arm64.s
    .section .testa, "r"
    .rva __imp_otherfunc

#--- icall.s
    .text
    .globl __icall_helper_arm64ec
    .p2align 2, 0x0
__icall_helper_arm64ec:
    mov w0, #2
    ret

    .section .hybmp$x, "yi"
    .symidx __imp_func1
    .symidx func1_exit_thunk
    .word 4

    .section .wowthk$aa,"xr",discard,func1_exit_thunk
    .globl func1_exit_thunk
func1_exit_thunk:
    mov w0, #3
    ret

#--- imp.def
NAME test.dll
EXPORTS
    data_sym DATA
    func1
    func2
    func3
    func4

#--- imp-ord10.def
NAME test.dll
EXPORTS
    data_sym DATA @10
    func1 @11
    func2 @12
    func3 @13
    func4 @14

#--- imp-ord20.def
NAME test.dll
EXPORTS
    data_sym DATA @10
    func1 @21
    func2 @22
    func3 @23
    func4 @24

#--- imp2.def
NAME test2.dll
EXPORTS
    otherfunc

#--- noname-ec.def
NAME test.dll
EXPORTS
    func1 @10 NONAME
    func2 @11 NONAME

#--- noname-native.def
NAME test.dll
EXPORTS
    func1 @12 NONAME
    func2 @11 NONAME

#--- dup-ec.def
NAME test.dll
EXPORTS
    func1
    func2 EXPORTAS func1

#--- dup-native.def
NAME test.dll
EXPORTS
    func3 EXPORTAS func4
    func4
