llvm-cov: Handle functions with no line number
authorJustin Bogner <mail@justinbogner.com>
Wed, 26 Mar 2014 22:03:06 +0000 (22:03 +0000)
committerJustin Bogner <mail@justinbogner.com>
Wed, 26 Mar 2014 22:03:06 +0000 (22:03 +0000)
Functions may in an instrumented binary but not in the original source
when they're inserted by the compiler or the runtime. These functions
aren't meaningful to the user, so teach llvm-cov to skip over them
instead of crashing.

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

lib/IR/GCOV.cpp
test/tools/llvm-cov/Inputs/copy_block_helper.gcda [new file with mode: 0644]
test/tools/llvm-cov/Inputs/copy_block_helper.gcno [new file with mode: 0644]
test/tools/llvm-cov/copy_block_helper.m [new file with mode: 0644]
test/tools/llvm-cov/lit.local.cfg

index dc9cb4b2a816f58ebc4393d468991e46bfc0def5..f69bdc4f8cc90308772de43188c4a35764d19825 100644 (file)
@@ -308,6 +308,11 @@ void GCOVFunction::dump() const {
 /// collectLineCounts - Collect line counts. This must be used after
 /// reading .gcno and .gcda files.
 void GCOVFunction::collectLineCounts(FileInfo &FI) {
+  // If the line number is zero, this is a function that doesn't actually appear
+  // in the source file, so there isn't anything we can do with it.
+  if (LineNumber == 0)
+    return;
+
   for (SmallVectorImpl<GCOVBlock *>::iterator I = Blocks.begin(),
          E = Blocks.end(); I != E; ++I)
     (*I)->collectLineCounts(FI);
diff --git a/test/tools/llvm-cov/Inputs/copy_block_helper.gcda b/test/tools/llvm-cov/Inputs/copy_block_helper.gcda
new file mode 100644 (file)
index 0000000..d7ff469
Binary files /dev/null and b/test/tools/llvm-cov/Inputs/copy_block_helper.gcda differ
diff --git a/test/tools/llvm-cov/Inputs/copy_block_helper.gcno b/test/tools/llvm-cov/Inputs/copy_block_helper.gcno
new file mode 100644 (file)
index 0000000..a9d1084
Binary files /dev/null and b/test/tools/llvm-cov/Inputs/copy_block_helper.gcno differ
diff --git a/test/tools/llvm-cov/copy_block_helper.m b/test/tools/llvm-cov/copy_block_helper.m
new file mode 100644 (file)
index 0000000..61a91c1
--- /dev/null
@@ -0,0 +1,29 @@
+// Make sure that compiler-added functions (whose line number is zero) don't
+// crash llvm-cov.
+
+// We need shell for cd
+// REQUIRES: shell
+
+// RUN: rm -rf %t
+// RUN: mkdir %t
+// RUN: cd %t
+// RUN: cp %s %p/Inputs/copy_block_helper.gc* .
+
+// RUN: llvm-cov copy_block_helper.m | FileCheck %s --check-prefix=STDOUT
+// STDOUT: File 'copy_block_helper.m'
+// STDOUT: Lines executed:100.00% of 5
+// STDOUT: copy_block_helper.m:creating 'copy_block_helper.m.gcov'
+
+// RUN: FileCheck %s --check-prefix=GCOV < %t/copy_block_helper.m.gcov
+// GCOV: -:    0:Runs:1
+// GCOV: -:    0:Programs:1
+
+id test_helper(id (^foo)(void)) { return foo(); } // GCOV: 1:    [[@LINE]]:id
+void test(id x) { // GCOV: -:    [[@LINE]]:void test
+  test_helper(^{  // GCOV: 2:    [[@LINE]]:  test_helper
+    return x;     // GCOV: 1:    [[@LINE]]:    return
+  });             // GCOV: -:    [[@LINE]]:
+}                 // GCOV: 1:    [[@LINE]]:}
+
+// GCOV: 1:    [[@LINE+1]]:int main
+int main(int argc, const char *argv[]) { test(0); }
index df9b335dd1310f7fc47e987a09d10534ffb9180d..f738810475fefc85b39907f057ef12675727acce 100644 (file)
@@ -1 +1 @@
-config.suffixes = ['.test']
+config.suffixes = ['.test', '.m']