gcov is an "Edge Profiling with Edge Counters" application according to Optimally Profiling and Tracing Programs (1994). The minimum number of counters necessary is |E|-(|V|-1). The unmeasured edges form a spanning tree. Both GCC --coverage and clang -fprofile-generate leverage this optimization. This patch implements the optimization for clang --coverage. The produced .gcda files are much smaller now.
12 lines
533 B
C
12 lines
533 B
C
/// -fsanitize=thread requires the (potentially concurrent) counter updates to be atomic.
|
|
// RUN: %clang_cc1 %s -triple x86_64 -emit-llvm -fsanitize=thread -femit-coverage-notes -femit-coverage-data \
|
|
// RUN: -coverage-notes-file /dev/null -coverage-data-file /dev/null -o - | FileCheck %s
|
|
|
|
// CHECK-LABEL: void @foo()
|
|
/// Two counters are incremented by __tsan_atomic64_fetch_add.
|
|
// CHECK: call i64 @__tsan_atomic64_fetch_add
|
|
// CHECK-NEXT: call i32 @__tsan_atomic32_fetch_sub
|
|
|
|
_Atomic(int) cnt;
|
|
void foo() { cnt--; }
|