1e5f5895bda30f374b0b51412fd4d837fa59aed66Alexey Samsonov//===-- asan_stats.cc -----------------------------------------------------===//
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// Code related to statistics collected by AddressSanitizer.
131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===//
141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_interceptors.h"
151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_internal.h"
161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_stats.h"
171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_thread_registry.h"
189e3bd38388a7c182db57f6e3fc0943e6d12f012eKostya Serebryany#include "sanitizer_common/sanitizer_stackdepot.h"
191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan {
211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
221e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyAsanStats::AsanStats() {
233f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  CHECK(REAL(memset) != 0);
2409672caefb5694f1981a1712fdefa44840a95e67Alexey Samsonov  REAL(memset)(this, 0, sizeof(AsanStats));
251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic void PrintMallocStatsArray(const char *prefix,
283f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany                                  uptr (&array)[kNumberOfSizeClasses]) {
29283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany  Printf("%s", prefix);
303f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany  for (uptr i = 0; i < kNumberOfSizeClasses; i++) {
311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany    if (!array[i]) continue;
32283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany    Printf("%zu:%zu; ", i, array[i]);
331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  }
34283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany  Printf("\n");
351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid AsanStats::Print() {
38283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany  Printf("Stats: %zuM malloced (%zuM for red zones) by %zu calls\n",
39e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonov             malloced>>20, malloced_redzones>>20, mallocs);
40283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany  Printf("Stats: %zuM realloced by %zu calls\n", realloced>>20, reallocs);
41283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany  Printf("Stats: %zuM freed by %zu calls\n", freed>>20, frees);
42283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany  Printf("Stats: %zuM really freed by %zu calls\n",
43e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonov             really_freed>>20, real_frees);
44e11c5c5a8cd6e448ddf3c69f783eb655cf4aab01Kostya Serebryany  Printf("Stats: %zuM (%zuM-%zuM) mmaped; %zu maps, %zu unmaps\n",
45e11c5c5a8cd6e448ddf3c69f783eb655cf4aab01Kostya Serebryany             (mmaped-munmaped)>>20, mmaped>>20, munmaped>>20,
46e11c5c5a8cd6e448ddf3c69f783eb655cf4aab01Kostya Serebryany             mmaps, munmaps);
471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  PrintMallocStatsArray("  mmaps   by size class: ", mmaped_by_size);
491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  PrintMallocStatsArray("  mallocs by size class: ", malloced_by_size);
501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  PrintMallocStatsArray("  frees   by size class: ", freed_by_size);
511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  PrintMallocStatsArray("  rfrees  by size class: ", really_freed_by_size);
52283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany  Printf("Stats: malloc large: %zu small slow: %zu\n",
53e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonov             malloc_large, malloc_small_slow);
541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
551e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
56f4f51f2cc6fa936f0c65577f82e6b62989d546eeDmitry Vyukovstatic BlockingMutex print_lock(LINKER_INITIALIZED);
5775f74616d227a158539a5cc23ea8282142623159Kostya Serebryany
581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic void PrintAccumulatedStats() {
5984f5bacaf1021b9fb6fc2cf48abe5d4d416422efAlexey Samsonov  AsanStats stats;
6084f5bacaf1021b9fb6fc2cf48abe5d4d416422efAlexey Samsonov  asanThreadRegistry().GetAccumulatedStats(&stats);
611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  // Use lock to keep reports from mixing up.
62f4f51f2cc6fa936f0c65577f82e6b62989d546eeDmitry Vyukov  BlockingMutexLock lock(&print_lock);
631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  stats.Print();
649e3bd38388a7c182db57f6e3fc0943e6d12f012eKostya Serebryany  StackDepotStats *stack_depot_stats = StackDepotGetStats();
659e3bd38388a7c182db57f6e3fc0943e6d12f012eKostya Serebryany  Printf("Stats: StackDepot: %zd ids; %zdM mapped\n",
669e3bd38388a7c182db57f6e3fc0943e6d12f012eKostya Serebryany         stack_depot_stats->n_uniq_ids, stack_depot_stats->mapped >> 20);
674b48f4563ca25d8915155acc5837e195cf0e5c57Kostya Serebryany  PrintInternalAllocatorStats();
681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}  // namespace __asan
711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// ---------------------- Interface ---------------- {{{1
731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyusing namespace __asan;  // NOLINT
741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
759aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryanyuptr __asan_get_current_allocated_bytes() {
761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  return asanThreadRegistry().GetCurrentAllocatedBytes();
771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
799aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryanyuptr __asan_get_heap_size() {
801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  return asanThreadRegistry().GetHeapSize();
811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
839aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryanyuptr __asan_get_free_bytes() {
841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  return asanThreadRegistry().GetFreeBytes();
851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
879aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryanyuptr __asan_get_unmapped_bytes() {
881e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  return 0;
891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany
911e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid __asan_print_accumulated_stats() {
921e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany  PrintAccumulatedStats();
931e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany}
94