mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 16:06:40 +00:00
377 lines
10 KiB
ArmAsm
377 lines
10 KiB
ArmAsm
// REQUIRES: aarch64
|
|
// RUN: split-file %s %t.dir && cd %t.dir
|
|
|
|
#--- test-simple.s
|
|
// Build a simple function with an entry thunk.
|
|
|
|
.section .text,"xr",discard,func
|
|
.globl func
|
|
.p2align 2
|
|
func:
|
|
mov w0, #1
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk
|
|
.globl thunk
|
|
.p2align 2
|
|
thunk:
|
|
mov w0, #10
|
|
ret
|
|
|
|
.section .hybmp$x, "yi"
|
|
.symidx func
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
|
|
.data
|
|
.rva func
|
|
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadcfg.obj
|
|
// RUN: llvm-mc -filetype=obj -triple=aarch64-windows %S/Inputs/loadconfig-arm64.s -o native-loadcfg.obj
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-simple.s -o test-simple.obj
|
|
// RUN: lld-link -machine:arm64ec -dll -noentry -out:out-simple.dll loadcfg.obj test-simple.obj
|
|
// RUN: llvm-objdump -d out-simple.dll | FileCheck --check-prefix=DISASM %s
|
|
|
|
// DISASM: Disassembly of section .text:
|
|
// DISASM-EMPTY:
|
|
// DISASM-NEXT: 0000000180001000 <.text>:
|
|
// DISASM-NEXT: 180001000: 00000009 udf #0x9
|
|
// DISASM-NEXT: 180001004: 52800020 mov w0, #0x1 // =1
|
|
// DISASM-NEXT: 180001008: d65f03c0 ret
|
|
// DISASM-NEXT: 18000100c: 52800140 mov w0, #0xa // =10
|
|
// DISASM-NEXT: 180001010: d65f03c0 ret
|
|
|
|
// RUN: llvm-readobj --sections out-simple.dll | FileCheck --check-prefix=HYBMP %s
|
|
// HYBMP-NOT: .hybmp
|
|
|
|
// RUN: lld-link -machine:arm64x -dll -noentry -out:out-simplex.dll native-loadcfg.obj loadcfg.obj test-simple.obj
|
|
// RUN: llvm-objdump -d out-simplex.dll | FileCheck --check-prefix=DISASM %s
|
|
|
|
#--- test-split-func.s
|
|
// Build a simple function with an entry thunk, but pass it in multiple files.
|
|
|
|
.section .text,"xr",discard,func
|
|
.globl func
|
|
.p2align 2
|
|
func:
|
|
mov w0, #1
|
|
ret
|
|
|
|
#--- test-split-thunk.s
|
|
.section .wowthk$aa,"xr",discard,thunk
|
|
.globl thunk
|
|
.p2align 2
|
|
thunk:
|
|
mov w0, #10
|
|
ret
|
|
|
|
#--- test-split-hybmp.s
|
|
.section .hybmp$x, "yi"
|
|
.symidx func
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
|
|
#--- test-split-data.s
|
|
.data
|
|
.rva func
|
|
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-split-func.s -o test-split-func.obj
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-split-thunk.s -o test-split-thunk.obj
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-split-hybmp.s -o test-split-hybmp.obj
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-split-data.s -o test-split-data.obj
|
|
// RUN: lld-link -machine:arm64ec -dll -noentry -out:out-split.dll loadcfg.obj \
|
|
// RUN: test-split-func.obj test-split-thunk.obj test-split-data.obj test-split-hybmp.obj
|
|
// RUN: llvm-objdump -d out-split.dll | FileCheck --check-prefix=DISASM %s
|
|
|
|
#--- test-align.s
|
|
// Build multiple functions with thunks and various alignments and check that entry thunk offsets
|
|
// are correctly placed.
|
|
|
|
.section .text,"xr",discard,func
|
|
.globl func
|
|
.p2align 2
|
|
func:
|
|
mov w0, #1
|
|
nop
|
|
ret
|
|
|
|
.section .text,"xr",discard,func2
|
|
.globl func2
|
|
.p2align 2
|
|
func2:
|
|
mov w0, #2
|
|
ret
|
|
|
|
.section .text,"xr",discard,func3
|
|
.globl func3
|
|
.p2align 3
|
|
func3:
|
|
mov w0, #3
|
|
nop
|
|
ret
|
|
|
|
.section .text,"xr",discard,func4
|
|
.globl func4
|
|
.p2align 3
|
|
func4:
|
|
mov w0, #4
|
|
ret
|
|
|
|
.section .text,"xr",discard,func5
|
|
.globl func5
|
|
.p2align 3
|
|
func5:
|
|
mov w0, #5
|
|
ret
|
|
|
|
.section .text,"xr",discard,func6
|
|
.globl func6
|
|
.p2align 4
|
|
func6:
|
|
mov w0, #6
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk
|
|
.globl thunk
|
|
.p2align 2
|
|
thunk:
|
|
mov w0, #10
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk2
|
|
.globl thunk2
|
|
.p2align 2
|
|
thunk2:
|
|
mov w0, #20
|
|
ret
|
|
|
|
.section .hybmp$x, "yi"
|
|
.symidx func
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
.symidx func2
|
|
.symidx thunk2
|
|
.word 1 // entry thunk
|
|
.symidx func3
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
.symidx func4
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
.symidx func5
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
.symidx func6
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
|
|
.data
|
|
.rva func
|
|
.rva func2
|
|
.rva func3
|
|
.rva func4
|
|
.rva func5
|
|
.rva func6
|
|
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-align.s -o test-align.obj
|
|
// RUN: lld-link -machine:arm64ec -dll -noentry -out:out-align.dll loadcfg.obj test-align.obj
|
|
// RUN: llvm-objdump -d out-align.dll | FileCheck --check-prefix=ALIGN %s
|
|
|
|
// ALIGN: Disassembly of section .text:
|
|
// ALIGN-EMPTY:
|
|
// ALIGN-NEXT: 0000000180001000 <.text>:
|
|
// ALIGN-NEXT: 180001000: 00000055 udf #0x55
|
|
// ALIGN-NEXT: 180001004: 52800020 mov w0, #0x1 // =1
|
|
// ALIGN-NEXT: 180001008: d503201f nop
|
|
// ALIGN-NEXT: 18000100c: d65f03c0 ret
|
|
// ALIGN-NEXT: 180001010: 0000004d udf #0x4d
|
|
// ALIGN-NEXT: 180001014: 52800040 mov w0, #0x2 // =2
|
|
// ALIGN-NEXT: 180001018: d65f03c0 ret
|
|
// ALIGN-NEXT: 18000101c: 00000039 udf #0x39
|
|
// ALIGN-NEXT: 180001020: 52800060 mov w0, #0x3 // =3
|
|
// ALIGN-NEXT: 180001024: d503201f nop
|
|
// ALIGN-NEXT: 180001028: d65f03c0 ret
|
|
// ALIGN-NEXT: 18000102c: 00000029 udf #0x29
|
|
// ALIGN-NEXT: 180001030: 52800080 mov w0, #0x4 // =4
|
|
// ALIGN-NEXT: 180001034: d65f03c0 ret
|
|
// ALIGN-NEXT: 180001038: 00000000 udf #0x0
|
|
// ALIGN-NEXT: 18000103c: 00000019 udf #0x19
|
|
// ALIGN-NEXT: 180001040: 528000a0 mov w0, #0x5 // =5
|
|
// ALIGN-NEXT: 180001044: d65f03c0 ret
|
|
// ALIGN-NEXT: 180001048: 00000000 udf #0x0
|
|
// ALIGN-NEXT: 18000104c: 00000009 udf #0x9
|
|
// ALIGN-NEXT: 180001050: 528000c0 mov w0, #0x6 // =6
|
|
// ALIGN-NEXT: 180001054: d65f03c0 ret
|
|
// ALIGN-NEXT: 180001058: 52800140 mov w0, #0xa // =10
|
|
// ALIGN-NEXT: 18000105c: d65f03c0 ret
|
|
// ALIGN-NEXT: 180001060: 52800280 mov w0, #0x14 // =20
|
|
// ALIGN-NEXT: 180001064: d65f03c0 ret
|
|
|
|
#--- test-icf-thunk.s
|
|
// Build two functions with identical entry thunks and check that thunks are merged by ICF.
|
|
|
|
.section .text,"xr",discard,func
|
|
.globl func
|
|
.p2align 2
|
|
func:
|
|
mov w0, #1
|
|
ret
|
|
|
|
.section .text,"xr",discard,func2
|
|
.globl func2
|
|
.p2align 2
|
|
func2:
|
|
mov w0, #2
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk
|
|
.globl thunk
|
|
.p2align 2
|
|
thunk:
|
|
mov w0, #10
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk2
|
|
.globl thunk2
|
|
.p2align 2
|
|
thunk2:
|
|
mov w0, #10
|
|
ret
|
|
|
|
.section .hybmp$x, "yi"
|
|
.symidx func
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
.symidx func2
|
|
.symidx thunk2
|
|
.word 1 // entry thunk
|
|
|
|
.data
|
|
.rva func
|
|
.rva func2
|
|
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-icf-thunk.s -o test-icf-thunk.obj
|
|
// RUN: lld-link -machine:arm64ec -dll -noentry -out:out-icf-thunk.dll loadcfg.obj test-icf-thunk.obj
|
|
// RUN: llvm-objdump -d out-icf-thunk.dll | FileCheck --check-prefix=ICF-THUNK %s
|
|
|
|
// ICF-THUNK: Disassembly of section .text:
|
|
// ICF-THUNK-EMPTY:
|
|
// ICF-THUNK-NEXT: 0000000180001000 <.text>:
|
|
// ICF-THUNK-NEXT: 180001000: 00000015 udf #0x15
|
|
// ICF-THUNK-NEXT: 180001004: 52800020 mov w0, #0x1 // =1
|
|
// ICF-THUNK-NEXT: 180001008: d65f03c0 ret
|
|
// ICF-THUNK-NEXT: 18000100c: 00000009 udf #0x9
|
|
// ICF-THUNK-NEXT: 180001010: 52800040 mov w0, #0x2 // =2
|
|
// ICF-THUNK-NEXT: 180001014: d65f03c0 ret
|
|
// ICF-THUNK-NEXT: 180001018: 52800140 mov w0, #0xa // =10
|
|
// ICF-THUNK-NEXT: 18000101c: d65f03c0 ret
|
|
|
|
#--- test-icf-diff-thunk.s
|
|
// Build two identical functions with different entry thunks and check that they are not merged by ICF.
|
|
|
|
.section .text,"xr",discard,func
|
|
.globl func
|
|
.p2align 2
|
|
func:
|
|
mov w0, #1
|
|
ret
|
|
|
|
.section .text,"xr",discard,func2
|
|
.globl func2
|
|
.p2align 2
|
|
func2:
|
|
mov w0, #1
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk
|
|
.globl thunk
|
|
.p2align 2
|
|
thunk:
|
|
mov w0, #10
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk2
|
|
.globl thunk2
|
|
.p2align 2
|
|
thunk2:
|
|
mov w0, #20
|
|
ret
|
|
|
|
.section .hybmp$x, "yi"
|
|
.symidx func
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
.symidx func2
|
|
.symidx thunk2
|
|
.word 1 // entry thunk
|
|
|
|
.data
|
|
.rva func
|
|
.rva func2
|
|
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-icf-diff-thunk.s -o test-icf-diff-thunk.obj
|
|
// RUN: lld-link -machine:arm64ec -dll -noentry -out:out-icf-diff-thunk.dll loadcfg.obj test-icf-diff-thunk.obj
|
|
// RUN: llvm-objdump -d out-icf-diff-thunk.dll | FileCheck --check-prefix=ICF-DIFF-THUNK %s
|
|
|
|
// ICF-DIFF-THUNK: Disassembly of section .text:
|
|
// ICF-DIFF-THUNK-EMPTY:
|
|
// ICF-DIFF-THUNK-NEXT: 0000000180001000 <.text>:
|
|
// ICF-DIFF-THUNK-NEXT: 180001000: 00000015 udf #0x15
|
|
// ICF-DIFF-THUNK-NEXT: 180001004: 52800020 mov w0, #0x1 // =1
|
|
// ICF-DIFF-THUNK-NEXT: 180001008: d65f03c0 ret
|
|
// ICF-DIFF-THUNK-NEXT: 18000100c: 00000011 udf #0x11
|
|
// ICF-DIFF-THUNK-NEXT: 180001010: 52800020 mov w0, #0x1 // =1
|
|
// ICF-DIFF-THUNK-NEXT: 180001014: d65f03c0 ret
|
|
// ICF-DIFF-THUNK-NEXT: 180001018: 52800140 mov w0, #0xa // =10
|
|
// ICF-DIFF-THUNK-NEXT: 18000101c: d65f03c0 ret
|
|
// ICF-DIFF-THUNK-NEXT: 180001020: 52800280 mov w0, #0x14 // =20
|
|
// ICF-DIFF-THUNK-NEXT: 180001024: d65f03c0 ret
|
|
|
|
#--- test-icf-both.s
|
|
// Build two identical functions with identical entry thunks and check that they are merged by ICF.
|
|
|
|
.section .text,"xr",discard,func
|
|
.globl func
|
|
.p2align 2
|
|
func:
|
|
mov w0, #1
|
|
ret
|
|
|
|
.section .text,"xr",discard,func2
|
|
.globl func2
|
|
.p2align 2
|
|
func2:
|
|
mov w0, #1
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk
|
|
.globl thunk
|
|
.p2align 2
|
|
thunk:
|
|
mov w0, #10
|
|
ret
|
|
|
|
.section .wowthk$aa,"xr",discard,thunk2
|
|
.globl thunk2
|
|
.p2align 2
|
|
thunk2:
|
|
mov w0, #10
|
|
ret
|
|
|
|
.section .hybmp$x, "yi"
|
|
.symidx func
|
|
.symidx thunk
|
|
.word 1 // entry thunk
|
|
.symidx func2
|
|
.symidx thunk2
|
|
.word 1 // entry thunk
|
|
|
|
.data
|
|
.rva func
|
|
.rva func2
|
|
|
|
// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-icf-both.s -o test-icf-both.obj
|
|
// RUN: lld-link -machine:arm64ec -dll -noentry -out:out-icf-both.dll loadcfg.obj test-icf-both.obj
|
|
// RUN: llvm-objdump -d out-icf-both.dll | FileCheck --check-prefix=DISASM %s
|
|
|