From: Justin Bogner Date: Wed, 26 Mar 2014 22:03:06 +0000 (+0000) Subject: llvm-cov: Handle functions with no line number X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2a6873fdf3fa413cd7ef09b368fab64aa936d027;p=oota-llvm.git llvm-cov: Handle functions with no line number 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 --- 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']