From: Eric Christopher Date: Wed, 11 Jul 2012 01:49:26 +0000 (+0000) Subject: The end of a block doesn't necessarily need a line table entry unless X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3d40f96394fb30b70ba83bdfd10f3ed69530b0e5;p=clang The end of a block doesn't necessarily need a line table entry unless there's something going on there. Remove the unconditional line entry and only add one if we're emitting cleanups (any other statements would be handled normally). Fixes rdar://9199234 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160033 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index c604e56539..11a5ddc7ce 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -2135,10 +2135,6 @@ void CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder, SourceLocation Loc /// region - end of a DW_TAG_lexical_block. void CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder, SourceLocation Loc) { assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); - - // Provide an entry in the line table for the end of the block. - EmitLocation(Builder, Loc); - LexicalBlockStack.pop_back(); } diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index b737a9ed7a..8740fd06df 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -854,8 +854,11 @@ public: /// cleanups. ~LexicalScope() { if (PopDebugStack) { - CGDebugInfo *DI = CGF.getDebugInfo(); - if (DI) DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd()); + if (CGDebugInfo *DI = CGF.getDebugInfo()) { + if (RunCleanupsScope::requiresCleanups()) + DI->EmitLocation(CGF.Builder, Range.getEnd()); + DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd()); + } } } @@ -864,6 +867,8 @@ public: void ForceCleanup() { RunCleanupsScope::ForceCleanup(); if (CGDebugInfo *DI = CGF.getDebugInfo()) { + if (RunCleanupsScope::requiresCleanups()) + DI->EmitLocation(CGF.Builder, Range.getEnd()); DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd()); PopDebugStack = false; } diff --git a/test/CodeGen/debug-info-block-end.c b/test/CodeGen/debug-info-block-end.c new file mode 100644 index 0000000000..72e8868bb4 --- /dev/null +++ b/test/CodeGen/debug-info-block-end.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -g -S -emit-llvm %s -o - | FileCheck %s + +int bar(); + +int foo(int i) { + int j = 0; + if (i) { + j = bar(); + } + else { + j = bar() + 2; + } + return j; +} + +// Make sure we don't have a line table entry for a block with no cleanups. +// CHECK-NOT: i32 9, i32 3, metadata