1229109Sed//===-- asan_stats.h --------------------------------------------*- C++ -*-===//
2229109Sed//
3229109Sed//                     The LLVM Compiler Infrastructure
4229109Sed//
5229109Sed// This file is distributed under the University of Illinois Open Source
6229109Sed// License. See LICENSE.TXT for details.
7229109Sed//
8229109Sed//===----------------------------------------------------------------------===//
9229109Sed//
10229109Sed// This file is a part of AddressSanitizer, an address sanity checker.
11229109Sed//
12229109Sed// ASan-private header for statistics.
13229109Sed//===----------------------------------------------------------------------===//
14229109Sed#ifndef ASAN_STATS_H
15229109Sed#define ASAN_STATS_H
16229109Sed
17229109Sed#include "asan_allocator.h"
18229109Sed#include "asan_internal.h"
19229109Sed
20229109Sednamespace __asan {
21229109Sed
22229109Sed// AsanStats struct is NOT thread-safe.
23229109Sed// Each AsanThread has its own AsanStats, which are sometimes flushed
24229109Sed// to the accumulated AsanStats.
25229109Sedstruct AsanStats {
26238901Sandrew  // AsanStats must be a struct consisting of uptr fields only.
27238901Sandrew  // When merging two AsanStats structs, we treat them as arrays of uptr.
28238901Sandrew  uptr mallocs;
29238901Sandrew  uptr malloced;
30238901Sandrew  uptr malloced_redzones;
31238901Sandrew  uptr frees;
32238901Sandrew  uptr freed;
33238901Sandrew  uptr real_frees;
34238901Sandrew  uptr really_freed;
35238901Sandrew  uptr reallocs;
36238901Sandrew  uptr realloced;
37238901Sandrew  uptr mmaps;
38238901Sandrew  uptr mmaped;
39245614Sandrew  uptr munmaps;
40245614Sandrew  uptr munmaped;
41288943Sdim  uptr malloc_large;
42238901Sandrew  uptr malloced_by_size[kNumberOfSizeClasses];
43229109Sed
44276789Sdim  // Ctor for global AsanStats (accumulated stats for dead threads).
45229109Sed  explicit AsanStats(LinkerInitialized) { }
46276789Sdim  // Creates empty stats.
47229109Sed  AsanStats();
48229109Sed
49274201Sdim  void Print();  // Prints formatted stats to stderr.
50274201Sdim  void Clear();
51274201Sdim  void MergeFrom(const AsanStats *stats);
52229109Sed};
53229109Sed
54251034Sed// Returns stats for GetCurrentThread(), or stats for fake "unknown thread"
55251034Sed// if GetCurrentThread() returns 0.
56251034SedAsanStats &GetCurrentThreadStats();
57274201Sdim// Flushes a given stats into accumulated stats of dead threads.
58274201Sdimvoid FlushToDeadThreadStats(AsanStats *stats);
59251034Sed
60245614Sandrew// A cross-platform equivalent of malloc_statistics_t on Mac OS.
61245614Sandrewstruct AsanMallocStats {
62245614Sandrew  uptr blocks_in_use;
63245614Sandrew  uptr size_in_use;
64245614Sandrew  uptr max_size_in_use;
65245614Sandrew  uptr size_allocated;
66245614Sandrew};
67245614Sandrew
68251034Sedvoid FillMallocStatistics(AsanMallocStats *malloc_stats);
69251034Sed
70229109Sed}  // namespace __asan
71229109Sed
72229109Sed#endif  // ASAN_STATS_H
73