зеркало из https://github.com/microsoft/clang-1.git
When emitting blocks, keep track of which cleanup scope they have. Minor fixes and cleanup.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64053 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
69c68b7454
Коммит
bd6fa3d032
|
@ -188,6 +188,12 @@ void CodeGenFunction::EmitBlock(llvm::BasicBlock *BB, bool IsFinished) {
|
|||
return;
|
||||
}
|
||||
|
||||
// If necessary, associate the block with the cleanup stack size.
|
||||
if (!CleanupEntries.empty()) {
|
||||
BlockScopes[BB] = CleanupEntries.size() - 1;
|
||||
CleanupEntries.back().Blocks.push_back(BB);
|
||||
}
|
||||
|
||||
CurFn->getBasicBlockList().push_back(BB);
|
||||
Builder.SetInsertPoint(BB);
|
||||
}
|
||||
|
|
|
@ -119,7 +119,11 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
|
|||
|
||||
assert(BreakContinueStack.empty() &&
|
||||
"mismatched push/pop in break/continue stack!");
|
||||
|
||||
assert(BlockScopes.empty() &&
|
||||
"did not remove all blocks from block scope map!");
|
||||
assert(CleanupEntries.empty() &&
|
||||
"mismatched push/pop in cleanup stack!");
|
||||
|
||||
// Emit function epilog (to return).
|
||||
EmitReturnBlock();
|
||||
|
||||
|
@ -537,8 +541,22 @@ void CodeGenFunction::EmitCleanupBlock()
|
|||
|
||||
llvm::BasicBlock *CleanupBlock = CE.CleanupBlock;
|
||||
|
||||
std::vector<llvm::BasicBlock *> Blocks;
|
||||
std::swap(Blocks, CE.Blocks);
|
||||
|
||||
std::vector<llvm::BranchInst *> BranchFixups;
|
||||
std::swap(BranchFixups, CE.BranchFixups);
|
||||
|
||||
CleanupEntries.pop_back();
|
||||
|
||||
EmitBlock(CleanupBlock);
|
||||
|
||||
// Remove all blocks from the block scope map.
|
||||
for (size_t i = 0, e = Blocks.size(); i != e; ++i) {
|
||||
assert(BlockScopes.count(Blocks[i]) &&
|
||||
"Did not find block in scope map!");
|
||||
|
||||
BlockScopes.erase(Blocks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -253,11 +253,22 @@ private:
|
|||
|
||||
explicit CleanupEntry(llvm::BasicBlock *cb)
|
||||
: CleanupBlock(cb) {}
|
||||
|
||||
~CleanupEntry() {
|
||||
assert(Blocks.empty() && "Did not empty blocks!");
|
||||
assert(BranchFixups.empty() && "Did not empty branch fixups!");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/// CleanupEntries - Stack of cleanup entries.
|
||||
llvm::SmallVector<CleanupEntry, 8> CleanupEntries;
|
||||
|
||||
typedef llvm::DenseMap<llvm::BasicBlock*, size_t> BlockScopeMap;
|
||||
|
||||
/// BlockScopes - Map of which "cleanup scope" scope basic blocks have.
|
||||
BlockScopeMap BlockScopes;
|
||||
|
||||
public:
|
||||
CodeGenFunction(CodeGenModule &cgm);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче