xref: /llvm-project/compiler-rt/lib/rtsan/rtsan_stats.cpp (revision 29097dd2f39cfd7e5f2e389b0f0a7701188d7570)
1c3334dadSChris Apple //===--- rtsan_stats.cpp - Realtime Sanitizer -------------------*- C++ -*-===//
2c3334dadSChris Apple //
3c3334dadSChris Apple // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c3334dadSChris Apple // See https://llvm.org/LICENSE.txt for license information.
5c3334dadSChris Apple // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c3334dadSChris Apple //
7c3334dadSChris Apple //===----------------------------------------------------------------------===//
8c3334dadSChris Apple //
9c3334dadSChris Apple // Part of the RealtimeSanitizer runtime library
10c3334dadSChris Apple //
11c3334dadSChris Apple //===----------------------------------------------------------------------===//
12c3334dadSChris Apple 
13c3334dadSChris Apple #include "rtsan/rtsan_stats.h"
148f8d5f00SChris Apple #include "rtsan/rtsan_flags.h"
15c3334dadSChris Apple 
16c3334dadSChris Apple #include "sanitizer_common/sanitizer_atomic.h"
17c3334dadSChris Apple #include "sanitizer_common/sanitizer_common.h"
18c3334dadSChris Apple 
19c3334dadSChris Apple using namespace __sanitizer;
20c3334dadSChris Apple using namespace __rtsan;
21c3334dadSChris Apple 
22*29097dd2SChris Apple static atomic_uint32_t total_error_count{0};
23*29097dd2SChris Apple static atomic_uint32_t unique_error_count{0};
24*29097dd2SChris Apple static atomic_uint32_t suppressed_count{0};
25c3334dadSChris Apple 
26c3334dadSChris Apple void __rtsan::IncrementTotalErrorCount() {
27*29097dd2SChris Apple   atomic_fetch_add(&total_error_count, 1, memory_order_relaxed);
28c3334dadSChris Apple }
29c3334dadSChris Apple 
30f5b95db4SChris Apple void __rtsan::IncrementUniqueErrorCount() {
31*29097dd2SChris Apple   atomic_fetch_add(&unique_error_count, 1, memory_order_relaxed);
32f5b95db4SChris Apple }
33f5b95db4SChris Apple 
34c3334dadSChris Apple static u32 GetTotalErrorCount() {
35*29097dd2SChris Apple   return atomic_load(&total_error_count, memory_order_relaxed);
36c3334dadSChris Apple }
37c3334dadSChris Apple 
38f5b95db4SChris Apple static u32 GetUniqueErrorCount() {
39*29097dd2SChris Apple   return atomic_load(&unique_error_count, memory_order_relaxed);
40f5b95db4SChris Apple }
41f5b95db4SChris Apple 
428f8d5f00SChris Apple void __rtsan::IncrementSuppressedCount() {
43*29097dd2SChris Apple   atomic_fetch_add(&suppressed_count, 1, memory_order_relaxed);
448f8d5f00SChris Apple }
458f8d5f00SChris Apple 
468f8d5f00SChris Apple static u32 GetSuppressedCount() {
47*29097dd2SChris Apple   return atomic_load(&suppressed_count, memory_order_relaxed);
488f8d5f00SChris Apple }
498f8d5f00SChris Apple 
50c3334dadSChris Apple void __rtsan::PrintStatisticsSummary() {
51c3334dadSChris Apple   ScopedErrorReportLock l;
52c3334dadSChris Apple   Printf("RealtimeSanitizer exit stats:\n");
53c3334dadSChris Apple   Printf("    Total error count: %u\n", GetTotalErrorCount());
54f5b95db4SChris Apple   Printf("    Unique error count: %u\n", GetUniqueErrorCount());
558f8d5f00SChris Apple 
568f8d5f00SChris Apple   if (flags().ContainsSuppresionFile())
578f8d5f00SChris Apple     Printf("    Suppression count: %u\n", GetSuppressedCount());
58c3334dadSChris Apple }
59