[clang] 338588d - Debug Info: Apply a default location for cleanups if none is available.

Adrian Prantl via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 5 13:30:30 PST 2019


Author: Adrian Prantl
Date: 2019-12-05T13:30:23-08:00
New Revision: 338588d7cf1865f2095f5961b73cfb533bc535c4

URL: https://github.com/llvm/llvm-project/commit/338588d7cf1865f2095f5961b73cfb533bc535c4
DIFF: https://github.com/llvm/llvm-project/commit/338588d7cf1865f2095f5961b73cfb533bc535c4.diff

LOG: Debug Info: Apply a default location for cleanups if none is available.

This unbreaks the debuginfo-tests testsuite by replacing the assertion
with a default location. There are cleanups in helper functions that
don't have a valid source location such as block copy helpers and it's
not worth tracking each of them down.

rdar://57630879

Added: 
    

Modified: 
    clang/lib/CodeGen/CGDebugInfo.h
    clang/lib/CodeGen/CodeGenFunction.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index 8e74f7e01965..fed79f0095b5 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -748,6 +748,7 @@ class ApplyDebugLocation {
   ApplyDebugLocation(ApplyDebugLocation &&Other) : CGF(Other.CGF) {
     Other.CGF = nullptr;
   }
+  ApplyDebugLocation &operator=(ApplyDebugLocation &&) = default;
 
   ~ApplyDebugLocation();
 

diff  --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index a25383f6e158..ffccbe2289d9 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -377,11 +377,14 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
   if (HasCleanups) {
     // Make sure the line table doesn't jump back into the body for
     // the ret after it's been at EndLoc.
+    Optional<ApplyDebugLocation> AL;
     if (CGDebugInfo *DI = getDebugInfo()) {
       if (OnlySimpleReturnStmts)
         DI->EmitLocation(Builder, EndLoc);
       else
-        assert(EndLoc.isValid() && "no location for inlineable cleanup calls");
+        // We may not have a valid end location. Try to apply it anyway, and
+        // fall back to an artificial location if needed.
+        AL = ApplyDebugLocation::CreateDefaultArtificial(*this, EndLoc);
     }
 
     PopCleanupBlocks(PrologueCleanupDepth);


        


More information about the cfe-commits mailing list