Files
TheRock/compiler/amd-llvm/llvm/test/MC/COFF/seh-unwindv2.s
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

366 lines
11 KiB
ArmAsm

// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -u - | FileCheck %s
// CHECK: UnwindInformation [
.text
single_epilog_atend:
.seh_proc stack_alloc_no_pushes
.seh_unwindversion 2
subq $40, %rsp
.seh_stackalloc 40
.seh_endprologue
callq a
nop
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
retq
.seh_endproc
// CHECK-LABEL: StartAddress: single_epilog_atend
// CHECK-NEXT: EndAddress: single_epilog_atend +0xF
// CHECK-NEXT: UnwindInfoAddress: .xdata
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x0)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 4
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 3
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x01: EPILOG atend=yes, length=0x1
// CHECK-NEXT: 0x00: EPILOG padding
// CHECK-NEXT: 0x04: ALLOC_SMALL size=40
// CHECK-NEXT: ]
// CHECK-NEXT: }
single_epilog_notatend:
.seh_proc stack_alloc_no_pushes
.seh_unwindversion 2
subq $40, %rsp
.seh_stackalloc 40
.seh_endprologue
callq a
nop
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
retq
nop
.seh_endproc
// CHECK-LABEL: StartAddress: single_epilog_notatend
// CHECK-NEXT: EndAddress: single_epilog_notatend +0x10
// CHECK-NEXT: UnwindInfoAddress: .xdata +0xC
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x0)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 4
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 3
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x01: EPILOG atend=no, length=0x1
// CHECK-NEXT: 0x02: EPILOG offset=0x2
// CHECK-NEXT: 0x04: ALLOC_SMALL size=40
// CHECK-NEXT: ]
// CHECK-NEXT: }
multiple_epilogs:
.seh_proc multiple_epilogs
.seh_unwindversion 2
subq $40, %rsp
.seh_stackalloc 40
.seh_endprologue
callq c
testl %eax, %eax
jle .L_ELSE_1
movl %eax, %ecx
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
jmp c
.L_ELSE_1:
nop
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
jmp b
.seh_endproc
// CHECK-LABEL: StartAddress: multiple_epilogs
// CHECK-NEXT: EndAddress: multiple_epilogs +0x22
// CHECK-NEXT: UnwindInfoAddress: .xdata +0x18
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x0)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 4
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 5
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x01: EPILOG atend=no, length=0x1
// CHECK-NEXT: 0x05: EPILOG offset=0x5
// CHECK-NEXT: 0x0F: EPILOG offset=0xF
// CHECK-NEXT: 0x00: EPILOG padding
// CHECK-NEXT: 0x04: ALLOC_SMALL size=40
// CHECK-NEXT: ]
// CHECK-NEXT: }
mismatched_terminators:
.seh_proc mismatched_terminators
.seh_unwindversion 2
subq $40, %rsp
.seh_stackalloc 40
.seh_endprologue
callq b
testl %eax, %eax
jle .L_ELSE_1
# %bb.2:
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
jmp b
.L_ELSE_2:
nop
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
retq
.seh_endproc
// CHECK-LABEL: StartAddress: mismatched_terminators
// CHECK-NEXT: EndAddress: mismatched_terminators +0x1C
// CHECK-NEXT: UnwindInfoAddress: .xdata +0x28
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x0)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 4
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 3
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x01: EPILOG atend=yes, length=0x1
// CHECK-NEXT: 0x0B: EPILOG offset=0xB
// CHECK-NEXT: 0x04: ALLOC_SMALL size=40
// CHECK-NEXT: ]
// CHECK-NEXT: }
chained:
.seh_proc chained
.seh_unwindversion 2
subq $40, %rsp
.seh_stackalloc 40
.seh_endprologue
callq c
testl %eax, %eax
jle .L_ELSE_3
movl %eax, %ecx
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
jmp c
.seh_splitchained
.seh_endprologue
.L_ELSE_3:
nop
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
jmp b
.seh_endproc
// CHECK: RuntimeFunction {
// CHECK-NEXT: StartAddress: chained (0x30)
// CHECK-NEXT: EndAddress: chained [[EndDisp1:\+0x[A-F0-9]+]] (0x34)
// CHECK-NEXT: UnwindInfoAddress: .xdata [[InfoDisp1:\+0x[A-F0-9]+]] (0x38)
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x0)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 4
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 3
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x01: EPILOG atend=no, length=0x1
// CHECK-NEXT: 0x05: EPILOG offset=0x5
// CHECK-NEXT: 0x04: ALLOC_SMALL size=40
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: RuntimeFunction {
// CHECK-NEXT: StartAddress: chained [[EndDisp1]] (0x3C)
// CHECK-NEXT: EndAddress: chained +0x22 (0x40)
// CHECK-NEXT: UnwindInfoAddress: .xdata +0x40 (0x44)
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x4)
// CHECK-NEXT: ChainInfo (0x4)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 0
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 2
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x01: EPILOG atend=no, length=0x1
// CHECK-NEXT: 0x05: EPILOG offset=0x5
// CHECK-NEXT: ]
// CHECK-NEXT: Chained {
// CHECK-NEXT: StartAddress: chained (0x48)
// CHECK-NEXT: EndAddress: chained [[EndDisp1]] (0x4C)
// CHECK-NEXT: UnwindInfoAddress: .xdata [[InfoDisp1]] (0x50)
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: }
has_ex_handler_data:
.seh_proc has_ex_handler_data
.seh_handler __C_specific_handler, @unwind, @except
.seh_unwindversion 2
pushq %rbp
.seh_pushreg %rbp
subq $32, %rsp
.seh_stackalloc 32
leaq 32(%rsp), %rbp
.seh_setframe %rbp, 32
.seh_endprologue
.has_ex_handler_data_callsite:
callq *__imp_callme(%rip)
nop
.has_ex_handler_data_finish:
.seh_startepilogue
addq $32, %rsp
.seh_unwindv2start
popq %rbp
.seh_endepilogue
retq
.has_ex_handler_data_handler:
jmp .has_ex_handler_data_finish
.seh_handlerdata
.long 1 # Number of call sites
.long .has_ex_handler_data_callsite@IMGREL # LabelStart
.long .has_ex_handler_data_finish@IMGREL # LabelEnd
.long 1 # CatchAll
.long .has_ex_handler_data_handler@IMGREL # ExceptionHandler
.text
.seh_endproc
// CHECK-LABEL: StartAddress: has_ex_handler_data
// CHECK-NEXT: EndAddress: .has_ex_handler_data_handler +0x2
// CHECK-NEXT: UnwindInfoAddress: .xdata +0x54
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x3)
// CHECK-NEXT: ExceptionHandler (0x1)
// CHECK-NEXT: TerminateHandler (0x2)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 10
// CHECK-NEXT: FrameRegister: RBP
// CHECK-NEXT: FrameOffset: 0x2
// CHECK-NEXT: UnwindCodeCount: 5
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x02: EPILOG atend=no, length=0x2
// CHECK-NEXT: 0x04: EPILOG offset=0x4
// CHECK-NEXT: 0x0A: SET_FPREG reg=RBP, offset=0x20
// CHECK-NEXT: 0x05: ALLOC_SMALL size=32
// CHECK-NEXT: 0x01: PUSH_NONVOL reg=RBP
// CHECK-NEXT: ]
// CHECK-NEXT: Handler: __C_specific_handler
// CHECK-NEXT: }
has_ex_handler_data_and_chaining:
.seh_proc chained
.seh_handler __C_specific_handler, @unwind, @except
.seh_unwindversion 2
subq $40, %rsp
.seh_stackalloc 40
.seh_endprologue
callq c
testl %eax, %eax
jle .L_ELSE_4
.has_ex_handler_data_and_chaining_callsite:
callq *__imp_callme(%rip)
nop
.has_ex_handler_data_and_chaining_finish:
movl %eax, %ecx
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
jmp c
.seh_splitchained
.seh_endprologue
.L_ELSE_4:
nop
.seh_startepilogue
addq $40, %rsp
.seh_unwindv2start
.seh_endepilogue
jmp b
.has_ex_handler_data_and_chaining_handler:
jmp .has_ex_handler_data_and_chaining_finish
.seh_handlerdata
.long 1 # Number of call sites
.long .has_ex_handler_data_and_chaining_callsite@IMGREL # LabelStart
.long .has_ex_handler_data_and_chaining_finish@IMGREL # LabelEnd
.long 1 # CatchAll
.long .has_ex_handler_data_and_chaining_handler@IMGREL # ExceptionHandler
.text
.seh_endproc
// CHECK: RuntimeFunction {
// CHECK-NEXT: StartAddress: has_ex_handler_data_and_chaining (0x54)
// CHECK-NEXT: EndAddress: .has_ex_handler_data_and_chaining_finish [[EndDisp2:\+0x[A-F0-9]+]] (0x58)
// CHECK-NEXT: UnwindInfoAddress: .xdata [[InfoDisp2:\+0x[A-F0-9]+]] (0x5C)
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x3)
// CHECK-NEXT: ExceptionHandler (0x1)
// CHECK-NEXT: TerminateHandler (0x2)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 4
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 3
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x01: EPILOG atend=no, length=0x1
// CHECK-NEXT: 0x05: EPILOG offset=0x5
// CHECK-NEXT: 0x04: ALLOC_SMALL size=40
// CHECK-NEXT: ]
// CHECK-NEXT: Handler: __C_specific_handler
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: RuntimeFunction {
// CHECK-NEXT: StartAddress: .has_ex_handler_data_and_chaining_finish [[EndDisp2]] (0x60)
// CHECK-NEXT: EndAddress: .has_ex_handler_data_and_chaining_handler +0x2 (0x64)
// CHECK-NEXT: UnwindInfoAddress: .xdata +0xA0 (0x68)
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 2
// CHECK-NEXT: Flags [ (0x4)
// CHECK-NEXT: ChainInfo (0x4)
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 0
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 2
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x01: EPILOG atend=no, length=0x1
// CHECK-NEXT: 0x07: EPILOG offset=0x7
// CHECK-NEXT: ]
// CHECK-NEXT: Chained {
// CHECK-NEXT: StartAddress: has_ex_handler_data_and_chaining (0xA8)
// CHECK-NEXT: EndAddress: .has_ex_handler_data_and_chaining_finish [[EndDisp2]] (0xAC)
// CHECK-NEXT: UnwindInfoAddress: .xdata [[InfoDisp2]] (0xB0)
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: }