mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-19 11:41:53 +00:00
[WinEH] Don't emit state stores or EH thunks for available_externally functions
The exception handler thunk needs to reference the LSDA of the parent function, which won't be emitted if it's available_externally. Fixes PR35736. ThinLTO ends up producing available_externally functions that use _CxxFrameHandler3. llvm-svn: 321532
This commit is contained in:
parent
7c317a7d2d
commit
879fd24edc
@ -149,6 +149,12 @@ void WinEHStatePass::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
}
|
||||
|
||||
bool WinEHStatePass::runOnFunction(Function &F) {
|
||||
// Don't insert state stores or exception handler thunks for
|
||||
// available_externally functions. The handler needs to reference the LSDA,
|
||||
// which will not be emitted in this case.
|
||||
if (F.hasAvailableExternallyLinkage())
|
||||
return false;
|
||||
|
||||
// Check the personality. Do nothing if this personality doesn't use funclets.
|
||||
if (!F.hasPersonalityFn())
|
||||
return false;
|
||||
|
28
test/CodeGen/X86/win32-eh-available-externally.ll
Normal file
28
test/CodeGen/X86/win32-eh-available-externally.ll
Normal file
@ -0,0 +1,28 @@
|
||||
; RUN: opt -S -x86-winehstate < %s | FileCheck %s --check-prefix=IR
|
||||
; RUN: llc < %s | FileCheck %s --check-prefix=ASM
|
||||
|
||||
; IR-NOT: define.*__ehhandler
|
||||
; IR: define available_externally void @foo(void ()*)
|
||||
; IR-NOT: define.*__ehhandler
|
||||
|
||||
; No code should be emitted.
|
||||
; ASM-NOT: __ehtable
|
||||
; ASM-NOT: __ehhandler
|
||||
|
||||
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
|
||||
target triple = "i686-pc-windows-msvc"
|
||||
|
||||
declare i32 @__CxxFrameHandler3(...) unnamed_addr
|
||||
|
||||
define available_externally void @foo(void ()*) personality i32 (...)* @__CxxFrameHandler3 {
|
||||
start:
|
||||
invoke void %0()
|
||||
to label %good unwind label %bad
|
||||
|
||||
good: ; preds = %start
|
||||
ret void
|
||||
|
||||
bad: ; preds = %start
|
||||
%cleanuppad = cleanuppad within none []
|
||||
cleanupret from %cleanuppad unwind to caller
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user