aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/compiler-rt/lib/nsan/nsan_stats.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/compiler-rt/lib/nsan/nsan_stats.h')
-rw-r--r--contrib/llvm-project/compiler-rt/lib/nsan/nsan_stats.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/contrib/llvm-project/compiler-rt/lib/nsan/nsan_stats.h b/contrib/llvm-project/compiler-rt/lib/nsan/nsan_stats.h
new file mode 100644
index 000000000000..d1c7e0115e7a
--- /dev/null
+++ b/contrib/llvm-project/compiler-rt/lib/nsan/nsan_stats.h
@@ -0,0 +1,93 @@
+//===-- nsan_stats.h --------------------------------------------*- C++- *-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of NumericalStabilitySanitizer.
+//
+// NSan statistics. This class counts the number of checks per code location,
+// and is used to output statistics (typically when using
+// `disable_warnings=1,enable_check_stats=1,enable_warning_stats=1`).
+//===----------------------------------------------------------------------===//
+
+#ifndef NSAN_STATS_H
+#define NSAN_STATS_H
+
+#include "sanitizer_common/sanitizer_addrhashmap.h"
+#include "sanitizer_common/sanitizer_internal_defs.h"
+#include "sanitizer_common/sanitizer_mutex.h"
+
+namespace __nsan {
+
+enum class CheckTypeT {
+ kUnknown = 0,
+ kRet,
+ kArg,
+ kLoad,
+ kStore,
+ kInsert,
+ kUser, // User initiated.
+ kFcmp,
+ kMaxCheckType,
+};
+
+class Stats {
+public:
+ Stats();
+ ~Stats();
+
+ // Signal that we checked the instruction at the given address.
+ void AddCheck(CheckTypeT check_ty, __sanitizer::uptr pc, __sanitizer::uptr bp,
+ double rel_err);
+ // Signal that we warned for the instruction at the given address.
+ void AddWarning(CheckTypeT check_ty, __sanitizer::uptr pc,
+ __sanitizer::uptr bp, double rel_err);
+
+ // Signal that we detected a floating-point load where the shadow type was
+ // invalid.
+ void AddInvalidLoadTrackingEvent(__sanitizer::uptr pc, __sanitizer::uptr bp);
+ // Signal that we detected a floating-point load where the shadow type was
+ // unknown but the value was nonzero.
+ void AddUnknownLoadTrackingEvent(__sanitizer::uptr pc, __sanitizer::uptr bp);
+
+ void Print() const;
+
+private:
+ using IndexMap = __sanitizer::AddrHashMap<__sanitizer::uptr, 11>;
+
+ struct CheckAndWarningsValue {
+ CheckTypeT check_ty;
+ __sanitizer::u32 stack_id = 0;
+ __sanitizer::u64 num_checks = 0;
+ __sanitizer::u64 num_warnings = 0;
+ // This is a bitcasted double. Doubles have the nice idea to be ordered as
+ // ints.
+ double max_relative_err = 0;
+ };
+ // Map Key(check_ty, StackId) to indices in CheckAndWarnings.
+ IndexMap CheckAndWarningsMap;
+ __sanitizer::InternalMmapVectorNoCtor<CheckAndWarningsValue>
+ check_and_warnings;
+ mutable __sanitizer::Mutex check_and_warning_mutex;
+
+ struct LoadTrackingValue {
+ CheckTypeT check_ty;
+ __sanitizer::u32 stack_id = 0;
+ __sanitizer::u64 num_invalid = 0;
+ __sanitizer::u64 num_unknown = 0;
+ };
+ // Map Key(CheckTypeT::kLoad, StackId) to indices in TrackedLoads.
+ IndexMap LoadTrackingMap;
+ __sanitizer::InternalMmapVectorNoCtor<LoadTrackingValue> TrackedLoads;
+ mutable __sanitizer::Mutex TrackedLoadsMutex;
+};
+
+extern Stats *nsan_stats;
+void InitializeStats();
+
+} // namespace __nsan
+
+#endif // NSAN_STATS_H