]> granicus.if.org Git - clang/commitdiff
[CodeGen] Add to emitted DebugLoc information about coverage when it's required
authorCalixte Denizet <cdenizet@mozilla.com>
Fri, 21 Sep 2018 09:17:06 +0000 (09:17 +0000)
committerCalixte Denizet <cdenizet@mozilla.com>
Fri, 21 Sep 2018 09:17:06 +0000 (09:17 +0000)
Summary:
Some lines have a hit counter where they should not have one.
Cleanup stuff is located to the last line of the body which is most of the time a '}'.
And Exception stuff is added at the beginning of a function and at the end (represented by '{' and '}').
So in such cases, the DebugLoc used in GCOVProfiling.cpp must be marked as not covered.
This patch is a followup of https://reviews.llvm.org/D49915.
Tests in projects/compiler_rt are fixed by: https://reviews.llvm.org/D49917

Reviewers: marco-c, davidxl

Reviewed By: marco-c

Subscribers: dblaikie, cfe-commits, sylvestre.ledru

Differential Revision: https://reviews.llvm.org/D49916

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342717 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CGDebugInfo.h
lib/CodeGen/CGException.cpp
lib/CodeGen/CodeGenFunction.cpp
lib/CodeGen/CodeGenFunction.h
test/CodeGen/debug-info-scope-file.c
test/CodeGenCXX/debug-info-inheriting-constructor.cpp
test/CodeGenCXX/linetable-virtual-variadic.cpp
test/CodeGenObjC/arc-linetable.m
test/CodeGenObjC/debug-info-blocks.m

index 7d6eb83f12d3765479f0908273aa4b632a445f08..216a12b40d31e6dd3094f5778e26b25e9653b4bb 100644 (file)
@@ -76,20 +76,22 @@ CGDebugInfo::~CGDebugInfo() {
 }
 
 ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
-                                       SourceLocation TemporaryLocation)
+                                       SourceLocation TemporaryLocation,
+                                       bool ImplicitCode)
     : CGF(&CGF) {
-  init(TemporaryLocation);
+  init(TemporaryLocation, false /* DefaultToEmpty */, ImplicitCode);
 }
 
 ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
                                        bool DefaultToEmpty,
-                                       SourceLocation TemporaryLocation)
+                                       SourceLocation TemporaryLocation,
+                                       bool ImplicitCode)
     : CGF(&CGF) {
-  init(TemporaryLocation, DefaultToEmpty);
+  init(TemporaryLocation, DefaultToEmpty, ImplicitCode);
 }
 
 void ApplyDebugLocation::init(SourceLocation TemporaryLocation,
-                              bool DefaultToEmpty) {
+                              bool DefaultToEmpty, bool ImplicitCode) {
   auto *DI = CGF->getDebugInfo();
   if (!DI) {
     CGF = nullptr;
@@ -102,7 +104,7 @@ void ApplyDebugLocation::init(SourceLocation TemporaryLocation,
     return;
 
   if (TemporaryLocation.isValid()) {
-    DI->EmitLocation(CGF->Builder, TemporaryLocation);
+    DI->EmitLocation(CGF->Builder, TemporaryLocation, ImplicitCode);
     return;
   }
 
@@ -3484,7 +3486,8 @@ void CGDebugInfo::EmitInlineFunctionEnd(CGBuilderTy &Builder) {
   setInlinedAt(llvm::DebugLoc(CurInlinedAt).getInlinedAt());
 }
 
-void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {
+void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc,
+                               bool ImplicitCode) {
   // Update our current location
   setLocation(Loc);
 
@@ -3492,8 +3495,9 @@ void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {
     return;
 
   llvm::MDNode *Scope = LexicalBlockStack.back();
-  Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(
-      getLineNumber(CurLoc), getColumnNumber(CurLoc), Scope, CurInlinedAt));
+  Builder.SetCurrentDebugLocation(
+      llvm::DebugLoc::get(getLineNumber(CurLoc), getColumnNumber(CurLoc), Scope,
+                          CurInlinedAt, ImplicitCode));
 }
 
 void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {
@@ -3540,7 +3544,7 @@ void CGDebugInfo::EmitLexicalBlockEnd(CGBuilderTy &Builder,
   assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
 
   // Provide an entry in the line table for the end of the block.
-  EmitLocation(Builder, Loc);
+  EmitLocation(Builder, Loc, true /* ImplicitCode */);
 
   if (DebugKind <= codegenoptions::DebugLineTablesOnly)
     return;
@@ -3556,7 +3560,7 @@ void CGDebugInfo::EmitFunctionEnd(CGBuilderTy &Builder, llvm::Function *Fn) {
   // Pop all regions for this function.
   while (LexicalBlockStack.size() != RCount) {
     // Provide an entry in the line table for the end of the block.
-    EmitLocation(Builder, CurLoc);
+    EmitLocation(Builder, CurLoc, true /* ImplicitCode */);
     LexicalBlockStack.pop_back();
   }
   FnBeginRegionCount.pop_back();
index 8641c2d8969152536a289c47404c9cc5c5f24404..6bffc7471d41b62c1e98144e567e42ec17cab1f2 100644 (file)
@@ -377,7 +377,9 @@ public:
   /// Emit metadata to indicate a change in line/column information in
   /// the source file. If the location is invalid, the previous
   /// location will be reused.
-  void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc);
+  /// \param ImplicitCode  True if the Loc must have coverage information
+  void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc,
+                    bool ImplicitCode = false);
 
   /// Emit a call to llvm.dbg.function.start to indicate
   /// start of a new function.
@@ -664,16 +666,19 @@ private:
 /// location or preferred location of the specified Expr.
 class ApplyDebugLocation {
 private:
-  void init(SourceLocation TemporaryLocation, bool DefaultToEmpty = false);
+  void init(SourceLocation TemporaryLocation, bool DefaultToEmpty = false,
+            bool ImplicitCode = false);
   ApplyDebugLocation(CodeGenFunction &CGF, bool DefaultToEmpty,
-                     SourceLocation TemporaryLocation);
+                     SourceLocation TemporaryLocation,
+                     bool ImplicitCode = false);
 
   llvm::DebugLoc OriginalLocation;
   CodeGenFunction *CGF;
 
 public:
   /// Set the location to the (valid) TemporaryLocation.
-  ApplyDebugLocation(CodeGenFunction &CGF, SourceLocation TemporaryLocation);
+  ApplyDebugLocation(CodeGenFunction &CGF, SourceLocation TemporaryLocation,
+                     bool ImplicitCode = false);
   ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E);
   ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc);
   ApplyDebugLocation(ApplyDebugLocation &&Other) : CGF(Other.CGF) {
@@ -696,13 +701,15 @@ public:
   static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF) {
     return ApplyDebugLocation(CGF, false, SourceLocation());
   }
+
   /// Apply TemporaryLocation if it is valid. Otherwise switch
   /// to an artificial debug location that has a valid scope, but no
   /// line information.
   static ApplyDebugLocation
   CreateDefaultArtificial(CodeGenFunction &CGF,
-                          SourceLocation TemporaryLocation) {
-    return ApplyDebugLocation(CGF, false, TemporaryLocation);
+                          SourceLocation TemporaryLocation,
+                          bool ImplicitCode = false) {
+    return ApplyDebugLocation(CGF, false, TemporaryLocation, ImplicitCode);
   }
 
   /// Set the IRBuilder to not attach debug locations.  Note that
index 4ee835259a54dec76c81091950a8f2bede0b06e7..787d25a681a407b25efe07e53f9b86ed4cb5549c 100644 (file)
@@ -767,7 +767,8 @@ llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
 
   // Save the current IR generation state.
   CGBuilderTy::InsertPoint savedIP = Builder.saveAndClearIP();
-  auto DL = ApplyDebugLocation::CreateDefaultArtificial(*this, CurEHLocation);
+  auto DL = ApplyDebugLocation::CreateDefaultArtificial(
+      *this, CurEHLocation, true /* ImplicitCode */);
 
   // Create and configure the landing pad.
   llvm::BasicBlock *lpad = createBasicBlock("lpad");
index 77f978f687e5acea78da7a89f7ccebba59c8a262..8fa0badc6e2b4e20c0875b46a34e21ede71457c6 100644 (file)
@@ -317,7 +317,7 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
     if (OnlySimpleReturnStmts)
       DI->EmitLocation(Builder, LastStopPoint);
     else
-      DI->EmitLocation(Builder, EndLoc);
+      DI->EmitLocation(Builder, EndLoc, true /* ImplicitCode */);
   }
 
   // Pop any cleanups that might have been associated with the
@@ -333,7 +333,7 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
     // the ret after it's been at EndLoc.
     if (CGDebugInfo *DI = getDebugInfo())
       if (OnlySimpleReturnStmts)
-        DI->EmitLocation(Builder, EndLoc);
+        DI->EmitLocation(Builder, EndLoc, true /* ImplicitCode */);
 
     PopCleanupBlocks(PrologueCleanupDepth);
   }
@@ -1179,7 +1179,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
   }
   // Emit a location at the end of the prologue.
   if (CGDebugInfo *DI = getDebugInfo())
-    DI->EmitLocation(Builder, StartLoc);
+    DI->EmitLocation(Builder, StartLoc, true /* ImplicitCode */);
 
   // TODO: Do we need to handle this in two places like we do with
   // target-features/target-cpu?
index 6ea2d75b318d46b507311fc3ea35df6be4a98794..7a5e308187ed03e820d96de9088c03f45bb5a3e9 100644 (file)
@@ -786,7 +786,7 @@ public:
       // If we should perform a cleanup, force them now.  Note that
       // this ends the cleanup scope before rescoping any labels.
       if (PerformCleanup) {
-        ApplyDebugLocation DL(CGF, Range.getEnd());
+        ApplyDebugLocation DL(CGF, Range.getEnd(), true /* ImplicitCode */);
         ForceCleanup();
       }
     }
index 94123bbc4935e977bf18ac784b7ab24b47d52d43..cc38449f2b23c93785f96a23aa48e9c7bc96fdb0 100644 (file)
@@ -5,10 +5,11 @@
 
 // CHECK: ret void, !dbg [[F1_LINE:![0-9]*]]
 // CHECK: ret void, !dbg [[F2_LINE:![0-9]*]]
-// CHECK: [[F1:![0-9]*]] = distinct !DISubprogram(name: "f1",{{.*}} isDefinition: true
-// CHECK: [[F1_LINE]] = !DILocation({{.*}}, scope: [[F1]])
-// CHECK: [[F2:![0-9]*]] = distinct !DISubprogram(name: "f2",{{.*}} isDefinition: true
-// CHECK: [[F2_LINE]] = !DILocation({{.*}}, scope: [[F2]])
+// CHECK: [[F1:![0-9]*]] = distinct !DISubprogram(name: "f1",{{.*}}
+// isDefinition: true CHECK: [[F1_LINE]] = !DILocation({{.*}}, scope: [[F1]],
+// isImplicitCode: true) CHECK: [[F2:![0-9]*]] = distinct !DISubprogram(name:
+// "f2",{{.*}} isDefinition: true CHECK: [[F2_LINE]] = !DILocation({{.*}},
+// scope: [[F2]], isImplicitCode: true)
 
 void f1() {
 }
index 8e47a0da6dfff36be052db63db67b03e2f1d7f9b..728a1938a23ed808a46237c44cef41daf86cd36d 100644 (file)
@@ -21,5 +21,5 @@ void foo() {
 // CHECK-DAG: ![[LOC]] = !DILocation(line: 0, scope: ![[A]], inlinedAt: ![[INL:[0-9]+]])
 // CHECK-DAG: ![[INL]] = !DILocation(line: [[@LINE+1]], scope: ![[FOO]])
   B b(0);
-// CHECK: ![[NOINL]] = !DILocation(line: [[@LINE+1]], scope: !{{[0-9]+}})
+  // CHECK: ![[NOINL]] = !DILocation(line: [[@LINE+1]], scope: !{{[0-9]+}}, isImplicitCode: true)
 }
index 60dee5fe61b4cf0aa8461a8a5be05e12894b019b..154ee300b74efcac6ba229bd14aa8afef279ee21 100644 (file)
@@ -17,6 +17,6 @@ void Derived::VariadicFunction(...) { }
 // CHECK: ret void, !dbg ![[LOC_I:[0-9]+]]
 //
 // CHECK: ![[SP]] = distinct !DISubprogram(name: "VariadicFunction"
-// CHECK: ![[LOC]] = !DILocation({{.*}}scope: ![[SP]])
+// CHECK: ![[LOC]] = !DILocation({{.*}}scope: ![[SP]], isImplicitCode: true)
 // CHECK: ![[SP_I]] = distinct !DISubprogram(name: "VariadicFunction"
-// CHECK: ![[LOC_I]] = !DILocation({{.*}}scope: ![[SP_I]])
+// CHECK: ![[LOC_I]] = !DILocation({{.*}}scope: ![[SP_I]], isImplicitCode: true)
index 877dfdc12211fc2159b85f49529f68fccd3d169d..5e23d335e381421a0a6f6c7601c528477e2b0e4e 100644 (file)
@@ -60,7 +60,7 @@ typedef signed char BOOL;
 - (int)testNoSideEffect:(NSString *)foo {
   int x = 1;
   return 1; // Return expression
-  // CHECK: ![[RET1]] = !DILocation(line: [[@LINE+1]], scope: ![[TESTNOSIDEEFFECT]])
+  // CHECK: ![[RET1]] = !DILocation(line: [[@LINE+1]], scope: ![[TESTNOSIDEEFFECT]], isImplicitCode: true)
 }           // Cleanup + Ret
 
 - (int)testNoCleanup {
index b6e5b42ec671c0ebb9ed21061352c0deb4874881..411666261293be6d10fd12fd673100c10e37504e 100644 (file)
 // CHECK: call {{.*}}, !dbg ![[DBG_LINE:[0-9]+]]
 // CHECK-NOT: ret
 // CHECK: load {{.*}}, !dbg ![[COPY_LINE:[0-9]+]]
-// CHECK: ret void, !dbg ![[COPY_LINE]]
 // CHECK: define {{.*}} @__destroy_helper_block_{{.*}}(i8*)
 // CHECK-NOT: ret
 // CHECK: load {{.*}}, !dbg ![[DESTROY_LINE:[0-9]+]]
-// CHECK: ret void, !dbg ![[DESTROY_LINE]]
 
 typedef unsigned int NSUInteger;