From f256e04534c85bab1452837b7d93c13a56ed23e8 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Fri, 22 Aug 2014 21:37:04 +0000 Subject: [PATCH] DebugInfo: Scope for condition variables more narrowly than the loop variable. for loops introduce two scopes - one for the outer loop variable and its initialization, and another for the body of the loop, including any variable declared inside the loop condition. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216288 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGStmt.cpp | 11 +----- lib/CodeGen/CodeGenFunction.h | 2 +- test/CodeGenCXX/debug-info-scope.cpp | 59 +++++++++++++++++----------- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 1395d60ab0..de3b795fc2 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -810,11 +810,7 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S, const ArrayRef &ForAttrs) { JumpDest LoopExit = getJumpDestInCurrentScope("for.end"); - RunCleanupsScope ForScope(*this); - - CGDebugInfo *DI = getDebugInfo(); - if (DI) - DI->EmitLexicalBlockStart(Builder, S.getSourceRange().getBegin()); + LexicalScope ForScope(*this, S.getSourceRange()); // Evaluate the first part before the loop. if (S.getInit()) @@ -842,7 +838,7 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S, BreakContinueStack.push_back(BreakContinue(LoopExit, Continue)); // Create a cleanup scope for the condition variable cleanups. - RunCleanupsScope ConditionScope(*this); + LexicalScope ConditionScope(*this, S.getSourceRange()); if (S.getCond()) { // If the for statement has a condition scope, emit the local variable @@ -902,9 +898,6 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S, ForScope.ForceCleanup(); - if (DI) - DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd()); - LoopStack.pop(); // Emit the fall-through block. diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 04294ec8e5..6d21e78bf2 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -535,7 +535,7 @@ public: } }; - class LexicalScope: protected RunCleanupsScope { + class LexicalScope : public RunCleanupsScope { SourceRange Range; SmallVector Labels; LexicalScope *ParentScope; diff --git a/test/CodeGenCXX/debug-info-scope.cpp b/test/CodeGenCXX/debug-info-scope.cpp index 0447dc04d5..58195e3778 100644 --- a/test/CodeGenCXX/debug-info-scope.cpp +++ b/test/CodeGenCXX/debug-info-scope.cpp @@ -3,30 +3,45 @@ // Two variables with the same name in subsequent if staments need to be in separate scopes. // // rdar://problem/14024005 -// -int printf(const char*, ...); +int src(); -char *return_char (int input) -{ - if (input%2 == 0) - return "I am even.\n"; - else - return "I am odd.\n"; -} +void f(); -int main2() { -// CHECK: [ DW_TAG_auto_variable ] [ptr] [line [[@LINE+2]]] -// CHECK: metadata !{i32 {{.*}}, metadata !{{.*}}, i32 [[@LINE+1]], {{.*}}} ; [ DW_TAG_lexical_block ] - if (char *ptr = return_char(1)) { - printf ("%s", ptr); - } -// CHECK: [ DW_TAG_auto_variable ] [ptr] [line [[@LINE+2]]] -// CHECK: metadata !{i32 {{.*}}, metadata !{{.*}}, i32 [[@LINE+1]], {{.*}}} ; [ DW_TAG_lexical_block ] - if (char *ptr = return_char(2)) { - printf ("%s", ptr); - } - else printf ("%s", ptr); +void func() { + // CHECK: = metadata !{i32 786688, metadata [[IF1:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE+2]]] + // CHECK: [[IF1]] = metadata !{i32 {{.*}}, metadata !{{.*}}, i32 [[@LINE+1]], {{.*}}} ; [ DW_TAG_lexical_block ] + if (int i = src()) + f(); - return 0; + // CHECK: = metadata !{i32 786688, metadata [[IF2:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE+2]]] + // CHECK: [[IF2]] = metadata !{i32 {{.*}}, metadata !{{.*}}, i32 [[@LINE+1]], {{.*}}} ; [ DW_TAG_lexical_block ] + if (int i = src()) { + f(); + } else + f(); + + // CHECK: = metadata !{i32 786688, metadata [[FOR:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE+2]]] + // CHECK: [[FOR]] = metadata !{i32 {{.*}}, metadata !{{.*}}, i32 [[@LINE+1]], {{.*}}} ; [ DW_TAG_lexical_block ] + for (int i = 0; + // CHECK: = metadata !{i32 786688, metadata [[FOR_BODY:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [b] [line [[@LINE+6]]] + // The scope could be located at 'bool b', but LLVM drops line information for + // scopes anyway, so it's not terribly important. + // FIXME: change the debug info schema to not include locations of scopes, + // since they're not used. + // CHECK: [[FOR_BODY]] = metadata !{i32 {{.*}}, metadata [[FOR]], i32 [[@LINE-6]], {{.*}}} ; [ DW_TAG_lexical_block ] + bool b = i != 10; ++i) + f(); + + // CHECK: = metadata !{i32 786688, metadata [[FOR:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE+2]]] + // CHECK: [[FOR]] = metadata !{i32 {{.*}}, metadata !{{.*}}, i32 [[@LINE+1]], {{.*}}} ; [ DW_TAG_lexical_block ] + for (int i = 0; i != 10; ++i) { + // FIXME: Do not include scopes that have only other scopes (and no variables + // or using declarations) as direct children, they just waste + // space/relocations/etc. + // CHECK: [[FOR_BODY:![0-9]*]] = metadata !{i32 {{.*}}, metadata [[FOR]], i32 [[@LINE-4]], {{.*}}} ; [ DW_TAG_lexical_block ] + // CHECK: = metadata !{i32 786688, metadata [[FOR_COMPOUND:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [b] [line [[@LINE+2]]] + // CHECK: [[FOR_COMPOUND]] = metadata !{i32 {{.*}}, metadata [[FOR_BODY]], i32 [[@LINE-6]], {{.*}}} ; [ DW_TAG_lexical_block ] + bool b = i % 2; + } } -- 2.50.1