This reapplies 36c64af9d7 in updated
form.
Emit the xdata for each function at .seh_endproc. This keeps the
exact same output header order for most code generated by the LLVM
CodeGen layer. (Sections still change order for code built from
assembly where functions lack an explicit .seh_handlerdata
directive, and functions with chained unwind info.)
The practical effect should be that assembly output lacks
superfluous ".seh_handlerdata; .text" pairs at the end of functions
that don't handle exceptions, which allows such functions to use
the AArch64 packed unwind format again.
Differential Revision: https://reviews.llvm.org/D87448
122 lines
3.1 KiB
LLVM
122 lines
3.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=x86_64-windows-msvc < %s -mattr=-sse | FileCheck %s
|
|
; RUN: llc -mtriple=x86_64-windows-gnu < %s -mattr=-sse | FileCheck %s
|
|
|
|
define void @recv_double(double %v, double* %p) {
|
|
; CHECK-LABEL: recv_double:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: movq %rcx, (%rdx)
|
|
; CHECK-NEXT: retq
|
|
store double %v, double* %p
|
|
ret void
|
|
}
|
|
|
|
define void @recv_float(float %v, float* %p) {
|
|
; CHECK-LABEL: recv_float:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: movl %ecx, (%rdx)
|
|
; CHECK-NEXT: retq
|
|
store float %v, float* %p
|
|
ret void
|
|
}
|
|
|
|
define dso_local double @ret_double(double* %p) {
|
|
; CHECK-LABEL: ret_double:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movq (%rcx), %rax
|
|
; CHECK-NEXT: retq
|
|
entry:
|
|
%v = load double, double* %p
|
|
ret double %v
|
|
}
|
|
|
|
define dso_local float @ret_float(float* %p) {
|
|
; CHECK-LABEL: ret_float:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movl (%rcx), %eax
|
|
; CHECK-NEXT: retq
|
|
entry:
|
|
%v = load float, float* %p
|
|
ret float %v
|
|
}
|
|
|
|
declare void @take_double(double)
|
|
declare void @take_float(float)
|
|
|
|
define void @pass_double(double* %p) {
|
|
; CHECK-LABEL: pass_double:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: subq $40, %rsp
|
|
; CHECK-NEXT: .seh_stackalloc 40
|
|
; CHECK-NEXT: .seh_endprologue
|
|
; CHECK-NEXT: movq (%rcx), %rcx
|
|
; CHECK-NEXT: callq take_double
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: addq $40, %rsp
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: .seh_endproc
|
|
%v = load double, double* %p
|
|
call void @take_double(double %v)
|
|
ret void
|
|
}
|
|
|
|
define void @pass_float(float* %p) {
|
|
; CHECK-LABEL: pass_float:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: subq $40, %rsp
|
|
; CHECK-NEXT: .seh_stackalloc 40
|
|
; CHECK-NEXT: .seh_endprologue
|
|
; CHECK-NEXT: movl (%rcx), %ecx
|
|
; CHECK-NEXT: callq take_float
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: addq $40, %rsp
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: .seh_endproc
|
|
%v = load float, float* %p
|
|
call void @take_float(float %v)
|
|
ret void
|
|
}
|
|
|
|
declare double @produce_double()
|
|
declare float @produce_float()
|
|
|
|
define void @call_double(double* %p) {
|
|
; CHECK-LABEL: call_double:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: pushq %rsi
|
|
; CHECK-NEXT: .seh_pushreg %rsi
|
|
; CHECK-NEXT: subq $32, %rsp
|
|
; CHECK-NEXT: .seh_stackalloc 32
|
|
; CHECK-NEXT: .seh_endprologue
|
|
; CHECK-NEXT: movq %rcx, %rsi
|
|
; CHECK-NEXT: callq produce_double
|
|
; CHECK-NEXT: movq %rax, (%rsi)
|
|
; CHECK-NEXT: addq $32, %rsp
|
|
; CHECK-NEXT: popq %rsi
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: .seh_endproc
|
|
%v = call double @produce_double()
|
|
store double %v, double* %p
|
|
ret void
|
|
}
|
|
|
|
define void @call_float(float* %p) {
|
|
; CHECK-LABEL: call_float:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: pushq %rsi
|
|
; CHECK-NEXT: .seh_pushreg %rsi
|
|
; CHECK-NEXT: subq $32, %rsp
|
|
; CHECK-NEXT: .seh_stackalloc 32
|
|
; CHECK-NEXT: .seh_endprologue
|
|
; CHECK-NEXT: movq %rcx, %rsi
|
|
; CHECK-NEXT: callq produce_float
|
|
; CHECK-NEXT: movl %eax, (%rsi)
|
|
; CHECK-NEXT: addq $32, %rsp
|
|
; CHECK-NEXT: popq %rsi
|
|
; CHECK-NEXT: retq
|
|
; CHECK-NEXT: .seh_endproc
|
|
%v = call float @produce_float()
|
|
store float %v, float* %p
|
|
ret void
|
|
}
|