r178490 - * Attempt to un-break gdb buildbot by emitting a lexical block end only

Adrian Prantl aprantl at apple.com
Mon Apr 1 12:02:06 PDT 2013


Author: adrian
Date: Mon Apr  1 14:02:06 2013
New Revision: 178490

URL: http://llvm.org/viewvc/llvm-project?rev=178490&view=rev
Log:
* Attempt to un-break gdb buildbot by emitting a lexical block end only
  when we actually end a lexical block.
* Added new test for line table / block cleanup.
* Follow-up to r177819 / rdar://problem/13115369

Added:
    cfe/trunk/test/CodeGenCXX/cp-blocks-linetables.cpp
Modified:
    cfe/trunk/lib/CodeGen/CodeGenFunction.h

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=178490&r1=178489&r2=178490&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Apr  1 14:02:06 2013
@@ -881,6 +881,9 @@ public:
     /// \brief Exit this cleanup scope, emitting any accumulated
     /// cleanups.
     ~LexicalScope() {
+      if (CGDebugInfo *DI = CGF.getDebugInfo())
+        DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd());
+
       // If we should perform a cleanup, force them now.  Note that
       // this ends the cleanup scope before rescoping any labels.
       if (PerformCleanup) ForceCleanup();
@@ -889,15 +892,9 @@ public:
     /// \brief Force the emission of cleanups now, instead of waiting
     /// until this object is destroyed.
     void ForceCleanup() {
+      CGF.CurLexicalScope = ParentScope;
       RunCleanupsScope::ForceCleanup();
-      endLexicalScope();
-    }
 
-  private:
-    void endLexicalScope() {
-      CGF.CurLexicalScope = ParentScope;
-      if (CGDebugInfo *DI = CGF.getDebugInfo())
-        DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd());
       if (!Labels.empty())
         rescopeLabels();
     }

Added: cfe/trunk/test/CodeGenCXX/cp-blocks-linetables.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cp-blocks-linetables.cpp?rev=178490&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/cp-blocks-linetables.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/cp-blocks-linetables.cpp Mon Apr  1 14:02:06 2013
@@ -0,0 +1,61 @@
+// RUN: %clang_cc1 -fblocks -g -emit-llvm %s -o - | FileCheck %s
+// Ensure that we generate a line table entry for the block cleanup.
+// CHECK: define {{.*}} @__main_block_invoke
+// CHECK: _NSConcreteStackBlock
+// CHECK: = bitcast {{.*}}, !dbg ![[L1:[0-9]+]]
+// CHECK-NOT:  call {{.*}} @_Block_object_dispose{{.*}}, !dbg ![[L1]]
+// CHECK: ret
+
+void * _NSConcreteStackBlock;
+#ifdef __cplusplus
+extern "C" void exit(int);
+#else
+extern void exit(int);
+#endif
+
+enum numbers {
+  zero, one, two, three, four
+};
+
+typedef enum numbers (^myblock)(enum numbers);
+
+
+double test(myblock I) {
+  return I(three);
+}
+
+int main() {
+  __block enum numbers x = one;
+  __block enum numbers y = two;
+
+  /* Breakpoint for first Block function.  */
+  myblock CL = ^(enum numbers z)
+    { enum numbers savex = x;
+      { __block enum numbers x = savex;
+	y = z;
+	if (y != three)
+	  exit (6);
+	test (
+	      /* Breakpoint for second Block function.  */
+	      ^ (enum numbers z) {
+		if (y != three) {
+		  exit(1);
+		}
+		if (x != one)
+		  exit(2);
+		x = z;
+		if (x != three)
+		  exit(3);
+		if (y != three)
+		  exit(4);
+		return (enum numbers) four;
+	      });}
+      return x;
+    };
+
+  enum numbers res = (enum numbers)test(CL);
+
+  if (res != one)
+    exit (5);
+  return 0;
+}





More information about the cfe-commits mailing list