[lld] [LLD][COFF] Implement support for hybrid IAT on ARM64X (PR #124189)
Martin Storsjö via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 24 02:14:07 PST 2025
================
@@ -0,0 +1,487 @@
+REQUIRES: aarch64
+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 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
+
+
+# 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-prefix=IMPORTS-12 %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: 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: }
+
+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
+
+
+# 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-prefix=IMPORTS-123-12 %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: Import {
+IMPORTS-123-12-NEXT: Name: test.dll
+IMPORTS-123-12-NEXT: ImportLookupTableRVA: 0x3340
+IMPORTS-123-12-NEXT: ImportAddressTableRVA: 0x2008
+IMPORTS-123-12-NEXT: Symbol: func1 (0)
+IMPORTS-123-12-NEXT: Symbol: func2 (0)
+IMPORTS-123-12-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
+
+
+# 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-prefix=IMPORTS-12-123 %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: 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: Symbol: func3 (0)
+IMPORTS-12-123-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
+
+
+# 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-prefix=IMPORTS-234-123 %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: Import {
+IMPORTS-234-123-NEXT: Name: test.dll
+IMPORTS-234-123-NEXT: ImportLookupTableRVA: 0x3340
+IMPORTS-234-123-NEXT: ImportAddressTableRVA: 0x2008
+IMPORTS-234-123-NEXT: Symbol: func2 (0)
+IMPORTS-234-123-NEXT: Symbol: func3 (0)
+IMPORTS-234-123-NEXT: Symbol: func1 (0)
+IMPORTS-234-123-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
+
+
+# Link to the imported func3 and func4 from both native code, and func1 and func2 from EC code.
----------------
mstorsjo wrote:
The word `both` here feels a bit off?
https://github.com/llvm/llvm-project/pull/124189
More information about the llvm-commits
mailing list