summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/IR/GCOV.cpp5
-rw-r--r--test/tools/llvm-cov/Inputs/copy_block_helper.gcdabin0 -> 432 bytes
-rw-r--r--test/tools/llvm-cov/Inputs/copy_block_helper.gcnobin0 -> 1140 bytes
-rw-r--r--test/tools/llvm-cov/copy_block_helper.m29
-rw-r--r--test/tools/llvm-cov/lit.local.cfg2
5 files changed, 35 insertions, 1 deletions
diff --git a/lib/IR/GCOV.cpp b/lib/IR/GCOV.cpp
index dc9cb4b2a8..f69bdc4f8c 100644
--- a/lib/IR/GCOV.cpp
+++ b/lib/IR/GCOV.cpp
@@ -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
index 0000000000..d7ff4696df
--- /dev/null
+++ b/test/tools/llvm-cov/Inputs/copy_block_helper.gcda
Binary files 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
index 0000000000..a9d1084064
--- /dev/null
+++ b/test/tools/llvm-cov/Inputs/copy_block_helper.gcno
Binary files 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
index 0000000000..61a91c1e77
--- /dev/null
+++ b/test/tools/llvm-cov/copy_block_helper.m
@@ -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); }
diff --git a/test/tools/llvm-cov/lit.local.cfg b/test/tools/llvm-cov/lit.local.cfg
index df9b335dd1..f738810475 100644
--- a/test/tools/llvm-cov/lit.local.cfg
+++ b/test/tools/llvm-cov/lit.local.cfg
@@ -1 +1 @@
-config.suffixes = ['.test']
+config.suffixes = ['.test', '.m']