<div dir="ltr">Hello Matt,<br><br>This commit broke tests on one of our builders:<br><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/7920">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/7920</a><br>. . .<br>Failing Tests (1):<br>    Clang :: CodeGenCXX/debug-info-range-for-var-names.cpp<br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 14, 2018 at 1:22 PM, Matt Davis via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mattd<br>
Date: Wed Feb 14 13:22:11 2018<br>
New Revision: 325175<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=325175&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=325175&view=rev</a><br>
Log:<br>
[Debug] Annotate compiler generated range-for loop variables.<br>
<br>
Summary:<br>
This change aims to simplify debugging by annotating the range-for loop artificial variables (range, begin, end) with the scope depth.<br>
<br>
<br>
Reviewers: rsmith, dblaikie<br>
<br>
Reviewed By: dblaikie<br>
<br>
Subscribers: dblaikie, cfe-commits<br>
<br>
Tags: #debug-info<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D42813" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D42813</a><br>
<br>
Added:<br>
    cfe/trunk/test/CodeGenCXX/<wbr>debug-info-range-for-var-<wbr>names.cpp<br>
Modified:<br>
    cfe/trunk/include/clang/Sema/<wbr>Scope.h<br>
    cfe/trunk/lib/Sema/SemaStmt.<wbr>cpp<br>
    cfe/trunk/test/CodeGenCXX/<wbr>debug-info-scope.cpp<br>
    cfe/trunk/test/CodeGenCXX/vla.<wbr>cpp<br>
<br>
Modified: cfe/trunk/include/clang/Sema/<wbr>Scope.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Scope.h?rev=325175&r1=325174&r2=325175&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Sema/Scope.h?rev=325175&<wbr>r1=325174&r2=325175&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Sema/<wbr>Scope.h (original)<br>
+++ cfe/trunk/include/clang/Sema/<wbr>Scope.h Wed Feb 14 13:22:11 2018<br>
@@ -259,6 +259,9 @@ public:<br>
   Scope *getTemplateParamParent() { return TemplateParamParent; }<br>
   const Scope *getTemplateParamParent() const { return TemplateParamParent; }<br>
<br>
+  /// Returns the depth of this scope. The translation-unit has scope depth 0.<br>
+  unsigned getDepth() const { return Depth; }<br>
+<br>
   /// Returns the number of function prototype scopes in this scope<br>
   /// chain.<br>
   unsigned getFunctionPrototypeDepth() const {<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaStmt.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=325175&r1=325174&r2=325175&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaStmt.cpp?rev=325175&r1=<wbr>325174&r2=325175&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/SemaStmt.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaStmt.<wbr>cpp Wed Feb 14 13:22:11 2018<br>
@@ -2025,7 +2025,7 @@ void NoteForRangeBeginEndFunction(<wbr>Sema &<br>
<br>
 /// Build a variable declaration for a for-range statement.<br>
 VarDecl *BuildForRangeVarDecl(Sema &SemaRef, SourceLocation Loc,<br>
-                              QualType Type, const char *Name) {<br>
+                              QualType Type, StringRef Name) {<br>
   DeclContext *DC = SemaRef.CurContext;<br>
   IdentifierInfo *II = &SemaRef.PP.<wbr>getIdentifierTable().get(Name)<wbr>;<br>
   TypeSourceInfo *TInfo = SemaRef.Context.<wbr>getTrivialTypeSourceInfo(Type, Loc);<br>
@@ -2094,10 +2094,12 @@ StmtResult Sema::ActOnCXXForRangeStmt(Sc<br>
   }<br>
<br>
   // Build  auto && __range = range-init<br>
+  // Divide by 2, since the variables are in the inner scope (loop body).<br>
+  const auto DepthStr = std::to_string(S->getDepth() / 2);<br>
   SourceLocation RangeLoc = Range->getLocStart();<br>
   VarDecl *RangeVar = BuildForRangeVarDecl(*this, RangeLoc,<br>
                                            Context.getAutoRRefDeductType(<wbr>),<br>
-                                           "__range");<br>
+                                           std::string("__range") + DepthStr);<br>
   if (FinishForRangeVarDecl(*this, RangeVar, Range, RangeLoc,<br>
                             diag::err_for_range_deduction_<wbr>failure)) {<br>
     LoopVar->setInvalidDecl();<br>
@@ -2340,10 +2342,12 @@ Sema::BuildCXXForRangeStmt(<wbr>SourceLocatio<br>
       return StmtError();<br>
<br>
     // Build auto __begin = begin-expr, __end = end-expr.<br>
+    // Divide by 2, since the variables are in the inner scope (loop body).<br>
+    const auto DepthStr = std::to_string(S->getDepth() / 2);<br>
     VarDecl *BeginVar = BuildForRangeVarDecl(*this, ColonLoc, AutoType,<br>
-                                             "__begin");<br>
+                                             std::string("__begin") + DepthStr);<br>
     VarDecl *EndVar = BuildForRangeVarDecl(*this, ColonLoc, AutoType,<br>
-                                           "__end");<br>
+                                           std::string("__end") + DepthStr);<br>
<br>
     // Build begin-expr and end-expr and attach to __begin and __end variables.<br>
     ExprResult BeginExpr, EndExpr;<br>
<br>
Added: cfe/trunk/test/CodeGenCXX/<wbr>debug-info-range-for-var-<wbr>names.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-range-for-var-names.cpp?rev=325175&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenCXX/debug-info-range-<wbr>for-var-names.cpp?rev=325175&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenCXX/<wbr>debug-info-range-for-var-<wbr>names.cpp (added)<br>
+++ cfe/trunk/test/CodeGenCXX/<wbr>debug-info-range-for-var-<wbr>names.cpp Wed Feb 14 13:22:11 2018<br>
@@ -0,0 +1,36 @@<br>
+// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s<br>
+<br>
+struct vec {<br>
+  using itr = int*;<br>
+  itr begin() { return nullptr; }<br>
+  itr end() { return nullptr; }<br>
+};<br>
+<br>
+void test() {<br>
+  vec as, bs, cs;<br>
+<br>
+  for (auto a : as)<br>
+    for (auto b : bs)<br>
+      for (auto c : cs) {<br>
+      }<br>
+}<br>
+<br>
+// CHECK: define void @_Z4testv()<br>
+// CHECK: call void @llvm.dbg.declare(metadata %struct.vec** {{.*}}, metadata ![[RANGE1:[0-9]+]]<br>
+// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[BEGIN1:[0-9]+]]<br>
+// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[END1:[0-9]+]]<br>
+// CHECK: call void @llvm.dbg.declare(metadata %struct.vec** {{.*}}, metadata ![[RANGE2:[0-9]+]]<br>
+// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[BEGIN2:[0-9]+]]<br>
+// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[END2:[0-9]+]]<br>
+// CHECK: call void @llvm.dbg.declare(metadata %struct.vec** {{.*}}, metadata ![[RANGE3:[0-9]+]]<br>
+// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[BEGIN3:[0-9]+]]<br>
+// CHECK: call void @llvm.dbg.declare(metadata i32** {{.*}}, metadata ![[END3:[0-9]+]]<br>
+// CHECK: ![[RANGE1]] = !DILocalVariable(name: "__range1",<br>
+// CHECK: ![[BEGIN1]] = !DILocalVariable(name: "__begin1",<br>
+// CHECK: ![[END1]] = !DILocalVariable(name: "__end1",<br>
+// CHECK: ![[RANGE2]] = !DILocalVariable(name: "__range2",<br>
+// CHECK: ![[BEGIN2]] = !DILocalVariable(name: "__begin2",<br>
+// CHECK: ![[END2]] = !DILocalVariable(name: "__end2",<br>
+// CHECK: ![[RANGE3]] = !DILocalVariable(name: "__range3",<br>
+// CHECK: ![[BEGIN3]] = !DILocalVariable(name: "__begin3",<br>
+// CHECK: ![[END3]] = !DILocalVariable(name: "__end3",<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/<wbr>debug-info-scope.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-scope.cpp?rev=325175&r1=325174&r2=325175&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenCXX/debug-info-scope.<wbr>cpp?rev=325175&r1=325174&r2=<wbr>325175&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenCXX/<wbr>debug-info-scope.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/<wbr>debug-info-scope.cpp Wed Feb 14 13:22:11 2018<br>
@@ -58,7 +58,7 @@ void func() {<br>
   }<br>
<br>
   int x[] = {1, 2};<br>
-  // CHECK: = !DILocalVariable(name: "__range"<br>
+  // CHECK: = !DILocalVariable(name: "__range1"<br>
   // CHECK-SAME:               scope: [[RANGE_FOR:![0-9]*]]<br>
   // CHECK-NOT:                line:<br>
   // CHECK-SAME:               ){{$}}<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/vla.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/vla.cpp?rev=325175&r1=325174&r2=325175&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenCXX/vla.cpp?rev=325175&<wbr>r1=325174&r2=325175&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenCXX/vla.<wbr>cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/vla.<wbr>cpp Wed Feb 14 13:22:11 2018<br>
@@ -68,8 +68,8 @@ void test0(void *array, int n) {<br>
 void test2(int b) {<br>
   // CHECK-LABEL: define void {{.*}}test2{{.*}}(i32 %b)<br>
   int varr[b];<br>
-  // AMD: %__end = alloca i32*, align 8, addrspace(5)<br>
-  // AMD: [[END:%.*]] = addrspacecast i32* addrspace(5)* %__end to i32**<br>
+  // AMD: %__end1 = alloca i32*, align 8, addrspace(5)<br>
+  // AMD: [[END:%.*]] = addrspacecast i32* addrspace(5)* %__end1 to i32**<br>
   // get the address of %b by checking the first store that stores it<br>
   //CHECK: store i32 %b, i32* [[PTR_B:%.*]]<br>
<br>
@@ -86,7 +86,7 @@ void test2(int b) {<br>
   //CHECK: [[VLA_SIZEOF:%.*]] = mul nuw i64 4, [[VLA_NUM_ELEMENTS_PRE]]<br>
   //CHECK-NEXT: [[VLA_NUM_ELEMENTS_POST:%.*]] = udiv i64 [[VLA_SIZEOF]], 4<br>
   //CHECK-NEXT: [[VLA_END_PTR:%.*]] = getelementptr inbounds i32, i32* {{%.*}}, i64 [[VLA_NUM_ELEMENTS_POST]]<br>
-  //X64-NEXT: store i32* [[VLA_END_PTR]], i32** %__end<br>
+  //X64-NEXT: store i32* [[VLA_END_PTR]], i32** %__end1<br>
   //AMD-NEXT: store i32* [[VLA_END_PTR]], i32** [[END]]<br>
   for (int d : varr) 0;<br>
 }<br>
@@ -94,8 +94,8 @@ void test2(int b) {<br>
 void test3(int b, int c) {<br>
   // CHECK-LABEL: define void {{.*}}test3{{.*}}(i32 %b, i32 %c)<br>
   int varr[b][c];<br>
-  // AMD: %__end = alloca i32*, align 8, addrspace(5)<br>
-  // AMD: [[END:%.*]] = addrspacecast i32* addrspace(5)* %__end to i32**<br>
+  // AMD: %__end1 = alloca i32*, align 8, addrspace(5)<br>
+  // AMD: [[END:%.*]] = addrspacecast i32* addrspace(5)* %__end1 to i32**<br>
   // get the address of %b by checking the first store that stores it<br>
   //CHECK: store i32 %b, i32* [[PTR_B:%.*]]<br>
   //CHECK-NEXT: store i32 %c, i32* [[PTR_C:%.*]]<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>