Skip to content
This repository was archived by the owner on May 21, 2019. It is now read-only.

Commit bc1f9b2

Browse files
committed
[sancov] Implement __sanitizer_cov_reset.
Summary: Clears all collected coverage. Reviewers: kcc Subscribers: srhines, kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D35958 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@309333 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 3d7f9b6 commit bc1f9b2

File tree

4 files changed

+83
-5
lines changed

4 files changed

+83
-5
lines changed

include/sanitizer/coverage_interface.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ extern "C" {
2222
// Record and dump coverage info.
2323
void __sanitizer_cov_dump();
2424

25-
// Dump collected coverage info. Sorts pcs by module into individual
26-
// .sancov files.
25+
// Clear collected coverage info.
26+
void __sanitizer_cov_reset();
27+
28+
// Dump collected coverage info. Sorts pcs by module into individual .sancov
29+
// files.
2730
void __sanitizer_dump_coverage(const uintptr_t *pcs, uintptr_t len);
2831

2932
#ifdef __cplusplus

lib/sanitizer_common/sanitizer_coverage_interface.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
// Sanitizer Coverage interface list.
1010
//===----------------------------------------------------------------------===//
1111
INTERFACE_FUNCTION(__sanitizer_cov_dump)
12+
INTERFACE_FUNCTION(__sanitizer_cov_reset)
1213
INTERFACE_FUNCTION(__sanitizer_dump_coverage)
1314
INTERFACE_FUNCTION(__sanitizer_dump_trace_pc_guard_coverage)
1415
INTERFACE_WEAK_FUNCTION(__sancov_default_options)

lib/sanitizer_common/sanitizer_coverage_libcdep_new.cc

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,17 @@ class TracePcGuardController {
125125
}
126126

127127
void TracePcGuard(u32* guard, uptr pc) {
128-
atomic_uint32_t* guard_ptr = reinterpret_cast<atomic_uint32_t*>(guard);
129-
u32 idx = atomic_exchange(guard_ptr, 0, memory_order_relaxed);
128+
u32 idx = *guard;
130129
if (!idx) return;
131130
// we start indices from 1.
132-
pc_vector[idx - 1] = pc;
131+
atomic_uintptr_t* pc_ptr =
132+
reinterpret_cast<atomic_uintptr_t*>(&pc_vector[idx - 1]);
133+
if (atomic_load(pc_ptr, memory_order_relaxed) == 0)
134+
atomic_store(pc_ptr, pc, memory_order_relaxed);
135+
}
136+
137+
void Reset() {
138+
internal_memset(&pc_vector[0], 0, sizeof(pc_vector[0]) * pc_vector.size());
133139
}
134140

135141
void Dump() {
@@ -181,6 +187,9 @@ SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_trace_pc_guard_coverage() {
181187
SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_dump() {
182188
__sanitizer_dump_trace_pc_guard_coverage();
183189
}
190+
SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_reset() {
191+
__sancov::pc_guard_controller.Reset();
192+
}
184193
// Default empty implementations (weak). Users should redefine them.
185194
SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_cmp, void) {}
186195
SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_cmp1, void) {}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard -DSHARED %s -shared -o %dynamiclib -fPIC %ld_flags_rpath_so
2+
// RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard %s %ld_flags_rpath_exe -o %t
3+
// RUN: rm -rf %T/coverage-reset && mkdir -p %T/coverage-reset && cd %T/coverage-reset
4+
// RUN: %env_asan_opts=coverage=1:verbosity=1 %run %t 2>&1 | FileCheck %s
5+
//
6+
// UNSUPPORTED: ios
7+
8+
#include <stdio.h>
9+
10+
#include <sanitizer/coverage_interface.h>
11+
12+
#ifdef SHARED
13+
void bar1() { printf("bar1\n"); }
14+
void bar2() { printf("bar2\n"); }
15+
#else
16+
__attribute__((noinline)) void foo1() { printf("foo1\n"); }
17+
__attribute__((noinline)) void foo2() { printf("foo2\n"); }
18+
void bar1();
19+
void bar2();
20+
21+
int main(int argc, char **argv) {
22+
fprintf(stderr, "RESET");
23+
__sanitizer_cov_reset();
24+
foo1();
25+
foo2();
26+
bar1();
27+
bar2();
28+
__sanitizer_cov_dump();
29+
// CHECK: RESET
30+
// CHECK: SanitizerCoverage: ./coverage-reset.cc{{.*}}.sancov: 2 PCs written
31+
// CHECK: SanitizerCoverage: ./libcoverage-reset.cc{{.*}}.sancov: 2 PCs written
32+
33+
fprintf(stderr, "RESET");
34+
__sanitizer_cov_reset();
35+
foo1();
36+
bar1();
37+
__sanitizer_cov_dump();
38+
// CHECK: RESET
39+
// CHECK: SanitizerCoverage: ./coverage-reset.cc{{.*}}.sancov: 1 PCs written
40+
// CHECK: SanitizerCoverage: ./libcoverage-reset.cc{{.*}}.sancov: 1 PCs written
41+
42+
fprintf(stderr, "RESET");
43+
__sanitizer_cov_reset();
44+
foo1();
45+
foo2();
46+
__sanitizer_cov_dump();
47+
// CHECK: RESET
48+
// CHECK: SanitizerCoverage: ./coverage-reset.cc{{.*}}.sancov: 2 PCs written
49+
50+
fprintf(stderr, "RESET");
51+
__sanitizer_cov_reset();
52+
bar1();
53+
bar2();
54+
__sanitizer_cov_dump();
55+
// CHECK: RESET
56+
// CHECK: SanitizerCoverage: ./libcoverage-reset.cc{{.*}}.sancov: 2 PCs written
57+
58+
fprintf(stderr, "RESET");
59+
__sanitizer_cov_reset();
60+
// CHECK: RESET
61+
62+
bar2();
63+
// CHECK: SanitizerCoverage: ./libcoverage-reset.cc{{.*}}.sancov: 1 PCs written
64+
}
65+
#endif

0 commit comments

Comments
 (0)