mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
de5c9a8723
Summary: Funclet EH tables require that a given funclet have only one unwind destination for exceptional exits. The verifier will therefore reject e.g. two cleanuprets with different unwind dests for the same cleanup, or two invokes exiting the same funclet but to different unwind dests. Because catchswitch has no 'nounwind' variant, and because IR producers are not *required* to annotate calls which will not unwind as 'nounwind', it is legal to nest a call or an "unwind to caller" catchswitch within a funclet pad that has an unwind destination other than caller; it is undefined behavior for such a call or catchswitch to unwind. Normally when inlining an invoke, calls in the inlined sequence are rewritten to invokes that unwind to the callsite invoke's unwind destination, and "unwind to caller" catchswitches in the inlined sequence are rewritten to unwind to the callsite invoke's unwind destination. However, if such a call or "unwind to caller" catchswitch is located in a callee funclet that has another exceptional exit with an unwind destination within the callee, applying the normal transformation would give that callee funclet multiple unwind destinations for its exceptional exits. There would be no way for EH table generation to determine which is the "true" exit, and the verifier would reject the function accordingly. Add logic to the inliner to detect these cases and leave such calls and "unwind to caller" catchswitches as calls and "unwind to caller" catchswitches in the inlined sequence. This fixes PR26147. Reviewers: rnk, andrew.w.kaylor, majnemer Subscribers: alexcrichton, llvm-commits Differential Revision: http://reviews.llvm.org/D16319 llvm-svn: 258273 |
||
---|---|---|
.. | ||
X86 | ||
2003-09-14-InlineValue.ll | ||
2003-09-22-PHINodeInlineFail.ll | ||
2003-09-22-PHINodesInExceptionDest.ll | ||
2003-09-22-PHINodesInNormalInvokeDest.ll | ||
2003-10-13-AllocaDominanceProblem.ll | ||
2004-04-15-InlineDeletesCall.ll | ||
2004-04-20-InlineLinkOnce.ll | ||
2004-10-17-InlineFunctionWithoutReturn.ll | ||
2006-01-14-CallGraphUpdate.ll | ||
2006-07-12-InlinePruneCGUpdate.ll | ||
2006-11-09-InlineCGUpdate-2.ll | ||
2006-11-09-InlineCGUpdate.ll | ||
2007-04-15-InlineEH.ll | ||
2007-06-25-WeakInline.ll | ||
2007-12-19-InlineNoUnwind.ll | ||
2008-09-02-NoInline.ll | ||
2009-01-08-NoInlineDynamicAlloca.ll | ||
2009-01-13-RecursiveInlineCrash.ll | ||
2009-05-07-CallUsingSelfCrash.ll | ||
2010-05-12-ValueMap.ll | ||
align.ll | ||
alloca_test.ll | ||
alloca-bonus.ll | ||
alloca-dbgdeclare-merge.ll | ||
alloca-dbgdeclare.ll | ||
alloca-in-scc.ll | ||
alloca-merge-align.ll | ||
always-inline.ll | ||
array_merge.ll | ||
attributes.ll | ||
basictest.ll | ||
blockaddress.ll | ||
byval_lifetime.ll | ||
byval-tail-call.ll | ||
byval.ll | ||
callgraph-update.ll | ||
casts.ll | ||
cfg_preserve_test.ll | ||
crash2.ll | ||
crash-lifetime-marker.ll | ||
crash.ll | ||
debug-info-duplicate-calls.ll | ||
debug-invoke.ll | ||
delete-call.ll | ||
deopt-bundles.ll | ||
devirtualize-2.ll | ||
devirtualize-3.ll | ||
devirtualize.ll | ||
dynamic_alloca_test.ll | ||
ephemeral.ll | ||
externally_available.ll | ||
frameescape.ll | ||
gvn-inline-iteration.ll | ||
ignore-debug-info.ll | ||
inline_cleanup.ll | ||
inline_constprop.ll | ||
inline_dbg_declare.ll | ||
inline_dce.ll | ||
inline_invoke.ll | ||
inline_minisize.ll | ||
inline_prune.ll | ||
inline_returns_twice.ll | ||
inline_ssp.ll | ||
inline-assume.ll | ||
inline-byval-bonus.ll | ||
inline-cold-callee.ll | ||
inline-cold.ll | ||
inline-constexpr-addrspacecast-argument.ll | ||
inline-fast-math-flags.ll | ||
inline-fp.ll | ||
inline-funclets.ll | ||
inline-hot-callee.ll | ||
inline-indirect.ll | ||
inline-invoke-tail.ll | ||
inline-invoke-with-asm-call.ll | ||
inline-musttail-varargs.ll | ||
inline-optnone.ll | ||
inline-optsize.ll | ||
inline-tail.ll | ||
inline-vla.ll | ||
invoke_test-1.ll | ||
invoke_test-2.ll | ||
invoke_test-3.ll | ||
invoke-cleanup.ll | ||
invoke-combine-clauses.ll | ||
invoke-cost.ll | ||
lifetime-no-datalayout.ll | ||
lifetime.ll | ||
nested-inline.ll | ||
noalias2.ll | ||
noalias-calls.ll | ||
noalias-cs.ll | ||
noalias.ll | ||
noinline-recursive-fn.ll | ||
noinline.ll | ||
nonnull.ll | ||
null-function.ll | ||
optimization-remarks.ll | ||
pr21206.ll | ||
pr22285.ll | ||
PR4909.ll | ||
ptr-diff.ll | ||
recursive.ll | ||
store-sroa.ll | ||
switch.ll | ||
vector-bonus.ll | ||
zero-cost.ll |