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