11e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===-- asan_stats.h --------------------------------------------*- C++ -*-===//
21e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
31e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//                     The LLVM Compiler Infrastructure
41e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
51e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is distributed under the University of Illinois Open Source
61e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// License. See LICENSE.TXT for details.
71e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
81e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===//
91e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is a part of AddressSanitizer, an address sanity checker.
111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//
121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// ASan-private header for statistics.
131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===//
141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#ifndef ASAN_STATS_H
151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_STATS_H
161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_allocator.h"
181e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_internal.h"
191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan {
211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
221e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// AsanStats struct is NOT thread-safe.
231e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Each AsanThread has its own AsanStats, which are sometimes flushed
241e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// to the accumulated AsanStats.
251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystruct AsanStats {
263f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  // AsanStats must be a struct consisting of uptr fields only.
273f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  // When merging two AsanStats structs, we treat them as arrays of uptr.
283f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr mallocs;
293f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr malloced;
303f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr malloced_redzones;
313f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr frees;
323f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr freed;
333f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr real_frees;
343f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr really_freed;
353f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr really_freed_redzones;
363f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr reallocs;
373f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr realloced;
383f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr mmaps;
393f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr mmaped;
40e3091193af47f4932b42ba1773416dfeb3aa2e87Kostya Serebryany  uptr munmaps;
41e3091193af47f4932b42ba1773416dfeb3aa2e87Kostya Serebryany  uptr munmaped;
423f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr mmaped_by_size[kNumberOfSizeClasses];
433f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr malloced_by_size[kNumberOfSizeClasses];
443f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr freed_by_size[kNumberOfSizeClasses];
453f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr really_freed_by_size[kNumberOfSizeClasses];
463f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany
473f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr malloc_large;
483f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  uptr malloc_small_slow;
491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Ctor for global AsanStats (accumulated stats for dead threads).
511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  explicit AsanStats(LinkerInitialized) { }
522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Creates empty stats.
531e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  AsanStats();
541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
55717ece58e18190c4aef50bd16254db1d74036395Alexey Samsonov  void Print();  // Prints formatted stats to stderr.
56717ece58e18190c4aef50bd16254db1d74036395Alexey Samsonov  void Clear();
57717ece58e18190c4aef50bd16254db1d74036395Alexey Samsonov  void MergeFrom(const AsanStats *stats);
581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany};
591e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
60c25e62b0cdbca855e7611583b0ff7013c31db21dAlexey Samsonov// Returns stats for GetCurrentThread(), or stats for fake "unknown thread"
61c25e62b0cdbca855e7611583b0ff7013c31db21dAlexey Samsonov// if GetCurrentThread() returns 0.
62c25e62b0cdbca855e7611583b0ff7013c31db21dAlexey SamsonovAsanStats &GetCurrentThreadStats();
63717ece58e18190c4aef50bd16254db1d74036395Alexey Samsonov// Flushes a given stats into accumulated stats of dead threads.
64717ece58e18190c4aef50bd16254db1d74036395Alexey Samsonovvoid FlushToDeadThreadStats(AsanStats *stats);
65c25e62b0cdbca855e7611583b0ff7013c31db21dAlexey Samsonov
66ca2cdd989076d091d8c4d4c277f8b47d9b5903adAlexander Potapenko// A cross-platform equivalent of malloc_statistics_t on Mac OS.
67ca2cdd989076d091d8c4d4c277f8b47d9b5903adAlexander Potapenkostruct AsanMallocStats {
68ca2cdd989076d091d8c4d4c277f8b47d9b5903adAlexander Potapenko  uptr blocks_in_use;
69ca2cdd989076d091d8c4d4c277f8b47d9b5903adAlexander Potapenko  uptr size_in_use;
70ca2cdd989076d091d8c4d4c277f8b47d9b5903adAlexander Potapenko  uptr max_size_in_use;
71ca2cdd989076d091d8c4d4c277f8b47d9b5903adAlexander Potapenko  uptr size_allocated;
72ca2cdd989076d091d8c4d4c277f8b47d9b5903adAlexander Potapenko};
73ca2cdd989076d091d8c4d4c277f8b47d9b5903adAlexander Potapenko
74c25e62b0cdbca855e7611583b0ff7013c31db21dAlexey Samsonovvoid FillMallocStatistics(AsanMallocStats *malloc_stats);
75c25e62b0cdbca855e7611583b0ff7013c31db21dAlexey Samsonov
761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}  // namespace __asan
771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif  // ASAN_STATS_H
79