forked from OSchip/llvm-project
Debug info: An if condition now creates a lexical scope of its own.
Two variables with the same name declared in two if conditions in the same scope are no longer coalesced into one. rdar://problem/14024005 llvm-svn: 183597
This commit is contained in:
parent
ae9d8e21d6
commit
0ffce6ec99
clang
|
@ -419,6 +419,11 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
|
|||
// unequal to 0. The condition must be a scalar type.
|
||||
RunCleanupsScope ConditionScope(*this);
|
||||
|
||||
// Also open a debugger-visible lexical scope for the condition.
|
||||
CGDebugInfo *DI = getDebugInfo();
|
||||
if (DI)
|
||||
DI->EmitLexicalBlockStart(Builder, S.getSourceRange().getBegin());
|
||||
|
||||
if (S.getConditionVariable())
|
||||
EmitAutoVarDecl(*S.getConditionVariable());
|
||||
|
||||
|
@ -439,6 +444,8 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
|
|||
RunCleanupsScope ExecutedScope(*this);
|
||||
EmitStmt(Executed);
|
||||
}
|
||||
if (DI)
|
||||
DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -476,6 +483,9 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
|
|||
EmitBranch(ContBlock);
|
||||
}
|
||||
|
||||
if (DI)
|
||||
DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd());
|
||||
|
||||
// Emit the continuation block for code after the if.
|
||||
EmitBlock(ContBlock, true);
|
||||
}
|
||||
|
|
|
@ -50,8 +50,9 @@ int func(bool b) {
|
|||
// CHECK: [[M1]] = metadata !{i32 {{[0-9]*}}, metadata [[CTXT]], metadata [[NS]], i32 9} ; [ DW_TAG_imported_module ]
|
||||
// CHECK: [[M2]] = metadata !{i32 {{[0-9]*}}, metadata [[CU]], metadata [[CTXT]], i32 12} ; [ DW_TAG_imported_module ]
|
||||
// CHECK: [[M3]] = metadata !{i32 {{[0-9]*}}, metadata [[CU]], metadata [[CTXT]], i32 13, metadata !"E"} ; [ DW_TAG_imported_module ]
|
||||
// CHECK: [[M4]] = metadata !{i32 {{[0-9]*}}, metadata [[LEX:![0-9]*]], metadata [[NS]], i32 17} ; [ DW_TAG_imported_module ]
|
||||
// CHECK: [[LEX]] = metadata !{i32 {{[0-9]*}}, metadata [[FILE2]], metadata [[FUNC]], i32 16, i32 0, i32 0} ; [ DW_TAG_lexical_block ]
|
||||
// CHECK: [[M4]] = metadata !{i32 {{[0-9]*}}, metadata [[LEX2:![0-9]*]], metadata [[NS]], i32 17} ; [ DW_TAG_imported_module ]
|
||||
// CHECK: [[LEX2]] = metadata !{i32 {{[0-9]*}}, metadata [[FILE2]], metadata [[LEX1:![0-9]+]], i32 16, i32 0, i32 {{.*}}} ; [ DW_TAG_lexical_block ]
|
||||
// CHECK: [[LEX1]] = metadata !{i32 {{[0-9]*}}, metadata [[FILE2]], metadata [[FUNC]], i32 16, i32 0, i32 {{.*}}} ; [ DW_TAG_lexical_block ]
|
||||
// CHECK: [[M5]] = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], metadata [[CTXT]], i32 20} ; [ DW_TAG_imported_module ]
|
||||
// CHECK: [[M6]] = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], metadata [[FOO:![0-9]*]], i32 21} ; [ DW_TAG_imported_declaration ]
|
||||
// CHECK: [[FOO]] {{.*}} ; [ DW_TAG_structure_type ] [foo] [line 5, size 0, align 0, offset 0] [fwd] [from ]
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
// RUN: %clang_cc1 -g -emit-llvm %s -o -| FileCheck %s
|
||||
//
|
||||
// Two variables with the same name in subsequent if staments need to be in separate scopes.
|
||||
//
|
||||
// rdar://problem/14024005
|
||||
//
|
||||
|
||||
int printf(const char*, ...);
|
||||
|
||||
char *return_char (int input)
|
||||
{
|
||||
if (input%2 == 0)
|
||||
return "I am even.\n";
|
||||
else
|
||||
return "I am odd.\n";
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue