diff --git a/lib/IR/GCOV.cpp b/lib/IR/GCOV.cpp index dc9cb4b2a81..f69bdc4f8cc 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::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 00000000000..d7ff4696df7 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 index 00000000000..a9d10840646 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 index 00000000000..61a91c1e77e --- /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 df9b335dd13..f738810475f 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']