diff options
author | Anders Carlsson <andersca@mac.com> | 2009-03-17 05:53:35 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-03-17 05:53:35 +0000 |
commit | 0ae7b2b2f964bd6145d65ef52dc2a28025b2bd06 (patch) | |
tree | a660bcfa23438a39c2736d511427b549e1c3fc2c | |
parent | 4598ffab57ba948a323b0877d3d35b7d71d27a4c (diff) |
Initialize the cleanup.dst variable if necessary. Fixes PR3789.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67075 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CodeGenFunction.cpp | 11 | ||||
-rw-r--r-- | test/CodeGen/cleanup-stack.c | 15 |
2 files changed, 23 insertions, 3 deletions
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index a54f9bd235..441c9fcdbf 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -549,7 +549,7 @@ CodeGenFunction::CleanupBlockInfo CodeGenFunction::PopCleanupBlock() EndBlock = createBasicBlock("cleanup.end"); llvm::BasicBlock *CurBB = Builder.GetInsertBlock(); - + Builder.SetInsertPoint(SwitchBlock); llvm::Value *DestCodePtr = CreateTempAlloca(llvm::Type::Int32Ty, @@ -561,9 +561,14 @@ CodeGenFunction::CleanupBlockInfo CodeGenFunction::PopCleanupBlock() BranchFixups.size()); // Restore the current basic block (if any) - if (CurBB) + if (CurBB) { Builder.SetInsertPoint(CurBB); - else + + // If we had a current basic block, we also need to emit an instruction + // to initialize the cleanup destination. + Builder.CreateStore(llvm::Constant::getNullValue(llvm::Type::Int32Ty), + DestCodePtr); + } else Builder.ClearInsertionPoint(); for (size_t i = 0, e = BranchFixups.size(); i != e; ++i) { diff --git a/test/CodeGen/cleanup-stack.c b/test/CodeGen/cleanup-stack.c new file mode 100644 index 0000000000..360f6e701b --- /dev/null +++ b/test/CodeGen/cleanup-stack.c @@ -0,0 +1,15 @@ +// RUN: clang -emit-llvm %s -o %t && +// RUN: grep "store i32 0, i32* %cleanup" %t | count 2 +void f(int n) { + int a[n]; + + { + int b[n]; + + if (n) + return; + } + + if (n) + return; +} |