Skip to content

Commit

Permalink
Fix inlining to not lose the "cleanup" clause from landingpads
Browse files Browse the repository at this point in the history
This fixes PR17872.  This bug can lead to C++ destructors not being
called when they should be, when an exception is thrown.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196711 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Mark Seaborn committed Dec 8, 2013
1 parent 615f9b7 commit 34005c9
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/Transforms/Utils/InlineFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,8 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
InlinedLPad->reserveClauses(OuterNum);
for (unsigned OuterIdx = 0; OuterIdx != OuterNum; ++OuterIdx)
InlinedLPad->addClause(OuterLPad->getClause(OuterIdx));
if (OuterLPad->isCleanup())
InlinedLPad->setCleanup(true);
}

for (Function::iterator BB = FirstNewBlock, E = Caller->end(); BB != E; ++BB){
Expand Down
39 changes: 39 additions & 0 deletions test/Transforms/Inline/invoke-cleanup.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
; RUN: opt %s -inline -S | FileCheck %s

declare void @external_func()

@exception_type1 = external global i8
@exception_type2 = external global i8


define internal void @inner() {
invoke void @external_func()
to label %cont unwind label %lpad
cont:
ret void
lpad:
%lp = landingpad i32 personality i8* null
catch i8* @exception_type1
resume i32 %lp
}

; Test that the "cleanup" clause is kept when inlining @inner() into
; this call site (PR17872), otherwise C++ destructors will not be
; called when they should be.

define void @outer() {
invoke void @inner()
to label %cont unwind label %lpad
cont:
ret void
lpad:
%lp = landingpad i32 personality i8* null
cleanup
catch i8* @exception_type2
resume i32 %lp
}
; CHECK: define void @outer
; CHECK: landingpad
; CHECK-NEXT: cleanup
; CHECK-NEXT: catch i8* @exception_type1
; CHECK-NEXT: catch i8* @exception_type2

0 comments on commit 34005c9

Please sign in to comment.