1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-28 06:22:51 +01:00
llvm-mirror/test/CodeGen/X86/cppeh-nounwind.ll
Reid Kleckner e4008eaff3 [WinEH] Emit the LSDA even if no lpads remain but outlining occurred
The outlined funclets call intrinsics which reference labels from the
LSDA. This situation can easily arise in small functions with a single
cleanup at -O0, where Clang marks a definition as nounwind, and then
WinEHPrepare "discovers" that the landingpad is dead by accident and
deletes it.

We now need to ask the LLVM IR Function for it's personality directly,
rather than going through MachineModuleInfo.

Fixes PR23892.

llvm-svn: 242063
2015-07-13 20:41:46 +00:00

36 lines
989 B
LLVM

; RUN: llc -mtriple=i686-pc-windows-msvc < %s | FileCheck %s
; Sometimes invokes of nounwind functions make it through to CodeGen, especially
; at -O0, where Clang sometimes optimistically annotates functions as nounwind.
; WinEHPrepare ends up outlining functions, and emitting references to LSDA
; labels. Make sure we emit the LSDA in that case.
declare i32 @__CxxFrameHandler3(...)
declare void @nounwind_func() nounwind
declare void @cleanup()
define void @should_emit_tables() personality i32 (...)* @__CxxFrameHandler3 {
entry:
invoke void @nounwind_func()
to label %done unwind label %lpad
done:
ret void
lpad:
%vals = landingpad { i8*, i32 }
cleanup
call void @cleanup()
resume { i8*, i32 } %vals
}
; CHECK: _should_emit_tables:
; CHECK: calll _nounwind_func
; CHECK: retl
; CHECK: L__ehtable$should_emit_tables:
; CHECK: ___ehhandler$should_emit_tables:
; CHECK: movl $L__ehtable$should_emit_tables, %eax
; CHECK: jmp ___CxxFrameHandler3 # TAILCALL