diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 19 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 4 |
2 files changed, 12 insertions, 11 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index ba14fea36e..79950e8c6b 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -663,20 +663,23 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr, StartFunction(BD, ResultType, Fn, Args, BExpr->getBody()->getLocEnd()); + CurFuncDecl = OuterFuncDecl; + CurCodeDecl = BD; + // 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; - 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); + ++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/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 645125667c..0b386841f1 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/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, |