summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorVedant Kumar <vsk@apple.com>2017-09-15 23:00:02 +0000
committerVedant Kumar <vsk@apple.com>2017-09-15 23:00:02 +0000
commit51d8f887db26815576af25c24c5c70b1b03b6830 (patch)
treec814b7670fc0473b1f57796569e42ff68152a152 /llvm/test
parentc445e65d0969dba334b4b1cb545457f98f5c654c (diff)
downloadbcm5719-llvm-51d8f887db26815576af25c24c5c70b1b03b6830.tar.gz
bcm5719-llvm-51d8f887db26815576af25c24c5c70b1b03b6830.zip
[llvm-cov] Avoid over-counting covered lines and regions
* Fix an unsigned integer overflow in the logic that computes the number of uncovered lines in a function. * When aggregating region and line coverage summaries, take into account that different instantiations may have a different number of regions. The new test case provides test coverage for both bugs. I also verified this change by preparing a coverage report for a stage2 build of llc -- the new assertions should detect any outstanding over-counting bugs. Fixes PR34613. llvm-svn: 313417
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects/header.h29
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects/merged.profdatabin0 -> 1488 bytes
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_1.cc14
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_1.covmappingbin0 -> 492 bytes
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_2.cc20
-rw-r--r--llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_2.covmappingbin0 -> 384 bytes
-rw-r--r--llvm/test/tools/llvm-cov/multiple-objects.test17
7 files changed, 80 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects/header.h b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/header.h
new file mode 100644
index 00000000000..03b37cd2dbb
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/header.h
@@ -0,0 +1,29 @@
+static inline void f1() {
+#ifdef DEF
+ if (false && false)
+ return;
+
+ if (true || false || true)
+ return;
+
+ if (true && false)
+ return;
+#endif
+}
+
+template<typename T>
+void f2(T **x) {
+#ifdef DEF
+ if (false && false)
+ *x = nullptr;
+
+ if (true || false || true)
+ *x = nullptr;
+
+ if (true && false)
+ *x = nullptr;
+#endif
+}
+
+static inline void f3() {
+}
diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects/merged.profdata b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/merged.profdata
new file mode 100644
index 00000000000..eeaa4eb45c8
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/merged.profdata
Binary files differ
diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_1.cc b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_1.cc
new file mode 100644
index 00000000000..835db293f69
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_1.cc
@@ -0,0 +1,14 @@
+#define DEF
+#include "header.h"
+
+int main() {
+ f1();
+
+ int *x;
+ f2(&x);
+
+ float *y;
+ f2(&y);
+
+ return 0;
+}
diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_1.covmapping b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_1.covmapping
new file mode 100644
index 00000000000..641bdb441c2
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_1.covmapping
Binary files differ
diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_2.cc b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_2.cc
new file mode 100644
index 00000000000..52965599a3a
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_2.cc
@@ -0,0 +1,20 @@
+#undef DEF
+#include "header.h"
+
+static int foo() {
+ return 0;
+}
+
+int main() {
+ f1();
+
+ long *x;
+ f2(&x);
+
+ double *y;
+ f2(&y);
+
+ f3();
+
+ return foo();
+}
diff --git a/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_2.covmapping b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_2.covmapping
new file mode 100644
index 00000000000..f26caea7480
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/Inputs/multiple_objects/use_2.covmapping
Binary files differ
diff --git a/llvm/test/tools/llvm-cov/multiple-objects.test b/llvm/test/tools/llvm-cov/multiple-objects.test
new file mode 100644
index 00000000000..f23a16d4cac
--- /dev/null
+++ b/llvm/test/tools/llvm-cov/multiple-objects.test
@@ -0,0 +1,17 @@
+RUN: llvm-cov report -instr-profile %S/Inputs/multiple_objects/merged.profdata \
+RUN: %S/Inputs/multiple_objects/use_2.covmapping \
+RUN: -object %S/Inputs/multiple_objects/use_1.covmapping | FileCheck -check-prefix=REPORT %s
+
+REPORT: Filename{{ +}}Regions{{ +}}Missed Regions{{ +}}Cover
+REPORT-NEXT: ---
+REPORT-NEXT: header.h{{ +}}25{{ +}}14{{ +}}44.00%
+
+Instructions for regenerating the test:
+
+clang -std=c++11 -mllvm -enable-name-compression=false -fprofile-instr-generate -fcoverage-mapping use_1.cc -o use_1
+clang -std=c++11 -mllvm -enable-name-compression=false -fprofile-instr-generate -fcoverage-mapping use_2.cc -o use_2
+LLVM_PROFILE_FILE="use_1.raw" ./use_1
+LLVM_PROFILE_FILE="use_2.raw" ./use_2
+llvm-profdata merge use_{1,2}.raw -o merged.profdata
+llvm-cov convert-for-testing ./use_1 -o ./use_1.covmapping
+llvm-cov convert-for-testing ./use_2 -o ./use_2.covmapping
OpenPOWER on IntegriCloud