A couple of refinements for laying out debug information for

BlockDeclRefDecls.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83185 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mike Stump 2009-10-01 00:27:30 +00:00
Родитель 9aeed32282
Коммит de8c5c77e2
1 изменённых файлов: 15 добавлений и 12 удалений

Просмотреть файл

@ -665,21 +665,20 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr,
// Save a spot to insert the debug information for all the BlockDeclRefDecls.
llvm::BasicBlock *entry = Builder.GetInsertBlock();
llvm::BasicBlock::iterator entry_ptr = Builder.GetInsertPoint();
CurFuncDecl = OuterFuncDecl;
CurCodeDecl = BD;
// FIXME: Can we straighten this out not using multiple basic blocks?
// Set body aside for now.
llvm::BasicBlock *body = createBasicBlock("body");
Builder.SetInsertPoint(body);
EmitStmt(BExpr->getBody());
// Remember where we were...
llvm::BasicBlock *resume = Builder.GetInsertBlock();
// Go back to the entry.
Builder.SetInsertPoint(entry);
if (CGDebugInfo *DI = getDebugInfo()) {
llvm::BasicBlock *end = Builder.GetInsertBlock();
llvm::BasicBlock::iterator end_ptr = Builder.GetInsertPoint();
// Emit debug information for all the BlockDeclRefDecls.
// First, go back to the entry...
Builder.SetInsertPoint(entry, entry_ptr);
// And then insert the debug information..
for (unsigned i=0; i < BlockDeclRefDecls.size(); ++i) {
const Expr *E = BlockDeclRefDecls[i];
const BlockDeclRefExpr *BDRE = dyn_cast<BlockDeclRefExpr>(E);
@ -691,10 +690,14 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr,
Builder, this);
}
}
// Then go back to the end, and we're done.
Builder.SetInsertPoint(end, end_ptr);
}
// And now go back to the body
EmitBlock(body);
// And resume where we left off.
if (resume == 0)
Builder.ClearInsertionPoint();
else
Builder.SetInsertPoint(resume);
FinishFunction(cast<CompoundStmt>(BExpr->getBody())->getRBracLoc());