r225955 - DebugInof: Correct the location of exception cleanups in global ctors/dtors and ObjC methods

David Blaikie dblaikie at gmail.com
Tue Jan 13 23:10:46 PST 2015


Author: dblaikie
Date: Wed Jan 14 01:10:46 2015
New Revision: 225955

URL: http://llvm.org/viewvc/llvm-project?rev=225955&view=rev
Log:
DebugInof: Correct the location of exception cleanups in global ctors/dtors and ObjC methods

Without setting the CurEHLocation these cleanups would be attributed to
whatever the last active debug line location was (the 'fn' call in the
included test cases). By setting CurEHLocation correctly the line
information is improved/corrected.

This quality bug turned into a crasher with r225000 when, instead of
allowing the last location to persist, it would be zero'd out. This
could lead to a function call (such as the dtor) being made without a
debug location - if that call was subsequently inlined (and the caller
and callee had debug info, just not the call instruction) the inliner
would violate important constraints about the debug location chains by
not updating the inlined instructions to chain up to the callee
locations.

So, by fixing this bug, I am addressing the assertion failures
introduced by r225000 and should be able to recommit that patch with
impunity...

Modified:
    cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
    cfe/trunk/lib/CodeGen/CGObjC.cpp
    cfe/trunk/test/CodeGenCXX/debug-info-line.cpp
    cfe/trunk/test/CodeGenObjCXX/debug-info-line.mm

Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=225955&r1=225954&r2=225955&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Wed Jan 14 01:10:46 2015
@@ -445,6 +445,8 @@ void CodeGenFunction::GenerateCXXGlobalV
   if (D->hasAttr<NoDebugAttr>())
     DebugInfo = nullptr; // disable debug info indefinitely for this function
 
+  CurEHLocation = D->getLocStart();
+
   StartFunction(GlobalDecl(D), getContext().VoidTy, Fn,
                 getTypes().arrangeNullaryFunction(),
                 FunctionArgList(), D->getLocation(),
@@ -554,6 +556,8 @@ llvm::Function *CodeGenFunction::generat
   llvm::Function *fn = CGM.CreateGlobalInitOrDestructFunction(
       FTy, "__cxx_global_array_dtor", VD->getLocation());
 
+  CurEHLocation = VD->getLocStart();
+
   StartFunction(VD, getContext().VoidTy, fn, FI, args);
 
   emitDestroy(addr, type, destroyer, useEHCleanupForArray);

Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=225955&r1=225954&r2=225955&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Wed Jan 14 01:10:46 2015
@@ -476,6 +476,7 @@ void CodeGenFunction::StartObjCMethod(co
     args.push_back(PI);
 
   CurGD = OMD;
+  CurEHLocation = OMD->getLocEnd();
 
   StartFunction(OMD, OMD->getReturnType(), Fn, FI, args,
                 OMD->getLocation(), StartLoc);

Modified: cfe/trunk/test/CodeGenCXX/debug-info-line.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-line.cpp?rev=225955&r1=225954&r2=225955&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/debug-info-line.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/debug-info-line.cpp Wed Jan 14 01:10:46 2015
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -fexceptions -fcxx-exceptions -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s
 
 int &src();
 int *sink();
@@ -110,6 +110,29 @@ void f10() {
       new (void_src()) int(src()));
 }
 
+// noexcept just to simplify the codegen a bit
+void fn() noexcept(true);
+
+struct bar {
+  bar();
+  // noexcept(false) to convolute the global dtor
+  ~bar() noexcept(false);
+};
+// global ctor cleanup
+// CHECK-LABEL: define
+// CHECK: invoke{{ }}
+// CHECK: invoke{{ }}
+// CHECK:   to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]]
+// global dtor cleanup
+// CHECK-LABEL: define
+// CHECK: invoke{{ }}
+// CHECK: invoke{{ }}
+// CHECK:   to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]]
+#line 1500
+bar b[1] = { //
+    (fn(),   //
+     bar())};
+
 // CHECK: [[DBG_F1]] = !{i32 100,
 // CHECK: [[DBG_FOO_VALUE]] = !{i32 200,
 // CHECK: [[DBG_FOO_REF]] = !{i32 202,
@@ -124,3 +147,5 @@ void f10() {
 // CHECK: [[DBG_F9]] = !{i32 1000,
 // CHECK: [[DBG_F10_ICMP]] = !{i32 1100,
 // CHECK: [[DBG_F10_STORE]] = !{i32 1100,
+// CHECK: [[DBG_GLBL_CTOR_B]] = !{i32 1500,
+// CHECK: [[DBG_GLBL_DTOR_B]] = !{i32 1500,

Modified: cfe/trunk/test/CodeGenObjCXX/debug-info-line.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/debug-info-line.mm?rev=225955&r1=225954&r2=225955&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjCXX/debug-info-line.mm (original)
+++ cfe/trunk/test/CodeGenObjCXX/debug-info-line.mm Wed Jan 14 01:10:46 2015
@@ -6,11 +6,25 @@ struct foo {
   ~foo();
 };
 
-void func() {
+void f1() {
   ^{
     foo f;
     fn();
-    // CHECK: cleanup, !dbg [[LINE:![0-9]*]]
-    // CHECK: [[LINE]] = !{i32 [[@LINE+1]], 
+    // CHECK: cleanup, !dbg [[DBG_F1:![0-9]*]]
+#line 100
   }();
 }
+
+// CHECK-LABEL: define internal i8* @"\01-[TNSObject init]"
+ at implementation TNSObject
+- (id)init
+{
+  foo f;
+  fn();
+  // CHECK: cleanup, !dbg [[DBG_TNSO:![0-9]*]]
+#line 200
+}
+ at end
+
+// CHECK: [[DBG_F1]] = !{i32 100,
+// CHECK: [[DBG_TNSO]] = !{i32 200,





More information about the cfe-commits mailing list