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