From 017460ab6c6550395e17763bd62d449586f79ab9 Mon Sep 17 00:00:00 2001 From: Mike Stump Date: Thu, 1 Oct 2009 22:29:41 +0000 Subject: [PATCH] Implement a FIXME. This improves codegen just a tad. llvm-svn: 83221 --- clang/lib/CodeGen/CGBlocks.cpp | 21 +++++++++++---------- clang/lib/CodeGen/CGDebugInfo.cpp | 4 ++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index ba14fea36e05..79950e8c6beb 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -663,20 +663,23 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr, StartFunction(BD, ResultType, Fn, Args, BExpr->getBody()->getLocEnd()); - // Save a spot to insert the debug information for all the BlockDeclRefDecls. - llvm::BasicBlock *entry = Builder.GetInsertBlock(); - 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); + + // Save a spot to insert the debug information for all the BlockDeclRefDecls. + llvm::BasicBlock *entry = Builder.GetInsertBlock(); + llvm::BasicBlock::iterator entry_ptr = Builder.GetInsertPoint(); + --entry_ptr; + EmitStmt(BExpr->getBody()); + // Remember where we were... llvm::BasicBlock *resume = Builder.GetInsertBlock(); + // Go back to the entry. - Builder.SetInsertPoint(entry); + ++entry_ptr; + Builder.SetInsertPoint(entry, entry_ptr); + if (CGDebugInfo *DI = getDebugInfo()) { // Emit debug information for all the BlockDeclRefDecls. for (unsigned i=0; i < BlockDeclRefDecls.size(); ++i) { @@ -691,8 +694,6 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr, } } } - // And now go back to the body - EmitBlock(body); // And resume where we left off. if (resume == 0) Builder.ClearInsertionPoint(); diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 645125667c9a..0b386841f19d 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1088,7 +1088,7 @@ void CGDebugInfo::EmitDeclare(const BlockDeclRefExpr *BDRE, unsigned Tag, // The llvm optimizer and code generator are not yet ready to support // optimized code debugging. const CompileOptions &CO = M->getCompileOpts(); - if (CO.OptimizationLevel) + if (CO.OptimizationLevel || Builder.GetInsertBlock() == 0) return; uint64_t XOffset = 0; @@ -1269,7 +1269,7 @@ void CGDebugInfo::EmitDeclare(const BlockDeclRefExpr *BDRE, unsigned Tag, Decl->getNameAsString(), Unit, Line, Ty, addr); // Insert an llvm.dbg.declare into the current block. - DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertBlock()); + DebugFactory.InsertDeclare(Storage, D, Builder.GetInsertPoint()); } void CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *Decl,