llvm/llvm/test/CodeGen/X86/seh-unwind-inline-asm-codegen.ll

; RUN: llc < %s | FileCheck %s

target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.28.29914"

@str = private unnamed_addr constant [6 x i8] c"Boom!\00", align 1

define dso_local void @trap() {
entry:
  unreachable
}

define dso_local void @test() personality ptr @__CxxFrameHandler3 {
entry:

; CHECK-LABEL: .Ltmp0:
; CHECK: callq  trap
; CHECK-LABEL: .Ltmp1:

  invoke void asm sideeffect unwind "call trap", "~{dirflag},~{fpsr},~{flags}"()
          to label %exit unwind label %except

exit:
  ret void

except:

; CHECK-LABEL: "?dtor$2@?0?test@4HA":
; CHECK: callq	printf

  %0 = cleanuppad within none []
  call void (ptr, ...) @printf(ptr @str) [ "funclet"(token %0) ]
  cleanupret from %0 unwind to caller
}

declare dso_local i32 @__CxxFrameHandler3(...)

declare dso_local void @printf(ptr, ...)

; SEH Table

; CHECK-LABEL: $cppxdata$test:
; CHECK-NEXT:    .long    429065506                       # MagicNumber
; CHECK-NEXT:    .long    1                               # MaxState
; CHECK-NEXT:    .long    ($stateUnwindMap$test)@IMGREL   # UnwindMap
; CHECK-NEXT:    .long    0                               # NumTryBlocks
; CHECK-NEXT:    .long    0                               # TryBlockMap
; CHECK-NEXT:    .long    3                               # IPMapEntries
; CHECK-NEXT:    .long    ($ip2state$test)@IMGREL         # IPToStateXData
; CHECK-NEXT:    .long    40                              # UnwindHelp
; CHECK-NEXT:    .long    0                               # ESTypeList
; CHECK-NEXT:    .long    1                               # EHFlags
; CHECK-NEXT:$stateUnwindMap$test:
; CHECK-NEXT:    .long    -1                              # ToState
; CHECK-NEXT:    .long    "?dtor$2@?0?test@4HA"@IMGREL    # Action
; CHECK-NEXT:$ip2state$test:
; CHECK-NEXT:    .long    .Lfunc_begin0@IMGREL            # IP
; CHECK-NEXT:    .long    -1                              # ToState
; CHECK-NEXT:    .long    .Ltmp0@IMGREL+1                 # IP
; CHECK-NEXT:    .long    0                               # ToState
; CHECK-NEXT:    .long    .Ltmp1@IMGREL+1                 # IP
; CHECK-NEXT:    .long    -1                              # ToState